use crate::string::UTF16Const; use crate::winapi_local::um::winioctl::CTL_CODE; use winapi::shared::basetsd::ULONG_PTR; use winapi::shared::guiddef::GUID; use winapi::shared::minwindef::DWORD; use winapi::shared::ntdef::{ BOOLEAN, CCHAR, CHAR, HANDLE, LARGE_INTEGER, LONG, LONGLONG, NTSTATUS, PBOOLEAN, PHANDLE, PLARGE_INTEGER, POBJECT_ATTRIBUTES, PUCHAR, PULONG, PUNICODE_STRING, PVOID, UCHAR, ULONG, ULONGLONG, USHORT, WCHAR, }; use winapi::um::winioctl::{ FILE_ANY_ACCESS, FILE_DEVICE_MAILSLOT, FILE_DEVICE_NAMED_PIPE, METHOD_BUFFERED, METHOD_NEITHER, }; use winapi::um::winnt::{ ACCESS_MASK, FILE_ID_128, FILE_READ_DATA, FILE_WRITE_DATA, PFILE_SEGMENT_ELEMENT, PSID, SID, }; pub const FILE_SUPERSEDE: ULONG = 0x00000000; pub const FILE_OPEN: ULONG = 0x00000001; pub const FILE_CREATE: ULONG = 0x00000002; pub const FILE_OPEN_IF: ULONG = 0x00000003; pub const FILE_OVERWRITE: ULONG = 0x00000004; pub const FILE_OVERWRITE_IF: ULONG = 0x00000005; pub const FILE_MAXIMUM_DISPOSITION: ULONG = 0x00000005; pub const FILE_DIRECTORY_FILE: ULONG = 0x00000001; pub const FILE_WRITE_THROUGH: ULONG = 0x00000002; pub const FILE_SEQUENTIAL_ONLY: ULONG = 0x00000004; pub const FILE_NO_INTERMEDIATE_BUFFERING: ULONG = 0x00000008; pub const FILE_SYNCHRONOUS_IO_ALERT: ULONG = 0x00000010; pub const FILE_SYNCHRONOUS_IO_NONALERT: ULONG = 0x00000020; pub const FILE_NON_DIRECTORY_FILE: ULONG = 0x00000040; pub const FILE_CREATE_TREE_CONNECTION: ULONG = 0x00000080; pub const FILE_COMPLETE_IF_OPLOCKED: ULONG = 0x00000100; pub const FILE_NO_EA_KNOWLEDGE: ULONG = 0x00000200; pub const FILE_OPEN_FOR_RECOVERY: ULONG = 0x00000400; pub const FILE_RANDOM_ACCESS: ULONG = 0x00000800; pub const FILE_DELETE_ON_CLOSE: ULONG = 0x00001000; pub const FILE_OPEN_BY_FILE_ID: ULONG = 0x00002000; pub const FILE_OPEN_FOR_BACKUP_INTENT: ULONG = 0x00004000; pub const FILE_NO_COMPRESSION: ULONG = 0x00008000; pub const FILE_OPEN_REQUIRING_OPLOCK: ULONG = 0x00010000; pub const FILE_DISALLOW_EXCLUSIVE: ULONG = 0x00020000; pub const FILE_SESSION_AWARE: ULONG = 0x00040000; pub const FILE_RESERVE_OPFILTER: ULONG = 0x00100000; pub const FILE_OPEN_REPARSE_POINT: ULONG = 0x00200000; pub const FILE_OPEN_NO_RECALL: ULONG = 0x00400000; pub const FILE_OPEN_FOR_FREE_SPACE_QUERY: ULONG = 0x00800000; pub const FILE_COPY_STRUCTURED_STORAGE: ULONG = 0x00000041; pub const FILE_STRUCTURED_STORAGE: ULONG = 0x00000441; pub const FILE_SUPERSEDED: ULONG = 0x00000000; pub const FILE_OPENED: ULONG = 0x00000001; pub const FILE_CREATED: ULONG = 0x00000002; pub const FILE_OVERWRITTEN: ULONG = 0x00000003; pub const FILE_EXISTS: ULONG = 0x00000004; pub const FILE_DOES_NOT_EXIST: ULONG = 0x00000005; pub const FILE_WRITE_TO_END_OF_FILE: ULONG = 0xffffffff; pub const FILE_USE_FILE_POINTER_POSITION: ULONG = 0xfffffffe; pub const FILE_BYTE_ALIGNMENT: ULONG = 0x00000000; pub const FILE_WORD_ALIGNMENT: ULONG = 0x00000001; pub const FILE_LONG_ALIGNMENT: ULONG = 0x00000003; pub const FILE_QUAD_ALIGNMENT: ULONG = 0x00000007; pub const FILE_OCTA_ALIGNMENT: ULONG = 0x0000000f; pub const FILE_32_BYTE_ALIGNMENT: ULONG = 0x0000001f; pub const FILE_64_BYTE_ALIGNMENT: ULONG = 0x0000003f; pub const FILE_128_BYTE_ALIGNMENT: ULONG = 0x0000007f; pub const FILE_256_BYTE_ALIGNMENT: ULONG = 0x000000ff; pub const FILE_512_BYTE_ALIGNMENT: ULONG = 0x000001ff; pub const MAXIMUM_FILENAME_LENGTH: u32 = 256; pub const FILE_NEED_EA: ULONG = 0x00000080; pub const FILE_EA_TYPE_BINARY: ULONG = 0xfffe; pub const FILE_EA_TYPE_ASCII: ULONG = 0xfffd; pub const FILE_EA_TYPE_BITMAP: ULONG = 0xfffb; pub const FILE_EA_TYPE_METAFILE: ULONG = 0xfffa; pub const FILE_EA_TYPE_ICON: ULONG = 0xfff9; pub const FILE_EA_TYPE_EA: ULONG = 0xffee; pub const FILE_EA_TYPE_MVMT: ULONG = 0xffdf; pub const FILE_EA_TYPE_MVST: ULONG = 0xffde; pub const FILE_EA_TYPE_ASN1: ULONG = 0xffdd; pub const FILE_EA_TYPE_FAMILY_IDS: ULONG = 0xff01; pub const FILE_REMOVABLE_MEDIA: ULONG = 0x00000001; pub const FILE_READ_ONLY_DEVICE: ULONG = 0x00000002; pub const FILE_FLOPPY_DISKETTE: ULONG = 0x00000004; pub const FILE_WRITE_ONCE_MEDIA: ULONG = 0x00000008; pub const FILE_REMOTE_DEVICE: ULONG = 0x00000010; pub const FILE_DEVICE_IS_MOUNTED: ULONG = 0x00000020; pub const FILE_VIRTUAL_VOLUME: ULONG = 0x00000040; pub const FILE_AUTOGENERATED_DEVICE_NAME: ULONG = 0x00000080; pub const FILE_DEVICE_SECURE_OPEN: ULONG = 0x00000100; pub const FILE_CHARACTERISTIC_PNP_DEVICE: ULONG = 0x00000800; pub const FILE_CHARACTERISTIC_TS_DEVICE: ULONG = 0x00001000; pub const FILE_CHARACTERISTIC_WEBDAV_DEVICE: ULONG = 0x00002000; pub const FILE_CHARACTERISTIC_CSV: ULONG = 0x00010000; pub const FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL: ULONG = 0x00020000; pub const FILE_PORTABLE_DEVICE: ULONG = 0x00040000; pub const FILE_PIPE_BYTE_STREAM_TYPE: ULONG = 0x00000000; pub const FILE_PIPE_MESSAGE_TYPE: ULONG = 0x00000001; pub const FILE_PIPE_ACCEPT_REMOTE_CLIENTS: ULONG = 0x00000000; pub const FILE_PIPE_REJECT_REMOTE_CLIENTS: ULONG = 0x00000002; pub const FILE_PIPE_TYPE_VALID_MASK: ULONG = 0x00000003; pub const FILE_PIPE_QUEUE_OPERATION: ULONG = 0x00000000; pub const FILE_PIPE_COMPLETE_OPERATION: ULONG = 0x00000001; pub const FILE_PIPE_BYTE_STREAM_MODE: ULONG = 0x00000000; pub const FILE_PIPE_MESSAGE_MODE: ULONG = 0x00000001; pub const FILE_PIPE_INBOUND: ULONG = 0x00000000; pub const FILE_PIPE_OUTBOUND: ULONG = 0x00000001; pub const FILE_PIPE_FULL_DUPLEX: ULONG = 0x00000002; pub const FILE_PIPE_DISCONNECTED_STATE: ULONG = 0x00000001; pub const FILE_PIPE_LISTENING_STATE: ULONG = 0x00000002; pub const FILE_PIPE_CONNECTED_STATE: ULONG = 0x00000003; pub const FILE_PIPE_CLOSING_STATE: ULONG = 0x00000004; pub const FILE_PIPE_CLIENT_END: ULONG = 0x00000000; pub const FILE_PIPE_SERVER_END: ULONG = 0x00000001; pub const MAILSLOT_SIZE_AUTO: u32 = 0; UNION!{union IO_STATUS_BLOCK_u { Status: NTSTATUS, Pointer: PVOID, }} STRUCT!{struct IO_STATUS_BLOCK { u: IO_STATUS_BLOCK_u, Information: ULONG_PTR, }} pub type PIO_STATUS_BLOCK = *mut IO_STATUS_BLOCK; FN!{stdcall PIO_APC_ROUTINE( ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, Reserved: ULONG, ) -> ()} STRUCT!{struct FILE_IO_COMPLETION_INFORMATION { KeyContext: PVOID, ApcContext: PVOID, IoStatusBlock: IO_STATUS_BLOCK, }} pub type PFILE_IO_COMPLETION_INFORMATION = *mut FILE_IO_COMPLETION_INFORMATION; ENUM!{enum FILE_INFORMATION_CLASS { FileDirectoryInformation = 1, FileFullDirectoryInformation = 2, FileBothDirectoryInformation = 3, FileBasicInformation = 4, FileStandardInformation = 5, FileInternalInformation = 6, FileEaInformation = 7, FileAccessInformation = 8, FileNameInformation = 9, FileRenameInformation = 10, FileLinkInformation = 11, FileNamesInformation = 12, FileDispositionInformation = 13, FilePositionInformation = 14, FileFullEaInformation = 15, FileModeInformation = 16, FileAlignmentInformation = 17, FileAllInformation = 18, FileAllocationInformation = 19, FileEndOfFileInformation = 20, FileAlternateNameInformation = 21, FileStreamInformation = 22, FilePipeInformation = 23, FilePipeLocalInformation = 24, FilePipeRemoteInformation = 25, FileMailslotQueryInformation = 26, FileMailslotSetInformation = 27, FileCompressionInformation = 28, FileObjectIdInformation = 29, FileCompletionInformation = 30, FileMoveClusterInformation = 31, FileQuotaInformation = 32, FileReparsePointInformation = 33, FileNetworkOpenInformation = 34, FileAttributeTagInformation = 35, FileTrackingInformation = 36, FileIdBothDirectoryInformation = 37, FileIdFullDirectoryInformation = 38, FileValidDataLengthInformation = 39, FileShortNameInformation = 40, FileIoCompletionNotificationInformation = 41, FileIoStatusBlockRangeInformation = 42, FileIoPriorityHintInformation = 43, FileSfioReserveInformation = 44, FileSfioVolumeInformation = 45, FileHardLinkInformation = 46, FileProcessIdsUsingFileInformation = 47, FileNormalizedNameInformation = 48, FileNetworkPhysicalNameInformation = 49, FileIdGlobalTxDirectoryInformation = 50, FileIsRemoteDeviceInformation = 51, FileUnusedInformation = 52, FileNumaNodeInformation = 53, FileStandardLinkInformation = 54, FileRemoteProtocolInformation = 55, FileRenameInformationBypassAccessCheck = 56, FileLinkInformationBypassAccessCheck = 57, FileVolumeNameInformation = 58, FileIdInformation = 59, FileIdExtdDirectoryInformation = 60, FileReplaceCompletionInformation = 61, FileHardLinkFullIdInformation = 62, FileIdExtdBothDirectoryInformation = 63, FileDispositionInformationEx = 64, FileRenameInformationEx = 65, FileRenameInformationExBypassAccessCheck = 66, FileDesiredStorageClassInformation = 67, FileStatInformation = 68, FileMemoryPartitionInformation = 69, FileStatLxInformation = 70, FileCaseSensitiveInformation = 71, FileLinkInformationEx = 72, FileLinkInformationExBypassAccessCheck = 73, FileStorageReserveIdInformation = 74, FileCaseSensitiveInformationForceAccessCheck = 75, FileMaximumInformation = 76, }} pub type PFILE_INFORMATION_CLASS = *mut FILE_INFORMATION_CLASS; STRUCT!{struct FILE_BASIC_INFORMATION { CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, FileAttributes: ULONG, }} pub type PFILE_BASIC_INFORMATION = *mut FILE_BASIC_INFORMATION; STRUCT!{struct FILE_STANDARD_INFORMATION { AllocationSize: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, NumberOfLinks: ULONG, DeletePending: BOOLEAN, Directory: BOOLEAN, }} pub type PFILE_STANDARD_INFORMATION = *mut FILE_STANDARD_INFORMATION; STRUCT!{struct FILE_STANDARD_INFORMATION_EX { AllocationSize: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, NumberOfLinks: ULONG, DeletePending: BOOLEAN, Directory: BOOLEAN, AlternateStream: BOOLEAN, MetadataAttribute: BOOLEAN, }} pub type PFILE_STANDARD_INFORMATION_EX = *mut FILE_STANDARD_INFORMATION_EX; STRUCT!{struct FILE_INTERNAL_INFORMATION { IndexNumber: LARGE_INTEGER, }} pub type PFILE_INTERNAL_INFORMATION = *mut FILE_INTERNAL_INFORMATION; STRUCT!{struct FILE_EA_INFORMATION { EaSize: ULONG, }} pub type PFILE_EA_INFORMATION = *mut FILE_EA_INFORMATION; STRUCT!{struct FILE_ACCESS_INFORMATION { AccessFlags: ACCESS_MASK, }} pub type PFILE_ACCESS_INFORMATION = *mut FILE_ACCESS_INFORMATION; STRUCT!{struct FILE_POSITION_INFORMATION { CurrentByteOffset: LARGE_INTEGER, }} pub type PFILE_POSITION_INFORMATION = *mut FILE_POSITION_INFORMATION; STRUCT!{struct FILE_MODE_INFORMATION { Mode: ULONG, }} pub type PFILE_MODE_INFORMATION = *mut FILE_MODE_INFORMATION; STRUCT!{struct FILE_ALIGNMENT_INFORMATION { AlignmentRequirement: ULONG, }} pub type PFILE_ALIGNMENT_INFORMATION = *mut FILE_ALIGNMENT_INFORMATION; STRUCT!{struct FILE_NAME_INFORMATION { FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_NAME_INFORMATION = *mut FILE_NAME_INFORMATION; STRUCT!{struct FILE_ALL_INFORMATION { BasicInformation: FILE_BASIC_INFORMATION, StandardInformation: FILE_STANDARD_INFORMATION, InternalInformation: FILE_INTERNAL_INFORMATION, EaInformation: FILE_EA_INFORMATION, AccessInformation: FILE_ACCESS_INFORMATION, PositionInformation: FILE_POSITION_INFORMATION, ModeInformation: FILE_MODE_INFORMATION, AlignmentInformation: FILE_ALIGNMENT_INFORMATION, NameInformation: FILE_NAME_INFORMATION, }} pub type PFILE_ALL_INFORMATION = *mut FILE_ALL_INFORMATION; STRUCT!{struct FILE_NETWORK_OPEN_INFORMATION { CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, FileAttributes: ULONG, }} pub type PFILE_NETWORK_OPEN_INFORMATION = *mut FILE_NETWORK_OPEN_INFORMATION; STRUCT!{struct FILE_ATTRIBUTE_TAG_INFORMATION { FileAttributes: ULONG, ReparseTag: ULONG, }} pub type PFILE_ATTRIBUTE_TAG_INFORMATION = *mut FILE_ATTRIBUTE_TAG_INFORMATION; STRUCT!{struct FILE_ALLOCATION_INFORMATION { AllocationSize: LARGE_INTEGER, }} pub type PFILE_ALLOCATION_INFORMATION = *mut FILE_ALLOCATION_INFORMATION; STRUCT!{struct FILE_COMPRESSION_INFORMATION { CompressedFileSize: LARGE_INTEGER, CompressionFormat: USHORT, CompressionUnitShift: UCHAR, ChunkShift: UCHAR, ClusterShift: UCHAR, Reserved: [UCHAR; 3], }} pub type PFILE_COMPRESSION_INFORMATION = *mut FILE_COMPRESSION_INFORMATION; STRUCT!{struct FILE_DISPOSITION_INFORMATION { DeleteFileA: BOOLEAN, }} pub type PFILE_DISPOSITION_INFORMATION = *mut FILE_DISPOSITION_INFORMATION; STRUCT!{struct FILE_END_OF_FILE_INFORMATION { EndOfFile: LARGE_INTEGER, }} pub type PFILE_END_OF_FILE_INFORMATION = *mut FILE_END_OF_FILE_INFORMATION; STRUCT!{struct FILE_VALID_DATA_LENGTH_INFORMATION { ValidDataLength: LARGE_INTEGER, }} pub type PFILE_VALID_DATA_LENGTH_INFORMATION = *mut FILE_VALID_DATA_LENGTH_INFORMATION; STRUCT!{struct FILE_LINK_INFORMATION { ReplaceIfExists: BOOLEAN, RootDirectory: HANDLE, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_LINK_INFORMATION = *mut FILE_LINK_INFORMATION; STRUCT!{struct FILE_MOVE_CLUSTER_INFORMATION { ClusterCount: ULONG, RootDirectory: HANDLE, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_MOVE_CLUSTER_INFORMATION = *mut FILE_MOVE_CLUSTER_INFORMATION; STRUCT!{struct FILE_RENAME_INFORMATION { ReplaceIfExists: BOOLEAN, RootDirectory: HANDLE, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_RENAME_INFORMATION = *mut FILE_RENAME_INFORMATION; STRUCT!{struct FILE_STREAM_INFORMATION { NextEntryOffset: ULONG, StreamNameLength: ULONG, StreamSize: LARGE_INTEGER, StreamAllocationSize: LARGE_INTEGER, StreamName: [WCHAR; 1], }} pub type PFILE_STREAM_INFORMATION = *mut FILE_STREAM_INFORMATION; STRUCT!{struct FILE_TRACKING_INFORMATION { DestinationFile: HANDLE, ObjectInformationLength: ULONG, ObjectInformation: [CHAR; 1], }} pub type PFILE_TRACKING_INFORMATION = *mut FILE_TRACKING_INFORMATION; STRUCT!{struct FILE_COMPLETION_INFORMATION { Port: HANDLE, Key: PVOID, }} pub type PFILE_COMPLETION_INFORMATION = *mut FILE_COMPLETION_INFORMATION; STRUCT!{struct FILE_PIPE_INFORMATION { ReadMode: ULONG, CompletionMode: ULONG, }} pub type PFILE_PIPE_INFORMATION = *mut FILE_PIPE_INFORMATION; STRUCT!{struct FILE_PIPE_LOCAL_INFORMATION { NamedPipeType: ULONG, NamedPipeConfiguration: ULONG, MaximumInstances: ULONG, CurrentInstances: ULONG, InboundQuota: ULONG, ReadDataAvailable: ULONG, OutboundQuota: ULONG, WriteQuotaAvailable: ULONG, NamedPipeState: ULONG, NamedPipeEnd: ULONG, }} pub type PFILE_PIPE_LOCAL_INFORMATION = *mut FILE_PIPE_LOCAL_INFORMATION; STRUCT!{struct FILE_PIPE_REMOTE_INFORMATION { CollectDataTime: LARGE_INTEGER, MaximumCollectionCount: ULONG, }} pub type PFILE_PIPE_REMOTE_INFORMATION = *mut FILE_PIPE_REMOTE_INFORMATION; STRUCT!{struct FILE_MAILSLOT_QUERY_INFORMATION { MaximumMessageSize: ULONG, MailslotQuota: ULONG, NextMessageSize: ULONG, MessagesAvailable: ULONG, ReadTimeout: LARGE_INTEGER, }} pub type PFILE_MAILSLOT_QUERY_INFORMATION = *mut FILE_MAILSLOT_QUERY_INFORMATION; STRUCT!{struct FILE_MAILSLOT_SET_INFORMATION { ReadTimeout: PLARGE_INTEGER, }} pub type PFILE_MAILSLOT_SET_INFORMATION = *mut FILE_MAILSLOT_SET_INFORMATION; STRUCT!{struct FILE_REPARSE_POINT_INFORMATION { FileReference: LONGLONG, Tag: ULONG, }} pub type PFILE_REPARSE_POINT_INFORMATION = *mut FILE_REPARSE_POINT_INFORMATION; STRUCT!{struct FILE_LINK_ENTRY_INFORMATION { NextEntryOffset: ULONG, ParentFileId: LONGLONG, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_LINK_ENTRY_INFORMATION = *mut FILE_LINK_ENTRY_INFORMATION; STRUCT!{struct FILE_LINKS_INFORMATION { BytesNeeded: ULONG, EntriesReturned: ULONG, Entry: FILE_LINK_ENTRY_INFORMATION, }} pub type PFILE_LINKS_INFORMATION = *mut FILE_LINKS_INFORMATION; STRUCT!{struct FILE_NETWORK_PHYSICAL_NAME_INFORMATION { FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_NETWORK_PHYSICAL_NAME_INFORMATION = *mut FILE_NETWORK_PHYSICAL_NAME_INFORMATION; STRUCT!{struct FILE_STANDARD_LINK_INFORMATION { NumberOfAccessibleLinks: ULONG, TotalNumberOfLinks: ULONG, DeletePending: BOOLEAN, Directory: BOOLEAN, }} pub type PFILE_STANDARD_LINK_INFORMATION = *mut FILE_STANDARD_LINK_INFORMATION; STRUCT!{struct FILE_SFIO_RESERVE_INFORMATION { RequestsPerPeriod: ULONG, Period: ULONG, RetryFailures: BOOLEAN, Discardable: BOOLEAN, RequestSize: ULONG, NumOutstandingRequests: ULONG, }} pub type PFILE_SFIO_RESERVE_INFORMATION = *mut FILE_SFIO_RESERVE_INFORMATION; STRUCT!{struct FILE_SFIO_VOLUME_INFORMATION { MaximumRequestsPerPeriod: ULONG, MinimumPeriod: ULONG, MinimumTransferSize: ULONG, }} pub type PFILE_SFIO_VOLUME_INFORMATION = *mut FILE_SFIO_VOLUME_INFORMATION; ENUM!{enum IO_PRIORITY_HINT { IoPriorityVeryLow = 0, IoPriorityLow = 1, IoPriorityNormal = 2, IoPriorityHigh = 3, IoPriorityCritical = 4, MaxIoPriorityTypes = 5, }} STRUCT!{struct FILE_IO_PRIORITY_HINT_INFORMATION { PriorityHint: IO_PRIORITY_HINT, }} pub type PFILE_IO_PRIORITY_HINT_INFORMATION = *mut FILE_IO_PRIORITY_HINT_INFORMATION; STRUCT!{struct FILE_IO_PRIORITY_HINT_INFORMATION_EX { PriorityHint: IO_PRIORITY_HINT, BoostOutstanding: BOOLEAN, }} pub type PFILE_IO_PRIORITY_HINT_INFORMATION_EX = *mut FILE_IO_PRIORITY_HINT_INFORMATION_EX; pub const FILE_SKIP_COMPLETION_PORT_ON_SUCCESS: u32 = 0x1; pub const FILE_SKIP_SET_EVENT_ON_HANDLE: u32 = 0x2; pub const FILE_SKIP_SET_USER_EVENT_ON_FAST_IO: u32 = 0x4; STRUCT!{struct FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { Flags: ULONG, }} pub type PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION = *mut FILE_IO_COMPLETION_NOTIFICATION_INFORMATION; STRUCT!{struct FILE_PROCESS_IDS_USING_FILE_INFORMATION { NumberOfProcessIdsInList: ULONG, ProcessIdList: [ULONG_PTR; 1], }} pub type PFILE_PROCESS_IDS_USING_FILE_INFORMATION = *mut FILE_PROCESS_IDS_USING_FILE_INFORMATION; STRUCT!{struct FILE_IS_REMOTE_DEVICE_INFORMATION { IsRemote: BOOLEAN, }} pub type PFILE_IS_REMOTE_DEVICE_INFORMATION = *mut FILE_IS_REMOTE_DEVICE_INFORMATION; STRUCT!{struct FILE_NUMA_NODE_INFORMATION { NodeNumber: USHORT, }} pub type PFILE_NUMA_NODE_INFORMATION = *mut FILE_NUMA_NODE_INFORMATION; STRUCT!{struct FILE_IOSTATUSBLOCK_RANGE_INFORMATION { IoStatusBlockRange: PUCHAR, Length: ULONG, }} pub type PFILE_IOSTATUSBLOCK_RANGE_INFORMATION = *mut FILE_IOSTATUSBLOCK_RANGE_INFORMATION; STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_GenericReserved { Reserved: [ULONG; 8], }} STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Server { Capabilities: ULONG, }} STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Share { Capabilities: ULONG, CachingFlags: ULONG, }} STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2 { Server: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Server, Share: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2_Share, }} UNION!{union FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific { Smb2: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific_Smb2, Reserved: [ULONG; 16], }} STRUCT!{struct FILE_REMOTE_PROTOCOL_INFORMATION { StructureVersion: USHORT, StructureSize: USHORT, Protocol: ULONG, ProtocolMajorVersion: USHORT, ProtocolMinorVersion: USHORT, ProtocolRevision: USHORT, Reserved: USHORT, Flags: ULONG, GenericReserved: FILE_REMOTE_PROTOCOL_INFORMATION_GenericReserved, ProtocolSpecific: FILE_REMOTE_PROTOCOL_INFORMATION_ProtocolSpecific, }} pub type PFILE_REMOTE_PROTOCOL_INFORMATION = *mut FILE_REMOTE_PROTOCOL_INFORMATION; pub const CHECKSUM_ENFORCEMENT_OFF: u32 = 0x00000001; STRUCT!{struct FILE_INTEGRITY_STREAM_INFORMATION { ChecksumAlgorithm: USHORT, ChecksumChunkShift: UCHAR, ClusterShift: UCHAR, Flags: ULONG, }} pub type PFILE_INTEGRITY_STREAM_INFORMATION = *mut FILE_INTEGRITY_STREAM_INFORMATION; STRUCT!{struct FILE_VOLUME_NAME_INFORMATION { DeviceNameLength: ULONG, DeviceName: [WCHAR; 1], }} pub type PFILE_VOLUME_NAME_INFORMATION = *mut FILE_VOLUME_NAME_INFORMATION; STRUCT!{struct FILE_ID_INFORMATION { VolumeSerialNumber: ULONGLONG, FileId: FILE_ID_128, }} pub type PFILE_ID_INFORMATION = *mut FILE_ID_INFORMATION; STRUCT!{struct FILE_ID_EXTD_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, EaSize: ULONG, ReparsePointTag: ULONG, FileId: FILE_ID_128, FileName: [WCHAR; 1], }} pub type PFILE_ID_EXTD_DIR_INFORMATION = *mut FILE_ID_EXTD_DIR_INFORMATION; STRUCT!{struct FILE_LINK_ENTRY_FULL_ID_INFORMATION { NextEntryOffset: ULONG, ParentFileId: FILE_ID_128, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_LINK_ENTRY_FULL_ID_INFORMATION = *mut FILE_LINK_ENTRY_FULL_ID_INFORMATION; STRUCT!{struct FILE_ID_EXTD_BOTH_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, EaSize: ULONG, ReparsePointTag: ULONG, FileId: FILE_ID_128, ShortNameLength: CCHAR, ShortName: [WCHAR; 12], FileName: [WCHAR; 1], }} pub type PFILE_ID_EXTD_BOTH_DIR_INFORMATION = *mut FILE_ID_EXTD_BOTH_DIR_INFORMATION; STRUCT!{struct FILE_STAT_INFORMATION { FileId: LARGE_INTEGER, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, FileAttributes: ULONG, ReparseTag: ULONG, NumberOfLinks: ULONG, EffectiveAccess: ULONG, }} pub type PFILE_STAT_INFORMATION = *mut FILE_STAT_INFORMATION; STRUCT!{struct FILE_MEMORY_PARTITION_INFORMATION_Flags_s { NoCrossPartitionAccess: UCHAR, Spare: [UCHAR; 3], }} UNION!{union FILE_MEMORY_PARTITION_INFORMATION_Flags { s: FILE_MEMORY_PARTITION_INFORMATION_Flags_s, AllFlags: ULONG, }} STRUCT!{struct FILE_MEMORY_PARTITION_INFORMATION { OwnerPartitionHandle: HANDLE, Flags: FILE_MEMORY_PARTITION_INFORMATION_Flags, }} pub type PFILE_MEMORY_PARTITION_INFORMATION = *mut FILE_MEMORY_PARTITION_INFORMATION; STRUCT!{struct FILE_STAT_LX_INFORMATION { FileId: LARGE_INTEGER, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, FileAttributes: ULONG, ReparseTag: ULONG, NumberOfLinks: ULONG, EffectiveAccess: ULONG, LxFlags: ULONG, LxUid: ULONG, LxGid: ULONG, LxMode: ULONG, LxDeviceIdMajor: ULONG, LxDeviceIdMinor: ULONG, }} pub type PFILE_STAT_LX_INFORMATION = *mut FILE_STAT_LX_INFORMATION; STRUCT!{struct FILE_CASE_SENSITIVE_INFORMATION { Flags: ULONG, }} pub type PFILE_CASE_SENSITIVE_INFORMATION = *mut FILE_CASE_SENSITIVE_INFORMATION; STRUCT!{struct FILE_DIRECTORY_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_DIRECTORY_INFORMATION = *mut FILE_DIRECTORY_INFORMATION; STRUCT!{struct FILE_FULL_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, EaSize: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_FULL_DIR_INFORMATION = *mut FILE_FULL_DIR_INFORMATION; STRUCT!{struct FILE_ID_FULL_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, EaSize: ULONG, FileId: LARGE_INTEGER, FileName: [WCHAR; 1], }} pub type PFILE_ID_FULL_DIR_INFORMATION = *mut FILE_ID_FULL_DIR_INFORMATION; STRUCT!{struct FILE_BOTH_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, EaSize: ULONG, ShortNameLength: CCHAR, ShortName: [WCHAR; 12], FileName: [WCHAR; 1], }} pub type PFILE_BOTH_DIR_INFORMATION = *mut FILE_BOTH_DIR_INFORMATION; STRUCT!{struct FILE_ID_BOTH_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, EaSize: ULONG, ShortNameLength: CCHAR, ShortName: [WCHAR; 12], FileId: LARGE_INTEGER, FileName: [WCHAR; 1], }} pub type PFILE_ID_BOTH_DIR_INFORMATION = *mut FILE_ID_BOTH_DIR_INFORMATION; STRUCT!{struct FILE_NAMES_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, FileNameLength: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_NAMES_INFORMATION = *mut FILE_NAMES_INFORMATION; STRUCT!{struct FILE_ID_GLOBAL_TX_DIR_INFORMATION { NextEntryOffset: ULONG, FileIndex: ULONG, CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, LastWriteTime: LARGE_INTEGER, ChangeTime: LARGE_INTEGER, EndOfFile: LARGE_INTEGER, AllocationSize: LARGE_INTEGER, FileAttributes: ULONG, FileNameLength: ULONG, FileId: LARGE_INTEGER, LockingTransactionId: GUID, TxInfoFlags: ULONG, FileName: [WCHAR; 1], }} pub type PFILE_ID_GLOBAL_TX_DIR_INFORMATION = *mut FILE_ID_GLOBAL_TX_DIR_INFORMATION; pub const FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED: u32 = 0x00000001; pub const FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX: u32 = 0x00000002; pub const FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX: u32 = 0x00000004; STRUCT!{struct FILE_OBJECTID_INFORMATION_u_s { BirthVolumeId: [UCHAR; 16], BirthObjectId: [UCHAR; 16], DomainId: [UCHAR; 16], }} UNION!{union FILE_OBJECTID_INFORMATION_u { s: FILE_OBJECTID_INFORMATION_u_s, ExtendedInfo: [UCHAR; 48], }} STRUCT!{struct FILE_OBJECTID_INFORMATION { FileReference: LONGLONG, ObjectId: [UCHAR; 16], u: FILE_OBJECTID_INFORMATION_u, }} pub type PFILE_OBJECTID_INFORMATION = *mut FILE_OBJECTID_INFORMATION; STRUCT!{struct FILE_FULL_EA_INFORMATION { NextEntryOffset: ULONG, Flags: UCHAR, EaNameLength: UCHAR, EaValueLength: USHORT, EaName: [CHAR; 1], }} pub type PFILE_FULL_EA_INFORMATION = *mut FILE_FULL_EA_INFORMATION; STRUCT!{struct FILE_GET_EA_INFORMATION { NextEntryOffset: ULONG, EaNameLength: UCHAR, EaName: [CHAR; 1], }} pub type PFILE_GET_EA_INFORMATION = *mut FILE_GET_EA_INFORMATION; STRUCT!{struct FILE_GET_QUOTA_INFORMATION { NextEntryOffset: ULONG, SidLength: ULONG, Sid: SID, }} pub type PFILE_GET_QUOTA_INFORMATION = *mut FILE_GET_QUOTA_INFORMATION; STRUCT!{struct FILE_QUOTA_INFORMATION { NextEntryOffset: ULONG, SidLength: ULONG, ChangeTime: LARGE_INTEGER, QuotaUsed: LARGE_INTEGER, QuotaThreshold: LARGE_INTEGER, QuotaLimit: LARGE_INTEGER, Sid: SID, }} pub type PFILE_QUOTA_INFORMATION = *mut FILE_QUOTA_INFORMATION; ENUM!{enum FS_INFORMATION_CLASS { FileFsVolumeInformation = 1, FileFsLabelInformation = 2, FileFsSizeInformation = 3, FileFsDeviceInformation = 4, FileFsAttributeInformation = 5, FileFsControlInformation = 6, FileFsFullSizeInformation = 7, FileFsObjectIdInformation = 8, FileFsDriverPathInformation = 9, FileFsVolumeFlagsInformation = 10, FileFsSectorSizeInformation = 11, FileFsDataCopyInformation = 12, FileFsMetadataSizeInformation = 13, FileFsFullSizeInformationEx = 14, FileFsMaximumInformation = 15, }} pub type PFS_INFORMATION_CLASS = *mut FS_INFORMATION_CLASS; STRUCT!{struct FILE_FS_LABEL_INFORMATION { VolumeLabelLength: ULONG, VolumeLabel: [WCHAR; 1], }} pub type PFILE_FS_LABEL_INFORMATION = *mut FILE_FS_LABEL_INFORMATION; STRUCT!{struct FILE_FS_VOLUME_INFORMATION { VolumeCreationTime: LARGE_INTEGER, VolumeSerialNumber: ULONG, VolumeLabelLength: ULONG, SupportsObjects: BOOLEAN, VolumeLabel: [WCHAR; 1], }} pub type PFILE_FS_VOLUME_INFORMATION = *mut FILE_FS_VOLUME_INFORMATION; STRUCT!{struct FILE_FS_SIZE_INFORMATION { TotalAllocationUnits: LARGE_INTEGER, AvailableAllocationUnits: LARGE_INTEGER, SectorsPerAllocationUnit: ULONG, BytesPerSector: ULONG, }} pub type PFILE_FS_SIZE_INFORMATION = *mut FILE_FS_SIZE_INFORMATION; STRUCT!{struct FILE_FS_CONTROL_INFORMATION { FreeSpaceStartFiltering: LARGE_INTEGER, FreeSpaceThreshold: LARGE_INTEGER, FreeSpaceStopFiltering: LARGE_INTEGER, DefaultQuotaThreshold: LARGE_INTEGER, DefaultQuotaLimit: LARGE_INTEGER, FileSystemControlFlags: ULONG, }} pub type PFILE_FS_CONTROL_INFORMATION = *mut FILE_FS_CONTROL_INFORMATION; STRUCT!{struct FILE_FS_FULL_SIZE_INFORMATION { TotalAllocationUnits: LARGE_INTEGER, CallerAvailableAllocationUnits: LARGE_INTEGER, ActualAvailableAllocationUnits: LARGE_INTEGER, SectorsPerAllocationUnit: ULONG, BytesPerSector: ULONG, }} pub type PFILE_FS_FULL_SIZE_INFORMATION = *mut FILE_FS_FULL_SIZE_INFORMATION; STRUCT!{struct FILE_FS_OBJECTID_INFORMATION { ObjectId: [UCHAR; 16], ExtendedInfo: [UCHAR; 48], }} pub type PFILE_FS_OBJECTID_INFORMATION = *mut FILE_FS_OBJECTID_INFORMATION; STRUCT!{struct FILE_FS_DEVICE_INFORMATION { DeviceType: DWORD, Characteristics: ULONG, }} pub type PFILE_FS_DEVICE_INFORMATION = *mut FILE_FS_DEVICE_INFORMATION; STRUCT!{struct FILE_FS_ATTRIBUTE_INFORMATION { FileSystemAttributes: ULONG, MaximumComponentNameLength: LONG, FileSystemNameLength: ULONG, FileSystemName: [WCHAR; 1], }} pub type PFILE_FS_ATTRIBUTE_INFORMATION = *mut FILE_FS_ATTRIBUTE_INFORMATION; STRUCT!{struct FILE_FS_DRIVER_PATH_INFORMATION { DriverInPath: BOOLEAN, DriverNameLength: ULONG, DriverName: [WCHAR; 1], }} pub type PFILE_FS_DRIVER_PATH_INFORMATION = *mut FILE_FS_DRIVER_PATH_INFORMATION; STRUCT!{struct FILE_FS_VOLUME_FLAGS_INFORMATION { Flags: ULONG, }} pub type PFILE_FS_VOLUME_FLAGS_INFORMATION = *mut FILE_FS_VOLUME_FLAGS_INFORMATION; pub const SSINFO_FLAGS_ALIGNED_DEVICE: u32 = 0x00000001; pub const SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE: u32 = 0x00000002; pub const SSINFO_OFFSET_UNKNOWN: u32 = 0xffffffff; STRUCT!{struct FILE_FS_SECTOR_SIZE_INFORMATION { LogicalBytesPerSector: ULONG, PhysicalBytesPerSectorForAtomicity: ULONG, PhysicalBytesPerSectorForPerformance: ULONG, FileSystemEffectivePhysicalBytesPerSectorForAtomicity: ULONG, Flags: ULONG, ByteOffsetForSectorAlignment: ULONG, ByteOffsetForPartitionAlignment: ULONG, }} pub type PFILE_FS_SECTOR_SIZE_INFORMATION = *mut FILE_FS_SECTOR_SIZE_INFORMATION; STRUCT!{struct FILE_FS_DATA_COPY_INFORMATION { NumberOfCopies: ULONG, }} pub type PFILE_FS_DATA_COPY_INFORMATION = *mut FILE_FS_DATA_COPY_INFORMATION; STRUCT!{struct FILE_FS_METADATA_SIZE_INFORMATION { TotalMetadataAllocationUnits: LARGE_INTEGER, SectorsPerAllocationUnit: ULONG, BytesPerSector: ULONG, }} pub type PFILE_FS_METADATA_SIZE_INFORMATION = *mut FILE_FS_METADATA_SIZE_INFORMATION; STRUCT!{struct FILE_FS_FULL_SIZE_INFORMATION_EX { ActualTotalAllocationUnits: ULONGLONG, ActualAvailableAllocationUnits: ULONGLONG, ActualPoolUnavailableAllocationUnits: ULONGLONG, CallerTotalAllocationUnits: ULONGLONG, CallerAvailableAllocationUnits: ULONGLONG, CallerPoolUnavailableAllocationUnits: ULONGLONG, UsedAllocationUnits: ULONGLONG, TotalReservedAllocationUnits: ULONGLONG, VolumeStorageReserveAllocationUnits: ULONGLONG, AvailableCommittedAllocationUnits: ULONGLONG, PoolAvailableAllocationUnits: ULONGLONG, SectorsPerAllocationUnit: ULONG, BytesPerSector: ULONG, }} pub type PFILE_FS_FULL_SIZE_INFORMATION_EX = *mut FILE_FS_FULL_SIZE_INFORMATION_EX; EXTERN!{extern "system" { fn NtCreateFile( FileHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, IoStatusBlock: PIO_STATUS_BLOCK, AllocationSize: PLARGE_INTEGER, FileAttributes: ULONG, ShareAccess: ULONG, CreateDisposition: ULONG, CreateOptions: ULONG, EaBuffer: PVOID, EaLength: ULONG, ) -> NTSTATUS; fn NtCreateNamedPipeFile( FileHandle: PHANDLE, DesiredAccess: ULONG, ObjectAttributes: POBJECT_ATTRIBUTES, IoStatusBlock: PIO_STATUS_BLOCK, ShareAccess: ULONG, CreateDisposition: ULONG, CreateOptions: ULONG, NamedPipeType: ULONG, ReadMode: ULONG, CompletionMode: ULONG, MaximumInstances: ULONG, InboundQuota: ULONG, OutboundQuota: ULONG, DefaultTimeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtCreateMailslotFile( FileHandle: PHANDLE, DesiredAccess: ULONG, ObjectAttributes: POBJECT_ATTRIBUTES, IoStatusBlock: PIO_STATUS_BLOCK, CreateOptions: ULONG, MailslotQuota: ULONG, MaximumMessageSize: ULONG, ReadTimeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtOpenFile( FileHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, IoStatusBlock: PIO_STATUS_BLOCK, ShareAccess: ULONG, OpenOptions: ULONG, ) -> NTSTATUS; fn NtDeleteFile( ObjectAttributes: POBJECT_ATTRIBUTES, ) -> NTSTATUS; fn NtFlushBuffersFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, ) -> NTSTATUS; fn NtFlushBuffersFileEx( FileHandle: HANDLE, Flags: ULONG, Parameters: PVOID, ParametersSize: ULONG, IoStatusBlock: PIO_STATUS_BLOCK, ) -> NTSTATUS; fn NtQueryInformationFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, FileInformation: PVOID, Length: ULONG, FileInformationClass: FILE_INFORMATION_CLASS, ) -> NTSTATUS; fn NtQueryInformationByName( ObjectAttributes: POBJECT_ATTRIBUTES, IoStatusBlock: PIO_STATUS_BLOCK, FileInformation: PVOID, Length: ULONG, FileInformationClass: FILE_INFORMATION_CLASS, ) -> NTSTATUS; fn NtSetInformationFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, FileInformation: PVOID, Length: ULONG, FileInformationClass: FILE_INFORMATION_CLASS, ) -> NTSTATUS; fn NtQueryDirectoryFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, FileInformation: PVOID, Length: ULONG, FileInformationClass: FILE_INFORMATION_CLASS, ReturnSingleEntry: BOOLEAN, FileName: PUNICODE_STRING, RestartScan: BOOLEAN, ) -> NTSTATUS; fn NtQueryEaFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, ReturnSingleEntry: BOOLEAN, EaList: PVOID, EaListLength: ULONG, EaIndex: PULONG, RestartScan: BOOLEAN, ) -> NTSTATUS; fn NtSetEaFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, ) -> NTSTATUS; fn NtQueryQuotaInformationFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, ReturnSingleEntry: BOOLEAN, SidList: PVOID, SidListLength: ULONG, StartSid: PSID, RestartScan: BOOLEAN, ) -> NTSTATUS; fn NtSetQuotaInformationFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, ) -> NTSTATUS; fn NtQueryVolumeInformationFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, FsInformation: PVOID, Length: ULONG, FsInformationClass: FS_INFORMATION_CLASS, ) -> NTSTATUS; fn NtSetVolumeInformationFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, FsInformation: PVOID, Length: ULONG, FsInformationClass: FS_INFORMATION_CLASS, ) -> NTSTATUS; fn NtCancelIoFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, ) -> NTSTATUS; fn NtCancelIoFileEx( FileHandle: HANDLE, IoRequestToCancel: PIO_STATUS_BLOCK, IoStatusBlock: PIO_STATUS_BLOCK, ) -> NTSTATUS; fn NtCancelSynchronousIoFile( ThreadHandle: HANDLE, IoRequestToCancel: PIO_STATUS_BLOCK, IoStatusBlock: PIO_STATUS_BLOCK, ) -> NTSTATUS; fn NtDeviceIoControlFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, IoControlCode: ULONG, InputBuffer: PVOID, InputBufferLength: ULONG, OutputBuffer: PVOID, OutputBufferLength: ULONG, ) -> NTSTATUS; fn NtFsControlFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, FsControlCode: ULONG, InputBuffer: PVOID, InputBufferLength: ULONG, OutputBuffer: PVOID, OutputBufferLength: ULONG, ) -> NTSTATUS; fn NtReadFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, ByteOffset: PLARGE_INTEGER, Key: PULONG, ) -> NTSTATUS; fn NtWriteFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, ByteOffset: PLARGE_INTEGER, Key: PULONG, ) -> NTSTATUS; fn NtReadFileScatter( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, SegmentArray: PFILE_SEGMENT_ELEMENT, Length: ULONG, ByteOffset: PLARGE_INTEGER, Key: PULONG, ) -> NTSTATUS; fn NtWriteFileGather( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, SegmentArray: PFILE_SEGMENT_ELEMENT, Length: ULONG, ByteOffset: PLARGE_INTEGER, Key: PULONG, ) -> NTSTATUS; fn NtLockFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, ByteOffset: PLARGE_INTEGER, Length: PLARGE_INTEGER, Key: ULONG, FailImmediately: BOOLEAN, ExclusiveLock: BOOLEAN, ) -> NTSTATUS; fn NtUnlockFile( FileHandle: HANDLE, IoStatusBlock: PIO_STATUS_BLOCK, ByteOffset: PLARGE_INTEGER, Length: PLARGE_INTEGER, Key: ULONG, ) -> NTSTATUS; fn NtQueryAttributesFile( ObjectAttributes: POBJECT_ATTRIBUTES, FileInformation: PFILE_BASIC_INFORMATION, ) -> NTSTATUS; fn NtQueryFullAttributesFile( ObjectAttributes: POBJECT_ATTRIBUTES, FileInformation: PFILE_NETWORK_OPEN_INFORMATION, ) -> NTSTATUS; fn NtNotifyChangeDirectoryFile( FileHandle: HANDLE, Event: HANDLE, ApcRoutine: PIO_APC_ROUTINE, ApcContext: PVOID, IoStatusBlock: PIO_STATUS_BLOCK, Buffer: PVOID, Length: ULONG, CompletionFilter: ULONG, WatchTree: BOOLEAN, ) -> NTSTATUS; fn NtLoadDriver( DriverServiceName: PUNICODE_STRING, ) -> NTSTATUS; fn NtUnloadDriver( DriverServiceName: PUNICODE_STRING, ) -> NTSTATUS; }} pub const IO_COMPLETION_QUERY_STATE: u32 = 0x0001; ENUM!{enum IO_COMPLETION_INFORMATION_CLASS { IoCompletionBasicInformation = 0, }} STRUCT!{struct IO_COMPLETION_BASIC_INFORMATION { Depth: LONG, }} pub type PIO_COMPLETION_BASIC_INFORMATION = *mut IO_COMPLETION_BASIC_INFORMATION; EXTERN!{extern "system" { fn NtCreateIoCompletion( IoCompletionHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, Count: ULONG, ) -> NTSTATUS; fn NtOpenIoCompletion( IoCompletionHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, ) -> NTSTATUS; fn NtQueryIoCompletion( IoCompletionHandle: HANDLE, IoCompletionInformationClass: IO_COMPLETION_INFORMATION_CLASS, IoCompletionInformation: PVOID, IoCompletionInformationLength: ULONG, ReturnLength: PULONG, ) -> NTSTATUS; fn NtSetIoCompletion( IoCompletionHandle: HANDLE, KeyContext: PVOID, ApcContext: PVOID, IoStatus: NTSTATUS, IoStatusInformation: ULONG_PTR, ) -> NTSTATUS; fn NtSetIoCompletionEx( IoCompletionHandle: HANDLE, IoCompletionPacketHandle: HANDLE, KeyContext: PVOID, ApcContext: PVOID, IoStatus: NTSTATUS, IoStatusInformation: ULONG_PTR, ) -> NTSTATUS; fn NtRemoveIoCompletion( IoCompletionHandle: HANDLE, KeyContext: *mut PVOID, ApcContext: *mut PVOID, IoStatusBlock: PIO_STATUS_BLOCK, Timeout: PLARGE_INTEGER, ) -> NTSTATUS; fn NtRemoveIoCompletionEx( IoCompletionHandle: HANDLE, IoCompletionInformation: PFILE_IO_COMPLETION_INFORMATION, Count: ULONG, NumEntriesRemoved: PULONG, Timeout: PLARGE_INTEGER, Alertable: BOOLEAN, ) -> NTSTATUS; fn NtCreateWaitCompletionPacket( WaitCompletionPacketHandle: PHANDLE, DesiredAccess: ACCESS_MASK, ObjectAttributes: POBJECT_ATTRIBUTES, ) -> NTSTATUS; fn NtAssociateWaitCompletionPacket( WaitCompletionPacketHandle: HANDLE, IoCompletionHandle: HANDLE, TargetObjectHandle: HANDLE, KeyContext: PVOID, ApcContext: PVOID, IoStatus: NTSTATUS, IoStatusInformation: ULONG_PTR, AlreadySignaled: PBOOLEAN, ) -> NTSTATUS; fn NtCancelWaitCompletionPacket( WaitCompletionPacketHandle: HANDLE, RemoveSignaledPacket: BOOLEAN, ) -> NTSTATUS; }} ENUM!{enum IO_SESSION_EVENT { IoSessionEventIgnore = 0, IoSessionEventCreated = 1, IoSessionEventTerminated = 2, IoSessionEventConnected = 3, IoSessionEventDisconnected = 4, IoSessionEventLogon = 5, IoSessionEventLogoff = 6, IoSessionEventMax = 7, }} ENUM!{enum IO_SESSION_STATE { IoSessionStateCreated = 0, IoSessionStateInitialized = 1, IoSessionStateConnected = 2, IoSessionStateDisconnected = 3, IoSessionStateDisconnectedLoggedOn = 4, IoSessionStateLoggedOn = 5, IoSessionStateLoggedOff = 6, IoSessionStateTerminated = 7, IoSessionStateMax = 8, }} EXTERN!{extern "system" { fn NtNotifyChangeSession( SessionHandle: HANDLE, ChangeSequenceNumber: ULONG, ChangeTimeStamp: PLARGE_INTEGER, Event: IO_SESSION_EVENT, NewState: IO_SESSION_STATE, PreviousState: IO_SESSION_STATE, Payload: PVOID, PayloadSize: ULONG, ) -> NTSTATUS; }} ENUM!{enum INTERFACE_TYPE { InterfaceTypeUndefined = -1i32 as u32, Internal = 0, Isa = 1, Eisa = 2, MicroChannel = 3, TurboChannel = 4, PCIBus = 5, VMEBus = 6, NuBus = 7, PCMCIABus = 8, CBus = 9, MPIBus = 10, MPSABus = 11, ProcessorInternal = 12, InternalPowerBus = 13, PNPISABus = 14, PNPBus = 15, Vmcs = 16, MaximumInterfaceType = 17, }} pub type PINTERFACE_TYPE = *mut INTERFACE_TYPE; ENUM!{enum DMA_WIDTH { Width8Bits = 0, Width16Bits = 1, Width32Bits = 2, MaximumDmaWidth = 3, }} pub type PDMA_WIDTH = *mut DMA_WIDTH; ENUM!{enum DMA_SPEED { Compatible = 0, TypeA = 1, TypeB = 2, TypeC = 3, TypeF = 4, MaximumDmaSpeed = 5, }} pub type PDMA_SPEED = *mut DMA_SPEED; ENUM!{enum BUS_DATA_TYPE { ConfigurationSpaceUndefined = -1i32 as u32, Cmos = 0, EisaConfiguration = 1, Pos = 2, CbusConfiguration = 3, PCIConfiguration = 4, VMEConfiguration = 5, NuBusConfiguration = 6, PCMCIAConfiguration = 7, MPIConfiguration = 8, MPSAConfiguration = 9, PNPISAConfiguration = 10, SgiInternalConfiguration = 11, MaximumBusDataType = 12, }} pub type PBUS_DATA_TYPE = *mut BUS_DATA_TYPE; pub const SYMLINK_FLAG_RELATIVE: u32 = 1; STRUCT!{struct REPARSE_DATA_BUFFER_u_SymbolicLinkReparseBuffer { SubstituteNameOffset: USHORT, SubstituteNameLength: USHORT, PrintNameOffset: USHORT, PrintNameLength: USHORT, Flags: ULONG, PathBuffer: [WCHAR; 1], }} STRUCT!{struct REPARSE_DATA_BUFFER_u_MountPointReparseBuffer { SubstituteNameOffset: USHORT, SubstituteNameLength: USHORT, PrintNameOffset: USHORT, PrintNameLength: USHORT, PathBuffer: [WCHAR; 1], }} STRUCT!{struct REPARSE_DATA_BUFFER_u_GenericReparseBuffer { DataBuffer: [UCHAR; 1], }} UNION!{union REPARSE_DATA_BUFFER_u { SymbolicLinkReparseBuffer: REPARSE_DATA_BUFFER_u_SymbolicLinkReparseBuffer, MountPointReparseBuffer: REPARSE_DATA_BUFFER_u_MountPointReparseBuffer, GenericReparseBuffer: REPARSE_DATA_BUFFER_u_GenericReparseBuffer, }} STRUCT!{struct REPARSE_DATA_BUFFER { ReparseTag: ULONG, ReparseDataLength: USHORT, Reserved: USHORT, u: REPARSE_DATA_BUFFER_u, }} pub type PREPARSE_DATA_BUFFER = *mut REPARSE_DATA_BUFFER; /// "\Device\NamedPipe\" pub const DEVICE_NAMED_PIPE: UTF16Const = UTF16Const(&[ 0x005C, 0x0044, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x005C, 0x004E, 0x0061, 0x006D, 0x0065, 0x0064, 0x0050, 0x0069, 0x0070, 0x0065, 0x005C, 0u16, ]); pub const FSCTL_PIPE_ASSIGN_EVENT: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_DISCONNECT: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_LISTEN: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_PEEK: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA); pub const FSTL_PIPE_QUERY_EVENT: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_TRANSCEIVE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA); pub const FSTL_PIPE_WAIT: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_IMPERSONATE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_SET_CLIENT_PROCESS: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_QUERY_CLIENT_PROCESS: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_GET_PIPE_ATTRIBUTE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_SET_PIPE_ATTRIBUTE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_GET_CONNECTION_ATTRIBUTE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_SET_CONNECTION_ATTRIBUTE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_GET_HANDLE_ATTRIBUTE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_SET_HANDLE_ATTRIBUTE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS); pub const FSTL_PIPE_FLUSH: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA); pub const FSTL_PIPE_INTERNAL_READ: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA); pub const FSTL_PIPE_INTERNAL_WRITE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA); pub const FSTL_PIPE_INTERNAL_TRANSCEIVE: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA); pub const FSTL_PIPE_INTERNAL_READ_OVFLOW: u32 = CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA); pub const FILE_PIPE_READ_DATA: u32 = 0x00000000; pub const FILE_PIPE_WRITE_SPACE: u32 = 0x00000001; STRUCT!{struct FILE_PIPE_ASSIGN_EVENT_BUFFER { EventHandle: HANDLE, KeyValue: ULONG, }} pub type PFILE_PIPE_ASSIGN_EVENT_BUFFER = *mut FILE_PIPE_ASSIGN_EVENT_BUFFER; STRUCT!{struct FILE_PIPE_PEEK_BUFFER { NamedPipeState: ULONG, ReadDataAvailable: ULONG, NumberOfMessages: ULONG, MessageLength: ULONG, Data: [CHAR; 1], }} pub type PFILE_PIPE_PEEK_BUFFER = *mut FILE_PIPE_PEEK_BUFFER; STRUCT!{struct FILE_PIPE_EVENT_BUFFER { NamedPipeState: ULONG, EntryType: ULONG, ByteCount: ULONG, KeyValue: ULONG, NumberRequests: ULONG, }} pub type PFILE_PIPE_EVENT_BUFFER = *mut FILE_PIPE_EVENT_BUFFER; STRUCT!{struct FILE_PIPE_WAIT_FOR_BUFFER { Timeout: LARGE_INTEGER, NameLength: ULONG, TimeoutSpecified: BOOLEAN, Name: [WCHAR; 1], }} pub type PFILE_PIPE_WAIT_FOR_BUFFER = *mut FILE_PIPE_WAIT_FOR_BUFFER; STRUCT!{struct FILE_PIPE_CLIENT_PROCESS_BUFFER { ClientSession: PVOID, ClientProcess: PVOID, }} pub type PFILE_PIPE_CLIENT_PROCESS_BUFFER = *mut FILE_PIPE_CLIENT_PROCESS_BUFFER; pub const FILE_PIPE_COMPUTER_NAME_LENGTH: usize = 15; STRUCT!{struct FILE_PIPE_CLIENT_PROCESS_BUFFER_EX { ClientSession: PVOID, ClientProcess: PVOID, ClientComputerNameLength: USHORT, ClientComputerBuffer: [WCHAR; FILE_PIPE_COMPUTER_NAME_LENGTH + 1], }} pub type PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX = *mut FILE_PIPE_CLIENT_PROCESS_BUFFER_EX; pub const MAILSLOT_CLASS_FIRSTCLASS: u32 = 1; pub const MAILSLOT_CLASS_SECONDCLASS: u32 = 2; pub const FSCTL_MAILSLOT_PEEK: u32 = CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA); STRUCT!{struct FILE_MAILSLOT_PEEK_BUFFER { ReadDataAvailable: ULONG, NumberOfMessages: ULONG, MessageLength: ULONG, }} pub type PFILE_MAILSLOT_PEEK_BUFFER = *mut FILE_MAILSLOT_PEEK_BUFFER;