1 /* ntdll.h. Contains ntdll specific stuff not defined elsewhere.
3 Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 #define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS) 0x40000000)
12 #define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005)
13 #define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006)
14 #ifndef STATUS_INVALID_INFO_CLASS
15 /* Some w32api header file defines this so we need to conditionalize this
16 define to avoid warnings. */
17 #define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xc0000003)
19 #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004)
20 #define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xc000000d)
21 #define STATUS_NO_SUCH_FILE ((NTSTATUS) 0xc000000f)
22 #define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xc0000010)
23 #define STATUS_END_OF_FILE ((NTSTATUS) 0xc0000011)
24 #define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS) 0xc0000013)
25 #define STATUS_ACCESS_DENIED ((NTSTATUS) 0xc0000022)
26 #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xc0000023)
27 #define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xc0000033)
28 #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS) 0xc0000034)
29 #define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS) 0xc000003A)
30 #define STATUS_SHARING_VIOLATION ((NTSTATUS) 0xc0000043)
31 #define STATUS_EA_TOO_LARGE ((NTSTATUS) 0xc0000050)
32 #define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS) 0xc0000051)
33 #define STATUS_NO_EAS_ON_FILE ((NTSTATUS) 0xc0000052)
34 #define STATUS_DELETE_PENDING ((NTSTATUS) 0xc0000056)
35 #define STATUS_DISK_FULL ((NTSTATUS) 0xc000007f)
36 #define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xc00000a1)
37 #define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xc00000bb)
38 #define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xc0000101)
39 #define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106)
40 #define STATUS_INVALID_LEVEL ((NTSTATUS) 0xc0000148)
41 #define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xc0000135)
42 #define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xc0000139)
43 #define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xc0000251)
44 #define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xc0000269)
46 #define PDI_MODULES 0x01
47 #define PDI_HEAPS 0x04
48 #define LDRP_IMAGE_DLL 0x00000004
49 #define WSLE_PAGE_READONLY 0x001
50 #define WSLE_PAGE_EXECUTE 0x002
51 #define WSLE_PAGE_EXECUTE_READ 0x003
52 #define WSLE_PAGE_READWRITE 0x004
53 #define WSLE_PAGE_WRITECOPY 0x005
54 #define WSLE_PAGE_EXECUTE_READWRITE 0x006
55 #define WSLE_PAGE_EXECUTE_WRITECOPY 0x007
56 #define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0
57 #define WSLE_PAGE_SHAREABLE 0x100
59 #define FILE_SUPERSEDED 0
61 #define FILE_CREATED 2
62 #define FILE_OVERWRITTEN 3
64 #define FILE_DOES_NOT_EXIST 5
66 #define FILE_WRITE_TO_END_OF_FILE (-1LL)
67 #define FILE_USE_FILE_POINTER_POSITION (-2LL)
69 /* Device Characteristics. */
70 #define FILE_REMOVABLE_MEDIA 0x00000001
71 #define FILE_READ_ONLY_DEVICE 0x00000002
72 #define FILE_FLOPPY_DISKETTE 0x00000004
73 #define FILE_WRITE_ONCE_MEDIA 0x00000008
74 #define FILE_REMOTE_DEVICE 0x00000010
75 #define FILE_DEVICE_IS_MOUNTED 0x00000020
76 #define FILE_VIRTUAL_VOLUME 0x00000040
77 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
78 #define FILE_DEVICE_SECURE_OPEN 0x00000100
80 typedef enum _FILE_INFORMATION_CLASS
82 FileDirectoryInformation
= 1,
83 FileFullDirectoryInformation
, // 2
84 FileBothDirectoryInformation
, // 3
85 FileBasicInformation
, // 4 wdm
86 FileStandardInformation
, // 5 wdm
87 FileInternalInformation
, // 6
88 FileEaInformation
, // 7
89 FileAccessInformation
, // 8
90 FileNameInformation
, // 9
91 FileRenameInformation
, // 10
92 FileLinkInformation
, // 11
93 FileNamesInformation
, // 12
94 FileDispositionInformation
, // 13
95 FilePositionInformation
, // 14 wdm
96 FileFullEaInformation
, // 15
97 FileModeInformation
, // 16
98 FileAlignmentInformation
, // 17
99 FileAllInformation
, // 18
100 FileAllocationInformation
, // 19
101 FileEndOfFileInformation
, // 20 wdm
102 FileAlternateNameInformation
, // 21
103 FileStreamInformation
, // 22
104 FilePipeInformation
, // 23
105 FilePipeLocalInformation
, // 24
106 FilePipeRemoteInformation
, // 25
107 FileMailslotQueryInformation
, // 26
108 FileMailslotSetInformation
, // 27
109 FileCompressionInformation
, // 28
110 FileObjectIdInformation
, // 29
111 FileCompletionInformation
, // 30
112 FileMoveClusterInformation
, // 31
113 FileQuotaInformation
, // 32
114 FileReparsePointInformation
, // 33
115 FileNetworkOpenInformation
, // 34
116 FileAttributeTagInformation
, // 35
117 FileTrackingInformation
, // 36
118 FileIdBothDirectoryInformation
, // 37
119 FileIdFullDirectoryInformation
, // 38
120 FileValidDataLengthInformation
, // 39
121 FileShortNameInformation
, // 40
122 FileMaximumInformation
123 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
125 typedef struct _FILE_NAMES_INFORMATION
127 ULONG NextEntryOffset
;
129 ULONG FileNameLength
;
131 } FILE_NAMES_INFORMATION
, *PFILE_NAMES_INFORMATION
;
133 typedef struct _FILE_DIRECTORY_INFORMATION
{
134 ULONG NextEntryOffset
;
136 LARGE_INTEGER CreationTime
;
137 LARGE_INTEGER LastAccessTime
;
138 LARGE_INTEGER LastWriteTime
;
139 LARGE_INTEGER ChangeTime
;
140 LARGE_INTEGER EndOfFile
;
141 LARGE_INTEGER AllocationSize
;
142 ULONG FileAttributes
;
143 ULONG FileNameLength
;
145 } FILE_DIRECTORY_INFORMATION
, *PFILE_DIRECTORY_INFORMATION
;
147 typedef struct _FILE_BOTH_DIR_INFORMATION
149 ULONG NextEntryOffset
;
151 LARGE_INTEGER CreationTime
;
152 LARGE_INTEGER LastAccessTime
;
153 LARGE_INTEGER LastWriteTime
;
154 LARGE_INTEGER ChangeTime
;
155 LARGE_INTEGER EndOfFile
;
156 LARGE_INTEGER AllocationSize
;
157 ULONG FileAttributes
;
158 ULONG FileNameLength
;
160 CCHAR ShortNameLength
;
163 } FILE_BOTH_DIR_INFORMATION
, *PFILE_BOTH_DIR_INFORMATION
;
165 typedef struct _FILE_ID_BOTH_DIR_INFORMATION
167 ULONG NextEntryOffset
;
169 LARGE_INTEGER CreationTime
;
170 LARGE_INTEGER LastAccessTime
;
171 LARGE_INTEGER LastWriteTime
;
172 LARGE_INTEGER ChangeTime
;
173 LARGE_INTEGER EndOfFile
;
174 LARGE_INTEGER AllocationSize
;
175 ULONG FileAttributes
;
176 ULONG FileNameLength
;
178 CCHAR ShortNameLength
;
180 LARGE_INTEGER FileId
;
182 } FILE_ID_BOTH_DIR_INFORMATION
, *PFILE_ID_BOTH_DIR_INFORMATION
;
185 #define AT_EXTENDABLE_FILE 0x00002000
186 #define AT_ROUND_TO_PAGE 0x40000000
188 #define LOCK_VM_IN_WSL 1
189 #define LOCK_VM_IN_RAM 2
191 #define DIRECTORY_QUERY 1
192 #define DIRECTORY_TRAVERSE 2
193 #define DIRECTORY_CREATE_OBJECT 4
194 #define DIRECTORY_CREATE_SUBDIRECTORY 8
195 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|0x0f)
197 #define EVENT_QUERY_STATE 1
198 #define SEMAPHORE_QUERY_STATE 1
200 /* Specific ACCESS_MASKSs for objects created in Cygwin. */
201 #define CYG_SHARED_DIR_ACCESS (DIRECTORY_QUERY \
202 | DIRECTORY_TRAVERSE \
203 | DIRECTORY_CREATE_SUBDIRECTORY \
204 | DIRECTORY_CREATE_OBJECT \
207 #define CYG_MUTANT_ACCESS (MUTANT_QUERY_STATE \
211 #define CYG_EVENT_ACCESS (EVENT_QUERY_STATE \
212 | EVENT_MODIFY_STATE \
216 #define CYG_SEMAPHORE_ACCESS (SEMAPHORE_QUERY_STATE \
217 | SEMAPHORE_MODIFY_STATE \
221 typedef ULONG KAFFINITY
;
223 typedef enum _SYSTEM_INFORMATION_CLASS
225 SystemBasicInformation
= 0,
226 SystemPerformanceInformation
= 2,
227 SystemTimeOfDayInformation
= 3,
228 SystemProcessesAndThreadsInformation
= 5,
229 SystemProcessorTimes
= 8,
230 SystemPagefileInformation
= 18,
231 /* There are a lot more of these... */
232 } SYSTEM_INFORMATION_CLASS
;
234 typedef struct _SYSTEM_BASIC_INFORMATION
237 ULONG MaximumIncrement
;
238 ULONG PhysicalPageSize
;
239 ULONG NumberOfPhysicalPages
;
240 ULONG LowestPhysicalPage
;
241 ULONG HighestPhysicalPage
;
242 ULONG AllocationGranularity
;
243 ULONG LowestUserAddress
;
244 ULONG HighestUserAddress
;
245 ULONG ActiveProcessors
;
246 UCHAR NumberProcessors
;
247 } SYSTEM_BASIC_INFORMATION
, *PSYSTEM_BASIC_INFORMATION
;
249 typedef struct _SYSTEM_PAGEFILE_INFORMATION
251 ULONG NextEntryOffset
;
255 UNICODE_STRING FileName
;
256 } SYSTEM_PAGEFILE_INFORMATION
, *PSYSTEM_PAGEFILE_INFORMATION
;
258 typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES
260 LARGE_INTEGER IdleTime
;
261 LARGE_INTEGER KernelTime
;
262 LARGE_INTEGER UserTime
;
263 LARGE_INTEGER DpcTime
;
264 LARGE_INTEGER InterruptTime
;
265 ULONG InterruptCount
;
266 } SYSTEM_PROCESSOR_TIMES
, *PSYSTEM_PROCESSOR_TIMES
;
268 typedef LONG KPRIORITY
;
269 typedef struct _VM_COUNTERS
271 ULONG PeakVirtualSize
;
273 ULONG PageFaultCount
;
274 ULONG PeakWorkingSetSize
;
275 ULONG WorkingSetSize
;
276 ULONG QuotaPeakPagedPoolUsage
;
277 ULONG QuotaPagedPoolUsage
;
278 ULONG QuotaPeakNonPagedPoolUsage
;
279 ULONG QuotaNonPagedPoolUsage
;
281 ULONG PeakPagefileUsage
;
282 } VM_COUNTERS
, *PVM_COUNTERS
;
284 typedef struct _CLIENT_ID
286 HANDLE UniqueProcess
;
288 } CLIENT_ID
, *PCLIENT_ID
;
334 typedef struct _SYSTEM_THREADS
336 LARGE_INTEGER KernelTime
;
337 LARGE_INTEGER UserTime
;
338 LARGE_INTEGER CreateTime
;
343 KPRIORITY BasePriority
;
344 ULONG ContextSwitchCount
;
346 KWAIT_REASON WaitReason
;
348 } SYSTEM_THREADS
, *PSYSTEM_THREADS
;
350 typedef struct _SYSTEM_PROCESSES
352 ULONG NextEntryDelta
;
355 LARGE_INTEGER CreateTime
;
356 LARGE_INTEGER UserTime
;
357 LARGE_INTEGER KernelTime
;
358 UNICODE_STRING ProcessName
;
359 KPRIORITY BasePriority
;
361 ULONG InheritedFromProcessId
;
364 VM_COUNTERS VmCounters
;
365 IO_COUNTERS IoCounters
;
366 SYSTEM_THREADS Threads
[1];
367 } SYSTEM_PROCESSES
, *PSYSTEM_PROCESSES
;
369 typedef struct _IO_STATUS_BLOCK
373 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
375 typedef struct _SYSTEM_PERFORMANCE_INFORMATION
377 LARGE_INTEGER IdleTime
;
378 LARGE_INTEGER ReadTransferCount
;
379 LARGE_INTEGER WriteTransferCount
;
380 LARGE_INTEGER OtherTransferCount
;
381 ULONG ReadOperationCount
;
382 ULONG WriteOperationCount
;
383 ULONG OtherOperationCount
;
384 ULONG AvailablePages
;
385 ULONG TotalCommittedPages
;
386 ULONG TotalCommitLimit
;
387 ULONG PeakCommitment
;
389 ULONG WriteCopyFaults
;
390 ULONG TransitionFaults
;
392 ULONG DemandZeroFaults
;
396 ULONG PagefilePagesWritten
;
397 ULONG PagefilePageWriteIos
;
398 ULONG MappedFilePagesWritten
;
399 ULONG MappedFilePageWriteIos
;
400 ULONG PagedPoolUsage
;
401 ULONG NonPagedPoolUsage
;
402 ULONG PagedPoolAllocs
;
403 ULONG PagedPoolFrees
;
404 ULONG NonPagedPoolAllocs
;
405 ULONG NonPagedPoolFrees
;
406 ULONG TotalFreeSystemPtes
;
407 ULONG SystemCodePage
;
408 ULONG TotalSystemDriverPages
;
409 ULONG TotalSystemCodePages
;
410 ULONG SmallNonPagedLookasideListAllocateHits
;
411 ULONG SmallPagedLookasideListAllocateHits
;
413 ULONG MmSystemCachePage
;
415 ULONG SystemDriverPage
;
416 ULONG FastReadNoWait
;
418 ULONG FastReadResourceMiss
;
419 ULONG FastReadNotPossible
;
420 ULONG FastMdlReadNoWait
;
421 ULONG FastMdlReadWait
;
422 ULONG FastMdlReadResourceMiss
;
423 ULONG FastMdlReadNotPossible
;
426 ULONG MapDataNoWaitMiss
;
427 ULONG MapDataWaitMiss
;
428 ULONG PinMappedDataCount
;
431 ULONG PinReadNoWaitMiss
;
432 ULONG PinReadWaitMiss
;
433 ULONG CopyReadNoWait
;
435 ULONG CopyReadNoWaitMiss
;
436 ULONG CopyReadWaitMiss
;
439 ULONG MdlReadNoWaitMiss
;
440 ULONG MdlReadWaitMiss
;
443 ULONG LazyWritePages
;
446 ULONG ContextSwitches
;
447 ULONG FirstLevelTbFills
;
448 ULONG SecondLevelTbFills
;
450 } SYSTEM_PERFORMANCE_INFORMATION
, *PSYSTEM_PERFORMANCE_INFORMATION
;
452 typedef struct __attribute__ ((aligned(8))) _SYSTEM_TIME_OF_DAY_INFORMATION
454 LARGE_INTEGER BootTime
;
455 LARGE_INTEGER CurrentTime
;
456 LARGE_INTEGER TimeZoneBias
;
457 ULONG CurrentTimeZoneId
;
458 } SYSTEM_TIME_OF_DAY_INFORMATION
, *PSYSTEM_TIME_OF_DAY_INFORMATION
;
460 typedef enum _PROCESSINFOCLASS
462 ProcessBasicInformation
= 0,
463 ProcessQuotaLimits
= 1,
464 ProcessVmCounters
= 3,
466 ProcessSessionInformation
= 24,
469 typedef struct _DEBUG_BUFFER
471 HANDLE SectionHandle
;
473 PVOID RemoteSectionBase
;
474 ULONG SectionBaseDelta
;
475 HANDLE EventPairHandle
;
477 HANDLE RemoteThreadHandle
;
482 PVOID ModuleInformation
;
483 PVOID BackTraceInformation
;
484 PVOID HeapInformation
;
485 PVOID LockInformation
;
487 } DEBUG_BUFFER
, *PDEBUG_BUFFER
;
489 typedef struct _DEBUG_HEAP_INFORMATION
502 } DEBUG_HEAP_INFORMATION
, *PDEBUG_HEAP_INFORMATION
;
504 typedef struct _DEBUG_MODULE_INFORMATION
513 USHORT ModuleNameOffset
;
515 } DEBUG_MODULE_INFORMATION
, *PDEBUG_MODULE_INFORMATION
;
517 typedef struct _KERNEL_USER_TIMES
519 LARGE_INTEGER CreateTime
;
520 LARGE_INTEGER ExitTime
;
521 LARGE_INTEGER KernelTime
;
522 LARGE_INTEGER UserTime
;
523 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
525 typedef struct _RTL_USER_PROCESS_PARAMETERS
527 ULONG AllocationSize
;
536 UNICODE_STRING CurrentDirectoryName
;
537 HANDLE CurrentDirectoryHandle
;
538 UNICODE_STRING DllPath
;
539 UNICODE_STRING ImagePathName
;
540 UNICODE_STRING CommandLine
;
548 ULONG dwFillAttribute
;
551 UNICODE_STRING WindowTitle
;
552 UNICODE_STRING DesktopInfo
;
553 UNICODE_STRING ShellInfo
;
554 UNICODE_STRING RuntimeInfo
;
555 } RTL_USER_PROCESS_PARAMETERS
, *PRTL_USER_PROCESS_PARAMETERS
;
563 PRTL_USER_PROCESS_PARAMETERS ProcessParameters
;
568 /* Simplifed definition, just to get the PEB pointer. */
573 /* A lot more follows... */
576 typedef struct _PROCESS_BASIC_INFORMATION
580 KAFFINITY AffinityMask
;
581 KPRIORITY BasePriority
;
582 ULONG UniqueProcessId
;
583 ULONG InheritedFromUniqueProcessId
;
584 } PROCESS_BASIC_INFORMATION
, *PPROCESS_BASIC_INFORMATION
;
586 typedef struct _PROCESS_SESSION_INFORMATION
589 } PROCESS_SESSION_INFORMATION
, *PPROCESS_SESSION_INFORMATION
;
591 typedef enum _MEMORY_INFORMATION_CLASS
593 MemoryBasicInformation
,
594 MemoryWorkingSetList
,
596 MemoryBasicVlmInformation
597 } MEMORY_INFORMATION_CLASS
;
599 typedef struct _MEMORY_WORKING_SET_LIST
602 ULONG WorkingSetList
[1];
603 } MEMORY_WORKING_SET_LIST
, *PMEMORY_WORKING_SET_LIST
;
605 typedef struct _FILE_BASIC_INFORMATION
{
606 LARGE_INTEGER CreationTime
;
607 LARGE_INTEGER LastAccessTime
;
608 LARGE_INTEGER LastWriteTime
;
609 LARGE_INTEGER ChangeTime
;
610 ULONG FileAttributes
;
611 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
613 typedef struct _FILE_STANDARD_INFORMATION
{
614 LARGE_INTEGER AllocationSize
;
615 LARGE_INTEGER EndOfFile
;
617 BOOLEAN DeletePending
;
619 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
621 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
622 LARGE_INTEGER CreationTime
;
623 LARGE_INTEGER LastAccessTime
;
624 LARGE_INTEGER LastWriteTime
;
625 LARGE_INTEGER ChangeTime
;
626 LARGE_INTEGER AllocationSize
;
627 LARGE_INTEGER EndOfFile
;
628 ULONG FileAttributes
;
629 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
631 typedef struct _FILE_INTERNAL_INFORMATION
{
632 LARGE_INTEGER FileId
;
633 } FILE_INTERNAL_INFORMATION
, *PFILE_INTERNAL_INFORMATION
;
635 typedef struct _FILE_EA_INFORMATION
{
637 } FILE_EA_INFORMATION
, *PFILE_EA_INFORMATION
;
639 typedef struct _FILE_ACCESS_INFORMATION
{
640 ACCESS_MASK AccessFlags
;
641 } FILE_ACCESS_INFORMATION
, *PFILE_ACCESS_INFORMATION
;
643 typedef struct _FILE_DISPOSITION_INFORMATION
{
645 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
647 typedef struct _FILE_POSITION_INFORMATION
{
648 LARGE_INTEGER CurrentByteOffset
;
649 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
651 typedef struct _FILE_END_OF_FILE_INFORMATION
{
652 LARGE_INTEGER EndOfFile
;
653 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
655 typedef struct _FILE_MODE_INFORMATION
{
657 } FILE_MODE_INFORMATION
, *PFILE_MODE_INFORMATION
;
659 typedef struct _FILE_ALIGNMENT_INFORMATION
{
660 ULONG AlignmentRequirement
;
661 } FILE_ALIGNMENT_INFORMATION
;
663 typedef struct _FILE_NAME_INFORMATION
{
664 ULONG FileNameLength
;
666 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
668 typedef struct _FILE_LINK_INFORMATION
{
669 BOOLEAN ReplaceIfExists
;
670 HANDLE RootDirectory
;
671 ULONG FileNameLength
;
673 } FILE_LINK_INFORMATION
, *PFILE_LINK_INFORMATION
;
675 typedef struct _FILE_RENAME_INFORMATION
{
676 BOOLEAN ReplaceIfExists
;
677 HANDLE RootDirectory
;
678 ULONG FileNameLength
;
680 } FILE_RENAME_INFORMATION
, *PFILE_RENAME_INFORMATION
;
682 typedef struct _FILE_ALL_INFORMATION
{
683 FILE_BASIC_INFORMATION BasicInformation
;
684 FILE_STANDARD_INFORMATION StandardInformation
;
685 FILE_INTERNAL_INFORMATION InternalInformation
;
686 FILE_EA_INFORMATION EaInformation
;
687 FILE_ACCESS_INFORMATION AccessInformation
;
688 FILE_POSITION_INFORMATION PositionInformation
;
689 FILE_MODE_INFORMATION ModeInformation
;
690 FILE_ALIGNMENT_INFORMATION AlignmentInformation
;
691 FILE_NAME_INFORMATION NameInformation
;
692 } FILE_ALL_INFORMATION
, *PFILE_ALL_INFORMATION
;
694 typedef struct _FILE_PIPE_LOCAL_INFORMATION
697 ULONG NamedPipeConfiguration
;
698 ULONG MaximumInstances
;
699 ULONG CurrentInstances
;
701 ULONG ReadDataAvailable
;
703 ULONG WriteQuotaAvailable
;
704 ULONG NamedPipeState
;
706 } FILE_PIPE_LOCAL_INFORMATION
, *PFILE_PIPE_LOCAL_INFORMATION
;
708 typedef struct _FILE_COMPRESSION_INFORMATION
710 LARGE_INTEGER CompressedFileSize
;
711 USHORT CompressionFormat
;
712 UCHAR CompressionUnitShift
;
716 } FILE_COMPRESSION_INFORMATION
, *PFILE_COMPRESSION_INFORMATION
;
718 typedef struct _FILE_FS_DEVICE_INFORMATION
721 ULONG Characteristics
;
722 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
724 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
726 ULONG FileSystemAttributes
;
727 ULONG MaximumComponentNameLength
;
728 ULONG FileSystemNameLength
;
729 WCHAR FileSystemName
[1];
730 } FILE_FS_ATTRIBUTE_INFORMATION
, *PFILE_FS_ATTRIBUTE_INFORMATION
;
732 typedef struct _FILE_FS_VOLUME_INFORMATION
734 LARGE_INTEGER VolumeCreationTime
;
735 ULONG VolumeSerialNumber
;
736 ULONG VolumeLabelLength
;
737 BOOLEAN SupportsObjects
;
738 WCHAR VolumeLabel
[1];
739 } FILE_FS_VOLUME_INFORMATION
, *PFILE_FS_VOLUME_INFORMATION
;
741 typedef struct _FILE_FS_SIZE_INFORMATION
743 LARGE_INTEGER TotalAllocationUnits
;
744 LARGE_INTEGER AvailableAllocationUnits
;
745 ULONG SectorsPerAllocationUnit
;
746 ULONG BytesPerSector
;
747 } FILE_FS_SIZE_INFORMATION
, *PFILE_FS_SIZE_INFORMATION
;
749 typedef struct _FILE_FS_FULL_SIZE_INFORMATION
751 LARGE_INTEGER TotalAllocationUnits
;
752 LARGE_INTEGER CallerAvailableAllocationUnits
;
753 LARGE_INTEGER ActualAvailableAllocationUnits
;
754 ULONG SectorsPerAllocationUnit
;
755 ULONG BytesPerSector
;
756 } FILE_FS_FULL_SIZE_INFORMATION
, *PFILE_FS_FULL_SIZE_INFORMATION
;
758 typedef struct _FILE_FS_OBJECTID_INFORMATION
{
760 UCHAR ExtendedInfo
[48];
761 } FILE_FS_OBJECTID_INFORMATION
, *PFILE_FS_OBJECTID_INFORMATION
;
763 typedef enum _FSINFOCLASS
{
764 FileFsVolumeInformation
= 1,
765 FileFsLabelInformation
,
766 FileFsSizeInformation
,
767 FileFsDeviceInformation
,
768 FileFsAttributeInformation
,
769 FileFsControlInformation
,
770 FileFsFullSizeInformation
,
771 FileFsObjectIdInformation
,
772 FileFsDriverPathInformation
,
773 FileFsMaximumInformation
774 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
776 typedef enum _OBJECT_INFORMATION_CLASS
778 ObjectBasicInformation
= 0,
779 ObjectNameInformation
= 1,
780 ObjectHandleInformation
= 4
782 } OBJECT_INFORMATION_CLASS
;
784 typedef struct _OBJECT_BASIC_INFORMATION
787 ACCESS_MASK GrantedAccess
;
790 ULONG PagedPoolUsage
;
791 ULONG NonPagedPoolUsage
;
793 ULONG NameInformationLength
;
794 ULONG TypeInformationLength
;
795 ULONG SecurityDescriptorLength
;
796 LARGE_INTEGER CreateTime
;
797 } OBJECT_BASIC_INFORMATION
, *POBJECT_BASIC_INFORMATION
;
799 typedef struct _OBJECT_NAME_INFORMATION
802 } OBJECT_NAME_INFORMATION
;
804 typedef struct _DIRECTORY_BASIC_INFORMATION
806 UNICODE_STRING ObjectName
;
807 UNICODE_STRING ObjectTypeName
;
808 } DIRECTORY_BASIC_INFORMATION
, *PDIRECTORY_BASIC_INFORMATION
;
810 typedef struct _FILE_GET_EA_INFORMATION
812 ULONG NextEntryOffset
;
815 } FILE_GET_EA_INFORMATION
, *PFILE_GET_EA_INFORMATION
;
817 typedef struct _FILE_FULL_EA_INFORMATION
819 ULONG NextEntryOffset
;
822 USHORT EaValueLength
;
824 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
826 typedef struct _FILE_MAILSLOT_SET_INFORMATION
828 LARGE_INTEGER ReadTimeout
;
829 } FILE_MAILSLOT_SET_INFORMATION
, *PFILE_MAILSLOT_SET_INFORMATION
;
831 typedef VOID
NTAPI (*PIO_APC_ROUTINE
)(PVOID
, PIO_STATUS_BLOCK
, ULONG
);
833 typedef enum _EVENT_TYPE
835 NotificationEvent
= 0,
837 } EVENT_TYPE
, *PEVENT_TYPE
;
839 typedef struct _EVENT_BASIC_INFORMATION
841 EVENT_TYPE EventType
;
843 } EVENT_BASIC_INFORMATION
, *PEVENT_BASIC_INFORMATION
;
845 typedef enum _EVENT_INFORMATION_CLASS
847 EventBasicInformation
= 0
848 } EVENT_INFORMATION_CLASS
, *PEVENT_INFORMATION_CLASS
;
850 /* Function declarations for ntdll.dll. These don't appear in any
851 standard Win32 header. */
854 NTSTATUS NTAPI
NtAdjustPrivilegesToken (HANDLE
, BOOLEAN
, PTOKEN_PRIVILEGES
,
855 ULONG
, PTOKEN_PRIVILEGES
, PULONG
);
856 NTSTATUS NTAPI
NtClose (HANDLE
);
857 NTSTATUS NTAPI
NtCreateDirectoryObject (PHANDLE
, ACCESS_MASK
,
859 NTSTATUS NTAPI
NtCreateEvent (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
860 EVENT_TYPE
, BOOLEAN
);
861 NTSTATUS NTAPI
NtCreateFile (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
862 PIO_STATUS_BLOCK
, PLARGE_INTEGER
, ULONG
, ULONG
,
863 ULONG
, ULONG
, PVOID
, ULONG
);
864 NTSTATUS NTAPI
NtCreateMailslotFile(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
865 PIO_STATUS_BLOCK
, ULONG
, ULONG
, ULONG
,
867 NTSTATUS NTAPI
NtCreateMutant (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
869 NTSTATUS NTAPI
NtCreateSection (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
870 PLARGE_INTEGER
, ULONG
, ULONG
, HANDLE
);
871 NTSTATUS NTAPI
NtCreateSemaphore (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
873 NTSTATUS NTAPI
NtCreateToken (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
874 TOKEN_TYPE
, PLUID
, PLARGE_INTEGER
, PTOKEN_USER
,
875 PTOKEN_GROUPS
, PTOKEN_PRIVILEGES
, PTOKEN_OWNER
,
876 PTOKEN_PRIMARY_GROUP
, PTOKEN_DEFAULT_DACL
,
878 NTSTATUS NTAPI
NtFsControlFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
, PVOID
,
879 PIO_STATUS_BLOCK
, ULONG
, PVOID
, ULONG
,
881 NTSTATUS NTAPI
NtLockVirtualMemory (HANDLE
, PVOID
*, ULONG
*, ULONG
);
882 NTSTATUS NTAPI
NtMapViewOfSection (HANDLE
, HANDLE
, PVOID
*, ULONG
, ULONG
,
883 PLARGE_INTEGER
, PULONG
, SECTION_INHERIT
,
885 NTSTATUS NTAPI
NtNotifyChangeDirectoryFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
,
886 PVOID
, PIO_STATUS_BLOCK
,
887 PFILE_NOTIFY_INFORMATION
, ULONG
,
889 NTSTATUS NTAPI
NtOpenDirectoryObject (PHANDLE
, ACCESS_MASK
,
891 NTSTATUS NTAPI
NtOpenEvent (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
892 NTSTATUS NTAPI
NtOpenFile (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
,
893 PIO_STATUS_BLOCK
, ULONG
, ULONG
);
894 NTSTATUS NTAPI
NtOpenMutant (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
895 NTSTATUS NTAPI
NtOpenSection (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
896 NTSTATUS NTAPI
NtOpenSemaphore (PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
897 /* WARNING! Don't rely on the timestamp information returned by
898 NtQueryAttributesFile. Only the DOS file attribute info is reliable. */
899 NTSTATUS NTAPI
NtQueryAttributesFile (POBJECT_ATTRIBUTES
,
900 PFILE_BASIC_INFORMATION
);
901 NTSTATUS NTAPI
NtQueryDirectoryFile(HANDLE
, HANDLE
, PVOID
, PVOID
,
902 PIO_STATUS_BLOCK
, PVOID
, ULONG
,
903 FILE_INFORMATION_CLASS
, BOOLEAN
,
904 PUNICODE_STRING
, BOOLEAN
);
905 NTSTATUS NTAPI
NtQueryDirectoryObject (HANDLE
, PVOID
, ULONG
, BOOLEAN
,
906 BOOLEAN
, PULONG
, PULONG
);
907 NTSTATUS NTAPI
NtQueryEaFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
, ULONG
,
908 BOOLEAN
, PVOID
, ULONG
, PULONG
, BOOLEAN
);
909 NTSTATUS NTAPI
NtQueryEvent (HANDLE
, EVENT_INFORMATION_CLASS
, PVOID
, ULONG
,
911 NTSTATUS NTAPI
NtQueryFullAttributesFile (POBJECT_ATTRIBUTES
,
912 PFILE_NETWORK_OPEN_INFORMATION
);
913 NTSTATUS NTAPI
NtQueryInformationFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
,
914 ULONG
, FILE_INFORMATION_CLASS
);
915 NTSTATUS NTAPI
NtQueryInformationProcess (HANDLE
, PROCESSINFOCLASS
,
916 PVOID
, ULONG
, PULONG
);
917 NTSTATUS NTAPI
NtQueryObject (HANDLE
, OBJECT_INFORMATION_CLASS
, VOID
*,
919 NTSTATUS NTAPI
NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS
,
920 PVOID
, ULONG
, PULONG
);
921 NTSTATUS NTAPI
NtQuerySecurityObject (HANDLE
, SECURITY_INFORMATION
,
922 PSECURITY_DESCRIPTOR
, ULONG
, PULONG
);
923 NTSTATUS NTAPI
NtQueryVirtualMemory (HANDLE
, PVOID
, MEMORY_INFORMATION_CLASS
,
924 PVOID
, ULONG
, PULONG
);
925 NTSTATUS NTAPI
NtQueryVolumeInformationFile (HANDLE
, IO_STATUS_BLOCK
*,
927 FS_INFORMATION_CLASS
);
928 NTSTATUS NTAPI
NtReadFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
, PVOID
,
929 PIO_STATUS_BLOCK
, PVOID
, ULONG
, PLARGE_INTEGER
,
931 NTSTATUS NTAPI
NtSetEaFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
, ULONG
);
932 NTSTATUS NTAPI
NtSetInformationFile (HANDLE
, PIO_STATUS_BLOCK
, PVOID
, ULONG
,
933 FILE_INFORMATION_CLASS
);
934 NTSTATUS NTAPI
NtSetSecurityObject (HANDLE
, SECURITY_INFORMATION
,
935 PSECURITY_DESCRIPTOR
);
936 NTSTATUS NTAPI
NtUnlockVirtualMemory (HANDLE
, PVOID
*, ULONG
*, ULONG
);
937 NTSTATUS NTAPI
NtUnmapViewOfSection (HANDLE
, PVOID
);
938 NTSTATUS NTAPI
NtWriteFile (HANDLE
, HANDLE
, PIO_APC_ROUTINE
, PVOID
,
939 PIO_STATUS_BLOCK
, PVOID
, ULONG
, PLARGE_INTEGER
,
941 NTSTATUS NTAPI
RtlAppendUnicodeToString (PUNICODE_STRING
, PCWSTR
);
942 NTSTATUS NTAPI
RtlAppendUnicodeStringToString (PUNICODE_STRING
,
944 VOID NTAPI
RtlAcquirePebLock ();
945 NTSTATUS NTAPI
RtlAnsiStringToUnicodeString (PUNICODE_STRING
, PANSI_STRING
,
947 LONG NTAPI
RtlCompareUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
949 NTSTATUS NTAPI
RtlConvertSidToUnicodeString (PUNICODE_STRING
, PSID
, BOOLEAN
);
950 VOID NTAPI
RtlCopyUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
);
951 BOOLEAN NTAPI
RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING
, PCSTR
);
952 NTSTATUS NTAPI
RtlDowncaseUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
954 BOOLEAN NTAPI
RtlEqualUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
956 VOID NTAPI
RtlFreeAnsiString (PANSI_STRING
);
957 VOID NTAPI
RtlFreeOemString (POEM_STRING
);
958 VOID NTAPI
RtlFreeUnicodeString (PUNICODE_STRING
);
959 VOID NTAPI
RtlInitEmptyUnicodeString (PUNICODE_STRING
, PCWSTR
, USHORT
);
960 VOID NTAPI
RtlInitUnicodeString (PUNICODE_STRING
, PCWSTR
);
961 NTSTATUS NTAPI
RtlIntegerToUnicodeString (ULONG
, ULONG
, PUNICODE_STRING
);
962 ULONG NTAPI
RtlIsDosDeviceName_U (PCWSTR
);
963 ULONG NTAPI
RtlNtStatusToDosError (NTSTATUS
);
964 NTSTATUS NTAPI
RtlOemStringToUnicodeString (PUNICODE_STRING
, POEM_STRING
,
966 BOOLEAN NTAPI
RtlPrefixUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
968 VOID NTAPI
RtlReleasePebLock ();
969 VOID NTAPI
RtlSecondsSince1970ToTime (ULONG
, PLARGE_INTEGER
);
970 NTSTATUS NTAPI
RtlUnicodeStringToAnsiString (PANSI_STRING
, PUNICODE_STRING
,
972 NTSTATUS NTAPI
RtlUnicodeStringToOemString (PANSI_STRING
, PUNICODE_STRING
,
974 WCHAR NTAPI
RtlUpcaseUnicodeChar (WCHAR
);
975 NTSTATUS NTAPI
RtlUpcaseUnicodeString (PUNICODE_STRING
, PUNICODE_STRING
,
978 /* A few Rtl functions are either actually macros, or they just don't
979 exist even though they would be a big help. We implement them here,
980 partly as inline functions. */
982 /* RtlInitEmptyUnicodeString is defined as a macro in wdm.h, but that file
983 is missing entirely in w32api. */
985 VOID NTAPI
RtlInitEmptyUnicodeString(PUNICODE_STRING dest
, PCWSTR buf
,
989 dest
->MaximumLength
= len
;
990 dest
->Buffer
= (PWSTR
) buf
;
992 /* Like RtlInitEmptyUnicodeString, but initialize Length to len, too.
993 This is for instance useful when creating a UNICODE_STRING from an
994 NtQueryInformationFile info buffer, where the length of the filename
995 is known, but you can't rely on the string being 0-terminated.
996 If you know it's 0-terminated, just use RtlInitUnicodeString(). */
998 VOID NTAPI
RtlInitCountedUnicodeString (PUNICODE_STRING dest
, PCWSTR buf
,
1001 dest
->Length
= dest
->MaximumLength
= len
;
1002 dest
->Buffer
= (PWSTR
) buf
;
1004 /* Split path into dirname and basename part. This function does not
1005 copy anything! It just initializes the dirname and basename
1006 UNICODE_STRINGs so that their Buffer members point to the right spot
1007 into path's Buffer, and the Length (and MaximumLength) members are set
1008 to match the dirname part and the basename part.
1009 Note that dirname's Length is set so that it also includes the trailing
1010 backslash. If you don't need it, just subtract sizeof(WCHAR) from
1013 VOID NTAPI
RtlSplitUnicodePath (PUNICODE_STRING path
, PUNICODE_STRING dirname
,
1014 PUNICODE_STRING basename
)
1016 USHORT len
= path
->Length
/ sizeof (WCHAR
);
1017 while (len
> 0 && path
->Buffer
[--len
] != L
'\\')
1021 RtlInitCountedUnicodeString (dirname
, path
->Buffer
, len
* sizeof (WCHAR
));
1023 RtlInitCountedUnicodeString (basename
, &path
->Buffer
[len
],
1024 path
->Length
- len
* sizeof (WCHAR
));
1026 /* Check if prefix is a prefix of path. */
1028 BOOLEAN NTAPI
RtlEqualUnicodePathPrefix (PUNICODE_STRING path
, PCWSTR prefix
,
1029 BOOLEAN caseinsensitive
)
1031 UNICODE_STRING p
, pref
;
1033 RtlInitUnicodeString (&pref
, prefix
);
1034 RtlInitCountedUnicodeString (&p
, path
->Buffer
,
1035 pref
.Length
< path
->Length
1036 ? pref
.Length
: path
->Length
);
1037 return RtlEqualUnicodeString (&p
, &pref
, caseinsensitive
);
1039 /* Check if sufffix is a sufffix of path. */
1041 BOOL NTAPI
RtlEqualUnicodePathSuffix (PUNICODE_STRING path
, PCWSTR suffix
,
1042 BOOLEAN caseinsensitive
)
1044 UNICODE_STRING p
, suf
;
1046 RtlInitUnicodeString (&suf
, suffix
);
1047 if (suf
.Length
< path
->Length
)
1048 RtlInitCountedUnicodeString (&p
, (PWCHAR
) ((PBYTE
) path
->Buffer
1049 + path
->Length
- suf
.Length
),
1052 RtlInitCountedUnicodeString (&p
, path
->Buffer
, path
->Length
);
1053 return RtlEqualUnicodeString (&p
, &suf
, caseinsensitive
);
1055 /* Implemented in strfuncs.cc. Create a Hex UNICODE_STRING from a given
1056 64 bit integer value. If append is TRUE, append the hex string,
1057 otherwise overwrite dest. Returns either STATUS_SUCCESS, or
1058 STATUS_BUFFER_OVERFLOW, if the unicode buffer is too small (hasn't
1059 room for 16 WCHARs). */
1060 NTSTATUS NTAPI
RtlInt64ToHexUnicodeString (ULONGLONG value
,
1061 PUNICODE_STRING dest
,