use winapi::shared::ntdef::{ BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, LONG, NTSTATUS, PHANDLE, PLARGE_INTEGER, POBJECT_ATTRIBUTES, PULONG, PUNICODE_STRING, PVOID, UCHAR, ULONG, UNICODE_STRING, WAIT_TYPE, }; use winapi::um::winnt::{ ACCESS_MASK, GENERIC_MAPPING, PSECURITY_DESCRIPTOR, SECURITY_INFORMATION, STANDARD_RIGHTS_REQUIRED, }; pub const OBJECT_TYPE_CREATE: u32 = 0x0001; pub const OBJECT_TYPE_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | 0x1; pub const DIRECTORY_QUERY: u32 = 0x0001; pub const DIRECTORY_TRAVERSE: u32 = 0x0002; pub const DIRECTORY_CREATE_OBJECT: u32 = 0x0004; pub const DIRECTORY_CREATE_SUBDIRECTORY: u32 = 0x0008; pub const DIRECTORY_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | 0xf; pub const SYMBOLIC_LINK_QUERY: u32 = 0x0001; pub const SYMBOLIC_LINK_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | 0x1; pub const OBJ_PROTECT_CLOSE: u32 = 0x00000001; pub const OBJ_INHERIT: u32 = 0x00000002; pub const OBJ_AUDIT_OBJECT_CLOSE: u32 = 0x00000004; ENUM!{enum OBJECT_INFORMATION_CLASS { ObjectBasicInformation = 0, ObjectNameInformation = 1, ObjectTypeInformation = 2, ObjectTypesInformation = 3, ObjectHandleFlagInformation = 4, ObjectSessionInformation = 5, ObjectSessionObjectInformation = 6, MaxObjectInfoClass = 7, }} STRUCT!{struct OBJECT_BASIC_INFORMATION { Attributes: ULONG, GrantedAccess: ACCESS_MASK, HandleCount: ULONG, PointerCount: ULONG, PagedPoolCharge: ULONG, NonPagedPoolCharge: ULONG, Reserved: [ULONG; 3], NameInfoSize: ULONG, TypeInfoSize: ULONG, SecurityDescriptorSize: ULONG, CreationTime: LARGE_INTEGER, }} pub type POBJECT_BASIC_INFORMATION = *mut OBJECT_BASIC_INFORMATION; STRUCT!{struct OBJECT_NAME_INFORMATION { Name: UNICODE_STRING, }} pub type POBJECT_NAME_INFORMATION = *mut OBJECT_NAME_INFORMATION; STRUCT!{struct OBJECT_TYPE_INFORMATION { TypeName: UNICODE_STRING, TotalNumberOfObjects: ULONG, TotalNumberOfHandles: ULONG, TotalPagedPoolUsage: ULONG, TotalNonPagedPoolUsage: ULONG, TotalNamePoolUsage: ULONG, TotalHandleTableUsage: ULONG, HighWaterNumberOfObjects: ULONG, HighWaterNumberOfHandles: ULONG, HighWaterPagedPoolUsage: ULONG, HighWaterNonPagedPoolUsage: ULONG, HighWaterNamePoolUsage: ULONG, HighWaterHandleTableUsage: ULONG, InvalidAttributes: ULONG, GenericMapping: GENERIC_MAPPING, ValidAccessMask: ULONG, SecurityRequired: BOOLEAN, MaintainHandleCount: BOOLEAN, TypeIndex: UCHAR, ReservedByte: CHAR, PoolType: ULONG, DefaultPagedPoolCharge: ULONG, DefaultNonPagedPoolCharge: ULONG, }} pub type POBJECT_TYPE_INFORMATION = *mut OBJECT_TYPE_INFORMATION; STRUCT!{struct OBJECT_TYPES_INFORMATION { NumberOfTypes: ULONG, }} pub type POBJECT_TYPES_INFORMATION = *mut OBJECT_TYPES_INFORMATION; STRUCT!{struct OBJECT_HANDLE_FLAG_INFORMATION { Inherit: BOOLEAN, ProtectFromClose: BOOLEAN, }} pub type POBJECT_HANDLE_FLAG_INFORMATION = *mut OBJECT_HANDLE_FLAG_INFORMATION; EXTERN!{extern "system" { fn NtQueryObject( Handle: HANDLE, ObjectInformationClass: OBJECT_INFORMATION_CLASS, ObjectInformation: PVOID, ObjectInformationLength: ULONG, ReturnLength: PULONG, ) -> NTSTATUS; fn NtSetInformationObject( Handle: HANDLE, ObjectInformationClass: OBJECT_INFORMATION_CLASS, ObjectInformation: PVOID, ObjectInformationLength: ULONG, ) -> NTSTATUS; }} pub const DUPLICATE_CLOSE_SOURCE: u32 = 0x00000001; pub const DUPLICATE_SAME_ACCESS: u32 = 0x00000002; pub const DUPLICATE_SAME_ATTRIBUTES: u32 = 0x00000004; EXTERN!{extern "system" { fn NtDuplicateObject( SourceProcessHandle: HANDLE, SourceHandle: HANDLE, TargetProcessHandle: HANDLE, TargetHandle: PHANDLE, DesiredAccess: ACCESS_MASK, HandleAttributes: ULONG, Options: ULONG, ) -> NTSTATUS; fn NtMakeTemporaryObject( Handle: HANDLE, ) -> NTSTATUS; fn NtMakePermanentObject( Handle: HANDLE, ) -> NTSTATUS; fn NtSignalAndWaitForSingleObject( SignalHandle: HANDLE, WaitHandle: HANDLE, Alertable: BOOLEAN, Timeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtWaitForSingleObject( Handle: HANDLE, Alertable: BOOLEAN, Timeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtWaitForMultipleObjects( Count: ULONG, Handles: *mut HANDLE, WaitType: WAIT_TYPE, Alertable: BOOLEAN, Timeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtWaitForMultipleObjects32( Count: ULONG, Handles: *mut LONG, WaitType: WAIT_TYPE, Alertable: BOOLEAN, Timeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtSetSecurityObject( Handle: HANDLE, SecurityInformation: SECURITY_INFORMATION, SecurityDescriptor: PSECURITY_DESCRIPTOR, ) -> NTSTATUS; fn NtQuerySecurityObject( Handle: HANDLE, SecurityInformation: SECURITY_INFORMATION, SecurityDescriptor: PSECURITY_DESCRIPTOR, Length: ULONG, LengthNeeded: PULONG, ) -> NTSTATUS; fn NtClose( Handle: HANDLE, ) -> NTSTATUS; fn NtCompareObjects( FirstObjectHandle: HANDLE, SecondObjectHandle: HANDLE, ) -> NTSTATUS; fn NtCreateDirectoryObject( DirectoryHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, ) -> NTSTATUS; fn NtCreateDirectoryObjectEx( DirectoryHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, ShadowDirectoryHandle: HANDLE, Flags: ULONG, ) -> NTSTATUS; fn NtOpenDirectoryObject( DirectoryHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, ) -> NTSTATUS; }} STRUCT!{struct OBJECT_DIRECTORY_INFORMATION { Name: UNICODE_STRING, TypeName: UNICODE_STRING, }} pub type POBJECT_DIRECTORY_INFORMATION = *mut OBJECT_DIRECTORY_INFORMATION; EXTERN!{extern "system" { fn NtQueryDirectoryObject( DirectoryHandle: HANDLE, Buffer: PVOID, Length: ULONG, ReturnSingleEntry: BOOLEAN, RestartScan: BOOLEAN, Context: PULONG, ReturnLength: PULONG, ) -> NTSTATUS; fn NtCreatePrivateNamespace( NamespaceHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, BoundaryDescriptor: PVOID, ) -> NTSTATUS; fn NtOpenPrivateNamespace( NamespaceHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, BoundaryDescriptor: PVOID, ) -> NTSTATUS; fn NtDeletePrivateNamespace( NamespaceHandle: HANDLE, ) -> NTSTATUS; fn NtCreateSymbolicLinkObject( LinkHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, LinkTarget: PUNICODE_STRING, ) -> NTSTATUS; fn NtOpenSymbolicLinkObject( LinkHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, ) -> NTSTATUS; fn NtQuerySymbolicLinkObject( LinkHandle: HANDLE, LinkTarget: PUNICODE_STRING, ReturnedLength: PULONG, ) -> NTSTATUS; }}