1 use crate::string::UTF16Const;
2 use crate::winapi_local::um::winioctl::CTL_CODE;
3 use winapi::shared::basetsd::ULONG_PTR;
4 use winapi::shared::guiddef::GUID;
5 use winapi::shared::minwindef::DWORD;
6 use winapi::shared::ntdef::{
7     BOOLEAN, CCHAR, CHAR, HANDLE, LARGE_INTEGER, LONG, LONGLONG, NTSTATUS, PBOOLEAN, PHANDLE,
8     PLARGE_INTEGER, POBJECT_ATTRIBUTES, PUCHAR, PULONG, PUNICODE_STRING, PVOID, UCHAR, ULONG,
9     ULONGLONG, USHORT, WCHAR,
10 };
11 use winapi::um::winioctl::{
12     FILE_ANY_ACCESS, FILE_DEVICE_MAILSLOT, FILE_DEVICE_NAMED_PIPE, METHOD_BUFFERED, METHOD_NEITHER,
13 };
14 use winapi::um::winnt::{
15     ACCESS_MASK, FILE_ID_128, FILE_READ_DATA, FILE_WRITE_DATA, PFILE_SEGMENT_ELEMENT, PSID, SID,
16 };
17 pub const FILE_SUPERSEDE: ULONG = 0x00000000;
18 pub const FILE_OPEN: ULONG = 0x00000001;
19 pub const FILE_CREATE: ULONG = 0x00000002;
20 pub const FILE_OPEN_IF: ULONG = 0x00000003;
21 pub const FILE_OVERWRITE: ULONG = 0x00000004;
22 pub const FILE_OVERWRITE_IF: ULONG = 0x00000005;
23 pub const FILE_MAXIMUM_DISPOSITION: ULONG = 0x00000005;
24 pub const FILE_DIRECTORY_FILE: ULONG = 0x00000001;
25 pub const FILE_WRITE_THROUGH: ULONG = 0x00000002;
26 pub const FILE_SEQUENTIAL_ONLY: ULONG = 0x00000004;
27 pub const FILE_NO_INTERMEDIATE_BUFFERING: ULONG = 0x00000008;
28 pub const FILE_SYNCHRONOUS_IO_ALERT: ULONG = 0x00000010;
29 pub const FILE_SYNCHRONOUS_IO_NONALERT: ULONG = 0x00000020;
30 pub const FILE_NON_DIRECTORY_FILE: ULONG = 0x00000040;
31 pub const FILE_CREATE_TREE_CONNECTION: ULONG = 0x00000080;
32 pub const FILE_COMPLETE_IF_OPLOCKED: ULONG = 0x00000100;
33 pub const FILE_NO_EA_KNOWLEDGE: ULONG = 0x00000200;
34 pub const FILE_OPEN_FOR_RECOVERY: ULONG = 0x00000400;
35 pub const FILE_RANDOM_ACCESS: ULONG = 0x00000800;
36 pub const FILE_DELETE_ON_CLOSE: ULONG = 0x00001000;
37 pub const FILE_OPEN_BY_FILE_ID: ULONG = 0x00002000;
38 pub const FILE_OPEN_FOR_BACKUP_INTENT: ULONG = 0x00004000;
39 pub const FILE_NO_COMPRESSION: ULONG = 0x00008000;
40 pub const FILE_OPEN_REQUIRING_OPLOCK: ULONG = 0x00010000;
41 pub const FILE_DISALLOW_EXCLUSIVE: ULONG = 0x00020000;
42 pub const FILE_SESSION_AWARE: ULONG = 0x00040000;
43 pub const FILE_RESERVE_OPFILTER: ULONG = 0x00100000;
44 pub const FILE_OPEN_REPARSE_POINT: ULONG = 0x00200000;
45 pub const FILE_OPEN_NO_RECALL: ULONG = 0x00400000;
46 pub const FILE_OPEN_FOR_FREE_SPACE_QUERY: ULONG = 0x00800000;
47 pub const FILE_COPY_STRUCTURED_STORAGE: ULONG = 0x00000041;
48 pub const FILE_STRUCTURED_STORAGE: ULONG = 0x00000441;
49 pub const FILE_SUPERSEDED: ULONG = 0x00000000;
50 pub const FILE_OPENED: ULONG = 0x00000001;
51 pub const FILE_CREATED: ULONG = 0x00000002;
52 pub const FILE_OVERWRITTEN: ULONG = 0x00000003;
53 pub const FILE_EXISTS: ULONG = 0x00000004;
54 pub const FILE_DOES_NOT_EXIST: ULONG = 0x00000005;
55 pub const FILE_WRITE_TO_END_OF_FILE: ULONG = 0xffffffff;
56 pub const FILE_USE_FILE_POINTER_POSITION: ULONG = 0xfffffffe;
57 pub const FILE_BYTE_ALIGNMENT: ULONG = 0x00000000;
58 pub const FILE_WORD_ALIGNMENT: ULONG = 0x00000001;
59 pub const FILE_LONG_ALIGNMENT: ULONG = 0x00000003;
60 pub const FILE_QUAD_ALIGNMENT: ULONG = 0x00000007;
61 pub const FILE_OCTA_ALIGNMENT: ULONG = 0x0000000f;
62 pub const FILE_32_BYTE_ALIGNMENT: ULONG = 0x0000001f;
63 pub const FILE_64_BYTE_ALIGNMENT: ULONG = 0x0000003f;
64 pub const FILE_128_BYTE_ALIGNMENT: ULONG = 0x0000007f;
65 pub const FILE_256_BYTE_ALIGNMENT: ULONG = 0x000000ff;
66 pub const FILE_512_BYTE_ALIGNMENT: ULONG = 0x000001ff;
67 pub const MAXIMUM_FILENAME_LENGTH: u32 = 256;
68 pub const FILE_NEED_EA: ULONG = 0x00000080;
69 pub const FILE_EA_TYPE_BINARY: ULONG = 0xfffe;
70 pub const FILE_EA_TYPE_ASCII: ULONG = 0xfffd;
71 pub const FILE_EA_TYPE_BITMAP: ULONG = 0xfffb;
72 pub const FILE_EA_TYPE_METAFILE: ULONG = 0xfffa;
73 pub const FILE_EA_TYPE_ICON: ULONG = 0xfff9;
74 pub const FILE_EA_TYPE_EA: ULONG = 0xffee;
75 pub const FILE_EA_TYPE_MVMT: ULONG = 0xffdf;
76 pub const FILE_EA_TYPE_MVST: ULONG = 0xffde;
77 pub const FILE_EA_TYPE_ASN1: ULONG = 0xffdd;
78 pub const FILE_EA_TYPE_FAMILY_IDS: ULONG = 0xff01;
79 pub const FILE_REMOVABLE_MEDIA: ULONG = 0x00000001;
80 pub const FILE_READ_ONLY_DEVICE: ULONG = 0x00000002;
81 pub const FILE_FLOPPY_DISKETTE: ULONG = 0x00000004;
82 pub const FILE_WRITE_ONCE_MEDIA: ULONG = 0x00000008;
83 pub const FILE_REMOTE_DEVICE: ULONG = 0x00000010;
84 pub const FILE_DEVICE_IS_MOUNTED: ULONG = 0x00000020;
85 pub const FILE_VIRTUAL_VOLUME: ULONG = 0x00000040;
86 pub const FILE_AUTOGENERATED_DEVICE_NAME: ULONG = 0x00000080;
87 pub const FILE_DEVICE_SECURE_OPEN: ULONG = 0x00000100;
88 pub const FILE_CHARACTERISTIC_PNP_DEVICE: ULONG = 0x00000800;
89 pub const FILE_CHARACTERISTIC_TS_DEVICE: ULONG = 0x00001000;
90 pub const FILE_CHARACTERISTIC_WEBDAV_DEVICE: ULONG = 0x00002000;
91 pub const FILE_CHARACTERISTIC_CSV: ULONG = 0x00010000;
92 pub const FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL: ULONG = 0x00020000;
93 pub const FILE_PORTABLE_DEVICE: ULONG = 0x00040000;
94 pub const FILE_PIPE_BYTE_STREAM_TYPE: ULONG = 0x00000000;
95 pub const FILE_PIPE_MESSAGE_TYPE: ULONG = 0x00000001;
96 pub const FILE_PIPE_ACCEPT_REMOTE_CLIENTS: ULONG = 0x00000000;
97 pub const FILE_PIPE_REJECT_REMOTE_CLIENTS: ULONG = 0x00000002;
98 pub const FILE_PIPE_TYPE_VALID_MASK: ULONG = 0x00000003;
99 pub const FILE_PIPE_QUEUE_OPERATION: ULONG = 0x00000000;
100 pub const FILE_PIPE_COMPLETE_OPERATION: ULONG = 0x00000001;
101 pub const FILE_PIPE_BYTE_STREAM_MODE: ULONG = 0x00000000;
102 pub const FILE_PIPE_MESSAGE_MODE: ULONG = 0x00000001;
103 pub const FILE_PIPE_INBOUND: ULONG = 0x00000000;
104 pub const FILE_PIPE_OUTBOUND: ULONG = 0x00000001;
105 pub const FILE_PIPE_FULL_DUPLEX: ULONG = 0x00000002;
106 pub const FILE_PIPE_DISCONNECTED_STATE: ULONG = 0x00000001;
107 pub const FILE_PIPE_LISTENING_STATE: ULONG = 0x00000002;
108 pub const FILE_PIPE_CONNECTED_STATE: ULONG = 0x00000003;
109 pub const FILE_PIPE_CLOSING_STATE: ULONG = 0x00000004;
110 pub const FILE_PIPE_CLIENT_END: ULONG = 0x00000000;
111 pub const FILE_PIPE_SERVER_END: ULONG = 0x00000001;
112 pub const MAILSLOT_SIZE_AUTO: u32 = 0;
113 UNION!{union IO_STATUS_BLOCK_u {
114     Status: NTSTATUS,
115     Pointer: PVOID,
116 }}
117 STRUCT!{struct IO_STATUS_BLOCK {
118     u: IO_STATUS_BLOCK_u,
119     Information: ULONG_PTR,
120 }}
121 pub type PIO_STATUS_BLOCK = *mut IO_STATUS_BLOCK;
122 FN!{stdcall PIO_APC_ROUTINE(
123     ApcContext: PVOID,
124     IoStatusBlock: PIO_STATUS_BLOCK,
125     Reserved: ULONG,
126 ) -> ()}
127 STRUCT!{struct FILE_IO_COMPLETION_INFORMATION {
128     KeyContext: PVOID,
129     ApcContext: PVOID,
130     IoStatusBlock: IO_STATUS_BLOCK,
131 }}
132 pub type PFILE_IO_COMPLETION_INFORMATION = *mut FILE_IO_COMPLETION_INFORMATION;
133 ENUM!{enum FILE_INFORMATION_CLASS {
134     FileDirectoryInformation = 1,
135     FileFullDirectoryInformation = 2,
136     FileBothDirectoryInformation = 3,
137     FileBasicInformation = 4,
138     FileStandardInformation = 5,
139     FileInternalInformation = 6,
140     FileEaInformation = 7,
141     FileAccessInformation = 8,
142     FileNameInformation = 9,
143     FileRenameInformation = 10,
144     FileLinkInformation = 11,
145     FileNamesInformation = 12,
146     FileDispositionInformation = 13,
147     FilePositionInformation = 14,
148     FileFullEaInformation = 15,
149     FileModeInformation = 16,
150     FileAlignmentInformation = 17,
151     FileAllInformation = 18,
152     FileAllocationInformation = 19,
153     FileEndOfFileInformation = 20,
154     FileAlternateNameInformation = 21,
155     FileStreamInformation = 22,
156     FilePipeInformation = 23,
157     FilePipeLocalInformation = 24,
158     FilePipeRemoteInformation = 25,
159     FileMailslotQueryInformation = 26,
160     FileMailslotSetInformation = 27,
161     FileCompressionInformation = 28,
162     FileObjectIdInformation = 29,
163     FileCompletionInformation = 30,
164     FileMoveClusterInformation = 31,
165     FileQuotaInformation = 32,
166     FileReparsePointInformation = 33,
167     FileNetworkOpenInformation = 34,
168     FileAttributeTagInformation = 35,
169     FileTrackingInformation = 36,
170     FileIdBothDirectoryInformation = 37,
171     FileIdFullDirectoryInformation = 38,
172     FileValidDataLengthInformation = 39,
173     FileShortNameInformation = 40,
174     FileIoCompletionNotificationInformation = 41,
175     FileIoStatusBlockRangeInformation = 42,
176     FileIoPriorityHintInformation = 43,
177     FileSfioReserveInformation = 44,
178     FileSfioVolumeInformation = 45,
179     FileHardLinkInformation = 46,
180     FileProcessIdsUsingFileInformation = 47,
181     FileNormalizedNameInformation = 48,
182     FileNetworkPhysicalNameInformation = 49,
183     FileIdGlobalTxDirectoryInformation = 50,
184     FileIsRemoteDeviceInformation = 51,
185     FileUnusedInformation = 52,
186     FileNumaNodeInformation = 53,
187     FileStandardLinkInformation = 54,
188     FileRemoteProtocolInformation = 55,
189     FileRenameInformationBypassAccessCheck = 56,
190     FileLinkInformationBypassAccessCheck = 57,
191     FileVolumeNameInformation = 58,
192     FileIdInformation = 59,
193     FileIdExtdDirectoryInformation = 60,
194     FileReplaceCompletionInformation = 61,
195     FileHardLinkFullIdInformation = 62,
196     FileIdExtdBothDirectoryInformation = 63,
197     FileDispositionInformationEx = 64,
198     FileRenameInformationEx = 65,
199     FileRenameInformationExBypassAccessCheck = 66,
200     FileDesiredStorageClassInformation = 67,
201     FileStatInformation = 68,
202     FileMemoryPartitionInformation = 69,
203     FileStatLxInformation = 70,
204     FileCaseSensitiveInformation = 71,
205     FileLinkInformationEx = 72,
206     FileLinkInformationExBypassAccessCheck = 73,
207     FileStorageReserveIdInformation = 74,
208     FileCaseSensitiveInformationForceAccessCheck = 75,
209     FileMaximumInformation = 76,
210 }}
211 pub type PFILE_INFORMATION_CLASS = *mut FILE_INFORMATION_CLASS;
212 STRUCT!{struct FILE_BASIC_INFORMATION {
213     CreationTime: LARGE_INTEGER,
214     LastAccessTime: LARGE_INTEGER,
215     LastWriteTime: LARGE_INTEGER,
216     ChangeTime: LARGE_INTEGER,
217     FileAttributes: ULONG,
218 }}
219 pub type PFILE_BASIC_INFORMATION = *mut FILE_BASIC_INFORMATION;
220 STRUCT!{struct FILE_STANDARD_INFORMATION {
221     AllocationSize: LARGE_INTEGER,
222     EndOfFile: LARGE_INTEGER,
223     NumberOfLinks: ULONG,
224     DeletePending: BOOLEAN,
225     Directory: BOOLEAN,
226 }}
227 pub type PFILE_STANDARD_INFORMATION = *mut FILE_STANDARD_INFORMATION;
228 STRUCT!{struct FILE_STANDARD_INFORMATION_EX {
229     AllocationSize: LARGE_INTEGER,
230     EndOfFile: LARGE_INTEGER,
231     NumberOfLinks: ULONG,
232     DeletePending: BOOLEAN,
233     Directory: BOOLEAN,
234     AlternateStream: BOOLEAN,
235     MetadataAttribute: BOOLEAN,
236 }}
237 pub type PFILE_STANDARD_INFORMATION_EX = *mut FILE_STANDARD_INFORMATION_EX;
238 STRUCT!{struct FILE_INTERNAL_INFORMATION {
239     IndexNumber: LARGE_INTEGER,
240 }}
241 pub type PFILE_INTERNAL_INFORMATION = *mut FILE_INTERNAL_INFORMATION;
242 STRUCT!{struct FILE_EA_INFORMATION {
243     EaSize: ULONG,
244 }}
245 pub type PFILE_EA_INFORMATION = *mut FILE_EA_INFORMATION;
246 STRUCT!{struct FILE_ACCESS_INFORMATION {
247     AccessFlags: ACCESS_MASK,
248 }}
249 pub type PFILE_ACCESS_INFORMATION = *mut FILE_ACCESS_INFORMATION;
250 STRUCT!{struct FILE_POSITION_INFORMATION {
251     CurrentByteOffset: LARGE_INTEGER,
252 }}
253 pub type PFILE_POSITION_INFORMATION = *mut FILE_POSITION_INFORMATION;
254 STRUCT!{struct FILE_MODE_INFORMATION {
255     Mode: ULONG,
256 }}
257 pub type PFILE_MODE_INFORMATION = *mut FILE_MODE_INFORMATION;
258 STRUCT!{struct FILE_ALIGNMENT_INFORMATION {
259     AlignmentRequirement: ULONG,
260 }}
261 pub type PFILE_ALIGNMENT_INFORMATION = *mut FILE_ALIGNMENT_INFORMATION;
262 STRUCT!{struct FILE_NAME_INFORMATION {
263     FileNameLength: ULONG,
264     FileName: [WCHAR; 1],
265 }}
266 pub type PFILE_NAME_INFORMATION = *mut FILE_NAME_INFORMATION;
267 STRUCT!{struct FILE_ALL_INFORMATION {
268     BasicInformation: FILE_BASIC_INFORMATION,
269     StandardInformation: FILE_STANDARD_INFORMATION,
270     InternalInformation: FILE_INTERNAL_INFORMATION,
271     EaInformation: FILE_EA_INFORMATION,
272     AccessInformation: FILE_ACCESS_INFORMATION,
273     PositionInformation: FILE_POSITION_INFORMATION,
274     ModeInformation: FILE_MODE_INFORMATION,
275     AlignmentInformation: FILE_ALIGNMENT_INFORMATION,
276     NameInformation: FILE_NAME_INFORMATION,
277 }}
278 pub type PFILE_ALL_INFORMATION = *mut FILE_ALL_INFORMATION;
279 STRUCT!{struct FILE_NETWORK_OPEN_INFORMATION {
280     CreationTime: LARGE_INTEGER,
281     LastAccessTime: LARGE_INTEGER,
282     LastWriteTime: LARGE_INTEGER,
283     ChangeTime: LARGE_INTEGER,
284     AllocationSize: LARGE_INTEGER,
285     EndOfFile: LARGE_INTEGER,
286     FileAttributes: ULONG,
287 }}
288 pub type PFILE_NETWORK_OPEN_INFORMATION = *mut FILE_NETWORK_OPEN_INFORMATION;
289 STRUCT!{struct FILE_ATTRIBUTE_TAG_INFORMATION {
290     FileAttributes: ULONG,
291     ReparseTag: ULONG,
292 }}
293 pub type PFILE_ATTRIBUTE_TAG_INFORMATION = *mut FILE_ATTRIBUTE_TAG_INFORMATION;
294 STRUCT!{struct FILE_ALLOCATION_INFORMATION {
295     AllocationSize: LARGE_INTEGER,
296 }}
297 pub type PFILE_ALLOCATION_INFORMATION = *mut FILE_ALLOCATION_INFORMATION;
298 STRUCT!{struct FILE_COMPRESSION_INFORMATION {
299     CompressedFileSize: LARGE_INTEGER,
300     CompressionFormat: USHORT,
301     CompressionUnitShift: UCHAR,
302     ChunkShift: UCHAR,
303     ClusterShift: UCHAR,
304     Reserved: [UCHAR; 3],
305 }}
306 pub type PFILE_COMPRESSION_INFORMATION = *mut FILE_COMPRESSION_INFORMATION;
307 STRUCT!{struct FILE_DISPOSITION_INFORMATION {
308     DeleteFileA: BOOLEAN,
309 }}
310 pub type PFILE_DISPOSITION_INFORMATION = *mut FILE_DISPOSITION_INFORMATION;
311 STRUCT!{struct FILE_END_OF_FILE_INFORMATION {
312     EndOfFile: LARGE_INTEGER,
313 }}
314 pub type PFILE_END_OF_FILE_INFORMATION = *mut FILE_END_OF_FILE_INFORMATION;
315 STRUCT!{struct FILE_VALID_DATA_LENGTH_INFORMATION {
316     ValidDataLength: LARGE_INTEGER,
317 }}
318 pub type PFILE_VALID_DATA_LENGTH_INFORMATION = *mut FILE_VALID_DATA_LENGTH_INFORMATION;
319 STRUCT!{struct FILE_LINK_INFORMATION {
320     ReplaceIfExists: BOOLEAN,
321     RootDirectory: HANDLE,
322     FileNameLength: ULONG,
323     FileName: [WCHAR; 1],
324 }}
325 pub type PFILE_LINK_INFORMATION = *mut FILE_LINK_INFORMATION;
326 STRUCT!{struct FILE_MOVE_CLUSTER_INFORMATION {
327     ClusterCount: ULONG,
328     RootDirectory: HANDLE,
329     FileNameLength: ULONG,
330     FileName: [WCHAR; 1],
331 }}
332 pub type PFILE_MOVE_CLUSTER_INFORMATION = *mut FILE_MOVE_CLUSTER_INFORMATION;
333 STRUCT!{struct FILE_RENAME_INFORMATION {
334     ReplaceIfExists: BOOLEAN,
335     RootDirectory: HANDLE,
336     FileNameLength: ULONG,
337     FileName: [WCHAR; 1],
338 }}
339 pub type PFILE_RENAME_INFORMATION = *mut FILE_RENAME_INFORMATION;
340 STRUCT!{struct FILE_STREAM_INFORMATION {
341     NextEntryOffset: ULONG,
342     StreamNameLength: ULONG,
343     StreamSize: LARGE_INTEGER,
344     StreamAllocationSize: LARGE_INTEGER,
345     StreamName: [WCHAR; 1],
346 }}
347 pub type PFILE_STREAM_INFORMATION = *mut FILE_STREAM_INFORMATION;
348 STRUCT!{struct FILE_TRACKING_INFORMATION {
349     DestinationFile: HANDLE,
350     ObjectInformationLength: ULONG,
351     ObjectInformation: [CHAR; 1],
352 }}
353 pub type PFILE_TRACKING_INFORMATION = *mut FILE_TRACKING_INFORMATION;
354 STRUCT!{struct FILE_COMPLETION_INFORMATION {
355     Port: HANDLE,
356     Key: PVOID,
357 }}
358 pub type PFILE_COMPLETION_INFORMATION = *mut FILE_COMPLETION_INFORMATION;
359 STRUCT!{struct FILE_PIPE_INFORMATION {
360     ReadMode: ULONG,
361     CompletionMode: ULONG,
362 }}
363 pub type PFILE_PIPE_INFORMATION = *mut FILE_PIPE_INFORMATION;
364 STRUCT!{struct FILE_PIPE_LOCAL_INFORMATION {
365     NamedPipeType: ULONG,
366     NamedPipeConfiguration: ULONG,
367     MaximumInstances: ULONG,
368     CurrentInstances: ULONG,
369     InboundQuota: ULONG,
370     ReadDataAvailable: ULONG,
371     OutboundQuota: ULONG,
372     WriteQuotaAvailable: ULONG,
373     NamedPipeState: ULONG,
374     NamedPipeEnd: ULONG,
375 }}
376 pub type PFILE_PIPE_LOCAL_INFORMATION = *mut FILE_PIPE_LOCAL_INFORMATION;
377 STRUCT!{struct FILE_PIPE_REMOTE_INFORMATION {
378     CollectDataTime: LARGE_INTEGER,
379     MaximumCollectionCount: ULONG,
380 }}
381 pub type PFILE_PIPE_REMOTE_INFORMATION = *mut FILE_PIPE_REMOTE_INFORMATION;
382 STRUCT!{struct FILE_MAILSLOT_QUERY_INFORMATION {
383     MaximumMessageSize: ULONG,
384     MailslotQuota: ULONG,
385     NextMessageSize: ULONG,
386     MessagesAvailable: ULONG,
387     ReadTimeout: LARGE_INTEGER,
388 }}
389 pub type PFILE_MAILSLOT_QUERY_INFORMATION = *mut FILE_MAILSLOT_QUERY_INFORMATION;
390 STRUCT!{struct FILE_MAILSLOT_SET_INFORMATION {
391     ReadTimeout: PLARGE_INTEGER,
392 }}
393 pub type PFILE_MAILSLOT_SET_INFORMATION = *mut FILE_MAILSLOT_SET_INFORMATION;
394 STRUCT!{struct FILE_REPARSE_POINT_INFORMATION {
395     FileReference: LONGLONG,
396     Tag: ULONG,
397 }}
398 pub type PFILE_REPARSE_POINT_INFORMATION = *mut FILE_REPARSE_POINT_INFORMATION;
399 STRUCT!{struct FILE_LINK_ENTRY_INFORMATION {
400     NextEntryOffset: ULONG,
401     ParentFileId: LONGLONG,
402     FileNameLength: ULONG,
403     FileName: [WCHAR; 1],
404 }}
405 pub type PFILE_LINK_ENTRY_INFORMATION = *mut FILE_LINK_ENTRY_INFORMATION;
406 STRUCT!{struct FILE_LINKS_INFORMATION {
407     BytesNeeded: ULONG,
408     EntriesReturned: ULONG,
409     Entry: FILE_LINK_ENTRY_INFORMATION,
410 }}
411 pub type PFILE_LINKS_INFORMATION = *mut FILE_LINKS_INFORMATION;
412 STRUCT!{struct FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
413     FileNameLength: ULONG,
414     FileName: [WCHAR; 1],
415 }}
416 pub type PFILE_NETWORK_PHYSICAL_NAME_INFORMATION = *mut FILE_NETWORK_PHYSICAL_NAME_INFORMATION;
417 STRUCT!{struct FILE_STANDARD_LINK_INFORMATION {
418     NumberOfAccessibleLinks: ULONG,
419     TotalNumberOfLinks: ULONG,
420     DeletePending: BOOLEAN,
421     Directory: BOOLEAN,
422 }}
423 pub type PFILE_STANDARD_LINK_INFORMATION = *mut FILE_STANDARD_LINK_INFORMATION;
424 STRUCT!{struct FILE_SFIO_RESERVE_INFORMATION {
425     RequestsPerPeriod: ULONG,
426     Period: ULONG,
427     RetryFailures: BOOLEAN,
428     Discardable: BOOLEAN,
429     RequestSize: ULONG,
430     NumOutstandingRequests: ULONG,
431 }}
432 pub type PFILE_SFIO_RESERVE_INFORMATION = *mut FILE_SFIO_RESERVE_INFORMATION;
433 STRUCT!{struct FILE_SFIO_VOLUME_INFORMATION {
434     MaximumRequestsPerPeriod: ULONG,
435     MinimumPeriod: ULONG,
436     MinimumTransferSize: ULONG,
437 }}
438 pub type PFILE_SFIO_VOLUME_INFORMATION = *mut FILE_SFIO_VOLUME_INFORMATION;
439 ENUM!{enum IO_PRIORITY_HINT {
440     IoPriorityVeryLow = 0,
441     IoPriorityLow = 1,
442     IoPriorityNormal = 2,
443     IoPriorityHigh = 3,
444     IoPriorityCritical = 4,
445     MaxIoPriorityTypes = 5,
446 }}
447 STRUCT!{struct FILE_IO_PRIORITY_HINT_INFORMATION {
448     PriorityHint: IO_PRIORITY_HINT,
449 }}
450 pub type PFILE_IO_PRIORITY_HINT_INFORMATION = *mut FILE_IO_PRIORITY_HINT_INFORMATION;
451 STRUCT!{struct FILE_IO_PRIORITY_HINT_INFORMATION_EX {
452     PriorityHint: IO_PRIORITY_HINT,
453     BoostOutstanding: BOOLEAN,
454 }}
455 pub type PFILE_IO_PRIORITY_HINT_INFORMATION_EX = *mut FILE_IO_PRIORITY_HINT_INFORMATION_EX;
456 pub const FILE_SKIP_COMPLETION_PORT_ON_SUCCESS: u32 = 0x1;
457 pub const FILE_SKIP_SET_EVENT_ON_HANDLE: u32 = 0x2;
458 pub const FILE_SKIP_SET_USER_EVENT_ON_FAST_IO: u32 = 0x4;
459 STRUCT!{struct FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
460     Flags: ULONG,
461 }}
462 pub type PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION =
463     *mut FILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
464 STRUCT!{struct FILE_PROCESS_IDS_USING_FILE_INFORMATION {
465     NumberOfProcessIdsInList: ULONG,
466     ProcessIdList: [ULONG_PTR; 1],
467 }}
468 pub type PFILE_PROCESS_IDS_USING_FILE_INFORMATION = *mut FILE_PROCESS_IDS_USING_FILE_INFORMATION;
469 STRUCT!{struct FILE_IS_REMOTE_DEVICE_INFORMATION {
470     IsRemote: BOOLEAN,
471 }}
472 pub type PFILE_IS_REMOTE_DEVICE_INFORMATION = *mut FILE_IS_REMOTE_DEVICE_INFORMATION;
473 STRUCT!{struct FILE_NUMA_NODE_INFORMATION {
474     NodeNumber: USHORT,
475 }}
476 pub type PFILE_NUMA_NODE_INFORMATION = *mut FILE_NUMA_NODE_INFORMATION;
477 STRUCT!{struct FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
478     IoStatusBlockRange: PUCHAR,
479     Length: ULONG,
480 }}
481 pub type PFILE_IOSTATUSBLOCK_RANGE_INFORMATION = *mut FILE_IOSTATUSBLOCK_RANGE_INFORMATION;
482 STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_GenericReserved {
483     Reserved: [ULONG; 8],
484 }}
485 STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Server {
486     Capabilities: ULONG,
487 }}
488 STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Share {
489     Capabilities: ULONG,
490     CachingFlags: ULONG,
491 }}
492 STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2 {
493     Server: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Server,
494     Share: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Share,
495 }}
496 UNION!{union FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific {
497     Smb2: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2,
498     Reserved: [ULONG; 16],
499 }}
500 STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION {
501     StructureVersion: USHORT,
502     StructureSize: USHORT,
503     Protocol: ULONG,
504     ProtocolMajorVersion: USHORT,
505     ProtocolMinorVersion: USHORT,
506     ProtocolRevision: USHORT,
507     Reserved: USHORT,
508     Flags: ULONG,
509     GenericReserved: FILE_REMOTE_PROTOCOL_INFORMATION_GenericReserved,
510     ProtocolSpecific: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific,
511 }}
512 pub type PFILE_REMOTE_PROTOCOL_INFORMATION = *mut FILE_REMOTE_PROTOCOL_INFORMATION;
513 pub const CHECKSUM_ENFORCEMENT_OFF: u32 = 0x00000001;
514 STRUCT!{struct FILE_INTEGRITY_STREAM_INFORMATION {
515     ChecksumAlgorithm: USHORT,
516     ChecksumChunkShift: UCHAR,
517     ClusterShift: UCHAR,
518     Flags: ULONG,
519 }}
520 pub type PFILE_INTEGRITY_STREAM_INFORMATION = *mut FILE_INTEGRITY_STREAM_INFORMATION;
521 STRUCT!{struct FILE_VOLUME_NAME_INFORMATION {
522     DeviceNameLength: ULONG,
523     DeviceName: [WCHAR; 1],
524 }}
525 pub type PFILE_VOLUME_NAME_INFORMATION = *mut FILE_VOLUME_NAME_INFORMATION;
526 STRUCT!{struct FILE_ID_INFORMATION {
527     VolumeSerialNumber: ULONGLONG,
528     FileId: FILE_ID_128,
529 }}
530 pub type PFILE_ID_INFORMATION = *mut FILE_ID_INFORMATION;
531 STRUCT!{struct FILE_ID_EXTD_DIR_INFORMATION {
532     NextEntryOffset: ULONG,
533     FileIndex: ULONG,
534     CreationTime: LARGE_INTEGER,
535     LastAccessTime: LARGE_INTEGER,
536     LastWriteTime: LARGE_INTEGER,
537     ChangeTime: LARGE_INTEGER,
538     EndOfFile: LARGE_INTEGER,
539     AllocationSize: LARGE_INTEGER,
540     FileAttributes: ULONG,
541     FileNameLength: ULONG,
542     EaSize: ULONG,
543     ReparsePointTag: ULONG,
544     FileId: FILE_ID_128,
545     FileName: [WCHAR; 1],
546 }}
547 pub type PFILE_ID_EXTD_DIR_INFORMATION = *mut FILE_ID_EXTD_DIR_INFORMATION;
548 STRUCT!{struct FILE_LINK_ENTRY_FULL_ID_INFORMATION {
549     NextEntryOffset: ULONG,
550     ParentFileId: FILE_ID_128,
551     FileNameLength: ULONG,
552     FileName: [WCHAR; 1],
553 }}
554 pub type PFILE_LINK_ENTRY_FULL_ID_INFORMATION = *mut FILE_LINK_ENTRY_FULL_ID_INFORMATION;
555 STRUCT!{struct FILE_ID_EXTD_BOTH_DIR_INFORMATION {
556     NextEntryOffset: ULONG,
557     FileIndex: ULONG,
558     CreationTime: LARGE_INTEGER,
559     LastAccessTime: LARGE_INTEGER,
560     LastWriteTime: LARGE_INTEGER,
561     ChangeTime: LARGE_INTEGER,
562     EndOfFile: LARGE_INTEGER,
563     AllocationSize: LARGE_INTEGER,
564     FileAttributes: ULONG,
565     FileNameLength: ULONG,
566     EaSize: ULONG,
567     ReparsePointTag: ULONG,
568     FileId: FILE_ID_128,
569     ShortNameLength: CCHAR,
570     ShortName: [WCHAR; 12],
571     FileName: [WCHAR; 1],
572 }}
573 pub type PFILE_ID_EXTD_BOTH_DIR_INFORMATION = *mut FILE_ID_EXTD_BOTH_DIR_INFORMATION;
574 STRUCT!{struct FILE_STAT_INFORMATION {
575     FileId: LARGE_INTEGER,
576     CreationTime: LARGE_INTEGER,
577     LastAccessTime: LARGE_INTEGER,
578     LastWriteTime: LARGE_INTEGER,
579     ChangeTime: LARGE_INTEGER,
580     AllocationSize: LARGE_INTEGER,
581     EndOfFile: LARGE_INTEGER,
582     FileAttributes: ULONG,
583     ReparseTag: ULONG,
584     NumberOfLinks: ULONG,
585     EffectiveAccess: ULONG,
586 }}
587 pub type PFILE_STAT_INFORMATION = *mut FILE_STAT_INFORMATION;
588 STRUCT!{struct FILE_MEMORY_PARTITION_INFORMATION_Flags_s {
589     NoCrossPartitionAccess: UCHAR,
590     Spare: [UCHAR; 3],
591 }}
592 UNION!{union FILE_MEMORY_PARTITION_INFORMATION_Flags {
593     s: FILE_MEMORY_PARTITION_INFORMATION_Flags_s,
594     AllFlags: ULONG,
595 }}
596 STRUCT!{struct FILE_MEMORY_PARTITION_INFORMATION {
597     OwnerPartitionHandle: HANDLE,
598     Flags: FILE_MEMORY_PARTITION_INFORMATION_Flags,
599 }}
600 pub type PFILE_MEMORY_PARTITION_INFORMATION = *mut FILE_MEMORY_PARTITION_INFORMATION;
601 STRUCT!{struct FILE_STAT_LX_INFORMATION {
602     FileId: LARGE_INTEGER,
603     CreationTime: LARGE_INTEGER,
604     LastAccessTime: LARGE_INTEGER,
605     LastWriteTime: LARGE_INTEGER,
606     ChangeTime: LARGE_INTEGER,
607     AllocationSize: LARGE_INTEGER,
608     EndOfFile: LARGE_INTEGER,
609     FileAttributes: ULONG,
610     ReparseTag: ULONG,
611     NumberOfLinks: ULONG,
612     EffectiveAccess: ULONG,
613     LxFlags: ULONG,
614     LxUid: ULONG,
615     LxGid: ULONG,
616     LxMode: ULONG,
617     LxDeviceIdMajor: ULONG,
618     LxDeviceIdMinor: ULONG,
619 }}
620 pub type PFILE_STAT_LX_INFORMATION = *mut FILE_STAT_LX_INFORMATION;
621 STRUCT!{struct FILE_CASE_SENSITIVE_INFORMATION {
622     Flags: ULONG,
623 }}
624 pub type PFILE_CASE_SENSITIVE_INFORMATION = *mut FILE_CASE_SENSITIVE_INFORMATION;
625 STRUCT!{struct FILE_DIRECTORY_INFORMATION {
626     NextEntryOffset: ULONG,
627     FileIndex: ULONG,
628     CreationTime: LARGE_INTEGER,
629     LastAccessTime: LARGE_INTEGER,
630     LastWriteTime: LARGE_INTEGER,
631     ChangeTime: LARGE_INTEGER,
632     EndOfFile: LARGE_INTEGER,
633     AllocationSize: LARGE_INTEGER,
634     FileAttributes: ULONG,
635     FileNameLength: ULONG,
636     FileName: [WCHAR; 1],
637 }}
638 pub type PFILE_DIRECTORY_INFORMATION = *mut FILE_DIRECTORY_INFORMATION;
639 STRUCT!{struct FILE_FULL_DIR_INFORMATION {
640     NextEntryOffset: ULONG,
641     FileIndex: ULONG,
642     CreationTime: LARGE_INTEGER,
643     LastAccessTime: LARGE_INTEGER,
644     LastWriteTime: LARGE_INTEGER,
645     ChangeTime: LARGE_INTEGER,
646     EndOfFile: LARGE_INTEGER,
647     AllocationSize: LARGE_INTEGER,
648     FileAttributes: ULONG,
649     FileNameLength: ULONG,
650     EaSize: ULONG,
651     FileName: [WCHAR; 1],
652 }}
653 pub type PFILE_FULL_DIR_INFORMATION = *mut FILE_FULL_DIR_INFORMATION;
654 STRUCT!{struct FILE_ID_FULL_DIR_INFORMATION {
655     NextEntryOffset: ULONG,
656     FileIndex: ULONG,
657     CreationTime: LARGE_INTEGER,
658     LastAccessTime: LARGE_INTEGER,
659     LastWriteTime: LARGE_INTEGER,
660     ChangeTime: LARGE_INTEGER,
661     EndOfFile: LARGE_INTEGER,
662     AllocationSize: LARGE_INTEGER,
663     FileAttributes: ULONG,
664     FileNameLength: ULONG,
665     EaSize: ULONG,
666     FileId: LARGE_INTEGER,
667     FileName: [WCHAR; 1],
668 }}
669 pub type PFILE_ID_FULL_DIR_INFORMATION = *mut FILE_ID_FULL_DIR_INFORMATION;
670 STRUCT!{struct FILE_BOTH_DIR_INFORMATION {
671     NextEntryOffset: ULONG,
672     FileIndex: ULONG,
673     CreationTime: LARGE_INTEGER,
674     LastAccessTime: LARGE_INTEGER,
675     LastWriteTime: LARGE_INTEGER,
676     ChangeTime: LARGE_INTEGER,
677     EndOfFile: LARGE_INTEGER,
678     AllocationSize: LARGE_INTEGER,
679     FileAttributes: ULONG,
680     FileNameLength: ULONG,
681     EaSize: ULONG,
682     ShortNameLength: CCHAR,
683     ShortName: [WCHAR; 12],
684     FileName: [WCHAR; 1],
685 }}
686 pub type PFILE_BOTH_DIR_INFORMATION = *mut FILE_BOTH_DIR_INFORMATION;
687 STRUCT!{struct FILE_ID_BOTH_DIR_INFORMATION {
688     NextEntryOffset: ULONG,
689     FileIndex: ULONG,
690     CreationTime: LARGE_INTEGER,
691     LastAccessTime: LARGE_INTEGER,
692     LastWriteTime: LARGE_INTEGER,
693     ChangeTime: LARGE_INTEGER,
694     EndOfFile: LARGE_INTEGER,
695     AllocationSize: LARGE_INTEGER,
696     FileAttributes: ULONG,
697     FileNameLength: ULONG,
698     EaSize: ULONG,
699     ShortNameLength: CCHAR,
700     ShortName: [WCHAR; 12],
701     FileId: LARGE_INTEGER,
702     FileName: [WCHAR; 1],
703 }}
704 pub type PFILE_ID_BOTH_DIR_INFORMATION = *mut FILE_ID_BOTH_DIR_INFORMATION;
705 STRUCT!{struct FILE_NAMES_INFORMATION {
706     NextEntryOffset: ULONG,
707     FileIndex: ULONG,
708     FileNameLength: ULONG,
709     FileName: [WCHAR; 1],
710 }}
711 pub type PFILE_NAMES_INFORMATION = *mut FILE_NAMES_INFORMATION;
712 STRUCT!{struct FILE_ID_GLOBAL_TX_DIR_INFORMATION {
713     NextEntryOffset: ULONG,
714     FileIndex: ULONG,
715     CreationTime: LARGE_INTEGER,
716     LastAccessTime: LARGE_INTEGER,
717     LastWriteTime: LARGE_INTEGER,
718     ChangeTime: LARGE_INTEGER,
719     EndOfFile: LARGE_INTEGER,
720     AllocationSize: LARGE_INTEGER,
721     FileAttributes: ULONG,
722     FileNameLength: ULONG,
723     FileId: LARGE_INTEGER,
724     LockingTransactionId: GUID,
725     TxInfoFlags: ULONG,
726     FileName: [WCHAR; 1],
727 }}
728 pub type PFILE_ID_GLOBAL_TX_DIR_INFORMATION = *mut FILE_ID_GLOBAL_TX_DIR_INFORMATION;
729 pub const FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED: u32 = 0x00000001;
730 pub const FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX: u32 = 0x00000002;
731 pub const FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX: u32 = 0x00000004;
732 STRUCT!{struct FILE_OBJECTID_INFORMATION_u_s {
733     BirthVolumeId: [UCHAR; 16],
734     BirthObjectId: [UCHAR; 16],
735     DomainId: [UCHAR; 16],
736 }}
737 UNION!{union FILE_OBJECTID_INFORMATION_u {
738     s: FILE_OBJECTID_INFORMATION_u_s,
739     ExtendedInfo: [UCHAR; 48],
740 }}
741 STRUCT!{struct FILE_OBJECTID_INFORMATION {
742     FileReference: LONGLONG,
743     ObjectId: [UCHAR; 16],
744     u: FILE_OBJECTID_INFORMATION_u,
745 }}
746 pub type PFILE_OBJECTID_INFORMATION = *mut FILE_OBJECTID_INFORMATION;
747 STRUCT!{struct FILE_FULL_EA_INFORMATION {
748     NextEntryOffset: ULONG,
749     Flags: UCHAR,
750     EaNameLength: UCHAR,
751     EaValueLength: USHORT,
752     EaName: [CHAR; 1],
753 }}
754 pub type PFILE_FULL_EA_INFORMATION = *mut FILE_FULL_EA_INFORMATION;
755 STRUCT!{struct FILE_GET_EA_INFORMATION {
756     NextEntryOffset: ULONG,
757     EaNameLength: UCHAR,
758     EaName: [CHAR; 1],
759 }}
760 pub type PFILE_GET_EA_INFORMATION = *mut FILE_GET_EA_INFORMATION;
761 STRUCT!{struct FILE_GET_QUOTA_INFORMATION {
762     NextEntryOffset: ULONG,
763     SidLength: ULONG,
764     Sid: SID,
765 }}
766 pub type PFILE_GET_QUOTA_INFORMATION = *mut FILE_GET_QUOTA_INFORMATION;
767 STRUCT!{struct FILE_QUOTA_INFORMATION {
768     NextEntryOffset: ULONG,
769     SidLength: ULONG,
770     ChangeTime: LARGE_INTEGER,
771     QuotaUsed: LARGE_INTEGER,
772     QuotaThreshold: LARGE_INTEGER,
773     QuotaLimit: LARGE_INTEGER,
774     Sid: SID,
775 }}
776 pub type PFILE_QUOTA_INFORMATION = *mut FILE_QUOTA_INFORMATION;
777 ENUM!{enum FS_INFORMATION_CLASS {
778     FileFsVolumeInformation = 1,
779     FileFsLabelInformation = 2,
780     FileFsSizeInformation = 3,
781     FileFsDeviceInformation = 4,
782     FileFsAttributeInformation = 5,
783     FileFsControlInformation = 6,
784     FileFsFullSizeInformation = 7,
785     FileFsObjectIdInformation = 8,
786     FileFsDriverPathInformation = 9,
787     FileFsVolumeFlagsInformation = 10,
788     FileFsSectorSizeInformation = 11,
789     FileFsDataCopyInformation = 12,
790     FileFsMetadataSizeInformation = 13,
791     FileFsFullSizeInformationEx = 14,
792     FileFsMaximumInformation = 15,
793 }}
794 pub type PFS_INFORMATION_CLASS = *mut FS_INFORMATION_CLASS;
795 STRUCT!{struct FILE_FS_LABEL_INFORMATION {
796     VolumeLabelLength: ULONG,
797     VolumeLabel: [WCHAR; 1],
798 }}
799 pub type PFILE_FS_LABEL_INFORMATION = *mut FILE_FS_LABEL_INFORMATION;
800 STRUCT!{struct FILE_FS_VOLUME_INFORMATION {
801     VolumeCreationTime: LARGE_INTEGER,
802     VolumeSerialNumber: ULONG,
803     VolumeLabelLength: ULONG,
804     SupportsObjects: BOOLEAN,
805     VolumeLabel: [WCHAR; 1],
806 }}
807 pub type PFILE_FS_VOLUME_INFORMATION = *mut FILE_FS_VOLUME_INFORMATION;
808 STRUCT!{struct FILE_FS_SIZE_INFORMATION {
809     TotalAllocationUnits: LARGE_INTEGER,
810     AvailableAllocationUnits: LARGE_INTEGER,
811     SectorsPerAllocationUnit: ULONG,
812     BytesPerSector: ULONG,
813 }}
814 pub type PFILE_FS_SIZE_INFORMATION = *mut FILE_FS_SIZE_INFORMATION;
815 STRUCT!{struct FILE_FS_CONTROL_INFORMATION {
816     FreeSpaceStartFiltering: LARGE_INTEGER,
817     FreeSpaceThreshold: LARGE_INTEGER,
818     FreeSpaceStopFiltering: LARGE_INTEGER,
819     DefaultQuotaThreshold: LARGE_INTEGER,
820     DefaultQuotaLimit: LARGE_INTEGER,
821     FileSystemControlFlags: ULONG,
822 }}
823 pub type PFILE_FS_CONTROL_INFORMATION = *mut FILE_FS_CONTROL_INFORMATION;
824 STRUCT!{struct FILE_FS_FULL_SIZE_INFORMATION {
825     TotalAllocationUnits: LARGE_INTEGER,
826     CallerAvailableAllocationUnits: LARGE_INTEGER,
827     ActualAvailableAllocationUnits: LARGE_INTEGER,
828     SectorsPerAllocationUnit: ULONG,
829     BytesPerSector: ULONG,
830 }}
831 pub type PFILE_FS_FULL_SIZE_INFORMATION = *mut FILE_FS_FULL_SIZE_INFORMATION;
832 STRUCT!{struct FILE_FS_OBJECTID_INFORMATION {
833     ObjectId: [UCHAR; 16],
834     ExtendedInfo: [UCHAR; 48],
835 }}
836 pub type PFILE_FS_OBJECTID_INFORMATION = *mut FILE_FS_OBJECTID_INFORMATION;
837 STRUCT!{struct FILE_FS_DEVICE_INFORMATION {
838     DeviceType: DWORD,
839     Characteristics: ULONG,
840 }}
841 pub type PFILE_FS_DEVICE_INFORMATION = *mut FILE_FS_DEVICE_INFORMATION;
842 STRUCT!{struct FILE_FS_ATTRIBUTE_INFORMATION {
843     FileSystemAttributes: ULONG,
844     MaximumComponentNameLength: LONG,
845     FileSystemNameLength: ULONG,
846     FileSystemName: [WCHAR; 1],
847 }}
848 pub type PFILE_FS_ATTRIBUTE_INFORMATION = *mut FILE_FS_ATTRIBUTE_INFORMATION;
849 STRUCT!{struct FILE_FS_DRIVER_PATH_INFORMATION {
850     DriverInPath: BOOLEAN,
851     DriverNameLength: ULONG,
852     DriverName: [WCHAR; 1],
853 }}
854 pub type PFILE_FS_DRIVER_PATH_INFORMATION = *mut FILE_FS_DRIVER_PATH_INFORMATION;
855 STRUCT!{struct FILE_FS_VOLUME_FLAGS_INFORMATION {
856     Flags: ULONG,
857 }}
858 pub type PFILE_FS_VOLUME_FLAGS_INFORMATION = *mut FILE_FS_VOLUME_FLAGS_INFORMATION;
859 pub const SSINFO_FLAGS_ALIGNED_DEVICE: u32 = 0x00000001;
860 pub const SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE: u32 = 0x00000002;
861 pub const SSINFO_OFFSET_UNKNOWN: u32 = 0xffffffff;
862 STRUCT!{struct FILE_FS_SECTOR_SIZE_INFORMATION {
863     LogicalBytesPerSector: ULONG,
864     PhysicalBytesPerSectorForAtomicity: ULONG,
865     PhysicalBytesPerSectorForPerformance: ULONG,
866     FileSystemEffectivePhysicalBytesPerSectorForAtomicity: ULONG,
867     Flags: ULONG,
868     ByteOffsetForSectorAlignment: ULONG,
869     ByteOffsetForPartitionAlignment: ULONG,
870 }}
871 pub type PFILE_FS_SECTOR_SIZE_INFORMATION = *mut FILE_FS_SECTOR_SIZE_INFORMATION;
872 STRUCT!{struct FILE_FS_DATA_COPY_INFORMATION {
873     NumberOfCopies: ULONG,
874 }}
875 pub type PFILE_FS_DATA_COPY_INFORMATION = *mut FILE_FS_DATA_COPY_INFORMATION;
876 STRUCT!{struct FILE_FS_METADATA_SIZE_INFORMATION {
877     TotalMetadataAllocationUnits: LARGE_INTEGER,
878     SectorsPerAllocationUnit: ULONG,
879     BytesPerSector: ULONG,
880 }}
881 pub type PFILE_FS_METADATA_SIZE_INFORMATION = *mut FILE_FS_METADATA_SIZE_INFORMATION;
882 STRUCT!{struct FILE_FS_FULL_SIZE_INFORMATION_EX {
883     ActualTotalAllocationUnits: ULONGLONG,
884     ActualAvailableAllocationUnits: ULONGLONG,
885     ActualPoolUnavailableAllocationUnits: ULONGLONG,
886     CallerTotalAllocationUnits: ULONGLONG,
887     CallerAvailableAllocationUnits: ULONGLONG,
888     CallerPoolUnavailableAllocationUnits: ULONGLONG,
889     UsedAllocationUnits: ULONGLONG,
890     TotalReservedAllocationUnits: ULONGLONG,
891     VolumeStorageReserveAllocationUnits: ULONGLONG,
892     AvailableCommittedAllocationUnits: ULONGLONG,
893     PoolAvailableAllocationUnits: ULONGLONG,
894     SectorsPerAllocationUnit: ULONG,
895     BytesPerSector: ULONG,
896 }}
897 pub type PFILE_FS_FULL_SIZE_INFORMATION_EX = *mut FILE_FS_FULL_SIZE_INFORMATION_EX;
898 EXTERN!{extern "system" {
899     fn NtCreateFile(
900         FileHandle: PHANDLE,
901         DesiredAccess: ACCESS_MASK,
902         ObjectAttributes: POBJECT_ATTRIBUTES,
903         IoStatusBlock: PIO_STATUS_BLOCK,
904         AllocationSize: PLARGE_INTEGER,
905         FileAttributes: ULONG,
906         ShareAccess: ULONG,
907         CreateDisposition: ULONG,
908         CreateOptions: ULONG,
909         EaBuffer: PVOID,
910         EaLength: ULONG,
911     ) -> NTSTATUS;
912     fn NtCreateNamedPipeFile(
913         FileHandle: PHANDLE,
914         DesiredAccess: ULONG,
915         ObjectAttributes: POBJECT_ATTRIBUTES,
916         IoStatusBlock: PIO_STATUS_BLOCK,
917         ShareAccess: ULONG,
918         CreateDisposition: ULONG,
919         CreateOptions: ULONG,
920         NamedPipeType: ULONG,
921         ReadMode: ULONG,
922         CompletionMode: ULONG,
923         MaximumInstances: ULONG,
924         InboundQuota: ULONG,
925         OutboundQuota: ULONG,
926         DefaultTimeout: PLARGE_INTEGER,
927     ) -> NTSTATUS;
928     fn NtCreateMailslotFile(
929         FileHandle: PHANDLE,
930         DesiredAccess: ULONG,
931         ObjectAttributes: POBJECT_ATTRIBUTES,
932         IoStatusBlock: PIO_STATUS_BLOCK,
933         CreateOptions: ULONG,
934         MailslotQuota: ULONG,
935         MaximumMessageSize: ULONG,
936         ReadTimeout: PLARGE_INTEGER,
937     ) -> NTSTATUS;
938     fn NtOpenFile(
939         FileHandle: PHANDLE,
940         DesiredAccess: ACCESS_MASK,
941         ObjectAttributes: POBJECT_ATTRIBUTES,
942         IoStatusBlock: PIO_STATUS_BLOCK,
943         ShareAccess: ULONG,
944         OpenOptions: ULONG,
945     ) -> NTSTATUS;
946     fn NtDeleteFile(
947         ObjectAttributes: POBJECT_ATTRIBUTES,
948     ) -> NTSTATUS;
949     fn NtFlushBuffersFile(
950         FileHandle: HANDLE,
951         IoStatusBlock: PIO_STATUS_BLOCK,
952     ) -> NTSTATUS;
953     fn NtFlushBuffersFileEx(
954         FileHandle: HANDLE,
955         Flags: ULONG,
956         Parameters: PVOID,
957         ParametersSize: ULONG,
958         IoStatusBlock: PIO_STATUS_BLOCK,
959     ) -> NTSTATUS;
960     fn NtQueryInformationFile(
961         FileHandle: HANDLE,
962         IoStatusBlock: PIO_STATUS_BLOCK,
963         FileInformation: PVOID,
964         Length: ULONG,
965         FileInformationClass: FILE_INFORMATION_CLASS,
966     ) -> NTSTATUS;
967     fn NtQueryInformationByName(
968         ObjectAttributes: POBJECT_ATTRIBUTES,
969         IoStatusBlock: PIO_STATUS_BLOCK,
970         FileInformation: PVOID,
971         Length: ULONG,
972         FileInformationClass: FILE_INFORMATION_CLASS,
973     ) -> NTSTATUS;
974     fn NtSetInformationFile(
975         FileHandle: HANDLE,
976         IoStatusBlock: PIO_STATUS_BLOCK,
977         FileInformation: PVOID,
978         Length: ULONG,
979         FileInformationClass: FILE_INFORMATION_CLASS,
980     ) -> NTSTATUS;
981     fn NtQueryDirectoryFile(
982         FileHandle: HANDLE,
983         Event: HANDLE,
984         ApcRoutine: PIO_APC_ROUTINE,
985         ApcContext: PVOID,
986         IoStatusBlock: PIO_STATUS_BLOCK,
987         FileInformation: PVOID,
988         Length: ULONG,
989         FileInformationClass: FILE_INFORMATION_CLASS,
990         ReturnSingleEntry: BOOLEAN,
991         FileName: PUNICODE_STRING,
992         RestartScan: BOOLEAN,
993     ) -> NTSTATUS;
994     fn NtQueryEaFile(
995         FileHandle: HANDLE,
996         IoStatusBlock: PIO_STATUS_BLOCK,
997         Buffer: PVOID,
998         Length: ULONG,
999         ReturnSingleEntry: BOOLEAN,
1000         EaList: PVOID,
1001         EaListLength: ULONG,
1002         EaIndex: PULONG,
1003         RestartScan: BOOLEAN,
1004     ) -> NTSTATUS;
1005     fn NtSetEaFile(
1006         FileHandle: HANDLE,
1007         IoStatusBlock: PIO_STATUS_BLOCK,
1008         Buffer: PVOID,
1009         Length: ULONG,
1010     ) -> NTSTATUS;
1011     fn NtQueryQuotaInformationFile(
1012         FileHandle: HANDLE,
1013         IoStatusBlock: PIO_STATUS_BLOCK,
1014         Buffer: PVOID,
1015         Length: ULONG,
1016         ReturnSingleEntry: BOOLEAN,
1017         SidList: PVOID,
1018         SidListLength: ULONG,
1019         StartSid: PSID,
1020         RestartScan: BOOLEAN,
1021     ) -> NTSTATUS;
1022     fn NtSetQuotaInformationFile(
1023         FileHandle: HANDLE,
1024         IoStatusBlock: PIO_STATUS_BLOCK,
1025         Buffer: PVOID,
1026         Length: ULONG,
1027     ) -> NTSTATUS;
1028     fn NtQueryVolumeInformationFile(
1029         FileHandle: HANDLE,
1030         IoStatusBlock: PIO_STATUS_BLOCK,
1031         FsInformation: PVOID,
1032         Length: ULONG,
1033         FsInformationClass: FS_INFORMATION_CLASS,
1034     ) -> NTSTATUS;
1035     fn NtSetVolumeInformationFile(
1036         FileHandle: HANDLE,
1037         IoStatusBlock: PIO_STATUS_BLOCK,
1038         FsInformation: PVOID,
1039         Length: ULONG,
1040         FsInformationClass: FS_INFORMATION_CLASS,
1041     ) -> NTSTATUS;
1042     fn NtCancelIoFile(
1043         FileHandle: HANDLE,
1044         IoStatusBlock: PIO_STATUS_BLOCK,
1045     ) -> NTSTATUS;
1046     fn NtCancelIoFileEx(
1047         FileHandle: HANDLE,
1048         IoRequestToCancel: PIO_STATUS_BLOCK,
1049         IoStatusBlock: PIO_STATUS_BLOCK,
1050     ) -> NTSTATUS;
1051     fn NtCancelSynchronousIoFile(
1052         ThreadHandle: HANDLE,
1053         IoRequestToCancel: PIO_STATUS_BLOCK,
1054         IoStatusBlock: PIO_STATUS_BLOCK,
1055     ) -> NTSTATUS;
1056     fn NtDeviceIoControlFile(
1057         FileHandle: HANDLE,
1058         Event: HANDLE,
1059         ApcRoutine: PIO_APC_ROUTINE,
1060         ApcContext: PVOID,
1061         IoStatusBlock: PIO_STATUS_BLOCK,
1062         IoControlCode: ULONG,
1063         InputBuffer: PVOID,
1064         InputBufferLength: ULONG,
1065         OutputBuffer: PVOID,
1066         OutputBufferLength: ULONG,
1067     ) -> NTSTATUS;
1068     fn NtFsControlFile(
1069         FileHandle: HANDLE,
1070         Event: HANDLE,
1071         ApcRoutine: PIO_APC_ROUTINE,
1072         ApcContext: PVOID,
1073         IoStatusBlock: PIO_STATUS_BLOCK,
1074         FsControlCode: ULONG,
1075         InputBuffer: PVOID,
1076         InputBufferLength: ULONG,
1077         OutputBuffer: PVOID,
1078         OutputBufferLength: ULONG,
1079     ) -> NTSTATUS;
1080     fn NtReadFile(
1081         FileHandle: HANDLE,
1082         Event: HANDLE,
1083         ApcRoutine: PIO_APC_ROUTINE,
1084         ApcContext: PVOID,
1085         IoStatusBlock: PIO_STATUS_BLOCK,
1086         Buffer: PVOID,
1087         Length: ULONG,
1088         ByteOffset: PLARGE_INTEGER,
1089         Key: PULONG,
1090     ) -> NTSTATUS;
1091     fn NtWriteFile(
1092         FileHandle: HANDLE,
1093         Event: HANDLE,
1094         ApcRoutine: PIO_APC_ROUTINE,
1095         ApcContext: PVOID,
1096         IoStatusBlock: PIO_STATUS_BLOCK,
1097         Buffer: PVOID,
1098         Length: ULONG,
1099         ByteOffset: PLARGE_INTEGER,
1100         Key: PULONG,
1101     ) -> NTSTATUS;
1102     fn NtReadFileScatter(
1103         FileHandle: HANDLE,
1104         Event: HANDLE,
1105         ApcRoutine: PIO_APC_ROUTINE,
1106         ApcContext: PVOID,
1107         IoStatusBlock: PIO_STATUS_BLOCK,
1108         SegmentArray: PFILE_SEGMENT_ELEMENT,
1109         Length: ULONG,
1110         ByteOffset: PLARGE_INTEGER,
1111         Key: PULONG,
1112     ) -> NTSTATUS;
1113     fn NtWriteFileGather(
1114         FileHandle: HANDLE,
1115         Event: HANDLE,
1116         ApcRoutine: PIO_APC_ROUTINE,
1117         ApcContext: PVOID,
1118         IoStatusBlock: PIO_STATUS_BLOCK,
1119         SegmentArray: PFILE_SEGMENT_ELEMENT,
1120         Length: ULONG,
1121         ByteOffset: PLARGE_INTEGER,
1122         Key: PULONG,
1123     ) -> NTSTATUS;
1124     fn NtLockFile(
1125         FileHandle: HANDLE,
1126         Event: HANDLE,
1127         ApcRoutine: PIO_APC_ROUTINE,
1128         ApcContext: PVOID,
1129         IoStatusBlock: PIO_STATUS_BLOCK,
1130         ByteOffset: PLARGE_INTEGER,
1131         Length: PLARGE_INTEGER,
1132         Key: ULONG,
1133         FailImmediately: BOOLEAN,
1134         ExclusiveLock: BOOLEAN,
1135     ) -> NTSTATUS;
1136     fn NtUnlockFile(
1137         FileHandle: HANDLE,
1138         IoStatusBlock: PIO_STATUS_BLOCK,
1139         ByteOffset: PLARGE_INTEGER,
1140         Length: PLARGE_INTEGER,
1141         Key: ULONG,
1142     ) -> NTSTATUS;
1143     fn NtQueryAttributesFile(
1144         ObjectAttributes: POBJECT_ATTRIBUTES,
1145         FileInformation: PFILE_BASIC_INFORMATION,
1146     ) -> NTSTATUS;
1147     fn NtQueryFullAttributesFile(
1148         ObjectAttributes: POBJECT_ATTRIBUTES,
1149         FileInformation: PFILE_NETWORK_OPEN_INFORMATION,
1150     ) -> NTSTATUS;
1151     fn NtNotifyChangeDirectoryFile(
1152         FileHandle: HANDLE,
1153         Event: HANDLE,
1154         ApcRoutine: PIO_APC_ROUTINE,
1155         ApcContext: PVOID,
1156         IoStatusBlock: PIO_STATUS_BLOCK,
1157         Buffer: PVOID,
1158         Length: ULONG,
1159         CompletionFilter: ULONG,
1160         WatchTree: BOOLEAN,
1161     ) -> NTSTATUS;
1162     fn NtLoadDriver(
1163         DriverServiceName: PUNICODE_STRING,
1164     ) -> NTSTATUS;
1165     fn NtUnloadDriver(
1166         DriverServiceName: PUNICODE_STRING,
1167     ) -> NTSTATUS;
1168 }}
1169 pub const IO_COMPLETION_QUERY_STATE: u32 = 0x0001;
1170 ENUM!{enum IO_COMPLETION_INFORMATION_CLASS {
1171     IoCompletionBasicInformation = 0,
1172 }}
1173 STRUCT!{struct IO_COMPLETION_BASIC_INFORMATION {
1174     Depth: LONG,
1175 }}
1176 pub type PIO_COMPLETION_BASIC_INFORMATION = *mut IO_COMPLETION_BASIC_INFORMATION;
1177 EXTERN!{extern "system" {
1178     fn NtCreateIoCompletion(
1179         IoCompletionHandle: PHANDLE,
1180         DesiredAccess: ACCESS_MASK,
1181         ObjectAttributes: POBJECT_ATTRIBUTES,
1182         Count: ULONG,
1183     ) -> NTSTATUS;
1184     fn NtOpenIoCompletion(
1185         IoCompletionHandle: PHANDLE,
1186         DesiredAccess: ACCESS_MASK,
1187         ObjectAttributes: POBJECT_ATTRIBUTES,
1188     ) -> NTSTATUS;
1189     fn NtQueryIoCompletion(
1190         IoCompletionHandle: HANDLE,
1191         IoCompletionInformationClass: IO_COMPLETION_INFORMATION_CLASS,
1192         IoCompletionInformation: PVOID,
1193         IoCompletionInformationLength: ULONG,
1194         ReturnLength: PULONG,
1195     ) -> NTSTATUS;
1196     fn NtSetIoCompletion(
1197         IoCompletionHandle: HANDLE,
1198         KeyContext: PVOID,
1199         ApcContext: PVOID,
1200         IoStatus: NTSTATUS,
1201         IoStatusInformation: ULONG_PTR,
1202     ) -> NTSTATUS;
1203     fn NtSetIoCompletionEx(
1204         IoCompletionHandle: HANDLE,
1205         IoCompletionPacketHandle: HANDLE,
1206         KeyContext: PVOID,
1207         ApcContext: PVOID,
1208         IoStatus: NTSTATUS,
1209         IoStatusInformation: ULONG_PTR,
1210     ) -> NTSTATUS;
1211     fn NtRemoveIoCompletion(
1212         IoCompletionHandle: HANDLE,
1213         KeyContext: *mut PVOID,
1214         ApcContext: *mut PVOID,
1215         IoStatusBlock: PIO_STATUS_BLOCK,
1216         Timeout: PLARGE_INTEGER,
1217     ) -> NTSTATUS;
1218     fn NtRemoveIoCompletionEx(
1219         IoCompletionHandle: HANDLE,
1220         IoCompletionInformation: PFILE_IO_COMPLETION_INFORMATION,
1221         Count: ULONG,
1222         NumEntriesRemoved: PULONG,
1223         Timeout: PLARGE_INTEGER,
1224         Alertable: BOOLEAN,
1225     ) -> NTSTATUS;
1226     fn NtCreateWaitCompletionPacket(
1227         WaitCompletionPacketHandle: PHANDLE,
1228         DesiredAccess: ACCESS_MASK,
1229         ObjectAttributes: POBJECT_ATTRIBUTES,
1230     ) -> NTSTATUS;
1231     fn NtAssociateWaitCompletionPacket(
1232         WaitCompletionPacketHandle: HANDLE,
1233         IoCompletionHandle: HANDLE,
1234         TargetObjectHandle: HANDLE,
1235         KeyContext: PVOID,
1236         ApcContext: PVOID,
1237         IoStatus: NTSTATUS,
1238         IoStatusInformation: ULONG_PTR,
1239         AlreadySignaled: PBOOLEAN,
1240     ) -> NTSTATUS;
1241     fn NtCancelWaitCompletionPacket(
1242         WaitCompletionPacketHandle: HANDLE,
1243         RemoveSignaledPacket: BOOLEAN,
1244     ) -> NTSTATUS;
1245 }}
1246 ENUM!{enum IO_SESSION_EVENT {
1247     IoSessionEventIgnore = 0,
1248     IoSessionEventCreated = 1,
1249     IoSessionEventTerminated = 2,
1250     IoSessionEventConnected = 3,
1251     IoSessionEventDisconnected = 4,
1252     IoSessionEventLogon = 5,
1253     IoSessionEventLogoff = 6,
1254     IoSessionEventMax = 7,
1255 }}
1256 ENUM!{enum IO_SESSION_STATE {
1257     IoSessionStateCreated = 0,
1258     IoSessionStateInitialized = 1,
1259     IoSessionStateConnected = 2,
1260     IoSessionStateDisconnected = 3,
1261     IoSessionStateDisconnectedLoggedOn = 4,
1262     IoSessionStateLoggedOn = 5,
1263     IoSessionStateLoggedOff = 6,
1264     IoSessionStateTerminated = 7,
1265     IoSessionStateMax = 8,
1266 }}
1267 EXTERN!{extern "system" {
1268     fn NtNotifyChangeSession(
1269         SessionHandle: HANDLE,
1270         ChangeSequenceNumber: ULONG,
1271         ChangeTimeStamp: PLARGE_INTEGER,
1272         Event: IO_SESSION_EVENT,
1273         NewState: IO_SESSION_STATE,
1274         PreviousState: IO_SESSION_STATE,
1275         Payload: PVOID,
1276         PayloadSize: ULONG,
1277     ) -> NTSTATUS;
1278 }}
1279 ENUM!{enum INTERFACE_TYPE {
1280     InterfaceTypeUndefined = -1i32 as u32,
1281     Internal = 0,
1282     Isa = 1,
1283     Eisa = 2,
1284     MicroChannel = 3,
1285     TurboChannel = 4,
1286     PCIBus = 5,
1287     VMEBus = 6,
1288     NuBus = 7,
1289     PCMCIABus = 8,
1290     CBus = 9,
1291     MPIBus = 10,
1292     MPSABus = 11,
1293     ProcessorInternal = 12,
1294     InternalPowerBus = 13,
1295     PNPISABus = 14,
1296     PNPBus = 15,
1297     Vmcs = 16,
1298     MaximumInterfaceType = 17,
1299 }}
1300 pub type PINTERFACE_TYPE = *mut INTERFACE_TYPE;
1301 ENUM!{enum DMA_WIDTH {
1302     Width8Bits = 0,
1303     Width16Bits = 1,
1304     Width32Bits = 2,
1305     MaximumDmaWidth = 3,
1306 }}
1307 pub type PDMA_WIDTH = *mut DMA_WIDTH;
1308 ENUM!{enum DMA_SPEED {
1309     Compatible = 0,
1310     TypeA = 1,
1311     TypeB = 2,
1312     TypeC = 3,
1313     TypeF = 4,
1314     MaximumDmaSpeed = 5,
1315 }}
1316 pub type PDMA_SPEED = *mut DMA_SPEED;
1317 ENUM!{enum BUS_DATA_TYPE {
1318     ConfigurationSpaceUndefined = -1i32 as u32,
1319     Cmos = 0,
1320     EisaConfiguration = 1,
1321     Pos = 2,
1322     CbusConfiguration = 3,
1323     PCIConfiguration = 4,
1324     VMEConfiguration = 5,
1325     NuBusConfiguration = 6,
1326     PCMCIAConfiguration = 7,
1327     MPIConfiguration = 8,
1328     MPSAConfiguration = 9,
1329     PNPISAConfiguration = 10,
1330     SgiInternalConfiguration = 11,
1331     MaximumBusDataType = 12,
1332 }}
1333 pub type PBUS_DATA_TYPE = *mut BUS_DATA_TYPE;
1334 pub const SYMLINK_FLAG_RELATIVE: u32 = 1;
1335 STRUCT!{struct REPARSE_DATA_BUFFER_u_SymbolicLinkReparseBuffer {
1336     SubstituteNameOffset: USHORT,
1337     SubstituteNameLength: USHORT,
1338     PrintNameOffset: USHORT,
1339     PrintNameLength: USHORT,
1340     Flags: ULONG,
1341     PathBuffer: [WCHAR; 1],
1342 }}
1343 STRUCT!{struct REPARSE_DATA_BUFFER_u_MountPointReparseBuffer {
1344     SubstituteNameOffset: USHORT,
1345     SubstituteNameLength: USHORT,
1346     PrintNameOffset: USHORT,
1347     PrintNameLength: USHORT,
1348     PathBuffer: [WCHAR; 1],
1349 }}
1350 STRUCT!{struct REPARSE_DATA_BUFFER_u_GenericReparseBuffer {
1351     DataBuffer: [UCHAR; 1],
1352 }}
1353 UNION!{union REPARSE_DATA_BUFFER_u {
1354     SymbolicLinkReparseBuffer: REPARSE_DATA_BUFFER_u_SymbolicLinkReparseBuffer,
1355     MountPointReparseBuffer: REPARSE_DATA_BUFFER_u_MountPointReparseBuffer,
1356     GenericReparseBuffer: REPARSE_DATA_BUFFER_u_GenericReparseBuffer,
1357 }}
1358 STRUCT!{struct REPARSE_DATA_BUFFER {
1359     ReparseTag: ULONG,
1360     ReparseDataLength: USHORT,
1361     Reserved: USHORT,
1362     u: REPARSE_DATA_BUFFER_u,
1363 }}
1364 pub type PREPARSE_DATA_BUFFER = *mut REPARSE_DATA_BUFFER;
1365 /// "\Device\NamedPipe\"
1366 pub const DEVICE_NAMED_PIPE: UTF16Const = UTF16Const(&[
1367     0x005C, 0x0044, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x005C, 0x004E, 0x0061, 0x006D, 0x0065,
1368     0x0064, 0x0050, 0x0069, 0x0070, 0x0065, 0x005C, 0u16,
1369 ]);
1370 pub const FSCTL_PIPE_ASSIGN_EVENT: u32 =
1371     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS);
1372 pub const FSTL_PIPE_DISCONNECT: u32 =
1373     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS);
1374 pub const FSTL_PIPE_LISTEN: u32 =
1375     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS);
1376 pub const FSTL_PIPE_PEEK: u32 =
1377     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA);
1378 pub const FSTL_PIPE_QUERY_EVENT: u32 =
1379     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS);
1380 pub const FSTL_PIPE_TRANSCEIVE: u32 =
1381     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA);
1382 pub const FSTL_PIPE_WAIT: u32 =
1383     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS);
1384 pub const FSTL_PIPE_IMPERSONATE: u32 =
1385     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS);
1386 pub const FSTL_PIPE_SET_CLIENT_PROCESS: u32 =
1387     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS);
1388 pub const FSTL_PIPE_QUERY_CLIENT_PROCESS: u32 =
1389     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS);
1390 pub const FSTL_PIPE_GET_PIPE_ATTRIBUTE: u32 =
1391     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS);
1392 pub const FSTL_PIPE_SET_PIPE_ATTRIBUTE: u32 =
1393     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS);
1394 pub const FSTL_PIPE_GET_CONNECTION_ATTRIBUTE: u32 =
1395     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS);
1396 pub const FSTL_PIPE_SET_CONNECTION_ATTRIBUTE: u32 =
1397     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS);
1398 pub const FSTL_PIPE_GET_HANDLE_ATTRIBUTE: u32 =
1399     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS);
1400 pub const FSTL_PIPE_SET_HANDLE_ATTRIBUTE: u32 =
1401     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS);
1402 pub const FSTL_PIPE_FLUSH: u32 =
1403     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA);
1404 pub const FSTL_PIPE_INTERNAL_READ: u32 =
1405     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA);
1406 pub const FSTL_PIPE_INTERNAL_WRITE: u32 =
1407     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA);
1408 pub const FSTL_PIPE_INTERNAL_TRANSCEIVE: u32 =
1409     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA);
1410 pub const FSTL_PIPE_INTERNAL_READ_OVFLOW: u32 =
1411     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA);
1412 pub const FILE_PIPE_READ_DATA: u32 = 0x00000000;
1413 pub const FILE_PIPE_WRITE_SPACE: u32 = 0x00000001;
1414 STRUCT!{struct FILE_PIPE_ASSIGN_EVENT_BUFFER {
1415     EventHandle: HANDLE,
1416     KeyValue: ULONG,
1417 }}
1418 pub type PFILE_PIPE_ASSIGN_EVENT_BUFFER = *mut FILE_PIPE_ASSIGN_EVENT_BUFFER;
1419 STRUCT!{struct FILE_PIPE_PEEK_BUFFER {
1420     NamedPipeState: ULONG,
1421     ReadDataAvailable: ULONG,
1422     NumberOfMessages: ULONG,
1423     MessageLength: ULONG,
1424     Data: [CHAR; 1],
1425 }}
1426 pub type PFILE_PIPE_PEEK_BUFFER = *mut FILE_PIPE_PEEK_BUFFER;
1427 STRUCT!{struct FILE_PIPE_EVENT_BUFFER {
1428     NamedPipeState: ULONG,
1429     EntryType: ULONG,
1430     ByteCount: ULONG,
1431     KeyValue: ULONG,
1432     NumberRequests: ULONG,
1433 }}
1434 pub type PFILE_PIPE_EVENT_BUFFER = *mut FILE_PIPE_EVENT_BUFFER;
1435 STRUCT!{struct FILE_PIPE_WAIT_FOR_BUFFER {
1436     Timeout: LARGE_INTEGER,
1437     NameLength: ULONG,
1438     TimeoutSpecified: BOOLEAN,
1439     Name: [WCHAR; 1],
1440 }}
1441 pub type PFILE_PIPE_WAIT_FOR_BUFFER = *mut FILE_PIPE_WAIT_FOR_BUFFER;
1442 STRUCT!{struct FILE_PIPE_CLIENT_PROCESS_BUFFER {
1443     ClientSession: PVOID,
1444     ClientProcess: PVOID,
1445 }}
1446 pub type PFILE_PIPE_CLIENT_PROCESS_BUFFER = *mut FILE_PIPE_CLIENT_PROCESS_BUFFER;
1447 pub const FILE_PIPE_COMPUTER_NAME_LENGTH: usize = 15;
1448 STRUCT!{struct FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
1449     ClientSession: PVOID,
1450     ClientProcess: PVOID,
1451     ClientComputerNameLength: USHORT,
1452     ClientComputerBuffer: [WCHAR; FILE_PIPE_COMPUTER_NAME_LENGTH + 1],
1453 }}
1454 pub type PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX = *mut FILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
1455 pub const MAILSLOT_CLASS_FIRSTCLASS: u32 = 1;
1456 pub const MAILSLOT_CLASS_SECONDCLASS: u32 = 2;
1457 pub const FSCTL_MAILSLOT_PEEK: u32 =
1458     CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA);
1459 STRUCT!{struct FILE_MAILSLOT_PEEK_BUFFER {
1460     ReadDataAvailable: ULONG,
1461     NumberOfMessages: ULONG,
1462     MessageLength: ULONG,
1463 }}
1464 pub type PFILE_MAILSLOT_PEEK_BUFFER = *mut FILE_MAILSLOT_PEEK_BUFFER;
1465