]> sourceware.org Git - newlib-cygwin.git/blobdiff - winsup/cygwin/ntdll.h
* cygwin.din (pthread_attr_getstack): Export.
[newlib-cygwin.git] / winsup / cygwin / ntdll.h
index 23ce468cd4d0bb3aa13800616c7176b7672237fd..75ba1a5e89189570ae51e11686278e51f9094e37 100644 (file)
@@ -1,6 +1,7 @@
 /* ntdll.h.  Contains ntdll specific stuff not defined elsewhere.
 
-   Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
+   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+   2009, 2010, 2011 Red Hat, Inc.
 
    This file is part of Cygwin.
 
@@ -8,8 +9,58 @@
    Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
    details. */
 
-#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xc0000004)
-#define STATUS_BUFFER_TOO_SMALL     ((NTSTATUS) 0xc0000023)
+#ifndef _NTDLL_H
+#define _NTDLL_H 1
+#define STATUS_NOT_ALL_ASSIGNED       ((NTSTATUS) 0x00000106)
+#define STATUS_OBJECT_NAME_EXISTS     ((NTSTATUS) 0x40000000)
+#define STATUS_BUFFER_OVERFLOW        ((NTSTATUS) 0x80000005)
+#define STATUS_NO_MORE_FILES          ((NTSTATUS) 0x80000006)
+#ifndef STATUS_INVALID_INFO_CLASS
+/* Some w32api header file defines this so we need to conditionalize this
+   define to avoid warnings. */
+#define STATUS_INVALID_INFO_CLASS     ((NTSTATUS) 0xc0000003)
+#endif
+#define STATUS_NOT_IMPLEMENTED        ((NTSTATUS) 0xc0000002)
+#define STATUS_INFO_LENGTH_MISMATCH   ((NTSTATUS) 0xc0000004)
+#define STATUS_INVALID_PARAMETER      ((NTSTATUS) 0xc000000d)
+#define STATUS_NO_SUCH_FILE           ((NTSTATUS) 0xc000000f)
+#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xc0000010)
+#define STATUS_END_OF_FILE            ((NTSTATUS) 0xc0000011)
+#define STATUS_NO_MEDIA_IN_DEVICE     ((NTSTATUS) 0xc0000013)
+#define STATUS_ACCESS_DENIED          ((NTSTATUS) 0xc0000022)
+#define STATUS_BUFFER_TOO_SMALL       ((NTSTATUS) 0xc0000023)
+#define STATUS_OBJECT_TYPE_MISMATCH   ((NTSTATUS) 0xc0000024)
+#define STATUS_OBJECT_NAME_INVALID    ((NTSTATUS) 0xc0000033)
+#define STATUS_OBJECT_NAME_NOT_FOUND  ((NTSTATUS) 0xc0000034)
+#define STATUS_OBJECT_PATH_NOT_FOUND  ((NTSTATUS) 0xc000003A)
+#define STATUS_SHARING_VIOLATION      ((NTSTATUS) 0xc0000043)
+#define STATUS_EAS_NOT_SUPPORTED      ((NTSTATUS) 0xc000004f)
+#define STATUS_EA_TOO_LARGE           ((NTSTATUS) 0xc0000050)
+#define STATUS_NONEXISTENT_EA_ENTRY   ((NTSTATUS) 0xc0000051)
+#define STATUS_NO_EAS_ON_FILE         ((NTSTATUS) 0xc0000052)
+#define STATUS_LOCK_NOT_GRANTED       ((NTSTATUS) 0xc0000055)
+#define STATUS_DELETE_PENDING         ((NTSTATUS) 0xc0000056)
+#define STATUS_PROCEDURE_NOT_FOUND    ((NTSTATUS) 0xc000007a)
+#define STATUS_DISK_FULL              ((NTSTATUS) 0xc000007f)
+#define STATUS_WORKING_SET_QUOTA      ((NTSTATUS) 0xc00000a1)
+#define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS) 0xc00000ab)
+#define STATUS_PIPE_NOT_AVAILABLE     ((NTSTATUS) 0xc00000ac)
+#define STATUS_INVALID_PIPE_STATE     ((NTSTATUS) 0xc00000ad)
+#define STATUS_PIPE_BUSY              ((NTSTATUS) 0xc00000ae)
+#define STATUS_NOT_SUPPORTED          ((NTSTATUS) 0xc00000bb)
+#define STATUS_BAD_NETWORK_PATH       ((NTSTATUS) 0xc00000be)
+#define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS) 0xc00000c3)
+#define STATUS_BAD_NETWORK_NAME       ((NTSTATUS) 0xc00000cc)
+#define STATUS_DIRECTORY_NOT_EMPTY    ((NTSTATUS) 0xc0000101)
+#define STATUS_CANNOT_DELETE          ((NTSTATUS) 0xc0000121)
+#define STATUS_INVALID_LEVEL          ((NTSTATUS) 0xc0000148)
+#define STATUS_DLL_NOT_FOUND          ((NTSTATUS) 0xc0000135)
+#define STATUS_ENTRYPOINT_NOT_FOUND   ((NTSTATUS) 0xc0000139)
+#define STATUS_BAD_DLL_ENTRYPOINT     ((NTSTATUS) 0xc0000251)
+#define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xc0000269)
+/* custom status code: */
+#define STATUS_ILLEGAL_DLL_PSEUDO_RELOCATION ((NTSTATUS) 0xe0000269)
+
 #define PDI_MODULES 0x01
 #define PDI_HEAPS 0x04
 #define LDRP_IMAGE_DLL 0x00000004
 #define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0
 #define WSLE_PAGE_SHAREABLE 0x100
 
+#define FILE_SUPERSEDED     0
+#define FILE_OPENED         1
+#define FILE_CREATED        2
+#define FILE_OVERWRITTEN    3
+#define FILE_EXISTS         4
+#define FILE_DOES_NOT_EXIST 5
+
+#define FILE_WRITE_TO_END_OF_FILE      (-1LL)
+#define FILE_USE_FILE_POINTER_POSITION (-2LL)
+
+/* Device Characteristics. */
+#define FILE_REMOVABLE_MEDIA           0x00000001
+#define FILE_READ_ONLY_DEVICE          0x00000002
+#define FILE_FLOPPY_DISKETTE           0x00000004
+#define FILE_WRITE_ONCE_MEDIA          0x00000008
+#define FILE_REMOTE_DEVICE             0x00000010
+#define FILE_DEVICE_IS_MOUNTED         0x00000020
+#define FILE_VIRTUAL_VOLUME            0x00000040
+#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
+#define FILE_DEVICE_SECURE_OPEN        0x00000100
+
+/* Transaction access rights. */
+#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x3F)
+
+typedef enum _FILE_INFORMATION_CLASS
+{
+  FileDirectoryInformation = 1,
+  FileFullDirectoryInformation, // 2
+  FileBothDirectoryInformation, // 3
+  FileBasicInformation, // 4 wdm
+  FileStandardInformation, // 5 wdm
+  FileInternalInformation, // 6
+  FileEaInformation, // 7
+  FileAccessInformation, // 8
+  FileNameInformation, // 9
+  FileRenameInformation, // 10
+  FileLinkInformation, // 11
+  FileNamesInformation, // 12
+  FileDispositionInformation, // 13
+  FilePositionInformation, // 14 wdm
+  FileFullEaInformation, // 15
+  FileModeInformation, // 16
+  FileAlignmentInformation, // 17
+  FileAllInformation, // 18
+  FileAllocationInformation, // 19
+  FileEndOfFileInformation, // 20 wdm
+  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
+  FileMaximumInformation
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef struct _FILE_NAMES_INFORMATION
+{
+  ULONG  NextEntryOffset;
+  ULONG  FileIndex;
+  ULONG  FileNameLength;
+  WCHAR  FileName[1];
+} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
+
+typedef struct _FILE_DIRECTORY_INFORMATION {
+  ULONG  NextEntryOffset;
+  ULONG  FileIndex;
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  LARGE_INTEGER  EndOfFile;
+  LARGE_INTEGER  AllocationSize;
+  ULONG  FileAttributes;
+  ULONG  FileNameLength;
+  WCHAR  FileName[1];
+} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
+
+typedef struct _FILE_BOTH_DIRECTORY_INFORMATION
+{
+  ULONG  NextEntryOffset;
+  ULONG  FileIndex;
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  LARGE_INTEGER  EndOfFile;
+  LARGE_INTEGER  AllocationSize;
+  ULONG  FileAttributes;
+  ULONG  FileNameLength;
+  ULONG  EaSize;
+  CCHAR  ShortNameLength;
+  WCHAR  ShortName[12];
+  WCHAR  FileName[1];
+} FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;
+
+typedef struct _FILE_ID_BOTH_DIR_INFORMATION
+{
+  ULONG  NextEntryOffset;
+  ULONG  FileIndex;
+  LARGE_INTEGER  CreationTime;
+  LARGE_INTEGER  LastAccessTime;
+  LARGE_INTEGER  LastWriteTime;
+  LARGE_INTEGER  ChangeTime;
+  LARGE_INTEGER  EndOfFile;
+  LARGE_INTEGER  AllocationSize;
+  ULONG  FileAttributes;
+  ULONG  FileNameLength;
+  ULONG  EaSize;
+  CCHAR  ShortNameLength;
+  WCHAR  ShortName[12];
+  LARGE_INTEGER  FileId;
+  WCHAR  FileName[1];
+} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
+
+
+#define AT_EXTENDABLE_FILE 0x00002000
+#define AT_ROUND_TO_PAGE 0x40000000
+
+#define LOCK_VM_IN_WSL 1
+#define LOCK_VM_IN_RAM 2
+
+#define DIRECTORY_QUERY 1
+#define DIRECTORY_TRAVERSE 2
+#define DIRECTORY_CREATE_OBJECT 4
+#define DIRECTORY_CREATE_SUBDIRECTORY 8
+#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|0x0f)
+
+#define SYMBOLIC_LINK_QUERY 1
+
+#define EVENT_QUERY_STATE 1
+#define SEMAPHORE_QUERY_STATE 1
+
+/* Specific ACCESS_MASKSs for objects created in Cygwin. */
+#define CYG_SHARED_DIR_ACCESS  (DIRECTORY_QUERY \
+                                | DIRECTORY_TRAVERSE \
+                                | DIRECTORY_CREATE_SUBDIRECTORY \
+                                | DIRECTORY_CREATE_OBJECT \
+                                | READ_CONTROL)
+
+#define CYG_MUTANT_ACCESS      (MUTANT_QUERY_STATE \
+                                | SYNCHRONIZE \
+                                | READ_CONTROL)
+
+#define CYG_EVENT_ACCESS       (EVENT_QUERY_STATE \
+                                | EVENT_MODIFY_STATE \
+                                | SYNCHRONIZE \
+                                | READ_CONTROL)
+
+#define CYG_SEMAPHORE_ACCESS   (SEMAPHORE_QUERY_STATE \
+                                | SEMAPHORE_MODIFY_STATE \
+                                | SYNCHRONIZE \
+                                | READ_CONTROL)
+
 typedef ULONG KAFFINITY;
 
 typedef enum _SYSTEM_INFORMATION_CLASS
@@ -267,7 +485,9 @@ typedef enum _PROCESSINFOCLASS
   ProcessBasicInformation = 0,
   ProcessQuotaLimits = 1,
   ProcessVmCounters = 3,
-  ProcessTimes =4,
+  ProcessTimes = 4,
+  ProcessSessionInformation = 24,
+  ProcessWow64Information = 26
 } PROCESSINFOCLASS;
 
 typedef struct _DEBUG_BUFFER
@@ -326,7 +546,75 @@ typedef struct _KERNEL_USER_TIMES
   LARGE_INTEGER UserTime;
 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
 
-typedef void *PPEB;
+typedef struct _RTL_USER_PROCESS_PARAMETERS
+{
+  ULONG AllocationSize;
+  ULONG Size;
+  ULONG Flags;
+  ULONG DebugFlags;
+  HANDLE hConsole;
+  ULONG ProcessGroup;
+  HANDLE hStdInput;
+  HANDLE hStdOutput;
+  HANDLE hStdError;
+  UNICODE_STRING CurrentDirectoryName;
+  HANDLE CurrentDirectoryHandle;
+  UNICODE_STRING DllPath;
+  UNICODE_STRING ImagePathName;
+  UNICODE_STRING CommandLine;
+  PWSTR Environment;
+  ULONG dwX;
+  ULONG dwY;
+  ULONG dwXSize;
+  ULONG dwYSize;
+  ULONG dwXCountChars;
+  ULONG dwYCountChars;
+  ULONG dwFillAttribute;
+  ULONG dwFlags;
+  ULONG wShowWindow;
+  UNICODE_STRING WindowTitle;
+  UNICODE_STRING DesktopInfo;
+  UNICODE_STRING ShellInfo;
+  UNICODE_STRING RuntimeInfo;
+} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
+
+typedef struct _PEB
+{
+  BYTE Reserved1[2];
+  BYTE BeingDebugged;
+  BYTE Reserved2[9];
+  PVOID LoaderData;
+  PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
+  BYTE Reserved3[4];
+  PVOID ProcessHeap;
+  PRTL_CRITICAL_SECTION FastPebLock;
+  BYTE Reserved4[436];
+  ULONG SessionId;
+} PEB, *PPEB;
+
+/* Simplifed definition, just to get the PEB pointer. */
+typedef struct _TEB
+{
+  PVOID dummy[12];
+  PPEB                    Peb;
+  /* A lot more follows... */
+} TEB, *PTEB;
+
+typedef struct _KSYSTEM_TIME
+{
+  ULONG LowPart;
+  LONG High1Time;
+  LONG High2Time;
+} KSYSTEM_TIME, *PKSYSTEM_TIME;
+
+typedef struct _KUSER_SHARED_DATA
+{
+  BYTE Reserved1[0x08];
+  KSYSTEM_TIME InterruptTime;
+  BYTE Reserved2[0x2c8];
+  ULONG DismountCount;
+  /* A lot more follows... */
+} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
 
 typedef struct _PROCESS_BASIC_INFORMATION
 {
@@ -338,6 +626,11 @@ typedef struct _PROCESS_BASIC_INFORMATION
   ULONG InheritedFromUniqueProcessId;
 } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
 
+typedef struct _PROCESS_SESSION_INFORMATION
+{
+  ULONG  SessionId;
+} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
+
 typedef enum _MEMORY_INFORMATION_CLASS
 {
   MemoryBasicInformation,
@@ -352,11 +645,94 @@ typedef struct _MEMORY_WORKING_SET_LIST
   ULONG WorkingSetList[1];
 } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;
 
-typedef struct _FILE_NAME_INFORMATION
-{
-  DWORD FileNameLength;
-  WCHAR FileName[MAX_PATH + 100];
-} FILE_NAME_INFORMATION;
+typedef struct _FILE_BASIC_INFORMATION {
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  ULONG FileAttributes;
+} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+
+typedef struct _FILE_STANDARD_INFORMATION {
+  LARGE_INTEGER AllocationSize;
+  LARGE_INTEGER EndOfFile;
+  ULONG NumberOfLinks;
+  BOOLEAN DeletePending;
+  BOOLEAN Directory;
+} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
+
+typedef struct _FILE_NETWORK_OPEN_INFORMATION {
+  LARGE_INTEGER CreationTime;
+  LARGE_INTEGER LastAccessTime;
+  LARGE_INTEGER LastWriteTime;
+  LARGE_INTEGER ChangeTime;
+  LARGE_INTEGER AllocationSize;
+  LARGE_INTEGER EndOfFile;
+  ULONG FileAttributes;
+} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+
+typedef struct _FILE_INTERNAL_INFORMATION {
+  LARGE_INTEGER FileId;
+} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
+
+typedef struct _FILE_EA_INFORMATION {
+  ULONG EaSize;
+} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
+
+typedef struct _FILE_ACCESS_INFORMATION {
+  ACCESS_MASK AccessFlags;
+} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
+
+typedef struct _FILE_DISPOSITION_INFORMATION {
+  BOOLEAN DeleteFile;
+} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
+
+typedef struct _FILE_POSITION_INFORMATION {
+  LARGE_INTEGER CurrentByteOffset;
+} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
+
+typedef struct _FILE_END_OF_FILE_INFORMATION {
+  LARGE_INTEGER EndOfFile;
+} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
+
+typedef struct _FILE_MODE_INFORMATION {
+  ULONG Mode;
+} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
+
+typedef struct _FILE_ALIGNMENT_INFORMATION {
+  ULONG AlignmentRequirement;
+} FILE_ALIGNMENT_INFORMATION;
+
+typedef struct _FILE_NAME_INFORMATION {
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
+
+typedef struct _FILE_LINK_INFORMATION {
+  BOOLEAN ReplaceIfExists;
+  HANDLE RootDirectory;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
+
+typedef struct _FILE_RENAME_INFORMATION {
+  BOOLEAN ReplaceIfExists;
+  HANDLE RootDirectory;
+  ULONG FileNameLength;
+  WCHAR FileName[1];
+} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+
+typedef struct _FILE_ALL_INFORMATION {
+  FILE_BASIC_INFORMATION     BasicInformation;
+  FILE_STANDARD_INFORMATION  StandardInformation;
+  FILE_INTERNAL_INFORMATION  InternalInformation;
+  FILE_EA_INFORMATION        EaInformation;
+  FILE_ACCESS_INFORMATION    AccessInformation;
+  FILE_POSITION_INFORMATION  PositionInformation;
+  FILE_MODE_INFORMATION      ModeInformation;
+  FILE_ALIGNMENT_INFORMATION AlignmentInformation;
+  FILE_NAME_INFORMATION      NameInformation;
+} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
 
 typedef struct _FILE_PIPE_LOCAL_INFORMATION
 {
@@ -374,18 +750,74 @@ typedef struct _FILE_PIPE_LOCAL_INFORMATION
 
 typedef struct _FILE_COMPRESSION_INFORMATION
 {
-  LARGE_INTEGER CompressedSize;
+  LARGE_INTEGER CompressedFileSize;
   USHORT CompressionFormat;
   UCHAR        CompressionUnitShift;
-  UCHAR Unknown;
-  UCHAR ClusterSizeShift;
+  UCHAR ChunkShift;
+  UCHAR ClusterShift;
+  UCHAR Reserved[3];
 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
 
-typedef enum _FILE_INFORMATION_CLASS
+typedef struct _FILE_FS_DEVICE_INFORMATION
 {
-  FilePipeLocalInformation = 24,
-  FileCompressionInformation = 28
-} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+  ULONG DeviceType;
+  ULONG Characteristics;
+} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
+
+typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
+{
+  ULONG FileSystemAttributes;
+  ULONG MaximumComponentNameLength;
+  ULONG FileSystemNameLength;
+  WCHAR FileSystemName[1];
+} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
+
+#pragma pack(push,4)
+typedef struct _FILE_FS_VOLUME_INFORMATION
+{
+  LARGE_INTEGER VolumeCreationTime;
+  ULONG VolumeSerialNumber;
+  ULONG VolumeLabelLength;
+  BOOLEAN SupportsObjects;
+  BOOLEAN __dummy;
+  WCHAR VolumeLabel[1];
+} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
+#pragma pack(pop)
+
+typedef struct _FILE_FS_SIZE_INFORMATION
+{
+  LARGE_INTEGER TotalAllocationUnits;
+  LARGE_INTEGER AvailableAllocationUnits;
+  ULONG SectorsPerAllocationUnit;
+  ULONG BytesPerSector;
+} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_FULL_SIZE_INFORMATION
+{
+  LARGE_INTEGER TotalAllocationUnits;
+  LARGE_INTEGER CallerAvailableAllocationUnits;
+  LARGE_INTEGER ActualAvailableAllocationUnits;
+  ULONG SectorsPerAllocationUnit;
+  ULONG BytesPerSector;
+} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_OBJECTID_INFORMATION {
+    UCHAR ObjectId[16];
+    UCHAR ExtendedInfo[48];
+} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
+
+typedef enum _FSINFOCLASS {
+  FileFsVolumeInformation = 1,
+  FileFsLabelInformation,
+  FileFsSizeInformation,
+  FileFsDeviceInformation,
+  FileFsAttributeInformation,
+  FileFsControlInformation,
+  FileFsFullSizeInformation,
+  FileFsObjectIdInformation,
+  FileFsDriverPathInformation,
+  FileFsMaximumInformation
+} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
 
 typedef enum _OBJECT_INFORMATION_CLASS
 {
@@ -395,45 +827,495 @@ typedef enum _OBJECT_INFORMATION_CLASS
    // and many more
 } OBJECT_INFORMATION_CLASS;
 
+typedef struct _OBJECT_BASIC_INFORMATION
+{
+  ULONG Attributes;
+  ACCESS_MASK GrantedAccess;
+  ULONG HandleCount;
+  ULONG PointerCount;
+  ULONG PagedPoolUsage;
+  ULONG NonPagedPoolUsage;
+  ULONG Reserved[3];
+  ULONG NameInformationLength;
+  ULONG TypeInformationLength;
+  ULONG SecurityDescriptorLength;
+  LARGE_INTEGER CreateTime;
+} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
+
 typedef struct _OBJECT_NAME_INFORMATION
 {
   UNICODE_STRING Name;
 } OBJECT_NAME_INFORMATION;
 
+typedef struct _DIRECTORY_BASIC_INFORMATION
+{
+  UNICODE_STRING ObjectName;
+  UNICODE_STRING ObjectTypeName;
+} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION;
+
+typedef struct _FILE_GET_EA_INFORMATION
+{
+  ULONG   NextEntryOffset;
+  UCHAR   EaNameLength;
+  CHAR    EaName[1];
+} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
+
+typedef struct _FILE_FULL_EA_INFORMATION
+{
+  ULONG NextEntryOffset;
+  UCHAR Flags;
+  UCHAR EaNameLength;
+  USHORT EaValueLength;
+  CHAR EaName[1];
+} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_SET_INFORMATION
+{
+  LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
+
+#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, \
+                                       METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef VOID NTAPI (*PIO_APC_ROUTINE)(PVOID, PIO_STATUS_BLOCK, ULONG);
+
+typedef enum _EVENT_TYPE
+{
+  NotificationEvent = 0,
+  SynchronizationEvent
+} EVENT_TYPE, *PEVENT_TYPE;
+
+typedef struct _EVENT_BASIC_INFORMATION
+{
+  EVENT_TYPE EventType;
+  LONG SignalState;
+} EVENT_BASIC_INFORMATION, *PEVENT_BASIC_INFORMATION;
+
+typedef enum _EVENT_INFORMATION_CLASS
+{
+  EventBasicInformation = 0
+} EVENT_INFORMATION_CLASS, *PEVENT_INFORMATION_CLASS;
+
+typedef enum _THREAD_INFORMATION_CLASS
+{
+  ThreadBasicInformation = 0,
+  ThreadImpersonationToken = 5
+} THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS;
+
+typedef struct _THREAD_BASIC_INFORMATION {
+    NTSTATUS  ExitStatus;
+    PNT_TIB  TebBaseAddress;
+    CLIENT_ID  ClientId;
+    KAFFINITY  AffinityMask;
+    KPRIORITY  Priority;
+    KPRIORITY  BasePriority;
+} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
+
+#define RTL_QUERY_REGISTRY_SUBKEY 0x01
+#define RTL_QUERY_REGISTRY_TOPKEY 0x02
+#define RTL_QUERY_REGISTRY_REQUIRED 0x04
+#define RTL_QUERY_REGISTRY_NOVALUE 0x08
+#define RTL_QUERY_REGISTRY_NOEXPAND 0x10
+#define RTL_QUERY_REGISTRY_DIRECT 0x20
+#define RTL_QUERY_REGISTRY_DELETE 0x40
+#define RTL_QUERY_REGISTRY_NOSTRING 0x80
+
+#define RTL_REGISTRY_ABSOLUTE 0
+#define RTL_REGISTRY_SERVICES 1
+#define RTL_REGISTRY_CONTROL 2
+#define RTL_REGISTRY_WINDOWS_NT 3
+#define RTL_REGISTRY_DEVICEMAP 4
+#define RTL_REGISTRY_USER 5
+#define RTL_REGISTRY_HANDLE 0x40000000
+#define RTL_REGISTRY_OPTIONAL 0x80000000
+
+typedef NTSTATUS (*PRTL_QUERY_REGISTRY_ROUTINE)
+                (PWSTR, ULONG, PVOID, ULONG, PVOID, PVOID);
+
+typedef struct _RTL_QUERY_REGISTRY_TABLE
+{
+  PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
+  ULONG Flags;
+  PCWSTR Name;
+  PVOID EntryContext;
+  ULONG DefaultType;
+  PVOID DefaultData;
+  ULONG DefaultLength;
+} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
+
+typedef enum _KEY_VALUE_INFORMATION_CLASS
+{
+  KeyValueBasicInformation = 0,
+  KeyValueFullInformation,
+  KeyValuePartialInformation
+} KEY_VALUE_INFORMATION_CLASS, *PKEY_VALUE_INFORMATION_CLASS;
+typedef struct _KEY_VALUE_PARTIAL_INFORMATION
+{
+  ULONG TitleIndex;
+  ULONG Type;
+  ULONG DataLength;
+  UCHAR Data[1];
+} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
+
+typedef enum _TIMER_TYPE
+{
+  NotificationTimer,
+  SynchronisationTimer
+} TIMER_TYPE, *PTIMER_TYPE;
+
+typedef VOID (APIENTRY *PTIMER_APC_ROUTINE)(PVOID, ULONG, ULONG);
+
 /* Function declarations for ntdll.dll.  These don't appear in any
    standard Win32 header.  */
+
+#define NtCurrentProcess() ((HANDLE) 0xffffffff)
+#define NtCurrentThread()  ((HANDLE) 0xfffffffe)
+
+#ifdef __cplusplus
+/* This is the mapping of the KUSER_SHARED_DATA structure into the 32 bit
+   user address space.  We need it here to access the current DismountCount. */
+static KUSER_SHARED_DATA &SharedUserData
+                        = *(volatile PKUSER_SHARED_DATA) 0x7ffe0000;
+
 extern "C"
 {
+#endif
+  NTSTATUS NTAPI NtAccessCheck (PSECURITY_DESCRIPTOR, HANDLE, ACCESS_MASK,
+                               PGENERIC_MAPPING, PPRIVILEGE_SET, PULONG,
+                               PACCESS_MASK, PNTSTATUS);
+  NTSTATUS NTAPI NtAdjustPrivilegesToken (HANDLE, BOOLEAN, PTOKEN_PRIVILEGES,
+                                         ULONG, PTOKEN_PRIVILEGES, PULONG);
+  NTSTATUS NTAPI NtAllocateLocallyUniqueId (PLUID);
+  NTSTATUS NTAPI NtAllocateUuids (PLARGE_INTEGER, PULONG, PULONG, PUCHAR);
+  NTSTATUS NTAPI NtCancelTimer (HANDLE, PBOOLEAN);
+  NTSTATUS NTAPI NtClose (HANDLE);
+  NTSTATUS NTAPI NtCommitTransaction (HANDLE, BOOLEAN);
+  NTSTATUS NTAPI NtCreateDirectoryObject (PHANDLE, ACCESS_MASK,
+                                         POBJECT_ATTRIBUTES);
+  NTSTATUS NTAPI NtCreateKey (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, ULONG,
+                             PUNICODE_STRING, ULONG, PULONG);
+  NTSTATUS NTAPI NtCreateEvent (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                               EVENT_TYPE, BOOLEAN);
   NTSTATUS NTAPI NtCreateFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
                             PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG,
                             ULONG, ULONG, PVOID, ULONG);
+  NTSTATUS NTAPI NtCreateMailslotFile(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                     PIO_STATUS_BLOCK, ULONG, ULONG, ULONG,
+                                     PLARGE_INTEGER);
+  NTSTATUS NTAPI NtCreateMutant (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                BOOLEAN);
+  NTSTATUS NTAPI NtCreateSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                 PLARGE_INTEGER, ULONG, ULONG, HANDLE);
+  NTSTATUS NTAPI NtCreateSemaphore (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                   LONG, LONG);
+  NTSTATUS NTAPI NtCreateTimer (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                               TIMER_TYPE);
   NTSTATUS NTAPI NtCreateToken (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
                                TOKEN_TYPE, PLUID, PLARGE_INTEGER, PTOKEN_USER,
                                PTOKEN_GROUPS, PTOKEN_PRIVILEGES, PTOKEN_OWNER,
                                PTOKEN_PRIMARY_GROUP, PTOKEN_DEFAULT_DACL,
                                PTOKEN_SOURCE);
+  NTSTATUS NTAPI NtCreateTransaction (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                     LPGUID, HANDLE, ULONG, ULONG, ULONG,
+                                     PLARGE_INTEGER, PUNICODE_STRING);
+  NTSTATUS NTAPI NtDuplicateToken (HANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                  BOOLEAN, TOKEN_TYPE, PHANDLE);
+  NTSTATUS NTAPI NtFsControlFile (HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID,
+                                 PIO_STATUS_BLOCK, ULONG, PVOID, ULONG,
+                                 PVOID, ULONG);
+  NTSTATUS NTAPI NtFlushBuffersFile (HANDLE, PIO_STATUS_BLOCK);
+  NTSTATUS NTAPI NtLoadKey (POBJECT_ATTRIBUTES, POBJECT_ATTRIBUTES);
+  NTSTATUS NTAPI NtLockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG);
   NTSTATUS NTAPI NtMapViewOfSection (HANDLE, HANDLE, PVOID *, ULONG, ULONG,
                                     PLARGE_INTEGER, PULONG, SECTION_INHERIT,
                                     ULONG, ULONG);
+  NTSTATUS NTAPI NtNotifyChangeDirectoryFile (HANDLE, HANDLE, PIO_APC_ROUTINE,
+                                             PVOID, PIO_STATUS_BLOCK,
+                                             PFILE_NOTIFY_INFORMATION, ULONG,
+                                             ULONG, BOOLEAN);
+  NTSTATUS NTAPI NtOpenDirectoryObject (PHANDLE, ACCESS_MASK,
+                                       POBJECT_ATTRIBUTES);
+  NTSTATUS NTAPI NtOpenEvent (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
   NTSTATUS NTAPI NtOpenFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
                             PIO_STATUS_BLOCK, ULONG, ULONG);
+  NTSTATUS NTAPI NtOpenKey (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
+  NTSTATUS NTAPI NtOpenMutant (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
+  NTSTATUS NTAPI NtOpenProcessToken (HANDLE, ACCESS_MASK, PHANDLE);
+  NTSTATUS NTAPI NtOpenThreadToken (HANDLE, ACCESS_MASK, BOOLEAN, PHANDLE);
   NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
-  NTSTATUS NTAPI NtQueryInformationFile (HANDLE, IO_STATUS_BLOCK *, VOID *,
+  NTSTATUS NTAPI NtOpenSemaphore (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
+  NTSTATUS NTAPI NtOpenSymbolicLinkObject (PHANDLE, ACCESS_MASK,
+                                          POBJECT_ATTRIBUTES);
+  /* WARNING!  Don't rely on the timestamp information returned by
+     NtQueryAttributesFile.  Only the DOS file attribute info is reliable. */
+  NTSTATUS NTAPI NtPrivilegeCheck (HANDLE, PPRIVILEGE_SET, PBOOLEAN);
+  NTSTATUS NTAPI NtQueryAttributesFile (POBJECT_ATTRIBUTES,
+                                       PFILE_BASIC_INFORMATION);
+  NTSTATUS NTAPI NtQueryDirectoryFile(HANDLE, HANDLE, PVOID, PVOID,
+                                     PIO_STATUS_BLOCK, PVOID, ULONG,
+                                     FILE_INFORMATION_CLASS, BOOLEAN,
+                                     PUNICODE_STRING, BOOLEAN);
+  NTSTATUS NTAPI NtQueryDirectoryObject (HANDLE, PVOID, ULONG, BOOLEAN,
+                                        BOOLEAN, PULONG, PULONG);
+  NTSTATUS NTAPI NtQueryEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
+                               BOOLEAN, PVOID, ULONG, PULONG, BOOLEAN);
+  NTSTATUS NTAPI NtQueryEvent (HANDLE, EVENT_INFORMATION_CLASS, PVOID, ULONG,
+                              PULONG);
+  NTSTATUS NTAPI NtQueryFullAttributesFile (POBJECT_ATTRIBUTES,
+                                           PFILE_NETWORK_OPEN_INFORMATION);
+  NTSTATUS NTAPI NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID,
                                         ULONG, FILE_INFORMATION_CLASS);
   NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS,
                                            PVOID, ULONG, PULONG);
+  NTSTATUS NTAPI NtQueryInformationThread (HANDLE, THREAD_INFORMATION_CLASS,
+                                           PVOID, ULONG, PULONG);
+  NTSTATUS NTAPI NtQueryInformationToken (HANDLE, TOKEN_INFORMATION_CLASS,
+                                         PVOID, ULONG, PULONG);
   NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *,
                                ULONG, ULONG *);
   NTSTATUS NTAPI NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS,
                                           PVOID, ULONG, PULONG);
+
+  NTSTATUS WINAPI NtQuerySystemTime (PLARGE_INTEGER);
+
   NTSTATUS NTAPI NtQuerySecurityObject (HANDLE, SECURITY_INFORMATION,
-                                       PSECURITY_DESCRIPTOR, ULONG, PULONG);
+                                       PSECURITY_DESCRIPTOR, ULONG, PULONG);
+  NTSTATUS NTAPI NtQuerySymbolicLinkObject (HANDLE, PUNICODE_STRING, PULONG);
+  NTSTATUS NTAPI NtQueryTimerResolution (PULONG, PULONG, PULONG);
+  NTSTATUS NTAPI NtQueryValueKey (HANDLE, PUNICODE_STRING,
+                                 KEY_VALUE_INFORMATION_CLASS, PVOID, ULONG,
+                                 PULONG);
   NTSTATUS NTAPI NtQueryVirtualMemory (HANDLE, PVOID, MEMORY_INFORMATION_CLASS,
                                       PVOID, ULONG, PULONG);
+  NTSTATUS NTAPI NtQueryVolumeInformationFile (HANDLE, IO_STATUS_BLOCK *,
+                                              VOID *, ULONG,
+                                              FS_INFORMATION_CLASS);
+  NTSTATUS NTAPI NtReadFile (HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID,
+                            PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER,
+                            PULONG);
+  NTSTATUS NTAPI NtRollbackTransaction (HANDLE, BOOLEAN);
+  NTSTATUS NTAPI NtSetEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG);
+  NTSTATUS NTAPI NtSetInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
+                                      FILE_INFORMATION_CLASS);
+  NTSTATUS NTAPI NtSetInformationThread (HANDLE, THREAD_INFORMATION_CLASS,
+                                        PVOID, ULONG);
+  NTSTATUS NTAPI NtSetInformationToken (HANDLE, TOKEN_INFORMATION_CLASS, PVOID,
+                                       ULONG);
   NTSTATUS NTAPI NtSetSecurityObject (HANDLE, SECURITY_INFORMATION,
                                      PSECURITY_DESCRIPTOR);
+  NTSTATUS NTAPI NtSetTimer (HANDLE, PLARGE_INTEGER, PTIMER_APC_ROUTINE, PVOID,
+                            BOOLEAN, LONG, PBOOLEAN);
+  NTSTATUS NTAPI NtSetTimerResolution (ULONG, BOOLEAN, PULONG);
+  NTSTATUS NTAPI NtSetValueKey (HANDLE, PUNICODE_STRING, ULONG, ULONG, PVOID,
+                               ULONG);
+  NTSTATUS NTAPI NtUnlockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG);
   NTSTATUS NTAPI NtUnmapViewOfSection (HANDLE, PVOID);
+  NTSTATUS NTAPI NtWriteFile (HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID,
+                             PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER,
+                             PULONG);
+  NTSTATUS NTAPI RtlAbsoluteToSelfRelativeSD (PSECURITY_DESCRIPTOR,
+                                             PSECURITY_DESCRIPTOR, PULONG);
+  VOID NTAPI RtlAcquirePebLock ();
+  NTSTATUS NTAPI RtlAddAccessAllowedAce (PACL, ULONG, ACCESS_MASK, PSID);
+  NTSTATUS NTAPI RtlAddAccessDeniedAce (PACL, ULONG, ACCESS_MASK, PSID);
+  NTSTATUS NTAPI RtlAddAce (PACL, ULONG, ULONG, PVOID, ULONG);
+  PVOID NTAPI RtlAllocateHeap (PVOID, ULONG, SIZE_T);
+  NTSTATUS NTAPI RtlAppendUnicodeToString (PUNICODE_STRING, PCWSTR);
+  NTSTATUS NTAPI RtlAppendUnicodeStringToString (PUNICODE_STRING,
+                                                PUNICODE_STRING);
+  NTSTATUS NTAPI RtlAnsiStringToUnicodeString (PUNICODE_STRING, PANSI_STRING,
+                                              BOOLEAN);
+  NTSTATUS NTAPI RtlCheckRegistryKey (ULONG, PCWSTR);
+  LONG NTAPI RtlCompareUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
+                                     BOOLEAN);
+  NTSTATUS NTAPI RtlConvertSidToUnicodeString (PUNICODE_STRING, PSID, BOOLEAN);
+  NTSTATUS NTAPI RtlConvertToAutoInheritSecurityObject (PSECURITY_DESCRIPTOR,
+                                                       PSECURITY_DESCRIPTOR,
+                                                       PSECURITY_DESCRIPTOR *,
+                                                       GUID *, BOOLEAN,
+                                                       PGENERIC_MAPPING);
+  NTSTATUS NTAPI RtlCopySid (ULONG, PSID, PSID);
+  VOID NTAPI RtlCopyUnicodeString (PUNICODE_STRING, PUNICODE_STRING);
+  NTSTATUS NTAPI RtlCreateAcl (PACL, ULONG, ULONG);
+  NTSTATUS NTAPI RtlCreateRegistryKey (ULONG, PCWSTR);
+  NTSTATUS NTAPI RtlCreateSecurityDescriptor (PSECURITY_DESCRIPTOR, ULONG);
+  BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING, PCSTR);
+  NTSTATUS NTAPI RtlDeleteSecurityObject (PSECURITY_DESCRIPTOR *);
+  NTSTATUS NTAPI RtlDowncaseUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
+                                          BOOLEAN);
+  NTSTATUS NTAPI RtlEnterCriticalSection (PRTL_CRITICAL_SECTION);
+  BOOLEAN NTAPI RtlEqualPrefixSid (PSID, PSID);
+  BOOLEAN NTAPI RtlEqualSid (PSID, PSID);
+  BOOLEAN NTAPI RtlEqualUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
+                                      BOOLEAN);
+  VOID NTAPI RtlFreeAnsiString (PANSI_STRING);
+  BOOLEAN NTAPI RtlFreeHeap (PVOID, ULONG, PVOID);
+  VOID NTAPI RtlFreeOemString (POEM_STRING);
+  VOID NTAPI RtlFreeUnicodeString (PUNICODE_STRING);
+  BOOLEAN NTAPI RtlFirstFreeAce (PACL, PVOID *);
+  NTSTATUS NTAPI RtlGetAce (PACL, ULONG, PVOID);
+  NTSTATUS NTAPI RtlGetControlSecurityDescriptor (PSECURITY_DESCRIPTOR,
+                                                 PSECURITY_DESCRIPTOR_CONTROL,
+                                                 PULONG);
+  HANDLE NTAPI RtlGetCurrentTransaction ();
+  NTSTATUS NTAPI RtlGetDaclSecurityDescriptor (PSECURITY_DESCRIPTOR, PBOOLEAN,
+                                              PACL *, PBOOLEAN);
+  NTSTATUS NTAPI RtlGetGroupSecurityDescriptor (PSECURITY_DESCRIPTOR, PSID *,
+                                               PBOOLEAN);
+  NTSTATUS NTAPI RtlGetOwnerSecurityDescriptor (PSECURITY_DESCRIPTOR, PSID *,
+                                               PBOOLEAN);
+  PSID_IDENTIFIER_AUTHORITY NTAPI RtlIdentifierAuthoritySid (PSID);
+  VOID NTAPI RtlInitEmptyUnicodeString (PUNICODE_STRING, PCWSTR, USHORT);
+  NTSTATUS NTAPI RtlInitializeSid (PSID, PSID_IDENTIFIER_AUTHORITY, UCHAR);
   VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING, PCWSTR);
+  NTSTATUS NTAPI RtlIntegerToUnicodeString (ULONG, ULONG, PUNICODE_STRING);
+  ULONG NTAPI RtlIsDosDeviceName_U (PCWSTR);
+  NTSTATUS NTAPI RtlLeaveCriticalSection (PRTL_CRITICAL_SECTION);
+  ULONG NTAPI RtlLengthSecurityDescriptor (PSECURITY_DESCRIPTOR);
+  ULONG NTAPI RtlLengthSid (PSID);
   ULONG NTAPI RtlNtStatusToDosError (NTSTATUS);
-  ULONG WINAPI RtlIsDosDeviceName_U (PCWSTR);
+  NTSTATUS NTAPI RtlOemStringToUnicodeString (PUNICODE_STRING, POEM_STRING,
+                                              BOOLEAN);
+  BOOLEAN NTAPI RtlPrefixUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
+                                       BOOLEAN);
+  NTSTATUS NTAPI RtlQueryRegistryValues (ULONG, PCWSTR,
+                                        PRTL_QUERY_REGISTRY_TABLE, PVOID,
+                                        PVOID);
+  VOID NTAPI RtlReleasePebLock ();
+  VOID NTAPI RtlSecondsSince1970ToTime (ULONG, PLARGE_INTEGER);
+  NTSTATUS NTAPI RtlSetCurrentDirectory_U (PUNICODE_STRING);
+  BOOLEAN NTAPI RtlSetCurrentTransaction (HANDLE);
+  NTSTATUS NTAPI RtlSetControlSecurityDescriptor (PSECURITY_DESCRIPTOR,
+                                                 SECURITY_DESCRIPTOR_CONTROL,
+                                                 SECURITY_DESCRIPTOR_CONTROL);
+  NTSTATUS NTAPI RtlSetDaclSecurityDescriptor (PSECURITY_DESCRIPTOR, BOOLEAN,
+                                              PACL, BOOLEAN);
+  NTSTATUS NTAPI RtlSetGroupSecurityDescriptor (PSECURITY_DESCRIPTOR, PSID,
+                                               BOOLEAN);
+  NTSTATUS NTAPI RtlSetOwnerSecurityDescriptor (PSECURITY_DESCRIPTOR, PSID,
+                                               BOOLEAN);
+  PUCHAR NTAPI RtlSubAuthorityCountSid (PSID);
+  PULONG NTAPI RtlSubAuthoritySid (PSID, ULONG);
+  NTSTATUS NTAPI RtlUnicodeStringToAnsiString (PANSI_STRING, PUNICODE_STRING,
+                                              BOOLEAN);
+  NTSTATUS NTAPI RtlUnicodeStringToOemString (PANSI_STRING, PUNICODE_STRING,
+                                             BOOLEAN);
+  WCHAR NTAPI RtlUpcaseUnicodeChar (WCHAR);
+  NTSTATUS NTAPI RtlUpcaseUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
+                                        BOOLEAN);
+  NTSTATUS NTAPI RtlWriteRegistryValue (ULONG, PCWSTR, PCWSTR, ULONG, PVOID,
+                                       ULONG);
+
+#ifdef __cplusplus
+  /* A few Rtl functions are either actually macros, or they just don't
+     exist even though they would be a big help.  We implement them here,
+     partly as inline functions. */
+
+  /* RtlInitEmptyUnicodeString is defined as a macro in wdm.h, but that file
+     is missing entirely in w32api. */
+  inline
+  VOID NTAPI RtlInitEmptyUnicodeString(PUNICODE_STRING dest, PCWSTR buf,
+                                      USHORT len)
+  {
+    dest->Length = 0;
+    dest->MaximumLength = len;
+    dest->Buffer = (PWSTR) buf;
+  }
+  /* Like RtlInitEmptyUnicodeString, but initialize Length to len, too.
+     This is for instance useful when creating a UNICODE_STRING from an
+     NtQueryInformationFile info buffer, where the length of the filename
+     is known, but you can't rely on the string being 0-terminated.
+     If you know it's 0-terminated, just use RtlInitUnicodeString(). */
+  inline
+  VOID NTAPI RtlInitCountedUnicodeString (PUNICODE_STRING dest, PCWSTR buf,
+                                         USHORT len)
+  {
+    dest->Length = dest->MaximumLength = len;
+    dest->Buffer = (PWSTR) buf;
+  }
+  /* Split path into dirname and basename part.  This function does not
+     copy anything!  It just initializes the dirname and basename
+     UNICODE_STRINGs so that their Buffer members point to the right spot
+     into path's Buffer, and the Length (and MaximumLength) members are set
+     to match the dirname part and the basename part.
+     Note that dirname's Length is set so that it also includes the trailing
+     backslash.  If you don't need it, just subtract sizeof(WCHAR) from
+     dirname.Length. */
+  inline
+  VOID NTAPI RtlSplitUnicodePath (PUNICODE_STRING path, PUNICODE_STRING dirname,
+                                 PUNICODE_STRING basename)
+  {
+    USHORT len = path->Length / sizeof (WCHAR);
+    while (len > 0 && path->Buffer[--len] != L'\\')
+      ;
+    ++len;
+    if (dirname)
+      RtlInitCountedUnicodeString (dirname, path->Buffer, len * sizeof (WCHAR));
+    if (basename)
+      RtlInitCountedUnicodeString (basename, &path->Buffer[len],
+                                  path->Length - len * sizeof (WCHAR));
+  }
+  /* Check if prefix is a prefix of path. */
+  inline
+  BOOLEAN NTAPI RtlEqualUnicodePathPrefix (PUNICODE_STRING path,
+                                          PUNICODE_STRING prefix,
+                                          BOOLEAN caseinsensitive)
+  {
+    UNICODE_STRING p;
+
+    RtlInitCountedUnicodeString (&p, path->Buffer,
+                                prefix->Length < path->Length
+                                ? prefix->Length : path->Length);
+    return RtlEqualUnicodeString (&p, prefix, caseinsensitive);
+  }
+  /* Check if sufffix is a sufffix of path. */
+  inline
+  BOOL NTAPI RtlEqualUnicodePathSuffix (PUNICODE_STRING path,
+                                       PUNICODE_STRING suffix,
+                                       BOOLEAN caseinsensitive)
+  {
+    UNICODE_STRING p;
+
+    if (suffix->Length < path->Length)
+      RtlInitCountedUnicodeString (&p, (PWCHAR) ((PBYTE) path->Buffer
+                                      + path->Length - suffix->Length),
+                                  suffix->Length);
+    else
+      RtlInitCountedUnicodeString (&p, path->Buffer, path->Length);
+    return RtlEqualUnicodeString (&p, suffix, caseinsensitive);
+  }
+  /* Implemented in strfuncs.cc.  Create a Hex UNICODE_STRING from a given
+     64 bit integer value.  If append is TRUE, append the hex string,
+     otherwise overwrite dest.  Returns either STATUS_SUCCESS, or
+     STATUS_BUFFER_OVERFLOW, if the unicode buffer is too small (hasn't
+     room for 16 WCHARs). */
+  NTSTATUS NTAPI RtlInt64ToHexUnicodeString (ULONGLONG value,
+                                            PUNICODE_STRING dest,
+                                            BOOLEAN append);
+  /* Set file attributes.  Don't change file times. */
+  inline
+  NTSTATUS NTAPI NtSetAttributesFile (HANDLE h, ULONG attr)
+  {
+    IO_STATUS_BLOCK io;
+    FILE_BASIC_INFORMATION fbi;
+    fbi.CreationTime.QuadPart = fbi.LastAccessTime.QuadPart =
+    fbi.LastWriteTime.QuadPart = fbi.ChangeTime.QuadPart = 0LL;
+    fbi.FileAttributes = attr ?: FILE_ATTRIBUTE_NORMAL;
+    return NtSetInformationFile(h, &io, &fbi, sizeof fbi, FileBasicInformation);
+  }
+
+  /* This test for a signalled event is twice as fast as calling
+     WaitForSingleObject (event, 0). */
+  inline
+  BOOL NTAPI IsEventSignalled (HANDLE event)
+  {
+    EVENT_BASIC_INFORMATION ebi;
+    return NT_SUCCESS (NtQueryEvent (event, EventBasicInformation,
+                                    &ebi, sizeof ebi, NULL))
+          && ebi.SignalState != 0;
+
+  }
 }
+#endif
+#endif /*_NTDLL_H*/
This page took 0.037443 seconds and 5 git commands to generate.