Home | History | Annotate | Download | only in src
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This file holds definitions related to the ntdll API.
      6 
      7 #ifndef SANDBOX_WIN_SRC_NT_INTERNALS_H__
      8 #define SANDBOX_WIN_SRC_NT_INTERNALS_H__
      9 
     10 #include <windows.h>
     11 #include <stddef.h>
     12 
     13 typedef LONG NTSTATUS;
     14 #define NT_SUCCESS(st) (st >= 0)
     15 
     16 #define STATUS_SUCCESS                ((NTSTATUS)0x00000000L)
     17 #define STATUS_BUFFER_OVERFLOW        ((NTSTATUS)0x80000005L)
     18 #define STATUS_UNSUCCESSFUL           ((NTSTATUS)0xC0000001L)
     19 #define STATUS_NOT_IMPLEMENTED        ((NTSTATUS)0xC0000002L)
     20 #define STATUS_INFO_LENGTH_MISMATCH   ((NTSTATUS)0xC0000004L)
     21 #ifndef STATUS_INVALID_PARAMETER
     22 // It is now defined in Windows 2008 SDK.
     23 #define STATUS_INVALID_PARAMETER      ((NTSTATUS)0xC000000DL)
     24 #endif
     25 #define STATUS_CONFLICTING_ADDRESSES  ((NTSTATUS)0xC0000018L)
     26 #define STATUS_ACCESS_DENIED          ((NTSTATUS)0xC0000022L)
     27 #define STATUS_BUFFER_TOO_SMALL       ((NTSTATUS)0xC0000023L)
     28 #define STATUS_OBJECT_NAME_NOT_FOUND  ((NTSTATUS)0xC0000034L)
     29 #define STATUS_OBJECT_NAME_COLLISION  ((NTSTATUS)0xC0000035L)
     30 #define STATUS_PROCEDURE_NOT_FOUND    ((NTSTATUS)0xC000007AL)
     31 #define STATUS_INVALID_IMAGE_FORMAT   ((NTSTATUS)0xC000007BL)
     32 #define STATUS_NO_TOKEN               ((NTSTATUS)0xC000007CL)
     33 
     34 #define CURRENT_PROCESS ((HANDLE) -1)
     35 #define CURRENT_THREAD  ((HANDLE) -2)
     36 #define NtCurrentProcess CURRENT_PROCESS
     37 
     38 typedef struct _UNICODE_STRING {
     39   USHORT Length;
     40   USHORT MaximumLength;
     41   PWSTR  Buffer;
     42 } UNICODE_STRING;
     43 typedef UNICODE_STRING *PUNICODE_STRING;
     44 typedef const UNICODE_STRING *PCUNICODE_STRING;
     45 
     46 typedef struct _STRING {
     47   USHORT Length;
     48   USHORT MaximumLength;
     49   PCHAR Buffer;
     50 } STRING;
     51 typedef STRING *PSTRING;
     52 
     53 typedef STRING ANSI_STRING;
     54 typedef PSTRING PANSI_STRING;
     55 typedef CONST PSTRING PCANSI_STRING;
     56 
     57 typedef STRING OEM_STRING;
     58 typedef PSTRING POEM_STRING;
     59 typedef CONST STRING* PCOEM_STRING;
     60 
     61 #define OBJ_CASE_INSENSITIVE 0x00000040L
     62 #define OBJ_OPENIF           0x00000080L
     63 
     64 typedef struct _OBJECT_ATTRIBUTES {
     65   ULONG Length;
     66   HANDLE RootDirectory;
     67   PUNICODE_STRING ObjectName;
     68   ULONG Attributes;
     69   PVOID SecurityDescriptor;
     70   PVOID SecurityQualityOfService;
     71 } OBJECT_ATTRIBUTES;
     72 typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
     73 
     74 #define InitializeObjectAttributes(p, n, a, r, s) { \
     75   (p)->Length = sizeof(OBJECT_ATTRIBUTES);\
     76   (p)->RootDirectory = r;\
     77   (p)->Attributes = a;\
     78   (p)->ObjectName = n;\
     79   (p)->SecurityDescriptor = s;\
     80   (p)->SecurityQualityOfService = NULL;\
     81 }
     82 
     83 typedef struct _IO_STATUS_BLOCK {
     84   union {
     85     NTSTATUS Status;
     86     PVOID Pointer;
     87   };
     88   ULONG_PTR Information;
     89 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
     90 
     91 // -----------------------------------------------------------------------
     92 // File IO
     93 
     94 // Create disposition values.
     95 
     96 #define FILE_SUPERSEDE                          0x00000000
     97 #define FILE_OPEN                               0x00000001
     98 #define FILE_CREATE                             0x00000002
     99 #define FILE_OPEN_IF                            0x00000003
    100 #define FILE_OVERWRITE                          0x00000004
    101 #define FILE_OVERWRITE_IF                       0x00000005
    102 #define FILE_MAXIMUM_DISPOSITION                0x00000005
    103 
    104 // Create/open option flags.
    105 
    106 #define FILE_DIRECTORY_FILE                     0x00000001
    107 #define FILE_WRITE_THROUGH                      0x00000002
    108 #define FILE_SEQUENTIAL_ONLY                    0x00000004
    109 #define FILE_NO_INTERMEDIATE_BUFFERING          0x00000008
    110 
    111 #define FILE_SYNCHRONOUS_IO_ALERT               0x00000010
    112 #define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020
    113 #define FILE_NON_DIRECTORY_FILE                 0x00000040
    114 #define FILE_CREATE_TREE_CONNECTION             0x00000080
    115 
    116 #define FILE_COMPLETE_IF_OPLOCKED               0x00000100
    117 #define FILE_NO_EA_KNOWLEDGE                    0x00000200
    118 #define FILE_OPEN_REMOTE_INSTANCE               0x00000400
    119 #define FILE_RANDOM_ACCESS                      0x00000800
    120 
    121 #define FILE_DELETE_ON_CLOSE                    0x00001000
    122 #define FILE_OPEN_BY_FILE_ID                    0x00002000
    123 #define FILE_OPEN_FOR_BACKUP_INTENT             0x00004000
    124 #define FILE_NO_COMPRESSION                     0x00008000
    125 
    126 #define FILE_RESERVE_OPFILTER                   0x00100000
    127 #define FILE_OPEN_REPARSE_POINT                 0x00200000
    128 #define FILE_OPEN_NO_RECALL                     0x00400000
    129 #define FILE_OPEN_FOR_FREE_SPACE_QUERY          0x00800000
    130 
    131 // Create/open result values. These are the disposition values returned on the
    132 // io status information.
    133 #define FILE_SUPERSEDED                         0x00000000
    134 #define FILE_OPENED                             0x00000001
    135 #define FILE_CREATED                            0x00000002
    136 #define FILE_OVERWRITTEN                        0x00000003
    137 #define FILE_EXISTS                             0x00000004
    138 #define FILE_DOES_NOT_EXIST                     0x00000005
    139 
    140 typedef NTSTATUS (WINAPI *NtCreateFileFunction)(
    141   OUT PHANDLE FileHandle,
    142   IN ACCESS_MASK DesiredAccess,
    143   IN POBJECT_ATTRIBUTES ObjectAttributes,
    144   OUT PIO_STATUS_BLOCK IoStatusBlock,
    145   IN PLARGE_INTEGER AllocationSize OPTIONAL,
    146   IN ULONG FileAttributes,
    147   IN ULONG ShareAccess,
    148   IN ULONG CreateDisposition,
    149   IN ULONG CreateOptions,
    150   IN PVOID EaBuffer OPTIONAL,
    151   IN ULONG EaLength);
    152 
    153 typedef NTSTATUS (WINAPI *NtOpenFileFunction)(
    154   OUT PHANDLE FileHandle,
    155   IN ACCESS_MASK DesiredAccess,
    156   IN POBJECT_ATTRIBUTES ObjectAttributes,
    157   OUT PIO_STATUS_BLOCK IoStatusBlock,
    158   IN ULONG ShareAccess,
    159   IN ULONG OpenOptions);
    160 
    161 typedef NTSTATUS (WINAPI *NtCloseFunction)(
    162   IN HANDLE Handle);
    163 
    164 typedef enum _FILE_INFORMATION_CLASS {
    165   FileRenameInformation = 10
    166 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
    167 
    168 typedef struct _FILE_RENAME_INFORMATION {
    169   BOOLEAN ReplaceIfExists;
    170   HANDLE RootDirectory;
    171   ULONG FileNameLength;
    172   WCHAR FileName[1];
    173 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
    174 
    175 typedef NTSTATUS (WINAPI *NtSetInformationFileFunction)(
    176   IN HANDLE FileHandle,
    177   OUT PIO_STATUS_BLOCK IoStatusBlock,
    178   IN PVOID FileInformation,
    179   IN ULONG Length,
    180   IN FILE_INFORMATION_CLASS FileInformationClass);
    181 
    182 typedef struct FILE_BASIC_INFORMATION {
    183   LARGE_INTEGER CreationTime;
    184   LARGE_INTEGER LastAccessTime;
    185   LARGE_INTEGER LastWriteTime;
    186   LARGE_INTEGER ChangeTime;
    187   ULONG FileAttributes;
    188 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
    189 
    190 typedef NTSTATUS (WINAPI *NtQueryAttributesFileFunction)(
    191   IN POBJECT_ATTRIBUTES ObjectAttributes,
    192   OUT PFILE_BASIC_INFORMATION FileAttributes);
    193 
    194 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
    195   LARGE_INTEGER CreationTime;
    196   LARGE_INTEGER LastAccessTime;
    197   LARGE_INTEGER LastWriteTime;
    198   LARGE_INTEGER ChangeTime;
    199   LARGE_INTEGER AllocationSize;
    200   LARGE_INTEGER EndOfFile;
    201   ULONG FileAttributes;
    202 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
    203 
    204 typedef NTSTATUS (WINAPI *NtQueryFullAttributesFileFunction)(
    205   IN POBJECT_ATTRIBUTES ObjectAttributes,
    206   OUT PFILE_NETWORK_OPEN_INFORMATION FileAttributes);
    207 
    208 // -----------------------------------------------------------------------
    209 // Sections
    210 
    211 typedef NTSTATUS (WINAPI *NtCreateSectionFunction)(
    212   OUT PHANDLE SectionHandle,
    213   IN ACCESS_MASK DesiredAccess,
    214   IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    215   IN PLARGE_INTEGER MaximumSize OPTIONAL,
    216   IN ULONG SectionPageProtection,
    217   IN ULONG AllocationAttributes,
    218   IN HANDLE FileHandle OPTIONAL);
    219 
    220 typedef ULONG SECTION_INHERIT;
    221 #define ViewShare 1
    222 #define ViewUnmap 2
    223 
    224 typedef NTSTATUS (WINAPI *NtMapViewOfSectionFunction)(
    225   IN HANDLE SectionHandle,
    226   IN HANDLE ProcessHandle,
    227   IN OUT PVOID *BaseAddress,
    228   IN ULONG_PTR ZeroBits,
    229   IN SIZE_T CommitSize,
    230   IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
    231   IN OUT PSIZE_T ViewSize,
    232   IN SECTION_INHERIT InheritDisposition,
    233   IN ULONG AllocationType,
    234   IN ULONG Win32Protect);
    235 
    236 typedef NTSTATUS (WINAPI *NtUnmapViewOfSectionFunction)(
    237   IN HANDLE ProcessHandle,
    238   IN PVOID BaseAddress);
    239 
    240 typedef enum _SECTION_INFORMATION_CLASS {
    241   SectionBasicInformation = 0,
    242   SectionImageInformation
    243 } SECTION_INFORMATION_CLASS;
    244 
    245 typedef struct _SECTION_BASIC_INFORMATION {
    246   PVOID BaseAddress;
    247   ULONG Attributes;
    248   LARGE_INTEGER Size;
    249 } SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;
    250 
    251 typedef NTSTATUS (WINAPI *NtQuerySectionFunction)(
    252   IN HANDLE SectionHandle,
    253   IN SECTION_INFORMATION_CLASS SectionInformationClass,
    254   OUT PVOID SectionInformation,
    255   IN SIZE_T SectionInformationLength,
    256   OUT PSIZE_T ReturnLength OPTIONAL);
    257 
    258 // -----------------------------------------------------------------------
    259 // Process and Thread
    260 
    261 typedef struct _CLIENT_ID {
    262   PVOID UniqueProcess;
    263   PVOID UniqueThread;
    264 } CLIENT_ID, *PCLIENT_ID;
    265 
    266 typedef NTSTATUS (WINAPI *NtOpenThreadFunction) (
    267   OUT PHANDLE ThreadHandle,
    268   IN ACCESS_MASK DesiredAccess,
    269   IN POBJECT_ATTRIBUTES ObjectAttributes,
    270   IN PCLIENT_ID ClientId);
    271 
    272 typedef NTSTATUS (WINAPI *NtOpenProcessFunction) (
    273   OUT PHANDLE ProcessHandle,
    274   IN ACCESS_MASK DesiredAccess,
    275   IN POBJECT_ATTRIBUTES ObjectAttributes,
    276   IN PCLIENT_ID ClientId);
    277 
    278 typedef enum _NT_THREAD_INFORMATION_CLASS {
    279   ThreadBasicInformation,
    280   ThreadTimes,
    281   ThreadPriority,
    282   ThreadBasePriority,
    283   ThreadAffinityMask,
    284   ThreadImpersonationToken,
    285   ThreadDescriptorTableEntry,
    286   ThreadEnableAlignmentFaultFixup,
    287   ThreadEventPair,
    288   ThreadQuerySetWin32StartAddress,
    289   ThreadZeroTlsCell,
    290   ThreadPerformanceCount,
    291   ThreadAmILastThread,
    292   ThreadIdealProcessor,
    293   ThreadPriorityBoost,
    294   ThreadSetTlsArrayAddress,
    295   ThreadIsIoPending,
    296   ThreadHideFromDebugger
    297 } NT_THREAD_INFORMATION_CLASS, *PNT_THREAD_INFORMATION_CLASS;
    298 
    299 typedef NTSTATUS (WINAPI *NtSetInformationThreadFunction) (
    300   IN HANDLE ThreadHandle,
    301   IN NT_THREAD_INFORMATION_CLASS ThreadInformationClass,
    302   IN PVOID ThreadInformation,
    303   IN ULONG ThreadInformationLength);
    304 
    305 // Partial definition only:
    306 typedef enum _PROCESSINFOCLASS {
    307   ProcessBasicInformation = 0,
    308   ProcessExecuteFlags = 0x22
    309 } PROCESSINFOCLASS;
    310 
    311 typedef PVOID PPEB;
    312 typedef LONG KPRIORITY;
    313 
    314 typedef struct _PROCESS_BASIC_INFORMATION {
    315   union {
    316     NTSTATUS ExitStatus;
    317     PVOID padding_for_x64_0;
    318   };
    319   PPEB PebBaseAddress;
    320   KAFFINITY AffinityMask;
    321   union {
    322     KPRIORITY BasePriority;
    323     PVOID padding_for_x64_1;
    324   };
    325   union {
    326     DWORD UniqueProcessId;
    327     PVOID padding_for_x64_2;
    328   };
    329   union {
    330     DWORD InheritedFromUniqueProcessId;
    331     PVOID padding_for_x64_3;
    332   };
    333 } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
    334 
    335 typedef NTSTATUS (WINAPI *NtQueryInformationProcessFunction)(
    336   IN HANDLE ProcessHandle,
    337   IN PROCESSINFOCLASS ProcessInformationClass,
    338   OUT PVOID ProcessInformation,
    339   IN ULONG ProcessInformationLength,
    340   OUT PULONG ReturnLength OPTIONAL);
    341 
    342 typedef NTSTATUS (WINAPI *NtSetInformationProcessFunction)(
    343   HANDLE ProcessHandle,
    344   IN PROCESSINFOCLASS ProcessInformationClass,
    345   IN PVOID ProcessInformation,
    346   IN ULONG ProcessInformationLength);
    347 
    348 typedef NTSTATUS (WINAPI *NtOpenThreadTokenFunction) (
    349   IN HANDLE ThreadHandle,
    350   IN ACCESS_MASK DesiredAccess,
    351   IN BOOLEAN OpenAsSelf,
    352   OUT PHANDLE TokenHandle);
    353 
    354 typedef NTSTATUS (WINAPI *NtOpenThreadTokenExFunction) (
    355   IN HANDLE ThreadHandle,
    356   IN ACCESS_MASK DesiredAccess,
    357   IN BOOLEAN OpenAsSelf,
    358   IN ULONG HandleAttributes,
    359   OUT PHANDLE TokenHandle);
    360 
    361 typedef NTSTATUS (WINAPI *NtOpenProcessTokenFunction) (
    362   IN HANDLE ProcessHandle,
    363   IN ACCESS_MASK DesiredAccess,
    364   OUT PHANDLE TokenHandle);
    365 
    366 typedef NTSTATUS (WINAPI *NtOpenProcessTokenExFunction) (
    367   IN HANDLE ProcessHandle,
    368   IN ACCESS_MASK DesiredAccess,
    369   IN ULONG HandleAttributes,
    370   OUT PHANDLE TokenHandle);
    371 
    372 typedef NTSTATUS (WINAPI * RtlCreateUserThreadFunction)(
    373   IN HANDLE Process,
    374   IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
    375   IN BOOLEAN CreateSuspended,
    376   IN ULONG ZeroBits,
    377   IN SIZE_T MaximumStackSize,
    378   IN SIZE_T CommittedStackSize,
    379   IN LPTHREAD_START_ROUTINE StartAddress,
    380   IN PVOID Parameter,
    381   OUT PHANDLE Thread,
    382   OUT PCLIENT_ID ClientId);
    383 
    384 // -----------------------------------------------------------------------
    385 // Registry
    386 
    387 typedef NTSTATUS (WINAPI *NtCreateKeyFunction)(
    388   OUT PHANDLE KeyHandle,
    389   IN ACCESS_MASK DesiredAccess,
    390   IN POBJECT_ATTRIBUTES ObjectAttributes,
    391   IN ULONG TitleIndex,
    392   IN PUNICODE_STRING Class OPTIONAL,
    393   IN ULONG CreateOptions,
    394   OUT PULONG Disposition OPTIONAL);
    395 
    396 typedef NTSTATUS (WINAPI *NtOpenKeyFunction)(
    397   OUT PHANDLE KeyHandle,
    398   IN ACCESS_MASK DesiredAccess,
    399   IN POBJECT_ATTRIBUTES ObjectAttributes);
    400 
    401 typedef NTSTATUS (WINAPI *NtOpenKeyExFunction)(
    402   OUT PHANDLE KeyHandle,
    403   IN ACCESS_MASK DesiredAccess,
    404   IN POBJECT_ATTRIBUTES ObjectAttributes,
    405   IN DWORD open_options);
    406 
    407 typedef NTSTATUS (WINAPI *NtDeleteKeyFunction)(
    408   IN HANDLE KeyHandle);
    409 
    410 // -----------------------------------------------------------------------
    411 // Memory
    412 
    413 // Don't really need this structure right now.
    414 typedef PVOID PRTL_HEAP_PARAMETERS;
    415 
    416 typedef PVOID (WINAPI *RtlCreateHeapFunction)(
    417   IN ULONG Flags,
    418   IN PVOID HeapBase OPTIONAL,
    419   IN SIZE_T ReserveSize OPTIONAL,
    420   IN SIZE_T CommitSize OPTIONAL,
    421   IN PVOID Lock OPTIONAL,
    422   IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
    423 
    424 typedef PVOID (WINAPI *RtlDestroyHeapFunction)(
    425   IN PVOID HeapHandle);
    426 
    427 typedef PVOID (WINAPI *RtlAllocateHeapFunction)(
    428   IN PVOID HeapHandle,
    429   IN ULONG Flags,
    430   IN SIZE_T Size);
    431 
    432 typedef BOOLEAN (WINAPI *RtlFreeHeapFunction)(
    433   IN PVOID HeapHandle,
    434   IN ULONG Flags,
    435   IN PVOID HeapBase);
    436 
    437 typedef NTSTATUS (WINAPI *NtAllocateVirtualMemoryFunction) (
    438   IN HANDLE ProcessHandle,
    439   IN OUT PVOID *BaseAddress,
    440   IN ULONG_PTR ZeroBits,
    441   IN OUT PSIZE_T RegionSize,
    442   IN ULONG AllocationType,
    443   IN ULONG Protect);
    444 
    445 typedef NTSTATUS (WINAPI *NtFreeVirtualMemoryFunction) (
    446   IN HANDLE ProcessHandle,
    447   IN OUT PVOID *BaseAddress,
    448   IN OUT PSIZE_T RegionSize,
    449   IN ULONG FreeType);
    450 
    451 typedef enum _MEMORY_INFORMATION_CLASS {
    452   MemoryBasicInformation = 0,
    453   MemoryWorkingSetList,
    454   MemorySectionName,
    455   MemoryBasicVlmInformation
    456 } MEMORY_INFORMATION_CLASS;
    457 
    458 typedef struct _MEMORY_SECTION_NAME {  // Information Class 2
    459   UNICODE_STRING SectionFileName;
    460 } MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;
    461 
    462 typedef NTSTATUS (WINAPI *NtQueryVirtualMemoryFunction)(
    463   IN HANDLE ProcessHandle,
    464   IN PVOID BaseAddress,
    465   IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
    466   OUT PVOID MemoryInformation,
    467   IN SIZE_T MemoryInformationLength,
    468   OUT PSIZE_T ReturnLength OPTIONAL);
    469 
    470 typedef NTSTATUS (WINAPI *NtProtectVirtualMemoryFunction)(
    471   IN HANDLE ProcessHandle,
    472   IN OUT PVOID* BaseAddress,
    473   IN OUT PSIZE_T ProtectSize,
    474   IN ULONG NewProtect,
    475   OUT PULONG OldProtect);
    476 
    477 // -----------------------------------------------------------------------
    478 // Objects
    479 
    480 typedef enum _OBJECT_INFORMATION_CLASS {
    481   ObjectBasicInformation,
    482   ObjectNameInformation,
    483   ObjectTypeInformation,
    484   ObjectAllInformation,
    485   ObjectDataInformation
    486 } OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
    487 
    488 typedef struct _OBJDIR_INFORMATION {
    489   UNICODE_STRING ObjectName;
    490   UNICODE_STRING ObjectTypeName;
    491   BYTE Data[1];
    492 } OBJDIR_INFORMATION;
    493 
    494 typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
    495   ULONG Attributes;
    496   ACCESS_MASK GrantedAccess;
    497   ULONG HandleCount;
    498   ULONG PointerCount;
    499   ULONG Reserved[10];    // reserved for internal use
    500 } PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
    501 
    502 typedef struct __PUBLIC_OBJECT_TYPE_INFORMATION {
    503   UNICODE_STRING TypeName;
    504   ULONG Reserved[22];    // reserved for internal use
    505 } PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;
    506 
    507 typedef enum _POOL_TYPE {
    508   NonPagedPool,
    509   PagedPool,
    510   NonPagedPoolMustSucceed,
    511   ReservedType,
    512   NonPagedPoolCacheAligned,
    513   PagedPoolCacheAligned,
    514   NonPagedPoolCacheAlignedMustS
    515 } POOL_TYPE;
    516 
    517 typedef struct _OBJECT_BASIC_INFORMATION {
    518   ULONG Attributes;
    519   ACCESS_MASK GrantedAccess;
    520   ULONG HandleCount;
    521   ULONG PointerCount;
    522   ULONG PagedPoolUsage;
    523   ULONG NonPagedPoolUsage;
    524   ULONG Reserved[3];
    525   ULONG NameInformationLength;
    526   ULONG TypeInformationLength;
    527   ULONG SecurityDescriptorLength;
    528   LARGE_INTEGER CreateTime;
    529 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
    530 
    531 typedef struct _OBJECT_TYPE_INFORMATION {
    532   UNICODE_STRING Name;
    533   ULONG TotalNumberOfObjects;
    534   ULONG TotalNumberOfHandles;
    535   ULONG TotalPagedPoolUsage;
    536   ULONG TotalNonPagedPoolUsage;
    537   ULONG TotalNamePoolUsage;
    538   ULONG TotalHandleTableUsage;
    539   ULONG HighWaterNumberOfObjects;
    540   ULONG HighWaterNumberOfHandles;
    541   ULONG HighWaterPagedPoolUsage;
    542   ULONG HighWaterNonPagedPoolUsage;
    543   ULONG HighWaterNamePoolUsage;
    544   ULONG HighWaterHandleTableUsage;
    545   ULONG InvalidAttributes;
    546   GENERIC_MAPPING GenericMapping;
    547   ULONG ValidAccess;
    548   BOOLEAN SecurityRequired;
    549   BOOLEAN MaintainHandleCount;
    550   USHORT MaintainTypeList;
    551   POOL_TYPE PoolType;
    552   ULONG PagedPoolUsage;
    553   ULONG NonPagedPoolUsage;
    554 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
    555 
    556 typedef enum _SYSTEM_INFORMATION_CLASS {
    557   SystemHandleInformation = 16
    558 } SYSTEM_INFORMATION_CLASS;
    559 
    560 typedef struct _SYSTEM_HANDLE_INFORMATION {
    561   USHORT ProcessId;
    562   USHORT CreatorBackTraceIndex;
    563   UCHAR ObjectTypeNumber;
    564   UCHAR Flags;
    565   USHORT Handle;
    566   PVOID Object;
    567   ACCESS_MASK GrantedAccess;
    568 } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
    569 
    570 typedef struct _SYSTEM_HANDLE_INFORMATION_EX {
    571   ULONG NumberOfHandles;
    572   SYSTEM_HANDLE_INFORMATION Information[1];
    573 } SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
    574 
    575 typedef struct _OBJECT_NAME_INFORMATION {
    576   UNICODE_STRING ObjectName;
    577 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
    578 
    579 typedef NTSTATUS (WINAPI *NtQueryObjectFunction)(
    580   IN HANDLE Handle,
    581   IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    582   OUT PVOID ObjectInformation OPTIONAL,
    583   IN ULONG ObjectInformationLength,
    584   OUT PULONG ReturnLength OPTIONAL);
    585 
    586 typedef NTSTATUS (WINAPI *NtDuplicateObjectFunction)(
    587   IN HANDLE SourceProcess,
    588   IN HANDLE SourceHandle,
    589   IN HANDLE TargetProcess,
    590   OUT PHANDLE TargetHandle,
    591   IN ACCESS_MASK DesiredAccess,
    592   IN ULONG Attributes,
    593   IN ULONG Options);
    594 
    595 typedef NTSTATUS (WINAPI *NtSignalAndWaitForSingleObjectFunction)(
    596   IN HANDLE HandleToSignal,
    597   IN HANDLE HandleToWait,
    598   IN BOOLEAN Alertable,
    599   IN PLARGE_INTEGER Timeout OPTIONAL);
    600 
    601 typedef NTSTATUS (WINAPI *NtQuerySystemInformation)(
    602   IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    603   OUT PVOID SystemInformation,
    604   IN ULONG SystemInformationLength,
    605   OUT PULONG ReturnLength);
    606 
    607 typedef NTSTATUS (WINAPI *NtQueryObject)(
    608   IN HANDLE Handle,
    609   IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    610   OUT PVOID ObjectInformation,
    611   IN ULONG ObjectInformationLength,
    612   OUT PULONG ReturnLength);
    613 
    614 // -----------------------------------------------------------------------
    615 // Strings
    616 
    617 typedef int (__cdecl *_strnicmpFunction)(
    618   IN const char* _Str1,
    619   IN const char* _Str2,
    620   IN size_t _MaxCount);
    621 
    622 typedef size_t  (__cdecl *strlenFunction)(
    623   IN const char * _Str);
    624 
    625 typedef size_t (__cdecl *wcslenFunction)(
    626   IN const wchar_t* _Str);
    627 
    628 typedef void* (__cdecl *memcpyFunction)(
    629   IN void* dest,
    630   IN const void* src,
    631   IN size_t count);
    632 
    633 typedef NTSTATUS (WINAPI *RtlAnsiStringToUnicodeStringFunction)(
    634   IN OUT PUNICODE_STRING  DestinationString,
    635   IN PANSI_STRING  SourceString,
    636   IN BOOLEAN  AllocateDestinationString);
    637 
    638 typedef LONG (WINAPI *RtlCompareUnicodeStringFunction)(
    639   IN PCUNICODE_STRING  String1,
    640   IN PCUNICODE_STRING  String2,
    641   IN BOOLEAN  CaseInSensitive);
    642 
    643 typedef VOID (WINAPI *RtlInitUnicodeStringFunction) (
    644   IN OUT PUNICODE_STRING DestinationString,
    645   IN PCWSTR SourceString);
    646 
    647 typedef enum _EVENT_TYPE {
    648   NotificationEvent,
    649   SynchronizationEvent
    650 } EVENT_TYPE, *PEVENT_TYPE;
    651 
    652 typedef NTSTATUS (WINAPI* NtCreateDirectoryObjectFunction) (
    653     PHANDLE DirectoryHandle,
    654     ACCESS_MASK DesiredAccess,
    655     POBJECT_ATTRIBUTES ObjectAttributes);
    656 
    657 typedef NTSTATUS (WINAPI* NtOpenDirectoryObjectFunction) (
    658     PHANDLE DirectoryHandle,
    659     ACCESS_MASK DesiredAccess,
    660     POBJECT_ATTRIBUTES ObjectAttributes);
    661 
    662 typedef NTSTATUS (WINAPI* NtQuerySymbolicLinkObjectFunction) (
    663     HANDLE LinkHandle,
    664     PUNICODE_STRING LinkTarget,
    665     PULONG ReturnedLength);
    666 
    667 typedef NTSTATUS (WINAPI* NtOpenSymbolicLinkObjectFunction) (
    668     PHANDLE LinkHandle,
    669     ACCESS_MASK DesiredAccess,
    670     POBJECT_ATTRIBUTES ObjectAttributes);
    671 
    672 #define DIRECTORY_QUERY               0x0001
    673 #define DIRECTORY_TRAVERSE            0x0002
    674 #define DIRECTORY_CREATE_OBJECT       0x0004
    675 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
    676 #define DIRECTORY_ALL_ACCESS          0x000F
    677 
    678 typedef NTSTATUS (WINAPI* NtCreateLowBoxToken)(
    679     OUT PHANDLE token,
    680     IN HANDLE original_handle,
    681     IN ACCESS_MASK access,
    682     IN POBJECT_ATTRIBUTES object_attribute,
    683     IN PSID appcontainer_sid,
    684     IN DWORD capabilityCount,
    685     IN PSID_AND_ATTRIBUTES capabilities,
    686     IN DWORD handle_count,
    687     IN PHANDLE handles);
    688 
    689 typedef NTSTATUS(WINAPI *NtSetInformationProcess)(
    690     IN HANDLE process_handle,
    691     IN ULONG info_class,
    692     IN PVOID process_information,
    693     IN ULONG information_length);
    694 
    695 struct PROCESS_ACCESS_TOKEN {
    696   HANDLE token;
    697   HANDLE thread;
    698 };
    699 
    700 const unsigned int NtProcessInformationAccessToken = 9;
    701 
    702 #endif  // SANDBOX_WIN_SRC_NT_INTERNALS_H__
    703 
    704