1 /* ntdll.h. Contains ntdll specific stuff not defined elsewhere.
3 Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
11 #ifndef STATUS_INVALID_INFO_CLASS
12 /* Some w32api header file defines this so we need to conditionalize this
13 define to avoid warnings. */
14 #define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xc0000003)
16 #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004)
17 #define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xc000000d)
18 #define STATUS_NO_SUCH_FILE ((NTSTATUS) 0xc000000f)
19 #define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xc0000010)
20 #define STATUS_END_OF_FILE ((NTSTATUS) 0xc0000011)
21 #define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS) 0xc0000013)
22 #define STATUS_ACCESS_DENIED ((NTSTATUS) 0xc0000022)
23 #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xc0000023)
24 #define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xc0000033)
25 #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS) 0xc0000034)
26 #define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS) 0xc000003A)
27 #define STATUS_SHARING_VIOLATION ((NTSTATUS) 0xc0000043)
28 #define STATUS_DELETE_PENDING ((NTSTATUS) 0xc0000056)
29 #define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xc00000a1)
30 #define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xc00000bb)
31 #define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xc0000101)
32 #define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106)
33 #define STATUS_INVALID_LEVEL ((NTSTATUS) 0xc0000148)
34 #define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005)
35 #define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006)
36 #define PDI_MODULES 0x01
37 #define PDI_HEAPS 0x04
38 #define LDRP_IMAGE_DLL 0x00000004
39 #define WSLE_PAGE_READONLY 0x001
40 #define WSLE_PAGE_EXECUTE 0x002
41 #define WSLE_PAGE_EXECUTE_READ 0x003
42 #define WSLE_PAGE_READWRITE 0x004
43 #define WSLE_PAGE_WRITECOPY 0x005
44 #define WSLE_PAGE_EXECUTE_READWRITE 0x006
45 #define WSLE_PAGE_EXECUTE_WRITECOPY 0x007
46 #define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0
47 #define WSLE_PAGE_SHAREABLE 0x100
49 #define FILE_SUPERSEDED 0
51 #define FILE_CREATED 2
52 #define FILE_OVERWRITTEN 3
54 #define FILE_DOES_NOT_EXIST 5
56 /* Device Characteristics. */
57 #define FILE_REMOVABLE_MEDIA 0x00000001
58 #define FILE_READ_ONLY_DEVICE 0x00000002
59 #define FILE_FLOPPY_DISKETTE 0x00000004
60 #define FILE_WRITE_ONCE_MEDIA 0x00000008
61 #define FILE_REMOTE_DEVICE 0x00000010
62 #define FILE_DEVICE_IS_MOUNTED 0x00000020
63 #define FILE_VIRTUAL_VOLUME 0x00000040
64 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
65 #define FILE_DEVICE_SECURE_OPEN 0x00000100
67 typedef enum _FILE_INFORMATION_CLASS
69 FileDirectoryInformation
= 1,
70 FileFullDirectoryInformation
, // 2
71 FileBothDirectoryInformation
, // 3
72 FileBasicInformation
, // 4 wdm
73 FileStandardInformation
, // 5 wdm
74 FileInternalInformation
, // 6
75 FileEaInformation
, // 7
76 FileAccessInformation
, // 8
77 FileNameInformation
, // 9
78 FileRenameInformation
, // 10
79 FileLinkInformation
, // 11
80 FileNamesInformation
, // 12
81 FileDispositionInformation
, // 13
82 FilePositionInformation
, // 14 wdm
83 FileFullEaInformation
, // 15
84 FileModeInformation
, // 16
85 FileAlignmentInformation
, // 17
86 FileAllInformation
, // 18
87 FileAllocationInformation
, // 19
88 FileEndOfFileInformation
, // 20 wdm
89 FileAlternateNameInformation
, // 21
90 FileStreamInformation
, // 22
91 FilePipeInformation
, // 23
92 FilePipeLocalInformation
, // 24
93 FilePipeRemoteInformation
, // 25
94 FileMailslotQueryInformation
, // 26
95 FileMailslotSetInformation
, // 27
96 FileCompressionInformation
, // 28
97 FileObjectIdInformation
, // 29
98 FileCompletionInformation
, // 30
99 FileMoveClusterInformation
, // 31
100 FileQuotaInformation
, // 32
101 FileReparsePointInformation
, // 33
102 FileNetworkOpenInformation
, // 34
103 FileAttributeTagInformation
, // 35
104 FileTrackingInformation
, // 36
105 FileIdBothDirectoryInformation
, // 37
106 FileIdFullDirectoryInformation
, // 38
107 FileValidDataLengthInformation
, // 39
108 FileShortNameInformation
, // 40
109 FileMaximumInformation
110 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
112 typedef struct _FILE_NAMES_INFORMATION
114 ULONG NextEntryOffset
;
116 ULONG FileNameLength
;
118 } FILE_NAMES_INFORMATION
, *PFILE_NAMES_INFORMATION
;
120 typedef struct _FILE_DIRECTORY_INFORMATION
{
121 ULONG NextEntryOffset
;
123 LARGE_INTEGER CreationTime
;
124 LARGE_INTEGER LastAccessTime
;
125 LARGE_INTEGER LastWriteTime
;
126 LARGE_INTEGER ChangeTime
;
127 LARGE_INTEGER EndOfFile
;
128 LARGE_INTEGER AllocationSize
;
129 ULONG FileAttributes
;
130 ULONG FileNameLength
;
132 } FILE_DIRECTORY_INFORMATION
, *PFILE_DIRECTORY_INFORMATION
;
134 typedef struct _FILE_BOTH_DIR_INFORMATION
136 ULONG NextEntryOffset
;
138 LARGE_INTEGER CreationTime
;
139 LARGE_INTEGER LastAccessTime
;
140 LARGE_INTEGER LastWriteTime
;
141 LARGE_INTEGER ChangeTime
;
142 LARGE_INTEGER EndOfFile
;
143 LARGE_INTEGER AllocationSize
;
144 ULONG FileAttributes
;
145 ULONG FileNameLength
;
147 CCHAR ShortNameLength
;
150 } FILE_BOTH_DIR_INFORMATION
, *PFILE_BOTH_DIR_INFORMATION
;
152 typedef struct _FILE_ID_BOTH_DIR_INFORMATION
154 ULONG NextEntryOffset
;
156 LARGE_INTEGER CreationTime
;
157 LARGE_INTEGER LastAccessTime
;
158 LARGE_INTEGER LastWriteTime
;
159 LARGE_INTEGER ChangeTime
;
160 LARGE_INTEGER EndOfFile
;
161 LARGE_INTEGER AllocationSize
;
162 ULONG FileAttributes
;
163 ULONG FileNameLength
;
165 CCHAR ShortNameLength
;
167 LARGE_INTEGER FileId
;
169 } FILE_ID_BOTH_DIR_INFORMATION
, *PFILE_ID_BOTH_DIR_INFORMATION
;
172 #define AT_EXTENDABLE_FILE 0x00002000
173 #define AT_ROUND_TO_PAGE 0x40000000
175 #define LOCK_VM_IN_WSL 1
176 #define LOCK_VM_IN_RAM 2
178 #define DIRECTORY_QUERY 1
180 typedef ULONG KAFFINITY
;
182 typedef enum _SYSTEM_INFORMATION_CLASS
184 SystemBasicInformation
= 0,
185 SystemPerformanceInformation
= 2,
186 SystemTimeOfDayInformation
= 3,
187 SystemProcessesAndThreadsInformation
= 5,
188 SystemProcessorTimes
= 8,
189 SystemPagefileInformation
= 18,
190 /* There are a lot more of these... */
191 } SYSTEM_INFORMATION_CLASS
;
193 typedef struct _SYSTEM_BASIC_INFORMATION
196 ULONG MaximumIncrement
;
197 ULONG PhysicalPageSize
;
198 ULONG NumberOfPhysicalPages
;
199 ULONG LowestPhysicalPage
;
200 ULONG HighestPhysicalPage
;
201 ULONG AllocationGranularity
;
202 ULONG LowestUserAddress
;
203 ULONG HighestUserAddress
;
204 ULONG ActiveProcessors
;
205 UCHAR NumberProcessors
;
206 } SYSTEM_BASIC_INFORMATION
, *PSYSTEM_BASIC_INFORMATION
;
208 typedef struct _SYSTEM_PAGEFILE_INFORMATION
210 ULONG NextEntryOffset
;
214 UNICODE_STRING FileName
;
215 } SYSTEM_PAGEFILE_INFORMATION
, *PSYSTEM_PAGEFILE_INFORMATION
;
217 typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES
219 LARGE_INTEGER IdleTime
;
220 LARGE_INTEGER KernelTime
;
221 LARGE_INTEGER UserTime
;
222 LARGE_INTEGER DpcTime
;
223 LARGE_INTEGER InterruptTime
;
224 ULONG InterruptCount
;
225 } SYSTEM_PROCESSOR_TIMES
, *PSYSTEM_PROCESSOR_TIMES
;
227 typedef LONG KPRIORITY
;
228 typedef struct _VM_COUNTERS
230 ULONG PeakVirtualSize
;
232 ULONG PageFaultCount
;
233 ULONG PeakWorkingSetSize
;
234 ULONG WorkingSetSize
;
235 ULONG QuotaPeakPagedPoolUsage
;
236 ULONG QuotaPagedPoolUsage
;
237 ULONG QuotaPeakNonPagedPoolUsage
;
238 ULONG QuotaNonPagedPoolUsage
;
240 ULONG PeakPagefileUsage
;
241 } VM_COUNTERS
, *PVM_COUNTERS
;
243 typedef struct _CLIENT_ID
245 HANDLE UniqueProcess
;
247 } CLIENT_ID
, *PCLIENT_ID
;
293 typedef struct _SYSTEM_THREADS
295 LARGE_INTEGER KernelTime
;
296 LARGE_INTEGER UserTime
;
297 LARGE_INTEGER CreateTime
;
302 KPRIORITY BasePriority
;
303 ULONG ContextSwitchCount
;
305 KWAIT_REASON WaitReason
;
307 } SYSTEM_THREADS
, *PSYSTEM_THREADS
;
309 typedef struct _SYSTEM_PROCESSES
311 ULONG NextEntryDelta
;
314 LARGE_INTEGER CreateTime
;
315 LARGE_INTEGER UserTime
;
316 LARGE_INTEGER KernelTime
;
317 UNICODE_STRING ProcessName
;
318 KPRIORITY BasePriority
;
320 ULONG InheritedFromProcessId
;
323 VM_COUNTERS VmCounters
;
324 IO_COUNTERS IoCounters
;
325 SYSTEM_THREADS Threads
[1];
326 } SYSTEM_PROCESSES
, *PSYSTEM_PROCESSES
;
328 typedef struct _IO_STATUS_BLOCK
332 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
334 typedef struct _SYSTEM_PERFORMANCE_INFORMATION
336 LARGE_INTEGER IdleTime
;
337 LARGE_INTEGER ReadTransferCount
;
338 LARGE_INTEGER WriteTransferCount
;
339 LARGE_INTEGER OtherTransferCount
;
340 ULONG ReadOperationCount
;
341 ULONG WriteOperationCount
;
342 ULONG OtherOperationCount
;
343 ULONG AvailablePages
;
344 ULONG TotalCommittedPages
;
345 ULONG TotalCommitLimit
;
346 ULONG PeakCommitment
;
348 ULONG WriteCopyFaults
;
349 ULONG TransitionFaults
;
351 ULONG DemandZeroFaults
;
355 ULONG PagefilePagesWritten
;
356 ULONG PagefilePageWriteIos
;
357 ULONG MappedFilePagesWritten
;
358 ULONG MappedFilePageWriteIos
;
359 ULONG PagedPoolUsage
;
360 ULONG NonPagedPoolUsage
;
361 ULONG PagedPoolAllocs
;
362 ULONG PagedPoolFrees
;
363 ULONG NonPagedPoolAllocs
;
364 ULONG NonPagedPoolFrees
;
365 ULONG TotalFreeSystemPtes
;
366 ULONG SystemCodePage
;
367 ULONG TotalSystemDriverPages
;
368 ULONG TotalSystemCodePages
;
369 ULONG SmallNonPagedLookasideListAllocateHits
;
370 ULONG SmallPagedLookasideListAllocateHits
;
372 ULONG MmSystemCachePage
;
374 ULONG SystemDriverPage
;
375 ULONG FastReadNoWait
;
377 ULONG FastReadResourceMiss
;
378 ULONG FastReadNotPossible
;
379 ULONG FastMdlReadNoWait
;
380 ULONG FastMdlReadWait
;
381 ULONG FastMdlReadResourceMiss
;
382 ULONG FastMdlReadNotPossible
;
385 ULONG MapDataNoWaitMiss
;
386 ULONG MapDataWaitMiss
;
387 ULONG PinMappedDataCount
;
390 ULONG PinReadNoWaitMiss
;
391 ULONG PinReadWaitMiss
;
392 ULONG CopyReadNoWait
;
394 ULONG CopyReadNoWaitMiss
;
395 ULONG CopyReadWaitMiss
;
398 ULONG MdlReadNoWaitMiss
;
399 ULONG MdlReadWaitMiss
;
402 ULONG LazyWritePages
;
405 ULONG ContextSwitches
;
406 ULONG FirstLevelTbFills
;
407 ULONG SecondLevelTbFills
;
409 } SYSTEM_PERFORMANCE_INFORMATION
, *PSYSTEM_PERFORMANCE_INFORMATION
;
411 typedef struct __attribute__ ((aligned(8))) _SYSTEM_TIME_OF_DAY_INFORMATION
413 LARGE_INTEGER BootTime
;
414 LARGE_INTEGER CurrentTime
;
415 LARGE_INTEGER TimeZoneBias
;
416 ULONG CurrentTimeZoneId
;
417 } SYSTEM_TIME_OF_DAY_INFORMATION
, *PSYSTEM_TIME_OF_DAY_INFORMATION
;
419 typedef enum _PROCESSINFOCLASS
421 ProcessBasicInformation
= 0,
422 ProcessQuotaLimits
= 1,
423 ProcessVmCounters
= 3,
427 typedef struct _DEBUG_BUFFER
429 HANDLE SectionHandle
;
431 PVOID RemoteSectionBase
;
432 ULONG SectionBaseDelta
;
433 HANDLE EventPairHandle
;
435 HANDLE RemoteThreadHandle
;
440 PVOID ModuleInformation
;
441 PVOID BackTraceInformation
;
442 PVOID HeapInformation
;
443 PVOID LockInformation
;
445 } DEBUG_BUFFER
, *PDEBUG_BUFFER
;
447 typedef struct _DEBUG_HEAP_INFORMATION
460 } DEBUG_HEAP_INFORMATION
, *PDEBUG_HEAP_INFORMATION
;
462 typedef struct _DEBUG_MODULE_INFORMATION
471 USHORT ModuleNameOffset
;
473 } DEBUG_MODULE_INFORMATION
, *PDEBUG_MODULE_INFORMATION
;
475 typedef struct _KERNEL_USER_TIMES
477 LARGE_INTEGER CreateTime
;
478 LARGE_INTEGER ExitTime
;
479 LARGE_INTEGER KernelTime
;
480 LARGE_INTEGER UserTime
;
481 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
483 typedef struct _RTL_USER_PROCESS_PARAMETERS
485 ULONG AllocationSize
;
494 UNICODE_STRING CurrentDirectoryName
;
495 HANDLE CurrentDirectoryHandle
;
496 UNICODE_STRING DllPath
;
497 UNICODE_STRING ImagePathName
;
498 UNICODE_STRING CommandLine
;
506 ULONG dwFillAttribute
;
509 UNICODE_STRING WindowTitle
;
510 UNICODE_STRING DesktopInfo
;
511 UNICODE_STRING ShellInfo
;
512 UNICODE_STRING RuntimeInfo
;
513 } RTL_USER_PROCESS_PARAMETERS
, *PRTL_USER_PROCESS_PARAMETERS
;
521 PRTL_USER_PROCESS_PARAMETERS ProcessParameters
;
526 typedef struct _PROCESS_BASIC_INFORMATION
530 KAFFINITY AffinityMask
;
531 KPRIORITY BasePriority
;
532 ULONG UniqueProcessId
;
533 ULONG InheritedFromUniqueProcessId
;
534 } PROCESS_BASIC_INFORMATION
, *PPROCESS_BASIC_INFORMATION
;
536 typedef enum _MEMORY_INFORMATION_CLASS
538 MemoryBasicInformation
,
539 MemoryWorkingSetList
,
541 MemoryBasicVlmInformation
542 } MEMORY_INFORMATION_CLASS
;
544 typedef struct _MEMORY_WORKING_SET_LIST
547 ULONG WorkingSetList
[1];
548 } MEMORY_WORKING_SET_LIST
, *PMEMORY_WORKING_SET_LIST
;
550 typedef struct _FILE_BASIC_INFORMATION
{
551 LARGE_INTEGER CreationTime
;
552 LARGE_INTEGER LastAccessTime
;
553 LARGE_INTEGER LastWriteTime
;
554 LARGE_INTEGER ChangeTime
;
555 ULONG FileAttributes
;
556 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
558 typedef struct _FILE_STANDARD_INFORMATION
{
559 LARGE_INTEGER AllocationSize
;
560 LARGE_INTEGER EndOfFile
;
562 BOOLEAN DeletePending
;
564 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
566 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
567 LARGE_INTEGER CreationTime
;
568 LARGE_INTEGER LastAccessTime
;
569 LARGE_INTEGER LastWriteTime
;
570 LARGE_INTEGER ChangeTime
;
571 LARGE_INTEGER AllocationSize
;
572 LARGE_INTEGER EndOfFile
;
573 ULONG FileAttributes
;
574 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
576 typedef struct _FILE_INTERNAL_INFORMATION
{
577 LARGE_INTEGER FileId
;
578 } FILE_INTERNAL_INFORMATION
, *PFILE_INTERNAL_INFORMATION
;
580 typedef struct _FILE_EA_INFORMATION
{
582 } FILE_EA_INFORMATION
, *PFILE_EA_INFORMATION
;
584 typedef struct _FILE_ACCESS_INFORMATION
{
585 ACCESS_MASK AccessFlags
;
586 } FILE_ACCESS_INFORMATION
, *PFILE_ACCESS_INFORMATION
;
588 typedef struct _FILE_DISPOSITION_INFORMATION
{
590 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
592 typedef struct _FILE_POSITION_INFORMATION
{
593 LARGE_INTEGER CurrentByteOffset
;
594 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
596 typedef struct _FILE_END_OF_FILE_INFORMATION
{
597 LARGE_INTEGER EndOfFile
;
598 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
600 typedef struct _FILE_MODE_INFORMATION
{
602 } FILE_MODE_INFORMATION
, *PFILE_MODE_INFORMATION
;
604 typedef struct _FILE_ALIGNMENT_INFORMATION
{
605 ULONG AlignmentRequirement
;
606 } FILE_ALIGNMENT_INFORMATION
;
608 typedef struct _FILE_NAME_INFORMATION
{
609 ULONG FileNameLength
;
611 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
613 typedef struct _FILE_LINK_INFORMATION
{
614 BOOLEAN ReplaceIfExists
;
615 HANDLE RootDirectory
;
616 ULONG FileNameLength
;
618 } FILE_LINK_INFORMATION
, *PFILE_LINK_INFORMATION
;
620 typedef struct _FILE_RENAME_INFORMATION
{
621 BOOLEAN ReplaceIfExists
;
622 HANDLE RootDirectory
;
623 ULONG FileNameLength
;
625 } FILE_RENAME_INFORMATION
, *PFILE_RENAME_INFORMATION
;
627 typedef struct _FILE_ALL_INFORMATION
{
628 FILE_BASIC_INFORMATION BasicInformation
;
629 FILE_STANDARD_INFORMATION StandardInformation
;
630 FILE_INTERNAL_INFORMATION InternalInformation
;
631 FILE_EA_INFORMATION EaInformation
;
632 FILE_ACCESS_INFORMATION AccessInformation
;
633 FILE_POSITION_INFORMATION PositionInformation
;
634 FILE_MODE_INFORMATION ModeInformation
;
635 FILE_ALIGNMENT_INFORMATION AlignmentInformation
;
636 FILE_NAME_INFORMATION NameInformation
;
637 } FILE_ALL_INFORMATION
, *PFILE_ALL_INFORMATION
;
639 typedef struct _FILE_PIPE_LOCAL_INFORMATION
642 ULONG NamedPipeConfiguration
;
643 ULONG MaximumInstances
;
644 ULONG CurrentInstances
;
646 ULONG ReadDataAvailable
;
648 ULONG WriteQuotaAvailable
;
649 ULONG NamedPipeState
;
651 } FILE_PIPE_LOCAL_INFORMATION
, *PFILE_PIPE_LOCAL_INFORMATION
;
653 typedef struct _FILE_COMPRESSION_INFORMATION
655 LARGE_INTEGER CompressedFileSize
;
656 USHORT CompressionFormat
;
657 UCHAR CompressionUnitShift
;
661 } FILE_COMPRESSION_INFORMATION
, *PFILE_COMPRESSION_INFORMATION
;
663 typedef struct _FILE_FS_DEVICE_INFORMATION
666 ULONG Characteristics
;
667 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
669 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
671 ULONG FileSystemAttributes
;
672 ULONG MaximumComponentNameLength
;
673 ULONG FileSystemNameLength
;
674 WCHAR FileSystemName
[1];
675 } FILE_FS_ATTRIBUTE_INFORMATION
, *PFILE_FS_ATTRIBUTE_INFORMATION
;
677 typedef struct _FILE_FS_VOLUME_INFORMATION
679 LARGE_INTEGER VolumeCreationTime
;
680 ULONG VolumeSerialNumber
;
681 ULONG VolumeLabelLength
;
682 BOOLEAN SupportsObjects
;
683 WCHAR VolumeLabel
[1];
684 } FILE_FS_VOLUME_INFORMATION
, *PFILE_FS_VOLUME_INFORMATION
;
686 typedef struct _FILE_FS_SIZE_INFORMATION
688 LARGE_INTEGER TotalAllocationUnits
;
689 LARGE_INTEGER AvailableAllocationUnits
;
690 ULONG SectorsPerAllocationUnit
;
691 ULONG BytesPerSector
;
692 } FILE_FS_SIZE_INFORMATION
, *PFILE_FS_SIZE_INFORMATION
;
694 typedef struct _FILE_FS_FULL_SIZE_INFORMATION
696 LARGE_INTEGER TotalAllocationUnits
;
697 LARGE_INTEGER CallerAvailableAllocationUnits
;
698 LARGE_INTEGER ActualAvailableAllocationUnits
;
699 ULONG SectorsPerAllocationUnit
;
700 ULONG BytesPerSector
;
701 } FILE_FS_FULL_SIZE_INFORMATION
, *PFILE_FS_FULL_SIZE_INFORMATION
;
703 typedef enum _FSINFOCLASS
{
704 FileFsVolumeInformation
= 1,
705 FileFsLabelInformation
,
706 FileFsSizeInformation
,
707 FileFsDeviceInformation
,
708 FileFsAttributeInformation
,
709 FileFsControlInformation
,
710 FileFsFullSizeInformation
,
711 FileFsObjectIdInformation
,
712 FileFsDriverPathInformation
,
713 FileFsMaximumInformation
714 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
716 typedef enum _OBJECT_INFORMATION_CLASS
718 ObjectBasicInformation
= 0,
719 ObjectNameInformation
= 1,
720 ObjectHandleInformation
= 4
722 } OBJECT_INFORMATION_CLASS
;
724 typedef struct _OBJECT_NAME_INFORMATION
727 } OBJECT_NAME_INFORMATION
;
729 typedef struct _DIRECTORY_BASIC_INFORMATION
731 UNICODE_STRING ObjectName
;
732 UNICODE_STRING ObjectTypeName
;
733 } DIRECTORY_BASIC_INFORMATION
, *PDIRECTORY_BASIC_INFORMATION
;
735 typedef struct _FILE_GET_EA_INFORMATION
737 ULONG NextEntryOffset
;
740 } FILE_GET_EA_INFORMATION
, *PFILE_GET_EA_INFORMATION
;
743 typedef struct _FILE_FULL_EA_INFORMATION
745 ULONG NextEntryOffset
;
748 USHORT EaValueLength
;
750 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
752 typedef struct _FILE_MAILSLOT_SET_INFORMATION
754 LARGE_INTEGER ReadTimeout
;
755 } FILE_MAILSLOT_SET_INFORMATION
, *PFILE_MAILSLOT_SET_INFORMATION
;
757 typedef VOID
NTAPI (*PIO_APC_ROUTINE
)(PVOID
, PIO_STATUS_BLOCK
, ULONG
);
759 /* Function declarations for ntdll.dll. These don't appear in any
760 standard Win32 header. */
763 NTSTATUS NTAPI
NtAdjustPrivilegesToken (HANDLE
, BOOLEAN
, PTOKEN_PRIVILEGES
,
764 ULONG
, PTOKEN_PRIVILEGES
, PULONG
);
765 NTSTATUS NTAPI
NtClose (HANDLE
);
766 NTSTATUS NTAPI
NtCreateFile (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
767 PIO_STATUS_BLOCK
, PLARGE_INTEGER
, ULONG
, ULONG
,
768 ULONG
, ULONG
, PVOID
, ULONG
);
769 NTSTATUS NTAPI
NtCreateMailslotFile(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
770 PIO_STATUS_BLOCK
, ULONG
, ULONG
, ULONG
,
772 NTSTATUS NTAPI
NtCreateSection (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
773 PLARGE_INTEGER
, ULONG
, ULONG
, HANDLE
);
774 NTSTATUS NTAPI
NtCreateToken (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
775 TOKEN_TYPE
, PLUID
, PLARGE_INTEGER
, PTOKEN_USER
,
776 PTOKEN_GROUPS
, PTOKEN_PRIVILEGES
, PTOKEN_OWNER
,
777 PTOKEN_PRIMARY_GROUP
, PTOKEN_DEFAULT_DACL
,
779 NTSTATUS NTAPI
NtFsControlFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
, PVOID
,
780 PIO_STATUS_BLOCK
, ULONG
, PVOID
, ULONG
,
782 NTSTATUS NTAPI
NtLockVirtualMemory (HANDLE
, PVOID
*, ULONG
*, ULONG
);
783 NTSTATUS NTAPI
NtMapViewOfSection (HANDLE
, HANDLE
, PVOID
*, ULONG
, ULONG
,
784 PLARGE_INTEGER
, PULONG
, SECTION_INHERIT
,
786 NTSTATUS NTAPI
NtNotifyChangeDirectoryFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
,
787 PVOID
, PIO_STATUS_BLOCK
,
788 PFILE_NOTIFY_INFORMATION
, ULONG
,
790 NTSTATUS NTAPI
NtOpenDirectoryObject (PHANDLE
, ACCESS_MASK
,
792 NTSTATUS NTAPI
NtOpenFile (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
793 PIO_STATUS_BLOCK
, ULONG
, ULONG
);
794 NTSTATUS NTAPI
NtOpenSection (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
795 /* WARNING! Don't rely on the timestamp information returned by
796 NtQueryAttributesFile. Only the DOS file attribute info is reliable. */
797 NTSTATUS NTAPI
NtQueryAttributesFile (POBJECT_ATTRIBUTES
,
798 PFILE_BASIC_INFORMATION
);
799 NTSTATUS NTAPI
NtQueryDirectoryFile(HANDLE
, HANDLE
, PVOID
, PVOID
,
800 PIO_STATUS_BLOCK
, PVOID
, ULONG
,
801 FILE_INFORMATION_CLASS
, BOOLEAN
,
802 PUNICODE_STRING
, BOOLEAN
);
803 NTSTATUS NTAPI
NtQueryDirectoryObject (HANDLE
, PVOID
, ULONG
, BOOLEAN
,
804 BOOLEAN
, PULONG
, PULONG
);
805 NTSTATUS NTAPI
NtQueryEaFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
, ULONG
,
806 BOOLEAN
, PVOID
, ULONG
, PULONG
, BOOLEAN
);
807 NTSTATUS NTAPI
NtQueryFullAttributesFile (POBJECT_ATTRIBUTES
,
808 PFILE_NETWORK_OPEN_INFORMATION
);
809 NTSTATUS NTAPI
NtQueryInformationFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
,
810 ULONG
, FILE_INFORMATION_CLASS
);
811 NTSTATUS NTAPI
NtQueryInformationProcess (HANDLE
, PROCESSINFOCLASS
,
812 PVOID
, ULONG
, PULONG
);
813 NTSTATUS NTAPI
NtQueryObject (HANDLE
, OBJECT_INFORMATION_CLASS
, VOID
*,
815 NTSTATUS NTAPI
NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS
,
816 PVOID
, ULONG
, PULONG
);
817 NTSTATUS NTAPI
NtQuerySecurityObject (HANDLE
, SECURITY_INFORMATION
,
818 PSECURITY_DESCRIPTOR
, ULONG
, PULONG
);
819 NTSTATUS NTAPI
NtQueryVirtualMemory (HANDLE
, PVOID
, MEMORY_INFORMATION_CLASS
,
820 PVOID
, ULONG
, PULONG
);
821 NTSTATUS NTAPI
NtQueryVolumeInformationFile (HANDLE
, IO_STATUS_BLOCK
*,
823 FS_INFORMATION_CLASS
);
824 NTSTATUS NTAPI
NtReadFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
, PVOID
,
825 PIO_STATUS_BLOCK
, PVOID
, ULONG
, PLARGE_INTEGER
,
827 NTSTATUS NTAPI
NtSetEaFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
, ULONG
);
828 NTSTATUS NTAPI
NtSetInformationFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
, ULONG
,
829 FILE_INFORMATION_CLASS
);
830 NTSTATUS NTAPI
NtSetSecurityObject (HANDLE
, SECURITY_INFORMATION
,
831 PSECURITY_DESCRIPTOR
);
832 NTSTATUS NTAPI
NtUnlockVirtualMemory (HANDLE
, PVOID
*, ULONG
*, ULONG
);
833 NTSTATUS NTAPI
NtUnmapViewOfSection (HANDLE
, PVOID
);
834 NTSTATUS NTAPI
NtWriteFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
, PVOID
,
835 PIO_STATUS_BLOCK
, PVOID
, ULONG
, PLARGE_INTEGER
,
837 NTSTATUS NTAPI
RtlAppendUnicodeToString (PUNICODE_STRING
, PCWSTR
);
838 NTSTATUS NTAPI
RtlAppendUnicodeStringToString (PUNICODE_STRING
,
840 VOID NTAPI
RtlAcquirePebLock ();
841 NTSTATUS NTAPI
RtlAnsiStringToUnicodeString (PUNICODE_STRING
, PANSI_STRING
,
843 LONG NTAPI
RtlCompareUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
845 NTSTATUS NTAPI
RtlConvertSidToUnicodeString (PUNICODE_STRING
, PSID
, BOOLEAN
);
846 VOID NTAPI
RtlCopyUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
);
847 BOOLEAN NTAPI
RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING
, PCSTR
);
848 BOOLEAN NTAPI
RtlEqualUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
850 VOID NTAPI
RtlFreeAnsiString (PANSI_STRING
);
851 VOID NTAPI
RtlFreeOemString (POEM_STRING
);
852 VOID NTAPI
RtlFreeUnicodeString (PUNICODE_STRING
);
853 VOID NTAPI
RtlInitEmptyUnicodeString (PUNICODE_STRING
, PCWSTR
, USHORT
);
854 VOID NTAPI
RtlInitUnicodeString (PUNICODE_STRING
, PCWSTR
);
855 NTSTATUS NTAPI
RtlIntegerToUnicodeString (ULONG
, ULONG
, PUNICODE_STRING
);
856 ULONG NTAPI
RtlIsDosDeviceName_U (PCWSTR
);
857 ULONG NTAPI
RtlNtStatusToDosError (NTSTATUS
);
858 NTSTATUS NTAPI
RtlOemStringToUnicodeString (PUNICODE_STRING
, POEM_STRING
,
860 BOOLEAN NTAPI
RtlPrefixUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
862 VOID NTAPI
RtlReleasePebLock ();
863 VOID NTAPI
RtlSecondsSince1970ToTime (ULONG
, PLARGE_INTEGER
);
864 NTSTATUS NTAPI
RtlUnicodeStringToAnsiString (PANSI_STRING
, PUNICODE_STRING
,
866 NTSTATUS NTAPI
RtlUnicodeStringToOemString (PANSI_STRING
, PUNICODE_STRING
,
868 WCHAR NTAPI
RtlUpcaseUnicodeChar (WCHAR
);
870 /* A few Rtl functions are either actually macros, or they just don't
871 exist even though they would be a big help. We implement them here,
872 partly as inline functions. */
874 /* RtlInitEmptyUnicodeString is defined as a macro in wdm.h, but that file
875 is missing entirely in w32api. */
877 VOID NTAPI
RtlInitEmptyUnicodeString(PUNICODE_STRING dest
, PCWSTR buf
,
881 dest
->MaximumLength
= len
;
882 dest
->Buffer
= (PWSTR
) buf
;
884 /* Like RtlInitEmptyUnicodeString, but initialize Length to len, too.
885 This is for instance useful when creating a UNICODE_STRING from an
886 NtQueryInformationFile info buffer, where the length of the filename
887 is known, but you can't rely on the string being 0-terminated.
888 If you know it's 0-terminated, just use RtlInitUnicodeString(). */
890 VOID NTAPI
RtlInitCountedUnicodeString (PUNICODE_STRING dest
, PCWSTR buf
,
893 dest
->Length
= dest
->MaximumLength
= len
;
894 dest
->Buffer
= (PWSTR
) buf
;
896 /* Split path into dirname and basename part. This function does not
897 copy anything! It just initializes the dirname and basename
898 UNICODE_STRINGs so that their Buffer members point to the right spot
899 into path's Buffer, and the Length (and MaximumLength) members are set
900 to match the dirname part and the basename part.
901 Note that dirname's Length is set so that it also includes the trailing
902 backslash. If you don't need it, just subtract sizeof(WCHAR) from
905 VOID NTAPI
RtlSplitUnicodePath (PUNICODE_STRING path
, PUNICODE_STRING dirname
,
906 PUNICODE_STRING basename
)
908 USHORT len
= path
->Length
/ sizeof (WCHAR
);
909 while (len
> 0 && path
->Buffer
[--len
] != L
'\\')
913 RtlInitCountedUnicodeString (dirname
, path
->Buffer
, len
* sizeof (WCHAR
));
915 RtlInitCountedUnicodeString (basename
, &path
->Buffer
[len
],
916 path
->Length
- len
* sizeof (WCHAR
));
918 /* Check if prefix is a prefix of path. */
920 BOOLEAN NTAPI
RtlEqualUnicodePathPrefix (PUNICODE_STRING path
, PCWSTR prefix
,
921 BOOLEAN caseinsensitive
)
923 UNICODE_STRING p
, pref
;
925 RtlInitUnicodeString (&pref
, prefix
);
926 RtlInitCountedUnicodeString (&p
, path
->Buffer
,
927 pref
.Length
< path
->Length
928 ? pref
.Length
: path
->Length
);
929 return RtlEqualUnicodeString (&p
, &pref
, caseinsensitive
);
931 /* Check if sufffix is a sufffix of path. */
933 BOOL NTAPI
RtlEqualUnicodePathSuffix (PUNICODE_STRING path
, PCWSTR suffix
,
934 BOOLEAN caseinsensitive
)
936 UNICODE_STRING p
, suf
;
938 RtlInitUnicodeString (&suf
, suffix
);
939 if (suf
.Length
< path
->Length
)
940 RtlInitCountedUnicodeString (&p
, (PWCHAR
) ((PBYTE
) path
->Buffer
941 + path
->Length
- suf
.Length
),
944 RtlInitCountedUnicodeString (&p
, path
->Buffer
, path
->Length
);
945 return RtlEqualUnicodeString (&p
, &suf
, caseinsensitive
);
947 /* Implemented in strfuncs.cc. Create a Hex UNICODE_STRING from a given
948 64 bit integer value. If append is TRUE, append the hex string,
949 otherwise overwrite dest. Returns either STAUTUS_SUCCESS, or
950 STATUS_BUFFER_OVERFLOW, if the unicode buffer is too small (hasn't
951 room for 16 WCHARs). */
952 NTSTATUS NTAPI
RtlInt64ToHexUnicodeString (ULONGLONG value
,
953 PUNICODE_STRING dest
,