ntapi/
ntobapi.rs

1use winapi::shared::ntdef::{
2    BOOLEAN, CHAR, HANDLE, LARGE_INTEGER, LONG, NTSTATUS, PHANDLE, PLARGE_INTEGER,
3    POBJECT_ATTRIBUTES, PULONG, PUNICODE_STRING, PVOID, UCHAR, ULONG, UNICODE_STRING, WAIT_TYPE,
4};
5use winapi::um::winnt::{
6    ACCESS_MASK, GENERIC_MAPPING, PSECURITY_DESCRIPTOR, SECURITY_INFORMATION,
7    STANDARD_RIGHTS_REQUIRED,
8};
9pub const OBJECT_TYPE_CREATE: u32 = 0x0001;
10pub const OBJECT_TYPE_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | 0x1;
11pub const DIRECTORY_QUERY: u32 = 0x0001;
12pub const DIRECTORY_TRAVERSE: u32 = 0x0002;
13pub const DIRECTORY_CREATE_OBJECT: u32 = 0x0004;
14pub const DIRECTORY_CREATE_SUBDIRECTORY: u32 = 0x0008;
15pub const DIRECTORY_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | 0xf;
16pub const SYMBOLIC_LINK_QUERY: u32 = 0x0001;
17pub const SYMBOLIC_LINK_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | 0x1;
18pub const OBJ_PROTECT_CLOSE: u32 = 0x00000001;
19pub const OBJ_INHERIT: u32 = 0x00000002;
20pub const OBJ_AUDIT_OBJECT_CLOSE: u32 = 0x00000004;
21ENUM!{enum OBJECT_INFORMATION_CLASS {
22    ObjectBasicInformation = 0,
23    ObjectNameInformation = 1,
24    ObjectTypeInformation = 2,
25    ObjectTypesInformation = 3,
26    ObjectHandleFlagInformation = 4,
27    ObjectSessionInformation = 5,
28    ObjectSessionObjectInformation = 6,
29    MaxObjectInfoClass = 7,
30}}
31STRUCT!{struct OBJECT_BASIC_INFORMATION {
32    Attributes: ULONG,
33    GrantedAccess: ACCESS_MASK,
34    HandleCount: ULONG,
35    PointerCount: ULONG,
36    PagedPoolCharge: ULONG,
37    NonPagedPoolCharge: ULONG,
38    Reserved: [ULONG; 3],
39    NameInfoSize: ULONG,
40    TypeInfoSize: ULONG,
41    SecurityDescriptorSize: ULONG,
42    CreationTime: LARGE_INTEGER,
43}}
44pub type POBJECT_BASIC_INFORMATION = *mut OBJECT_BASIC_INFORMATION;
45STRUCT!{struct OBJECT_NAME_INFORMATION {
46    Name: UNICODE_STRING,
47}}
48pub type POBJECT_NAME_INFORMATION = *mut OBJECT_NAME_INFORMATION;
49STRUCT!{struct OBJECT_TYPE_INFORMATION {
50    TypeName: UNICODE_STRING,
51    TotalNumberOfObjects: ULONG,
52    TotalNumberOfHandles: ULONG,
53    TotalPagedPoolUsage: ULONG,
54    TotalNonPagedPoolUsage: ULONG,
55    TotalNamePoolUsage: ULONG,
56    TotalHandleTableUsage: ULONG,
57    HighWaterNumberOfObjects: ULONG,
58    HighWaterNumberOfHandles: ULONG,
59    HighWaterPagedPoolUsage: ULONG,
60    HighWaterNonPagedPoolUsage: ULONG,
61    HighWaterNamePoolUsage: ULONG,
62    HighWaterHandleTableUsage: ULONG,
63    InvalidAttributes: ULONG,
64    GenericMapping: GENERIC_MAPPING,
65    ValidAccessMask: ULONG,
66    SecurityRequired: BOOLEAN,
67    MaintainHandleCount: BOOLEAN,
68    TypeIndex: UCHAR,
69    ReservedByte: CHAR,
70    PoolType: ULONG,
71    DefaultPagedPoolCharge: ULONG,
72    DefaultNonPagedPoolCharge: ULONG,
73}}
74pub type POBJECT_TYPE_INFORMATION = *mut OBJECT_TYPE_INFORMATION;
75STRUCT!{struct OBJECT_TYPES_INFORMATION {
76    NumberOfTypes: ULONG,
77}}
78pub type POBJECT_TYPES_INFORMATION = *mut OBJECT_TYPES_INFORMATION;
79STRUCT!{struct OBJECT_HANDLE_FLAG_INFORMATION {
80    Inherit: BOOLEAN,
81    ProtectFromClose: BOOLEAN,
82}}
83pub type POBJECT_HANDLE_FLAG_INFORMATION = *mut OBJECT_HANDLE_FLAG_INFORMATION;
84EXTERN!{extern "system" {
85    fn NtQueryObject(
86        Handle: HANDLE,
87        ObjectInformationClass: OBJECT_INFORMATION_CLASS,
88        ObjectInformation: PVOID,
89        ObjectInformationLength: ULONG,
90        ReturnLength: PULONG,
91    ) -> NTSTATUS;
92    fn NtSetInformationObject(
93        Handle: HANDLE,
94        ObjectInformationClass: OBJECT_INFORMATION_CLASS,
95        ObjectInformation: PVOID,
96        ObjectInformationLength: ULONG,
97    ) -> NTSTATUS;
98}}
99pub const DUPLICATE_CLOSE_SOURCE: u32 = 0x00000001;
100pub const DUPLICATE_SAME_ACCESS: u32 = 0x00000002;
101pub const DUPLICATE_SAME_ATTRIBUTES: u32 = 0x00000004;
102EXTERN!{extern "system" {
103    fn NtDuplicateObject(
104        SourceProcessHandle: HANDLE,
105        SourceHandle: HANDLE,
106        TargetProcessHandle: HANDLE,
107        TargetHandle: PHANDLE,
108        DesiredAccess: ACCESS_MASK,
109        HandleAttributes: ULONG,
110        Options: ULONG,
111    ) -> NTSTATUS;
112    fn NtMakeTemporaryObject(
113        Handle: HANDLE,
114    ) -> NTSTATUS;
115    fn NtMakePermanentObject(
116        Handle: HANDLE,
117    ) -> NTSTATUS;
118    fn NtSignalAndWaitForSingleObject(
119        SignalHandle: HANDLE,
120        WaitHandle: HANDLE,
121        Alertable: BOOLEAN,
122        Timeout: PLARGE_INTEGER,
123    ) -> NTSTATUS;
124    fn NtWaitForSingleObject(
125        Handle: HANDLE,
126        Alertable: BOOLEAN,
127        Timeout: PLARGE_INTEGER,
128    ) -> NTSTATUS;
129    fn NtWaitForMultipleObjects(
130        Count: ULONG,
131        Handles: *mut HANDLE,
132        WaitType: WAIT_TYPE,
133        Alertable: BOOLEAN,
134        Timeout: PLARGE_INTEGER,
135    ) -> NTSTATUS;
136    fn NtWaitForMultipleObjects32(
137        Count: ULONG,
138        Handles: *mut LONG,
139        WaitType: WAIT_TYPE,
140        Alertable: BOOLEAN,
141        Timeout: PLARGE_INTEGER,
142    ) -> NTSTATUS;
143    fn NtSetSecurityObject(
144        Handle: HANDLE,
145        SecurityInformation: SECURITY_INFORMATION,
146        SecurityDescriptor: PSECURITY_DESCRIPTOR,
147    ) -> NTSTATUS;
148    fn NtQuerySecurityObject(
149        Handle: HANDLE,
150        SecurityInformation: SECURITY_INFORMATION,
151        SecurityDescriptor: PSECURITY_DESCRIPTOR,
152        Length: ULONG,
153        LengthNeeded: PULONG,
154    ) -> NTSTATUS;
155    fn NtClose(
156        Handle: HANDLE,
157    ) -> NTSTATUS;
158    fn NtCompareObjects(
159        FirstObjectHandle: HANDLE,
160        SecondObjectHandle: HANDLE,
161    ) -> NTSTATUS;
162    fn NtCreateDirectoryObject(
163        DirectoryHandle: PHANDLE,
164        DesiredAccess: ACCESS_MASK,
165        ObjectAttributes: POBJECT_ATTRIBUTES,
166    ) -> NTSTATUS;
167    fn NtCreateDirectoryObjectEx(
168        DirectoryHandle: PHANDLE,
169        DesiredAccess: ACCESS_MASK,
170        ObjectAttributes: POBJECT_ATTRIBUTES,
171        ShadowDirectoryHandle: HANDLE,
172        Flags: ULONG,
173    ) -> NTSTATUS;
174    fn NtOpenDirectoryObject(
175        DirectoryHandle: PHANDLE,
176        DesiredAccess: ACCESS_MASK,
177        ObjectAttributes: POBJECT_ATTRIBUTES,
178    ) -> NTSTATUS;
179}}
180STRUCT!{struct OBJECT_DIRECTORY_INFORMATION {
181    Name: UNICODE_STRING,
182    TypeName: UNICODE_STRING,
183}}
184pub type POBJECT_DIRECTORY_INFORMATION = *mut OBJECT_DIRECTORY_INFORMATION;
185EXTERN!{extern "system" {
186    fn NtQueryDirectoryObject(
187        DirectoryHandle: HANDLE,
188        Buffer: PVOID,
189        Length: ULONG,
190        ReturnSingleEntry: BOOLEAN,
191        RestartScan: BOOLEAN,
192        Context: PULONG,
193        ReturnLength: PULONG,
194    ) -> NTSTATUS;
195    fn NtCreatePrivateNamespace(
196        NamespaceHandle: PHANDLE,
197        DesiredAccess: ACCESS_MASK,
198        ObjectAttributes: POBJECT_ATTRIBUTES,
199        BoundaryDescriptor: PVOID,
200    ) -> NTSTATUS;
201    fn NtOpenPrivateNamespace(
202        NamespaceHandle: PHANDLE,
203        DesiredAccess: ACCESS_MASK,
204        ObjectAttributes: POBJECT_ATTRIBUTES,
205        BoundaryDescriptor: PVOID,
206    ) -> NTSTATUS;
207    fn NtDeletePrivateNamespace(
208        NamespaceHandle: HANDLE,
209    ) -> NTSTATUS;
210    fn NtCreateSymbolicLinkObject(
211        LinkHandle: PHANDLE,
212        DesiredAccess: ACCESS_MASK,
213        ObjectAttributes: POBJECT_ATTRIBUTES,
214        LinkTarget: PUNICODE_STRING,
215    ) -> NTSTATUS;
216    fn NtOpenSymbolicLinkObject(
217        LinkHandle: PHANDLE,
218        DesiredAccess: ACCESS_MASK,
219        ObjectAttributes: POBJECT_ATTRIBUTES,
220    ) -> NTSTATUS;
221    fn NtQuerySymbolicLinkObject(
222        LinkHandle: HANDLE,
223        LinkTarget: PUNICODE_STRING,
224        ReturnedLength: PULONG,
225    ) -> NTSTATUS;
226}}