FlyFar

src/ntdll.h

May 17th, 2024
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 89.92 KB | Cybersecurity | 0 0
  1. #ifndef _NTDDK_
  2. #define _NTDDK_
  3.  
  4. #define NT_INCLUDED
  5. #define _NTDEF_
  6. #define _CTYPE_DISABLE_MACROS
  7.  
  8. #pragma warning(disable : 4200)
  9.  
  10. #undef STATUS_WAIT_0
  11. #undef STATUS_ABANDONED_WAIT_0
  12. #undef STATUS_USER_APC
  13. #undef STATUS_TIMEOUT
  14. #undef STATUS_PENDING
  15. #undef DBG_CONTINUE
  16. #undef STATUS_SEGMENT_NOTIFICATION
  17. #undef DBG_TERMINATE_THREAD
  18. #undef DBG_TERMINATE_PROCESS
  19. #undef DBG_CONTROL_C
  20. #undef DBG_CONTROL_BREAK
  21. #undef STATUS_GUARD_PAGE_VIOLATION
  22. #undef STATUS_DATATYPE_MISALIGNMENT
  23. #undef STATUS_BREAKPOINT
  24. #undef STATUS_SINGLE_STEP
  25. #undef DBG_EXCEPTION_NOT_HANDLED
  26. #undef STATUS_ACCESS_VIOLATION
  27. #undef STATUS_IN_PAGE_ERROR
  28. #undef STATUS_INVALID_HANDLE
  29. #undef STATUS_NO_MEMORY
  30. #undef STATUS_ILLEGAL_INSTRUCTION
  31. #undef STATUS_NONCONTINUABLE_EXCEPTION
  32. #undef STATUS_INVALID_DISPOSITION
  33. #undef STATUS_ARRAY_BOUNDS_EXCEEDED
  34. #undef STATUS_FLOAT_DENORMAL_OPERAND
  35. #undef STATUS_FLOAT_DIVIDE_BY_ZERO
  36. #undef STATUS_FLOAT_INEXACT_RESULT
  37. #undef STATUS_FLOAT_INVALID_OPERATION
  38. #undef STATUS_FLOAT_OVERFLOW
  39. #undef STATUS_FLOAT_STACK_CHECK
  40. #undef STATUS_FLOAT_UNDERFLOW
  41. #undef STATUS_INTEGER_DIVIDE_BY_ZERO
  42. #undef STATUS_INTEGER_OVERFLOW
  43. #undef STATUS_PRIVILEGED_INSTRUCTION
  44. #undef STATUS_STACK_OVERFLOW
  45. #undef STATUS_CONTROL_C_EXIT
  46. #undef STATUS_FLOAT_MULTIPLE_FAULTS
  47. #undef STATUS_FLOAT_MULTIPLE_TRAPS
  48. #undef STATUS_ILLEGAL_VLM_REFERENCE
  49. #undef STATUS_REG_NAT_CONSUMPTION
  50. #undef DBG_EXCEPTION_HANDLED
  51.  
  52. #include <ntstatus.h>
  53.  
  54. #if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
  55. #define NTAPI __stdcall
  56. #else
  57. #define _cdecl
  58. #define NTAPI
  59. #endif
  60.  
  61. #ifdef __cplusplus
  62. extern "C" {
  63. #endif
  64.  
  65. #define MAXIMUM_FILENAME_LENGTH         256
  66. #define PORT_MAXIMUM_MESSAGE_LENGTH     256
  67. #define INITIAL_PRIVILEGE_COUNT         3
  68.  
  69. #define FSCTL_GET_VOLUME_INFORMATION    0x90064
  70.  
  71. // constants for RtlDetermineDosPathNameType_U
  72. #define DOS_PATHTYPE_UNC                0x00000001  // \\COMPUTER1
  73. #define DOS_PATHTYPE_ROOTDRIVE          0x00000002  // C:\
  74. #define DOS_PATHTYPE_STREAM             0x00000003  // X:X or C:
  75. #define DOS_PATHTYPE_NT                 0x00000004  // \\??\\C:
  76. #define DOS_PATHTYPE_NAME               0x00000005  // C
  77. #define DOS_PATHTYPE_DEVICE             0x00000006  // \\.\C:
  78. #define DOS_PATHTYPE_LOCALUNCROOT       0x00000007  // \\.
  79.  
  80. // Define the various device characteristics flags
  81. #define FILE_REMOVABLE_MEDIA            0x00000001
  82. #define FILE_READ_ONLY_DEVICE           0x00000002
  83. #define FILE_FLOPPY_DISKETTE            0x00000004
  84. #define FILE_WRITE_ONCE_MEDIA           0x00000008
  85. #define FILE_REMOTE_DEVICE              0x00000010
  86. #define FILE_DEVICE_IS_MOUNTED          0x00000020
  87. #define FILE_VIRTUAL_VOLUME             0x00000040
  88. #define FILE_AUTOGENERATED_DEVICE_NAME  0x00000080
  89. #define FILE_DEVICE_SECURE_OPEN         0x00000100
  90.  
  91. #define FILE_SUPERSEDE                          0x00000000
  92. #define FILE_OPEN                               0x00000001
  93. #define FILE_CREATE                             0x00000002
  94. #define FILE_OPEN_IF                            0x00000003
  95. #define FILE_OVERWRITE                          0x00000004
  96. #define FILE_OVERWRITE_IF                       0x00000005
  97. #define FILE_MAXIMUM_DISPOSITION                0x00000005
  98.  
  99. #define FILE_DIRECTORY_FILE                     0x00000001
  100. #define FILE_WRITE_THROUGH                      0x00000002
  101. #define FILE_SEQUENTIAL_ONLY                    0x00000004
  102. #define FILE_NO_INTERMEDIATE_BUFFERING          0x00000008
  103.  
  104. #define FILE_SYNCHRONOUS_IO_ALERT               0x00000010
  105. #define FILE_SYNCHRONOUS_IO_NONALERT            0x00000020
  106. #define FILE_NON_DIRECTORY_FILE                 0x00000040
  107. #define FILE_CREATE_TREE_CONNECTION             0x00000080
  108.  
  109. #define FILE_COMPLETE_IF_OPLOCKED               0x00000100
  110. #define FILE_NO_EA_KNOWLEDGE                    0x00000200
  111. #define FILE_OPEN_FOR_RECOVERY                  0x00000400
  112. #define FILE_RANDOM_ACCESS                      0x00000800
  113.  
  114. #define FILE_DELETE_ON_CLOSE                    0x00001000
  115. #define FILE_OPEN_BY_FILE_ID                    0x00002000
  116. #define FILE_OPEN_FOR_BACKUP_INTENT             0x00004000
  117. #define FILE_NO_COMPRESSION                     0x00008000
  118.  
  119. #define FILE_RESERVE_OPFILTER                   0x00100000
  120. #define FILE_OPEN_REPARSE_POINT                 0x00200000
  121. #define FILE_OPEN_NO_RECALL                     0x00400000
  122. #define FILE_OPEN_FOR_FREE_SPACE_QUERY          0x00800000
  123.  
  124. #define FILE_COPY_STRUCTURED_STORAGE            0x00000041
  125. #define FILE_STRUCTURED_STORAGE                 0x00000441
  126.  
  127. #define FILE_VALID_OPTION_FLAGS                 0x00ffffff
  128. #define FILE_VALID_PIPE_OPTION_FLAGS            0x00000032
  129. #define FILE_VALID_MAILSLOT_OPTION_FLAGS        0x00000032
  130. #define FILE_VALID_SET_FLAGS                    0x00000036
  131.  
  132. // THREAD STATES
  133. #define THREAD_STATE_INITIALIZED        0
  134. #define THREAD_STATE_READY              1
  135. #define THREAD_STATE_RUNNING            2
  136. #define THREAD_STATE_STANDBY            3
  137. #define THREAD_STATE_TERMINATED         4
  138. #define THREAD_STATE_WAIT               5
  139. #define THREAD_STATE_TRANSITION         6
  140. #define THREAD_STATE_UNKNOWN            7
  141.  
  142. // OBJECT TYPE CODES
  143. #define OB_TYPE_TYPE                    1
  144. #define OB_TYPE_DIRECTORY               2
  145. #define OB_TYPE_SYMBOLIC_LINK           3
  146. #define OB_TYPE_TOKEN                   4
  147. #define OB_TYPE_PROCESS                 5
  148. #define OB_TYPE_THREAD                  6
  149. #define OB_TYPE_EVENT                   7
  150. #define OB_TYPE_EVENT_PAIR              8
  151. #define OB_TYPE_MUTANT                  9
  152. #define OB_TYPE_SEMAPHORE               10
  153. #define OB_TYPE_TIMER                   11
  154. #define OB_TYPE_PROFILE                 12
  155. #define OB_TYPE_WINDOW_STATION          13
  156. #define OB_TYPE_DESKTOP                 14
  157. #define OB_TYPE_SECTION                 15
  158. #define OB_TYPE_KEY                     16
  159. #define OB_TYPE_PORT                    17
  160. #define OB_TYPE_ADAPTER                 18
  161. #define OB_TYPE_CONTROLLER              19
  162. #define OB_TYPE_DEVICE                  20
  163. #define OB_TYPE_DRIVER                  21
  164. #define OB_TYPE_IO_COMPLETION           22
  165. #define OB_TYPE_FILE                    23
  166.  
  167. #define OBJ_INHERIT                     0x00000002
  168. #define OBJ_PERMANENT                   0x00000010
  169. #define OBJ_EXCLUSIVE                   0x00000020
  170. #define OBJ_CASE_INSENSITIVE            0x00000040
  171. #define OBJ_OPENIF                      0x00000080
  172. #define OBJ_OPENLINK                    0x00000100
  173. #define OBJ_VALID_ATTRIBUTES            0x000001F2
  174.  
  175.  
  176. // Object Manager Directory Specific Access Rights.
  177. #define DIRECTORY_QUERY                 0x0001
  178. #define DIRECTORY_TRAVERSE              0x0002
  179. #define DIRECTORY_CREATE_OBJECT         0x0004
  180. #define DIRECTORY_CREATE_SUBDIRECTORY   0x0008
  181. #define DIRECTORY_ALL_ACCESS            (STANDARD_RIGHTS_REQUIRED | 0xF)
  182.  
  183. // Object Manager Symbolic Link Specific Access Rights.
  184. #define SYMBOLIC_LINK_QUERY             0x0001
  185. #define SYMBOLIC_LINK_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | 0x1)
  186.  
  187. #define NT_SUCCESS(Status)              ((LONG)(Status) >= 0)
  188. #define NT_ERROR(Status)                ((ULONG)(Status) >> 30 == 3)
  189.  
  190. #define DEVICE_TYPE                     DWORD
  191.  
  192. // values for RtlAdjustPrivilege
  193. #define SE_MIN_WELL_KNOWN_PRIVILEGE       (2L)
  194. #define SE_CREATE_TOKEN_PRIVILEGE         (2L)
  195. #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE   (3L)
  196. #define SE_LOCK_MEMORY_PRIVILEGE          (4L)
  197. #define SE_INCREASE_QUOTA_PRIVILEGE       (5L)
  198. #define SE_UNSOLICITED_INPUT_PRIVILEGE    (6L) // obsolete and unused
  199. #define SE_MACHINE_ACCOUNT_PRIVILEGE      (6L)
  200. #define SE_TCB_PRIVILEGE                  (7L)
  201. #define SE_SECURITY_PRIVILEGE             (8L)
  202. #define SE_TAKE_OWNERSHIP_PRIVILEGE       (9L)
  203. #define SE_LOAD_DRIVER_PRIVILEGE          (10L)
  204. #define SE_SYSTEM_PROFILE_PRIVILEGE       (11L)
  205. #define SE_SYSTEMTIME_PRIVILEGE           (12L)
  206. #define SE_PROF_SINGLE_PROCESS_PRIVILEGE  (13L)
  207. #define SE_INC_BASE_PRIORITY_PRIVILEGE    (14L)
  208. #define SE_CREATE_PAGEFILE_PRIVILEGE      (15L)
  209. #define SE_CREATE_PERMANENT_PRIVILEGE     (16L)
  210. #define SE_BACKUP_PRIVILEGE               (17L)
  211. #define SE_RESTORE_PRIVILEGE              (18L)
  212. #define SE_SHUTDOWN_PRIVILEGE             (19L)
  213. #define SE_DEBUG_PRIVILEGE                (20L)
  214. #define SE_AUDIT_PRIVILEGE                (21L)
  215. #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE   (22L)
  216. #define SE_CHANGE_NOTIFY_PRIVILEGE        (23L)
  217. #define SE_REMOTE_SHUTDOWN_PRIVILEGE      (24L)
  218. #define SE_MAX_WELL_KNOWN_PRIVILEGE       (SE_REMOTE_SHUTDOWN_PRIVILEGE)
  219.  
  220. #define InitializeObjectAttributes( p, n, a, r, s ) {   \
  221.     (p)->uLength = sizeof( OBJECT_ATTRIBUTES );          \
  222.     (p)->hRootDirectory = r;                             \
  223.     (p)->uAttributes = a;                                \
  224.     (p)->pObjectName = n;                                \
  225.     (p)->pSecurityDescriptor = s;                        \
  226.     (p)->pSecurityQualityOfService = NULL;               \
  227. }
  228.  
  229.  
  230. typedef LONG        NTSTATUS;
  231. /*lint -e624 */  // Don't complain about different typedefs.
  232.                  // winnt
  233. typedef NTSTATUS    *PNTSTATUS;
  234. /*lint +e624 */  // Resume checking for different typedefs.
  235.  
  236. typedef NTSTATUS    (NTAPI *NTSYSCALL)();
  237. typedef NTSYSCALL   *PNTSYSCALL;
  238.  
  239. typedef ULONG       KAFFINITY;
  240. typedef KAFFINITY   *PKAFFINITY;
  241. typedef LONG        KPRIORITY;
  242.  
  243. typedef BYTE        KPROCESSOR_MODE;
  244.  
  245. typedef VOID        *POBJECT;
  246.  
  247. typedef VOID        (*PKNORMAL_ROUTINE) (
  248.                         IN PVOID NormalContext,
  249.                         IN PVOID SystemArgument1,
  250.                         IN PVOID SystemArgument2
  251.                     );
  252.  
  253. typedef struct _STRING {
  254.     USHORT Length;
  255.     USHORT MaximumLength;
  256. #ifdef MIDL_PASS
  257.     [size_is(MaximumLength), length_is(Length) ]
  258. #endif // MIDL_PASS
  259.     PCHAR Buffer;
  260. } STRING, *PSTRING;
  261.  
  262.  
  263. typedef STRING ANSI_STRING;
  264. typedef PSTRING PANSI_STRING;
  265.  
  266. typedef STRING OEM_STRING;
  267. typedef PSTRING POEM_STRING;
  268.  
  269. /*
  270. typedef struct _UNICODE_STRING
  271. {
  272.     USHORT  Length;
  273.     USHORT  MaximumLength;
  274.     PWSTR  Buffer;
  275. } UNICODE_STRING, *PUNICODE_STRING;
  276. */
  277.  
  278. typedef struct _HARDWARE_PTE
  279. {
  280.     ULONG Valid             : 1;
  281.     ULONG Write             : 1;
  282.     ULONG Owner             : 1;
  283.     ULONG WriteThrough      : 1;
  284.     ULONG CacheDisable      : 1;
  285.     ULONG Accessed          : 1;
  286.     ULONG Dirty             : 1;
  287.     ULONG LargePage         : 1;
  288.     ULONG Global            : 1;
  289.     ULONG CopyOnWrite       : 1;
  290.     ULONG Prototype         : 1;
  291.     ULONG reserved          : 1;
  292.     ULONG PageFrameNumber   : 20;
  293. } HARDWARE_PTE, *PHARDWARE_PTE;
  294.  
  295. typedef struct _OBJECT_ATTRIBUTES
  296. {
  297.     ULONG           uLength;
  298.     HANDLE          hRootDirectory;
  299.     PUNICODE_STRING pObjectName;
  300.     ULONG           uAttributes;
  301.     PVOID           pSecurityDescriptor;
  302.     PVOID           pSecurityQualityOfService;
  303. } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
  304.  
  305. typedef struct _CLIENT_ID
  306. {
  307.     HANDLE  UniqueProcess;
  308.     HANDLE  UniqueThread;
  309. } CLIENT_ID, *PCLIENT_ID;
  310.  
  311. typedef struct _PEB_FREE_BLOCK
  312. {
  313.    struct _PEB_FREE_BLOCK   *Next;
  314.    ULONG                    Size;
  315. } PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;
  316.  
  317. typedef struct _CURDIR
  318. {
  319.    UNICODE_STRING   DosPath;
  320.    HANDLE           Handle;
  321. } CURDIR, *PCURDIR;
  322.  
  323. typedef struct _RTL_DRIVE_LETTER_CURDIR
  324. {
  325.     WORD    Flags;
  326.     WORD    Length;
  327.     DWORD   TimeStamp;
  328.     STRING  DosPath;
  329. } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
  330.  
  331. #define PROCESS_PARAMETERS_NORMALIZED   1   // pointers in are absolute (not self-relative)
  332.  
  333. typedef struct _PROCESS_PARAMETERS
  334. {
  335.     ULONG                   MaximumLength;
  336.     ULONG                   Length;
  337.     ULONG                   Flags;              // PROCESS_PARAMETERS_NORMALIZED
  338.     ULONG                   DebugFlags;
  339.     HANDLE                  ConsoleHandle;
  340.     ULONG                   ConsoleFlags;
  341.     HANDLE                  StandardInput;
  342.     HANDLE                  StandardOutput;
  343.     HANDLE                  StandardError;
  344.     CURDIR                  CurrentDirectory;
  345.     UNICODE_STRING          DllPath;
  346.     UNICODE_STRING          ImagePathName;
  347.     UNICODE_STRING          CommandLine;
  348.     PWSTR                   Environment;
  349.     ULONG                   StartingX;
  350.     ULONG                   StartingY;
  351.     ULONG                   CountX;
  352.     ULONG                   CountY;
  353.     ULONG                   CountCharsX;
  354.     ULONG                   CountCharsY;
  355.     ULONG                   FillAttribute;
  356.     ULONG                   WindowFlags;
  357.     ULONG                   ShowWindowFlags;
  358.     UNICODE_STRING          WindowTitle;
  359.     UNICODE_STRING          Desktop;
  360.     UNICODE_STRING          ShellInfo;
  361.     UNICODE_STRING          RuntimeInfo;
  362.     RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];
  363. } PROCESS_PARAMETERS, *PPROCESS_PARAMETERS;
  364.  
  365. typedef struct _RTL_BITMAP
  366. {
  367.     DWORD   SizeOfBitMap;
  368.     PDWORD  Buffer;
  369. } RTL_BITMAP, *PRTL_BITMAP, **PPRTL_BITMAP;
  370.  
  371. #define LDR_STATIC_LINK             0x0000002
  372. #define LDR_IMAGE_DLL               0x0000004
  373. #define LDR_LOAD_IN_PROGRESS        0x0001000
  374. #define LDR_UNLOAD_IN_PROGRESS      0x0002000
  375. #define LDR_ENTRY_PROCESSED         0x0004000
  376. #define LDR_ENTRY_INSERTED          0x0008000
  377. #define LDR_CURRENT_LOAD            0x0010000
  378. #define LDR_FAILED_BUILTIN_LOAD     0x0020000
  379. #define LDR_DONT_CALL_FOR_THREADS   0x0040000
  380. #define LDR_PROCESS_ATTACH_CALLED   0x0080000
  381. #define LDR_DEBUG_SYMBOLS_LOADED    0x0100000
  382. #define LDR_IMAGE_NOT_AT_BASE       0x0200000
  383. #define LDR_WX86_IGNORE_MACHINETYPE 0x0400000
  384.  
  385. typedef struct _LDR_DATA_TABLE_ENTRY
  386. {
  387.     LIST_ENTRY      InLoadOrderModuleList;
  388.     LIST_ENTRY      InMemoryOrderModuleList;
  389.     LIST_ENTRY      InInitializationOrderModuleList;
  390.     PVOID           DllBase;
  391.     PVOID           EntryPoint;
  392.     ULONG           SizeOfImage;    // in bytes
  393.     UNICODE_STRING  FullDllName;
  394.     UNICODE_STRING  BaseDllName;
  395.     ULONG           Flags;          // LDR_*
  396.     USHORT          LoadCount;
  397.     USHORT          TlsIndex;
  398.     LIST_ENTRY      HashLinks;
  399.     PVOID           SectionPointer;
  400.     ULONG           CheckSum;
  401.     ULONG           TimeDateStamp;
  402. //    PVOID         LoadedImports;                  // seems they are exist only on XP !!!
  403. //    PVOID         EntryPointActivationContext;    // -same-
  404. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
  405.  
  406. typedef struct _PEB_LDR_DATA {
  407.     ULONG Length;
  408.     BOOLEAN Initialized;
  409.     PVOID SsHandle;
  410.     LIST_ENTRY ModuleListLoadOrder;
  411.     LIST_ENTRY ModuleListMemoryOrder;
  412.     LIST_ENTRY ModuleListInitOrder;
  413. } PEB_LDR_DATA, *PPEB_LDR_DATA;
  414.  
  415. typedef VOID NTSYSAPI (*PPEBLOCKROUTINE)(PVOID);
  416.  
  417. typedef struct _SYSTEM_STRINGS
  418. {
  419.     UNICODE_STRING  SystemRoot;       // C:\WINNT
  420.     UNICODE_STRING  System32Root;     // C:\WINNT\System32
  421.     UNICODE_STRING  BaseNamedObjects; // \BaseNamedObjects
  422. }SYSTEM_STRINGS,*PSYSTEM_STRINGS;
  423.  
  424. typedef struct _TEXT_INFO
  425. {
  426.     PVOID           Reserved;
  427.     PSYSTEM_STRINGS SystemStrings;
  428. }TEXT_INFO, *PTEXT_INFO;
  429.  
  430. typedef struct _PEB
  431. {
  432.     UCHAR               InheritedAddressSpace;              // 0
  433.     UCHAR               ReadImageFileExecOptions;           // 1
  434.     UCHAR               BeingDebugged;                      // 2
  435.     BYTE                b003;                               // 3
  436.     PVOID               Mutant;                             // 4
  437.     PVOID               ImageBaseAddress;                   // 8
  438.     PPEB_LDR_DATA       Ldr;                                // C
  439.     PPROCESS_PARAMETERS ProcessParameters;                  // 10
  440.     PVOID               SubSystemData;                      // 14  
  441.     PVOID               ProcessHeap;                        // 18
  442.     KSPIN_LOCK          FastPebLock;                        // 1C
  443.     PPEBLOCKROUTINE     FastPebLockRoutine;                 // 20
  444.     PPEBLOCKROUTINE     FastPebUnlockRoutine;               // 24
  445.     ULONG               EnvironmentUpdateCount;             // 28
  446.     PVOID               *KernelCallbackTable;               // 2C
  447.     PVOID               EventLogSection;                    // 30
  448.     PVOID               EventLog;                           // 34
  449.     PPEB_FREE_BLOCK     FreeList;                           // 38
  450.     ULONG               TlsExpansionCounter;                // 3C
  451.     PRTL_BITMAP         TlsBitmap;                          // 40
  452.     ULONG               TlsBitmapData[0x2];                 // 44
  453.     PVOID               ReadOnlySharedMemoryBase;           // 4C
  454.     PVOID               ReadOnlySharedMemoryHeap;           // 50
  455.     PTEXT_INFO          ReadOnlyStaticServerData;           // 54
  456.     PVOID               InitAnsiCodePageData;               // 58
  457.     PVOID               InitOemCodePageData;                // 5C
  458.     PVOID               InitUnicodeCaseTableData;           // 60
  459.     ULONG               KeNumberProcessors;                 // 64
  460.     ULONG               NtGlobalFlag;                       // 68
  461.     DWORD               d6C;                                // 6C
  462.     LARGE_INTEGER       MmCriticalSectionTimeout;           // 70
  463.     ULONG               MmHeapSegmentReserve;               // 78
  464.     ULONG               MmHeapSegmentCommit;                // 7C
  465.     ULONG               MmHeapDeCommitTotalFreeThreshold;   // 80
  466.     ULONG               MmHeapDeCommitFreeBlockThreshold;   // 84
  467.     ULONG               NumberOfHeaps;                      // 88
  468.     ULONG               AvailableHeaps;                     // 8C
  469.     PHANDLE             ProcessHeapsListBuffer;             // 90
  470.     PVOID               GdiSharedHandleTable;               // 94
  471.     PVOID               ProcessStarterHelper;               // 98
  472.     PVOID               GdiDCAttributeList;                 // 9C
  473.     KSPIN_LOCK          LoaderLock;                         // A0
  474.     ULONG               NtMajorVersion;                     // A4
  475.     ULONG               NtMinorVersion;                     // A8
  476.     USHORT              NtBuildNumber;                      // AC
  477.     USHORT              NtCSDVersion;                       // AE
  478.     ULONG               PlatformId;                         // B0
  479.     ULONG               Subsystem;                          // B4
  480.     ULONG               MajorSubsystemVersion;              // B8
  481.     ULONG               MinorSubsystemVersion;              // BC
  482.     KAFFINITY           AffinityMask;                       // C0
  483.     ULONG               GdiHandleBuffer[0x22];              // C4
  484.     ULONG               PostProcessInitRoutine;             // 14C
  485.     ULONG               TlsExpansionBitmap;                 // 150
  486.     UCHAR               TlsExpansionBitmapBits[0x80];       // 154
  487.     ULONG               SessionId;                          // 1D4
  488.     ULARGE_INTEGER      AppCompatFlags;                     // 1D8
  489.     PWORD               CSDVersion;                         // 1E0
  490. /*  PVOID               AppCompatInfo;                      // 1E4
  491.     UNICODE_STRING      usCSDVersion;
  492.     PVOID               ActivationContextData;
  493.     PVOID               ProcessAssemblyStorageMap;
  494.     PVOID               SystemDefaultActivationContextData;
  495.     PVOID               SystemAssemblyStorageMap;
  496.     ULONG               MinimumStackCommit; */
  497. } PEB, *PPEB;
  498.  
  499. typedef struct _TEB
  500. {
  501.     NT_TIB          Tib;                        
  502.     PVOID           EnvironmentPointer;          
  503.     CLIENT_ID       Cid;                      
  504.     PVOID           ActiveRpcInfo;                
  505.     PVOID           ThreadLocalStoragePointer;    
  506.     PPEB            Peb;                          
  507.     ULONG           LastErrorValue;              
  508.     ULONG           CountOfOwnedCriticalSections;
  509.     PVOID           CsrClientThread;              
  510.     PVOID           Win32ThreadInfo;              
  511.     ULONG           Win32ClientInfo[0x1F];        
  512.     PVOID           WOW32Reserved;                
  513.     ULONG           CurrentLocale;                
  514.     ULONG           FpSoftwareStatusRegister;    
  515.     PVOID           SystemReserved1[0x36];        
  516.     PVOID           Spare1;                      
  517.     LONG            ExceptionCode;                
  518.     ULONG           SpareBytes1[0x28];            
  519.     PVOID           SystemReserved2[0xA];        
  520.     ULONG           gdiRgn;                      
  521.     ULONG           gdiPen;                      
  522.     ULONG           gdiBrush;                    
  523.     CLIENT_ID       RealClientId;            
  524.     PVOID           GdiCachedProcessHandle;      
  525.     ULONG           GdiClientPID;                
  526.     ULONG           GdiClientTID;                
  527.     PVOID           GdiThreadLocaleInfo;          
  528.     PVOID           UserReserved[5];              
  529.     PVOID           glDispatchTable[0x118];      
  530.     ULONG           glReserved1[0x1A];            
  531.     PVOID           glReserved2;                  
  532.     PVOID           glSectionInfo;                
  533.     PVOID           glSection;                    
  534.     PVOID           glTable;                      
  535.     PVOID           glCurrentRC;                  
  536.     PVOID           glContext;                    
  537.     NTSTATUS        LastStatusValue;          
  538.     UNICODE_STRING  StaticUnicodeString;
  539.     WCHAR           StaticUnicodeBuffer[0x105];  
  540.     PVOID           DeallocationStack;            
  541.     PVOID           TlsSlots[0x40];              
  542.     LIST_ENTRY      TlsLinks;                
  543.     PVOID           Vdm;                          
  544.     PVOID           ReservedForNtRpc;            
  545.     PVOID           DbgSsReserved[0x2];          
  546.     ULONG           HardErrorDisabled;            
  547.     PVOID           Instrumentation[0x10];        
  548.     PVOID           WinSockData;                  
  549.     ULONG           GdiBatchCount;                
  550.     ULONG           Spare2;                      
  551.     ULONG           Spare3;                      
  552.     ULONG           Spare4;                      
  553.     PVOID           ReservedForOle;              
  554.     ULONG           WaitingOnLoaderLock;          
  555.     PVOID           StackCommit;                  
  556.     PVOID           StackCommitMax;              
  557.     PVOID           StackReserve;                
  558. } TEB, *PTEB;
  559.  
  560. typedef enum _POOL_TYPE
  561. {
  562.     NonPagedPool,
  563.     PagedPool,
  564.     NonPagedPoolMustSucceed,
  565.     DontUseThisType,
  566.     NonPagedPoolCacheAligned,
  567.     PagedPoolCacheAligned,
  568.     NonPagedPoolCacheAlignedMustS,
  569.     MaxPoolType
  570. } POOL_TYPE, *PPOOL_TYPE;
  571.  
  572. typedef enum _KWAIT_REASON
  573. {
  574.     Executive,
  575.     FreePage,
  576.     PageIn,
  577.     PoolAllocation,
  578.     DelayExecution,
  579.     Suspended,
  580.     UserRequest,
  581.     WrExecutive,
  582.     WrFreePage,
  583.     WrPageIn,
  584.     WrPoolAllocation,
  585.     WrDelayExecution,
  586.     WrSuspended,
  587.     WrUserRequest,
  588.     WrEventPair,
  589.     WrQueue,
  590.     WrLpcReceive,
  591.     WrLpcReply,
  592.     WrVirtualMemory,
  593.     WrPageOut,
  594.     WrRendezvous,
  595.     Spare2,
  596.     Spare3,
  597.     Spare4,
  598.     Spare5,
  599.     Spare6,
  600.     WrKernel,
  601.     MaximumWaitReason
  602. } KWAIT_REASON, *PKWAIT_REASON;
  603.  
  604. typedef struct _DISPATCHER_HEADER
  605. {
  606.     BYTE        uType;          //DO_TYPE_*
  607.     BYTE        uAbsolute;
  608.     BYTE        uSize;          // number of DWORDs
  609.     BYTE        uInserted;
  610.     LONG        lSignalState;
  611.     LIST_ENTRY  WaitListHead;
  612. } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
  613.  
  614. typedef struct _KPROCESS
  615. {
  616.     DISPATCHER_HEADER   Header;           // DO_TYPE_PROCESS (0x1A)
  617.     LIST_ENTRY          le10;
  618.     DWORD               d18;
  619.     DWORD               d1C;
  620.     DWORD               d20;
  621.     DWORD               d24;
  622.     DWORD               d28;
  623.     DWORD               d2C;
  624.     DWORD               d30;
  625.     DWORD               d34;
  626.     DWORD               dKernelTime;      // ticks
  627.     DWORD               dUserTime;        // ticks
  628.     LIST_ENTRY          le40;
  629.     LIST_ENTRY          OutSwapList;
  630.     LIST_ENTRY          ThreadListHead;   // KTHREAD.ThreadList
  631.     DWORD               d58;
  632.     KAFFINITY           AffinityMask;
  633.     WORD                w60;
  634.     BYTE                bBasePriority;
  635.     BYTE                b63;
  636.     WORD                w64;
  637.     BYTE                b66;
  638.     BOOLEAN             fPriorityBoost;
  639. } KPROCESS, *PKPROCESS;
  640.  
  641. typedef struct _PORT_MESSAGE
  642. {
  643.     USHORT      DataSize;
  644.     USHORT      MessageSize;
  645.     USHORT      MessageType;
  646.     USHORT      VirtualRangesOffset;
  647.     CLIENT_ID   ClientId;
  648.     ULONG       MessageId;
  649.     ULONG       SectionSize;
  650. //  UCHAR       Data[];
  651. } PORT_MESSAGE, *PPORT_MESSAGE;
  652.  
  653. typedef struct _SERVICE_DESCRIPTOR_TABLE
  654. {
  655.     PNTSYSCALL  ServiceTable;    // array of entrypoints
  656.     PULONG      puCounterTable;    // array of counters
  657.     ULONG       uTableSize;       // number of table entries
  658.     PBYTE       pbArgumentTable;   // array of byte counts
  659. } SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;
  660.  
  661. typedef struct _KSEMAPHORE
  662. {
  663.     DISPATCHER_HEADER   Header;
  664.     LONG                lLimit;
  665. } KSEMAPHORE, *PKSEMAPHORE;
  666.  
  667. typedef struct _KTHREAD
  668. {
  669.     DISPATCHER_HEADER           Header;       // DO_TYPE_THREAD (0x6C)
  670.     LIST_ENTRY                  le010;
  671.     DWORD                       d018;
  672.     DWORD                       d01C;
  673.     PTEB                        pTeb;
  674.     DWORD                       d024;
  675.     DWORD                       d028;
  676.     BYTE                        b02C;
  677.     BYTE                        bThreadState; // THREAD_STATE_*
  678.     WORD                        w02E;
  679.     WORD                        w030;
  680.     BYTE                        b032;
  681.     BYTE                        bPriority;
  682.     LIST_ENTRY                  le034;
  683.     LIST_ENTRY                  le03C;
  684.     PKPROCESS                   pProcess;
  685.     DWORD                       d048;
  686.     DWORD                       dContextSwitches;
  687.     DWORD                       d050;
  688.     WORD                        w054;
  689.     BYTE                        b056;
  690.     BYTE                        bWaitReason;
  691.     DWORD                       d058;
  692.     PLIST_ENTRY                 ple05C;
  693.     PLIST_ENTRY                 ple060;
  694.     DWORD                       d064;
  695.     BYTE                        bBasePriority;
  696.     BYTE                        b069;
  697.     WORD                        w06A;
  698.     DWORD                       d06C;
  699.     DWORD                       d070;
  700.     DWORD                       d074;
  701.     DWORD                       d078;
  702.     DWORD                       d07C;
  703.     DWORD                       d080;
  704.     DWORD                       d084;
  705.     DWORD                       d088;
  706.     DWORD                       d08C;
  707.     DWORD                       d090;
  708.     DWORD                       d094;
  709.     DWORD                       d098;
  710.     DWORD                       d09C;
  711.     DWORD                       d0A0;
  712.     DWORD                       d0A4;
  713.     DWORD                       d0A8;
  714.     DWORD                       d0AC;
  715.     DWORD                       d0B0;
  716.     DWORD                       d0B4;
  717.     DWORD                       d0B8;
  718.     DWORD                       d0BC;
  719.     DWORD                       d0C0;
  720.     DWORD                       d0C4;
  721.     DWORD                       d0C8;
  722.     DWORD                       d0CC;
  723.     DWORD                       d0D0;
  724.     DWORD                       d0D4;
  725.     DWORD                       d0D8;
  726.     PSERVICE_DESCRIPTOR_TABLE   pServiceDescriptorTable;
  727.     DWORD                       d0E0;
  728.     DWORD                       d0E4;
  729.     DWORD                       d0E8;
  730.     DWORD                       d0EC;
  731.     LIST_ENTRY                  le0F0;
  732.     DWORD                       d0F8;
  733.     DWORD                       d0FC;
  734.     DWORD                       d100;
  735.     DWORD                       d104;
  736.     DWORD                       d108;
  737.     DWORD                       d10C;
  738.     DWORD                       d110;
  739.     DWORD                       d114;
  740.     DWORD                       d118;
  741.     BYTE                        b11C;
  742.     BYTE                        b11D;
  743.     WORD                        w11E;
  744.     DWORD                       d120;
  745.     DWORD                       d124;
  746.     DWORD                       d128;
  747.     DWORD                       d12C;
  748.     DWORD                       d130;
  749.     WORD                        w134;
  750.     BYTE                        b136;
  751.     KPROCESSOR_MODE             ProcessorMode;
  752.     DWORD                       dKernelTime;  // ticks
  753.     DWORD                       dUserTime;    // ticks
  754.     DWORD                       d140;
  755.     DWORD                       d144;
  756.     DWORD                       d148;
  757.     DWORD                       d14C;
  758.     DWORD                       d150;
  759.     DWORD                       d154;
  760.     DWORD                       d158;
  761.     DWORD                       d15C;
  762.     DWORD                       d160;
  763.     DWORD                       d164;
  764.     DWORD                       d168;
  765.     DWORD                       d16C;
  766.     DWORD                       d170;
  767.     PROC                        SuspendNop;
  768.     DWORD                       d178;
  769.     DWORD                       d17C;
  770.     DWORD                       d180;
  771.     DWORD                       d184;
  772.     DWORD                       d188;
  773.     DWORD                       d18C;
  774.     KSEMAPHORE                  SuspendSemaphore;
  775.     LIST_ENTRY                  ThreadList; // KPROCESS.ThreadListHead
  776.     DWORD                       d1AC;
  777. } KTHREAD, *PKTHREAD;
  778.  
  779. typedef struct _ETHREAD
  780. {
  781.     KTHREAD         Tcb;
  782.     LARGE_INTEGER   liCreateTime;
  783.     LARGE_INTEGER   liExitTime;
  784.     NTSTATUS        ExitStatus;
  785.     LIST_ENTRY      PostBlockList;
  786.     LIST_ENTRY      TerminationPortList;
  787.     ULONG           uActiveTimerListLock;
  788.     LIST_ENTRY      ActiveTimerListHead;
  789.     CLIENT_ID       Cid;
  790.     KSEMAPHORE      LpcReplySemaphore;
  791.     ULONG           uLpcReplyMessage;
  792.     LARGE_INTEGER   liLpcReplyMessageId;
  793.     ULONG           uImpersonationInfo;
  794.     LIST_ENTRY      IrpList;
  795.     LIST_ENTRY      TopLevelIrp;
  796.     ULONG           uReadClusterSize;
  797.     BOOLEAN         fForwardClusterOnly;
  798.     BOOLEAN         fDisablePageFaultClustering;
  799.     BOOLEAN         fDeadThread;
  800.     BOOLEAN         fHasTerminated;
  801.     ULONG           uEventPair;
  802.     ULONG           uGrantedAccess;
  803.     ULONG           uThreadsProcess;
  804.     PVOID           pStartAddress;
  805.     PVOID           Win32StartAddress;
  806.     BOOLEAN         fLpcExitThreadCalled;
  807.     BOOLEAN         fHardErrorsAreDisabled;
  808.     WORD            wUknown1;
  809.     DWORD           dwUknown2;
  810. } ETHREAD, *PETHREAD;
  811.  
  812. typedef PETHREAD    ERESOURCE_THREAD,
  813.                     *PERESOURCE_THREAD;
  814.  
  815. typedef struct _KEVENT
  816. {
  817.     DISPATCHER_HEADER   Header;
  818. } KEVENT, *PKEVENT;
  819.  
  820. typedef struct _ERESOURCE_OLD
  821. {
  822.     LIST_ENTRY          SystemResourcesList;
  823.     PERESOURCE_THREAD   OwnerThreads;
  824.     PBYTE               pbOwnerCounts;
  825.     WORD                wTableSize;
  826.     WORD                wActiveCount;
  827.     WORD                wFlag;
  828.     WORD                wTableRover;
  829.     BYTE                bInitialOwnerCounts[4];
  830.     ERESOURCE_THREAD    InitialOwnerThreads[4];
  831.     DWORD               dwUknown1;
  832.     ULONG               uContentionCount;
  833.     WORD                wNumberOfExclusiveWaiters;
  834.     WORD                wNumberOfSharedWaiters;
  835.     KSEMAPHORE          SharedWaiters;
  836.     KEVENT              ExclusiveWaiters;
  837.     KSPIN_LOCK          SpinLock;
  838.     ULONG               uCreatorBackTraceIndex;
  839.     WORD                wDepth;
  840.     WORD                wUknown2;
  841.     PVOID               pOwnerBackTrace[4];
  842. } ERESOURCE_OLD, *PERESOURCE_OLD;
  843.  
  844. typedef struct _OWNER_ENTRY
  845. {
  846.     ERESOURCE_THREAD    OwnerThread;
  847.     SHORT               sOwnerCount;
  848.     WORD                wTableSize;
  849. } OWNER_ENTRY, *POWNER_ENTRY;
  850.  
  851. typedef struct _ERESOURCE_LITE
  852. {
  853.     LIST_ENTRY      SystemResourcesList;
  854.     POWNER_ENTRY    OwnerTable;
  855.     SHORT           sActiveCount;
  856.     WORD            wFlag;
  857.     PKSEMAPHORE     SharedWaiters;
  858.     PKEVENT         ExclusiveWaiters;
  859.     OWNER_ENTRY     OwnerThreads[2];
  860.     ULONG           uContentionCount;
  861.     WORD            wNumberOfSharedWaiters;
  862.     WORD            wNumberOfExclusiveWaiters;
  863.     union
  864.     {
  865.  
  866.         PVOID       pAddress;
  867.         ULONG       uCreatorBackTraceIndex;
  868.     };
  869.     KSPIN_LOCK      SpinLock;
  870. } ERESOURCE_LITE, *PERESOURCE_LITE;
  871.  
  872. typedef ERESOURCE_LITE  ERESOURCE,
  873.                         *PERESOURCE;
  874.  
  875. typedef struct _IO_STATUS_BLOCK
  876. {
  877.     NTSTATUS    Status;
  878.     ULONG       uInformation;
  879. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
  880.  
  881. /* Defined in Winnt.h
  882. typedef struct _QUOTA_LIMITS {
  883.     SIZE_T PagedPoolLimit;
  884.     SIZE_T NonPagedPoolLimit;
  885.     SIZE_T MinimumWorkingSetSize;
  886.     SIZE_T MaximumWorkingSetSize;
  887.     SIZE_T PagefileLimit;
  888.     LARGE_INTEGER TimeLimit;
  889. } QUOTA_LIMITS, *PQUOTA_LIMITS;
  890. */
  891.  
  892. typedef struct _IOCOUNTERS
  893. {
  894.     ULONG           uReadOperationCount;
  895.     ULONG           uWriteOperationCount;
  896.     ULONG           uOtherOperationCount;
  897.     LARGE_INTEGER   liReadTransferCount;
  898.     LARGE_INTEGER   liWriteTransferCount;
  899.     LARGE_INTEGER   liOtherTransferCount;
  900. } IOCOUNTERS, *PIOCOUNTERS;
  901.  
  902. typedef struct _VM_COUNTERS
  903. {
  904.     ULONG   uPeakVirtualSize;
  905.     ULONG   uVirtualSize;
  906.     ULONG   uPageFaultCount;
  907.     ULONG   uPeakWorkingSetSize;
  908.     ULONG   uWorkingSetSize;
  909.     ULONG   uQuotaPeakPagedPoolUsage;
  910.     ULONG   uQuotaPagedPoolUsage;
  911.     ULONG   uQuotaPeakNonPagedPoolUsage;
  912.     ULONG   uQuotaNonPagedPoolUsage;
  913.     ULONG   uPagefileUsage;
  914.     ULONG   uPeakPagefileUsage;
  915. } VM_COUNTERS, *PVM_COUNTERS;
  916.  
  917. typedef struct _KERNEL_USER_TIMES
  918. {
  919.     LARGE_INTEGER liCreateTime;
  920.     LARGE_INTEGER liExitTime;
  921.     LARGE_INTEGER liKernelTime;
  922.     LARGE_INTEGER liUserTime;
  923. } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
  924.  
  925. typedef struct _BASE_PRIORITY_INFORMATION
  926. {
  927.     KPRIORITY   BasePriority;
  928. } BASE_PRIORITY_INFORMATION, *PBASE_PRIORITY_INFORMATION;
  929.  
  930. typedef struct _AFFINITY_MASK
  931. {
  932.     KAFFINITY   AffinityMask;
  933. } AFFINITY_MASK, *PAFFINITY_MASK;
  934.  
  935. typedef struct _TIME_FIELDS
  936. {
  937.     WORD    wYear;
  938.     WORD    wMonth;
  939.     WORD    wDay;
  940.     WORD    wHour;
  941.     WORD    wMinute;
  942.     WORD    wSecond;
  943.     WORD    wMilliseconds;
  944.     WORD    wWeekday;
  945. } TIME_FIELDS, *PTIME_FIELDS;
  946.  
  947. typedef void (*PIO_APC_ROUTINE) (PVOID              ApcContext,
  948.                                  PIO_STATUS_BLOCK   IoStatusBlock,
  949.                                  ULONG              Reserved);
  950.  
  951. #if(_WIN32_WINNT < 0x0400)
  952.  
  953. typedef struct _NTFS_VOLUME_DATA_BUFFER
  954. {
  955.     LARGE_INTEGER   liSerialNumber;
  956.     LARGE_INTEGER   liNumberOfSectors;
  957.     LARGE_INTEGER   liTotalClusters;
  958.     LARGE_INTEGER   liFreeClusters;
  959.     LARGE_INTEGER   liReserved;
  960.     ULONG           uBytesPerSector;
  961.     ULONG           uBytesPerCluster;
  962.     ULONG           uBytesPerMFTRecord;
  963.     ULONG           uClustersPerMFTRecord;
  964.     LARGE_INTEGER   liMFTLength;
  965.     LARGE_INTEGER   liMFTStart;
  966.     LARGE_INTEGER   liMFTMirrorStart;
  967.     LARGE_INTEGER   liMFTZoneStart;
  968.     LARGE_INTEGER   liMFTZoneEnd;
  969. } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
  970.  
  971. #endif
  972.  
  973. typedef struct _OBJDIR_INFORMATION
  974. {
  975.     UNICODE_STRING  ObjectName;
  976.     UNICODE_STRING  ObjectTypeName; // e.g. Directory, Device ...
  977.     UCHAR           Data[1];        // variable length
  978. } OBJDIR_INFORMATION, *POBJDIR_INFORMATION;
  979.  
  980. // Define the file system information class values
  981. typedef enum _FSINFOCLASS {
  982.     FileFsVolumeInformation       = 1,
  983.     FileFsLabelInformation,      // 2
  984.     FileFsSizeInformation,       // 3
  985.     FileFsDeviceInformation,     // 4
  986.     FileFsAttributeInformation,  // 5
  987.     FileFsControlInformation,    // 6
  988.     FileFsFullSizeInformation,   // 7
  989.     FileFsObjectIdInformation,   // 8
  990.     FileFsMaximumInformation
  991. } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
  992.  
  993. typedef struct _FILE_FS_VOLUME_INFORMATION {
  994.     LARGE_INTEGER VolumeCreationTime;
  995.     ULONG VolumeSerialNumber;
  996.     ULONG VolumeLabelLength;
  997.     BOOLEAN SupportsObjects;
  998.     WCHAR VolumeLabel[1];
  999. } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
  1000.  
  1001. typedef struct _FILE_FS_LABEL_INFORMATION {
  1002.     ULONG VolumeLabelLength;
  1003.     WCHAR VolumeLabel[1];
  1004. } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
  1005.  
  1006. typedef struct _FILE_FS_SIZE_INFORMATION {
  1007.     LARGE_INTEGER TotalAllocationUnits;
  1008.     LARGE_INTEGER AvailableAllocationUnits;
  1009.     ULONG SectorsPerAllocationUnit;
  1010.     ULONG BytesPerSector;
  1011. } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
  1012.  
  1013. typedef struct _FILE_FS_DEVICE_INFORMATION {
  1014.     DEVICE_TYPE DeviceType;
  1015.     ULONG Characteristics;
  1016. } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
  1017.  
  1018. typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
  1019.     ULONG FileSystemAttributes;
  1020.     LONG MaximumComponentNameLength;
  1021.     ULONG FileSystemNameLength;
  1022.     WCHAR FileSystemName[1];
  1023. } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
  1024.  
  1025. typedef struct _FILE_FS_CONTROL_INFORMATION {
  1026.     LARGE_INTEGER FreeSpaceStartFiltering;
  1027.     LARGE_INTEGER FreeSpaceThreshold;
  1028.     LARGE_INTEGER FreeSpaceStopFiltering;
  1029.     LARGE_INTEGER DefaultQuotaThreshold;
  1030.     LARGE_INTEGER DefaultQuotaLimit;
  1031.     ULONG FileSystemControlFlags;
  1032. } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
  1033.  
  1034. typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
  1035.     LARGE_INTEGER TotalQuotaAllocationUnits;
  1036.     LARGE_INTEGER AvailableQuotaAllocationUnits;
  1037.     LARGE_INTEGER AvailableAllocationUnits;
  1038.     ULONG SectorsPerAllocationUnit;
  1039.     ULONG BytesPerSector;
  1040. } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
  1041.  
  1042. typedef struct _FILE_FS_OBJECT_ID_INFORMATION {
  1043.     GUID VolumeObjectId;
  1044.     ULONG VolumeObjectIdExtendedInfo[12];
  1045. } FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION;
  1046.  
  1047. typedef enum _SYSTEMINFOCLASS
  1048. {
  1049.     SystemBasicInformation,             // 0x002C
  1050.     SystemProcessorInformation,         // 0x000C
  1051.     SystemPerformanceInformation,       // 0x0138
  1052.     SystemTimeInformation,              // 0x0020
  1053.     SystemPathInformation,              // not implemented
  1054.     SystemProcessInformation,           // 0x00C8+ per process
  1055.     SystemCallInformation,              // 0x0018 + (n * 0x0004)
  1056.     SystemConfigurationInformation,     // 0x0018
  1057.     SystemProcessorCounters,            // 0x0030 per cpu
  1058.     SystemGlobalFlag,                   // 0x0004 (fails if size != 4)
  1059.     SystemCallTimeInformation,          // not implemented
  1060.     SystemModuleInformation,            // 0x0004 + (n * 0x011C)
  1061.     SystemLockInformation,              // 0x0004 + (n * 0x0024)
  1062.     SystemStackTraceInformation,        // not implemented
  1063.     SystemPagedPoolInformation,         // checked build only
  1064.     SystemNonPagedPoolInformation,      // checked build only
  1065.     SystemHandleInformation,            // 0x0004  + (n * 0x0010)
  1066.     SystemObjectTypeInformation,        // 0x0038+ + (n * 0x0030+)
  1067.     SystemPageFileInformation,          // 0x0018+ per page file
  1068.     SystemVdmInstemulInformation,       // 0x0088
  1069.     SystemVdmBopInformation,            // invalid info class
  1070.     SystemCacheInformation,             // 0x0024
  1071.     SystemPoolTagInformation,           // 0x0004 + (n * 0x001C)
  1072.     SystemInterruptInformation,         // 0x0000, or 0x0018 per cpu
  1073.     SystemDpcInformation,               // 0x0014
  1074.     SystemFullMemoryInformation,        // checked build only
  1075.     SystemLoadDriver,                   // 0x0018, set mode only
  1076.     SystemUnloadDriver,                 // 0x0004, set mode only
  1077.     SystemTimeAdjustmentInformation,    // 0x000C, 0x0008 writeable
  1078.     SystemSummaryMemoryInformation,     // checked build only
  1079.     SystemNextEventIdInformation,       // checked build only
  1080.     SystemEventIdsInformation,          // checked build only
  1081.     SystemCrashDumpInformation,         // 0x0004
  1082.     SystemExceptionInformation,         // 0x0010
  1083.     SystemCrashDumpStateInformation,    // 0x0004
  1084.     SystemDebuggerInformation,          // 0x0002
  1085.     SystemContextSwitchInformation,     // 0x0030
  1086.     SystemRegistryQuotaInformation,     // 0x000C
  1087.     SystemAddDriver,                    // 0x0008, set mode only
  1088.     SystemPrioritySeparationInformation,// 0x0004, set mode only
  1089.     SystemPlugPlayBusInformation,       // not implemented
  1090.     SystemDockInformation,              // not implemented
  1091.     SystemPowerInfo,             // 0x0060 (XP only!)
  1092.     SystemProcessorSpeedInformation,    // 0x000C (XP only!)
  1093.     SystemTimeZoneInformation,          // 0x00AC
  1094.     SystemLookasideInformation,         // n * 0x0020
  1095.     SystemSetTimeSlipEvent,
  1096.     SystemCreateSession,                // set mode only
  1097.     SystemDeleteSession,                // set mode only
  1098.     SystemInvalidInfoClass1,            // invalid info class
  1099.     SystemRangeStartInformation,        // 0x0004 (fails if size != 4)
  1100.     SystemVerifierInformation,
  1101.     SystemAddVerifier,
  1102.     SystemSessionProcessesInformation,  // checked build only
  1103.     MaxSystemInfoClass
  1104. } SYSTEMINFOCLASS, *PSYSTEMINFOCLASS;
  1105.  
  1106. typedef struct _SYSTEM_BASIC_INFORMATION
  1107. {
  1108.     DWORD       dwUnknown1;               // 0
  1109.     ULONG       uKeMaximumIncrement;      // x86: 0x0002625A or 0x00018730
  1110.     ULONG       uPageSize;                // bytes
  1111.     ULONG       uMmNumberOfPhysicalPages;
  1112.     ULONG       uMmLowestPhysicalPage;
  1113.     ULONG       uMmHighestPhysicalPage;
  1114.     ULONG       uAllocationGranularity;   // bytes
  1115.     PVOID       pLowestUserAddress;
  1116.     PVOID       pMmHighestUserAddress;
  1117.     KAFFINITY   uKeActiveProcessors;
  1118.     BYTE        bKeNumberProcessors;
  1119.     BYTE        bUnknown2;
  1120.     WORD        wUnknown3;
  1121. } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
  1122.  
  1123. typedef struct _SYSTEM_PROCESSOR_INFORMATION
  1124. {
  1125.     WORD    wKeProcessorArchitecture; // PROCESSOR_ARCHITECTURE_* (PROCESSOR_ARCHITECTURE_INTEL)
  1126.     WORD    wKeProcessorLevel;        // PROCESSOR_* (PROCESSOR_INTEL_PENTIUM)
  1127.     WORD    wKeProcessorRevision;     // Pentium: H=model, L=stepping
  1128.     WORD    wUnknown1;                // 0
  1129.     ULONG   uKeFeatureBits;
  1130. } SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION;
  1131.  
  1132. typedef struct _MM_INFO_COUNTERS
  1133. {
  1134.     ULONG   uPageFaults;
  1135.     ULONG   uWriteCopyFaults;
  1136.     ULONG   uTransistionFaults;
  1137.     ULONG   uCacheTransitionCount;
  1138.     ULONG   uDemandZeroFaults;
  1139.     ULONG   uPagesRead;
  1140.     ULONG   uPageReadIos;
  1141.     ULONG   uCacheReadCount;
  1142.     ULONG   uCacheIoCount;
  1143.     ULONG   uPagefilePagesWritten;
  1144.     ULONG   uPagefilePageWriteIos;
  1145.     ULONG   uMappedFilePagesWritten;
  1146.     ULONG   uMappedFilePageWriteIos;
  1147. } MM_INFO_COUNTERS, *PMM_INFO_COUNTERS;
  1148.  
  1149. typedef struct _SYSTEM_PERFORMANCE_INFORMATION
  1150. {
  1151.     LARGE_INTEGER       liIdleTime;             // 100 nsec units
  1152.     LARGE_INTEGER       liIoReadTransferCount;
  1153.     LARGE_INTEGER       liIoWriteTransferCount;
  1154.     LARGE_INTEGER       liIoOtherTransferCount;
  1155.     ULONG               uIoReadOperationCount;
  1156.     ULONG               uIoWriteOperationCount;
  1157.     ULONG               uIoOtherOperationCount;
  1158.     ULONG               uMmAvailablePages;
  1159.     ULONG               uMmTotalCommittedPages;
  1160.     ULONG               uMmTotalCommitLimit;   // pages
  1161.     ULONG               uMmPeakCommitLimit;    // pages
  1162.     MM_INFO_COUNTERS    MmInfoCounters;
  1163.     ULONG               uPoolPaged;            // pages
  1164.     ULONG               uPoolNonPaged;         // pages
  1165.     ULONG               uPagedPoolAllocs;
  1166.     ULONG               uPagedPoolFrees;
  1167.     ULONG               uNonPagedPoolAllocs;
  1168.     ULONG               uNonPagedPoolFrees;
  1169.     ULONG               uMmTotalFreeSystemPages;
  1170.     ULONG               uMmSystemCodePage;
  1171.     ULONG               uMmTotalSystemDriverPages;
  1172.     ULONG               uMmTotalSystemCodePages;
  1173.     ULONG               uSmallNonPagedLookasideListAllocateHits;
  1174.     ULONG               uSmallPagedLookasideListAllocateHits;
  1175.     DWORD               dwUnknown1;
  1176.     ULONG               uMmSystemCachePage;
  1177.     ULONG               uMmPagedPoolPage;
  1178.     ULONG               uMmSystemDriverPage;
  1179.     ULONG               uCcFastReadNoWait;
  1180.     ULONG               uCcFastReadWait;
  1181.     ULONG               uCcFastReadResourceMiss;
  1182.     ULONG               uCcFastReadNotPossible;
  1183.     ULONG               uCcFastMdlReadNoWait;
  1184.     ULONG               uCcFastMdlReadWait;
  1185.     ULONG               uCcFastMdlReadResourceMiss;
  1186.     ULONG               uCcFastMdlReadNotPossible;
  1187.     ULONG               uCcMapDataNoWait;
  1188.     ULONG               uCcMapDataWait;
  1189.     ULONG               uCcMapDataNoWaitMiss;
  1190.     ULONG               uCcMapDataWaitMiss;
  1191.     ULONG               uCcPinMappedDataCount;
  1192.     ULONG               uCcPinReadNoWait;
  1193.     ULONG               uCcPinReadWait;
  1194.     ULONG               uCcPinReadNoWaitMiss;
  1195.     ULONG               uCcPinReadWaitMiss;
  1196.     ULONG               uCcCopyReadNoWait;
  1197.     ULONG               uCcCopyReadWait;
  1198.     ULONG               uCcCopyReadNoWaitMiss;
  1199.     ULONG               uCcCopyReadWaitMiss;
  1200.     ULONG               uCcMdlReadNoWait;
  1201.     ULONG               uCcMdlReadWait;
  1202.     ULONG               uCcMdlReadNoWaitMiss;
  1203.     ULONG               uCcMdlReadWaitMiss;
  1204.     ULONG               uCcReadAheadIos;
  1205.     ULONG               uCcLazyWriteIos;
  1206.     ULONG               uCcLazyWritePages;
  1207.     ULONG               uCcDataFlushes;
  1208.     ULONG               uCcDataPages;
  1209.     ULONG               uTotalContextSwitches; // total across cpus
  1210.     ULONG               uFirstLevelTbFills;
  1211.     ULONG               uSecondLevelTbFills;
  1212.     ULONG               uSystemCalls;
  1213. } SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION;
  1214.  
  1215. typedef struct _SYSTEM_TIME_INFORMATION
  1216. {
  1217.     LARGE_INTEGER   liKeBootTime;           // relative to 01-01-1601
  1218.     LARGE_INTEGER   liKeSystemTime;         // relative to 01-01-1601
  1219.     LARGE_INTEGER   liExpTimeZoneBias;      // utc time = local time + bias
  1220.     ULONG           uExpCurrentTimeZoneId;  // TIME_ZONE_ID_* (TIME_ZONE_ID_UNKNOWN, etc.)
  1221.     DWORD           dwUnknown1;
  1222. } SYSTEM_TIME_INFORMATION, *PSYSTEM_TIME_INFORMATION;
  1223.  
  1224. typedef enum
  1225. {
  1226.     StateInitialized,
  1227.     StateReady,
  1228.     StateRunning,
  1229.     StateStandby,
  1230.     StateTerminated,
  1231.     StateWait,
  1232.     StateTransition,
  1233.     StateUnknown
  1234. } THREAD_STATE;
  1235.  
  1236. typedef struct _SYSTEM_THREAD
  1237. {
  1238.     LARGE_INTEGER   liKernelTime;       // 100 nsec units
  1239.     LARGE_INTEGER   liUserTime;         // 100 nsec units
  1240.     LARGE_INTEGER   liCreateTime;       // relative to 01-01-1601
  1241.     ULONG           WaitTime;           // ticks
  1242.     PVOID           pStartAddress;      // EIP
  1243.     CLIENT_ID       Cid;                // process/thread ids
  1244.     KPRIORITY       Priority;
  1245.     KPRIORITY       BasePriority;
  1246.     ULONG           ContextSwitches;
  1247.     THREAD_STATE    ThreadState;
  1248.     KWAIT_REASON    WaitReason;
  1249. //  DWORD           dwUnknown2;         // maybe it not exists !!!
  1250. } SYSTEM_THREAD, *PSYSTEM_THREAD;
  1251.  
  1252. typedef struct _SYSTEM_PROCESS_INFORMATION
  1253. {
  1254.     ULONG           uNext;           // relative offset
  1255.     ULONG           uThreadCount;
  1256.     LARGE_INTEGER   liUnknown1;
  1257.     LARGE_INTEGER   liUnknown2;
  1258.     LARGE_INTEGER   liUnknown3;
  1259.     LARGE_INTEGER   liCreateTime;     // relative to 01-01-1601
  1260.     LARGE_INTEGER   liUserTime;       // 100 nsec units
  1261.     LARGE_INTEGER   liKernelTime;     // 100 nsec units
  1262.     UNICODE_STRING  usName;
  1263.     KPRIORITY       BasePriority;
  1264.     ULONG           uUniqueProcessId;
  1265.     ULONG           uInheritedFromUniqueProcessId;
  1266.     ULONG           uHandleCount;
  1267.     ULONG           uSessionId;      // W2K Only!
  1268.     DWORD           dwUnknown5;
  1269.     VM_COUNTERS     VmCounters;
  1270.     ULONG           uCommitCharge;   // bytes
  1271.     SYSTEM_THREAD   aST[];
  1272. } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
  1273.  
  1274. typedef struct _IO_COUNTERSEX
  1275. {
  1276.     LARGE_INTEGER   ReadOperationCount;
  1277.     LARGE_INTEGER   WriteOperationCount;
  1278.     LARGE_INTEGER   OtherOperationCount;
  1279.     LARGE_INTEGER   ReadTransferCount;
  1280.     LARGE_INTEGER   WriteTransferCount;
  1281.     LARGE_INTEGER   OtherTransferCount;
  1282. } IO_COUNTERSEX, *PIO_COUNTERSEX;
  1283.  
  1284. typedef struct _SYSTEM_PROCESS_INFORMATION_2000
  1285. {
  1286.     ULONG           uNext;           // relative offset
  1287.     ULONG           uThreadCount;
  1288.     LARGE_INTEGER   liUnknown1;
  1289.     LARGE_INTEGER   liUnknown2;
  1290.     LARGE_INTEGER   liUnknown3;
  1291.     LARGE_INTEGER   liCreateTime;     // relative to 01-01-1601
  1292.     LARGE_INTEGER   liUserTime;       // 100 nsec units
  1293.     LARGE_INTEGER   liKernelTime;     // 100 nsec units
  1294.     UNICODE_STRING  usName;
  1295.     KPRIORITY       BasePriority;
  1296.     ULONG           uUniqueProcessId;
  1297.     ULONG           uInheritedFromUniqueProcessId;
  1298.     ULONG           uHandleCount;
  1299.     ULONG           uSessionId;      // W2K Only!
  1300.     DWORD           dwUnknown5;
  1301.     VM_COUNTERS     VmCounters;
  1302.     ULONG           uCommitCharge;   // bytes
  1303.     IO_COUNTERSEX   IoCounters;
  1304.     SYSTEM_THREAD   aST[];
  1305. } SYSTEM_PROCESS_INFORMATION_2000, *PSYSTEM_PROCESS_INFORMATION_2000;
  1306.  
  1307. typedef struct _SYSTEM_CALL_INFORMATION
  1308. {
  1309.     ULONG   Length;
  1310.     ULONG   NumberOfTables;
  1311. //  ULONG   NumberOfEntries[NumberOfTables]
  1312. //  ULONG   CallCounts[NumberOfTables][NumberOfEntries];
  1313. } SYSTEM_CALL_INFORMATION, *PSYSTEM_CALL_INFORMATION;
  1314.  
  1315. typedef struct _SYSTEM_CONFIGURATION_INFORMATION
  1316. {
  1317.     ULONG   uDiskCount;
  1318.     ULONG   uFloppyCount;
  1319.     ULONG   uCDRomCount;
  1320.     ULONG   uTapeCount;
  1321.     ULONG   uSerialCount;         // com port with mouse not included
  1322.     ULONG   uParallelCount;
  1323. } SYSTEM_CONFIGURATION_INFORMATION, *PSYSTEM_CONFIGURATION_INFORMATION;
  1324.  
  1325. typedef struct _SYSTEM_PROCESSOR_COUNTERS
  1326. {
  1327.     LARGE_INTEGER   liProcessorTime;       // 100 nsec units
  1328.     LARGE_INTEGER   liKernelTime;          // 100 nsec units
  1329.     LARGE_INTEGER   liUserTime;            // 100 nsec units
  1330.     LARGE_INTEGER   liDpcTime;             // 100 nsec units
  1331.     LARGE_INTEGER   liInterruptTime;       // 100 nsec units
  1332.     ULONG           uInterruptCount;
  1333.     DWORD           dwUnknown1;
  1334. } SYSTEM_PROCESSOR_COUNTERS, *PSYSTEM_PROCESSOR_COUNTERS;
  1335.  
  1336. typedef struct _SYSTEM_GLOBAL_FLAG
  1337. {
  1338.     ULONG   NtGlobalFlag;        // see Q147314, Q102985, Q105677
  1339. } SYSTEM_GLOBAL_FLAG, *PSYSTEM_GLOBAL_FLAG;
  1340.  
  1341. typedef struct _SYSTEM_CALL_TIME_INFORMATION
  1342. {
  1343.     ULONG           Length;
  1344.     ULONG           TotalCalls;
  1345.     LARGE_INTEGER   TimeOfCalls[1];
  1346. } SYSTEM_CALL_TIME_INFORMATION, *PSYSTEM_CALL_TIME_INFORMATION;
  1347.  
  1348. typedef struct _SYSTEM_MODULE
  1349. {
  1350.     ULONG   Reserved[2];
  1351.     ULONG   Base;
  1352.     ULONG   Size;
  1353.     ULONG   Flags;
  1354.     USHORT  Index;
  1355.     USHORT  Unknown;
  1356.     USHORT  LoadCount;
  1357.     USHORT  ModuleNameOffset;
  1358.     CHAR    ImageName[256];
  1359. } SYSTEM_MODULE, *PSYSTEM_MODULE;
  1360.  
  1361. typedef struct _SYSTEM_MODULE_INFORMATION
  1362. {
  1363.     ULONG           uCount;
  1364.     SYSTEM_MODULE   aSM[];
  1365. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
  1366.  
  1367. typedef struct _SYSTEM_LOCK
  1368. {
  1369.     union
  1370.     {
  1371.         PERESOURCE_OLD  pEResourceOld;  // old ERESOURCE format
  1372.         PERESOURCE_LITE pEResourceLite; // new "lite" format
  1373.         PERESOURCE      pEResource;     // current format
  1374.     };
  1375.     WORD    wUnknown1;                  // 1
  1376.     WORD    wUnknown2;                  // 0
  1377.     ULONG   ExclusiveOwnerThreadId;
  1378.     ULONG   uActiveCount;
  1379.     ULONG   uContentionCount;
  1380.     DWORD   dwUnknown3;
  1381.     DWORD   dwUnknown4;
  1382.     ULONG   uNumberOfSharedWaiters;
  1383.     ULONG   uNumberOfExclusiveWaiters;
  1384. } SYSTEM_LOCK, *PSYSTEM_LOCK;
  1385.  
  1386. typedef struct _SYSTEM_LOCK_INFORMATION
  1387. {
  1388.     ULONG       uCount;
  1389.     SYSTEM_LOCK aSL[];
  1390. } SYSTEM_LOCK_INFORMATION, *PSYSTEM_LOCK_INFORMATION;
  1391.  
  1392. typedef struct _SYSTEM_HANDLE
  1393. {
  1394.     ULONG       uIdProcess;
  1395.     UCHAR       ObjectType;    // OB_TYPE_* (OB_TYPE_TYPE, etc.)
  1396.     UCHAR       Flags;         // HANDLE_FLAG_* (HANDLE_FLAG_INHERIT, etc.)
  1397.     USHORT      Handle;
  1398.     POBJECT     pObject;
  1399.     ACCESS_MASK GrantedAccess;
  1400. } SYSTEM_HANDLE, *PSYSTEM_HANDLE;
  1401.  
  1402. typedef struct _SYSTEM_HANDLE_INFORMATION
  1403. {
  1404.     ULONG           uCount;
  1405.     SYSTEM_HANDLE   aSH[];
  1406. } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
  1407.  
  1408. typedef struct _SYSTEM_OBJECTTYPE_INFORMATION
  1409. {
  1410.     ULONG           NextEntryOffset;    // absolute offset
  1411.     ULONG           ObjectCount;
  1412.     ULONG           HandleCount;
  1413.     ULONG           TypeIndex;          // OB_TYPE_* (OB_TYPE_TYPE, etc.)
  1414.     ULONG           InvalidAttributes;  // OBJ_* (OBJ_INHERIT, etc.)
  1415.     GENERIC_MAPPING GenericMapping;
  1416.     ACCESS_MASK     ValidAccessMask;
  1417.     POOL_TYPE       PoolType;
  1418.     BOOLEAN         SecurityRequired;
  1419.     BOOLEAN         WaitableObject;
  1420.     UNICODE_STRING  TypeName;
  1421. } SYSTEM_OBJECTTYPE_INFORMATION, *PSYSTEM_OBJECTTYPE_INFORMATION;
  1422.  
  1423. // follows after SYSTEM_OBJECTTYPE_INFORMATION.TypeName
  1424. typedef struct _SYSTEM_OBJECT_INFORMATION
  1425. {
  1426.     ULONG                   NextEntryOffset;        // absolute offset
  1427.     POBJECT                 Object;
  1428.     ULONG                   CreatorProcessId;
  1429.     USHORT                  CreatorBackTraceIndex;
  1430.     USHORT                  Flags;                  // see "Native API Reference" page 24
  1431.     LONG                    PointerCount;
  1432.     LONG                    HandleCount;
  1433.     ULONG                   PagedPoolCharge;
  1434.     ULONG                   NonPagedPoolCharge;
  1435.     ULONG                   ExclusiveProcessId;
  1436.     PSECURITY_DESCRIPTOR    SecurityDescriptor;
  1437.     UNICODE_STRING          ObjectName;
  1438. } SYSTEM_OBJECT_INFORMATION, *PSYSTEM_OBJECT_INFORMATION;
  1439.  
  1440. typedef struct _SYSTEM_PAGE_FILE_INFORMATION
  1441. {
  1442.     ULONG           NextEntryOffset;    // relative offset
  1443.     ULONG           CurrentSize;        // pages
  1444.     ULONG           TotalUsed;          // pages
  1445.     ULONG           PeakUsed;           // pages
  1446.     UNICODE_STRING  FileName;
  1447. } SYSTEM_PAGE_FILE_INFORMATION, *PSYSTEM_PAGE_FILE_INFORMATION;
  1448.  
  1449. typedef struct _SYSTEM_VDM_INSTEMUL_INFO
  1450. {
  1451.     BOOL    fExVdmSegmentNotPresent;
  1452.     ULONG   uOpcode0FV86;
  1453.     ULONG   uOpcodeESPrefixV86;
  1454.     ULONG   uOpcodeCSPrefixV86;
  1455.     ULONG   uOpcodeSSPrefixV86;
  1456.     ULONG   uOpcodeDSPrefixV86;
  1457.     ULONG   uOpcodeFSPrefixV86;
  1458.     ULONG   uOpcodeGSPrefixV86;
  1459.     ULONG   uOpcodeOPER32PrefixV86;
  1460.     ULONG   uOpcodeADDR32PrefixV86;
  1461.     ULONG   uOpcodeINSBV86;
  1462.     ULONG   uOpcodeINSWV86;
  1463.     ULONG   uOpcodeOUTSBV86;
  1464.     ULONG   uOpcodeOUTSWV86;
  1465.     ULONG   uOpcodePUSHFV86;
  1466.     ULONG   uOpcodePOPFV86;
  1467.     ULONG   uOpcodeINTnnV86;
  1468.     ULONG   uOpcodeINTOV86;
  1469.     ULONG   uOpcodeIRETV86;
  1470.     ULONG   uOpcodeINBimmV86;
  1471.     ULONG   uOpcodeINWimmV86;
  1472.     ULONG   uOpcodeOUTBimmV86;
  1473.     ULONG   uOpcodeOUTWimmV86;
  1474.     ULONG   uOpcodeINBV86;
  1475.     ULONG   uOpcodeINWV86;
  1476.     ULONG   uOpcodeOUTBV86;
  1477.     ULONG   uOpcodeOUTWV86;
  1478.     ULONG   uOpcodeLOCKPrefixV86;
  1479.     ULONG   uOpcodeREPNEPrefixV86;
  1480.     ULONG   uOpcodeREPPrefixV86;
  1481.     ULONG   uOpcodeHLTV86;
  1482.     ULONG   uOpcodeCLIV86;
  1483.     ULONG   uOpcodeSTIV86;
  1484.     ULONG   uVdmBopCount;
  1485. } SYSTEM_VDM_INSTEMUL_INFO, *PSYSTEM_VDM_INSTEMUL_INFO;
  1486.  
  1487. typedef struct _SYSTEM_CACHE_INFORMATION
  1488. {
  1489.     ULONG uFileCache;           // bytes
  1490.     ULONG uFileCachePeak;       // bytes
  1491.     ULONG PageFaultCount;
  1492.     ULONG MinimumWorkingSet;
  1493.     ULONG MaximumWorkingSet;
  1494.     ULONG TransitionSharedPages;
  1495.     ULONG TransitionSharedPagesPeak;
  1496.     ULONG Reserved[2];
  1497. } SYSTEM_CACHE_INFORMATION, *PSYSTEM_CACHE_INFORMATION;
  1498.  
  1499. typedef struct _SYSTEM_POOL_ENTRY
  1500. {
  1501.     BOOLEAN Allocated;
  1502.     BOOLEAN Spare0;
  1503.     USHORT  AllocatorBackTraceIndex;
  1504.     ULONG   Size;
  1505.     union
  1506.     {
  1507.         UCHAR   Tag[4];
  1508.         ULONG   TagUlong;
  1509.         PVOID   ProcessChargedQuota;
  1510.     };
  1511. } SYSTEM_POOL_ENTRY, *PSYSTEM_POOL_ENTRY;
  1512.  
  1513. typedef struct _SYSTEM_POOL_INFORMATION
  1514. {
  1515.     ULONG               TotalSize;
  1516.     PVOID               FirstEntry;
  1517.     USHORT              EntryOverhead;
  1518.     BOOLEAN             PoolTagPresent;
  1519.     BOOLEAN             Spare0;
  1520.     ULONG               NumberOfEntries;
  1521.     SYSTEM_POOL_ENTRY   Entries[1];
  1522. } SYSTEM_POOL_INFORMATION, *PSYSTEM_POOL_INFORMATION;
  1523.  
  1524. typedef struct _SYSTEM_POOL_TAG
  1525. {
  1526.     union
  1527.     {
  1528.         UCHAR   Tag[4];
  1529.         ULONG   TagUlong;
  1530.     };
  1531.     ULONG   PagedPoolAllocs;
  1532.     ULONG   PagedPoolFrees;
  1533.     ULONG   PagedPoolUsage;
  1534.     ULONG   NonPagedPoolAllocs;
  1535.     ULONG   NonPagedPoolFrees;
  1536.     ULONG   NonPagedPoolUsage;
  1537. } SYSTEM_POOL_TAG, *PSYSTEM_POOL_TAG;
  1538.  
  1539. typedef struct _SYSTEM_POOL_TAG_INFORMATION
  1540. {
  1541.     ULONG           uCount;
  1542.     SYSTEM_POOL_TAG aSPT[];
  1543. } SYSTEM_POOL_TAG_INFORMATION, *PSYSTEM_POOL_TAG_INFORMATION;
  1544.  
  1545. typedef struct _SYSTEM_INTERRUPT_INFORMATION
  1546. {
  1547.     ULONG   ContextSwitches;
  1548.     ULONG   DpcCount;
  1549.     ULONG   DpcRate;
  1550.     ULONG   TimeIncrement;
  1551.     ULONG   DpcBypassCount;
  1552.     ULONG   ApcBypassCount;
  1553. } SYSTEM_INTERRUPT_INFORMATION, *PSYSTEM_INTERRUPT_INFORMATION;
  1554.  
  1555. typedef struct _SYSTEM_DPC_INFORMATION
  1556. {
  1557.     DWORD   dwUnknown1;
  1558.     ULONG   MaximumDpcQueueDepth;
  1559.     ULONG   MinimumDpcRate;
  1560.     ULONG   AdjustDpcThreshold;
  1561.     ULONG   IdealDpcRate;
  1562. } SYSTEM_DPC_INFORMATION, *PSYSTEM_DPC_INFORMATION;
  1563.  
  1564. typedef struct _SYSTEM_MEMORY_INFO
  1565. {
  1566.     PUCHAR  StringOffset;
  1567.     USHORT  ValidCount;
  1568.     USHORT  TransitionCount;
  1569.     USHORT  ModifiedCount;
  1570.     USHORT  PageTableCount;
  1571. } SYSTEM_MEMORY_INFO, *PSYSTEM_MEMORY_INFO;
  1572.  
  1573. typedef struct _SYSTEM_MEMORY_INFORMATION
  1574. {
  1575.     ULONG               InfoSize;
  1576.     ULONG               StringStart;
  1577.     SYSTEM_MEMORY_INFO  Memory[1];
  1578. } SYSTEM_MEMORY_INFORMATION, *PSYSTEM_MEMORY_INFORMATION;
  1579.  
  1580. typedef struct _SYSTEM_LOAD_DRIVER
  1581. {
  1582.     UNICODE_STRING          DriverName;         // input
  1583.     PVOID                   BaseAddress;        // output
  1584.     PVOID                   SectionPointer;     // output
  1585.     PVOID                   EntryPoint;         // output
  1586.     PIMAGE_EXPORT_DIRECTORY ExportDirectory;    // output
  1587. } SYSTEM_LOAD_DRIVER, *PSYSTEM_LOAD_DRIVER;
  1588.  
  1589. typedef struct _SYSTEM_UNLOAD_DRIVER
  1590. {
  1591.     PVOID   SectionPointer;
  1592. } SYSTEM_UNLOAD_DRIVER, *PSYSTEM_UNLOAD_DRIVER;
  1593.  
  1594. typedef struct _SYSTEM_QUERY_TIME_ADJUSTMENT
  1595. {
  1596.     ULONG   TimeAdjustment;
  1597.     ULONG   MaximumIncrement;
  1598.     BOOLEAN TimeSynchronization;
  1599. } SYSTEM_QUERY_TIME_ADJUSTMENT, *PSYSTEM_QUERY_TIME_ADJUSTMENT;
  1600.  
  1601. typedef struct _SYSTEM_SET_TIME_ADJUSTMENT
  1602. {
  1603.     ULONG   TimeAdjustment;
  1604.     BOOLEAN TimeSynchronization;
  1605. } SYSTEM_SET_TIME_ADJUSTMENT, *PSYSTEM_SET_TIME_ADJUSTMENT;
  1606.  
  1607. typedef struct _SYSTEM_CRASH_DUMP_INFORMATION
  1608. {
  1609.     HANDLE  CrashDumpSectionHandle;
  1610. } SYSTEM_CRASH_DUMP_INFORMATION, *PSYSTEM_CRASH_DUMP_INFORMATION;
  1611.  
  1612. typedef struct _SYSTEM_CRASH_DUMP_INFORMATION_2000
  1613. {
  1614.     HANDLE  CrashDumpSectionHandle;
  1615.     HANDLE  Unknown;                // Windows 2000 only
  1616. } SYSTEM_CRASH_DUMP_INFORMATION_2000, *PSYSTEM_CRASH_DUMP_INFORMATION_2000;
  1617.  
  1618. typedef struct _SYSTEM_EXCEPTION_INFORMATION
  1619. {
  1620.     ULONG   AlignmentFixupCount;
  1621.     ULONG   ExceptionDispatchCount;
  1622.     ULONG   FloatingEmulationCount;
  1623.     ULONG   ByteWordEmulationCount;
  1624. } SYSTEM_EXCEPTION_INFORMATION, *PSYSTEM_EXCEPTION_INFORMATION;
  1625.  
  1626. typedef struct _SYSTEM_CRASH_DUMP_STATE_INFORMATION
  1627. {
  1628.     ULONG   ValidCrashDump;
  1629. } SYSTEM_CRASH_DUMP_STATE_INFORMATION, *PSYSTEM_CRASH_DUMP_STATE_INFORMATION;
  1630.  
  1631. typedef struct _SYSTEM_CRASH_DUMP_STATE_INFORMATION_2000
  1632. {
  1633.     ULONG   ValidCrashDump;
  1634.     ULONG   Unknown;        // Windows 2000 only
  1635. } SYSTEM_CRASH_DUMP_STATE_INFORMATION_2000, *PSYSTEM_CRASH_DUMP_STATE_INFORMATION_2000;
  1636.  
  1637. typedef struct _SYSTEM_DEBUGGER_INFORMATION
  1638. {
  1639.     BOOLEAN KernelDebuggerEnabled;
  1640.     BOOLEAN KernelDebuggerNotPresent;
  1641. } SYSTEM_DEBUGGER_INFORMATION, *PSYSTEM_DEBUGGER_INFORMATION;
  1642.  
  1643. typedef struct _SYSTEM_CONTEXT_SWITCH_INFORMATION
  1644. {
  1645.     ULONG   ContextSwitches;
  1646.     ULONG   FindAny;
  1647.     ULONG   FindLast;
  1648.     ULONG   FindIdeal;
  1649.     ULONG   IdleAny;
  1650.     ULONG   IdleCurrent;
  1651.     ULONG   IdleLast;
  1652.     ULONG   IdleIdeal;
  1653.     ULONG   PreemptAny;
  1654.     ULONG   PreemptCurrent;
  1655.     ULONG   PreemptLast;
  1656.     ULONG   SwitchToIdle;
  1657. } SYSTEM_CONTEXT_SWITCH_INFORMATION, *PSYSTEM_CONTEXT_SWITCH_INFORMATION;
  1658.  
  1659. typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION
  1660. {
  1661.     ULONG   RegistryQuotaAllowed;   // bytes
  1662.     ULONG   RegistryQuotaUsed;      // bytes
  1663.     ULONG   PagedPoolSize;          // bytes
  1664. } SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION;
  1665.  
  1666. typedef struct _SYSTEM_ADD_DRIVER
  1667. {
  1668.     UNICODE_STRING  ModuleName;
  1669. } SYSTEM_ADD_DRIVER, *PSYSTEM_ADD_DRIVER;
  1670.  
  1671. typedef struct _SYSTEM_PRIORITY_SEPARATION_INFORMATION
  1672. {
  1673.     ULONG   PrioritySeparation;     // 0..2
  1674. } SYSTEM_PRIORITY_SEPARATION_INFORMATION, *PSYSTEM_PRIORITY_SEPARATION_INFORMATION;
  1675.  
  1676. #define MAX_BUS_NAME    24
  1677.  
  1678. typedef enum _PLUGPLAY_BUS_CLASS
  1679. {
  1680.     SystemBus,
  1681.     PlugPlayVirtualBus,
  1682.     MaxPlugPlayBusClass
  1683. } PLUGPLAY_BUS_CLASS, *PPLUGPLAY_BUS_CLASS;
  1684.  
  1685. typedef enum _PLUGPLAY_VIRTUAL_BUS_TYPE
  1686. {
  1687.     Root,
  1688.     MaxPlugPlayVirtualBusType
  1689. } PLUGPLAY_VIRTUAL_BUS_TYPE, *PPLUGPLAY_VIRTUAL_BUS_TYPE;
  1690.  
  1691. typedef enum _INTERFACE_TYPE
  1692. {
  1693.     InterfaceTypeUndefined = -1,
  1694.     Internal,
  1695.     Isa,
  1696.     Eisa,
  1697.     MicroChannel,
  1698.     TurboChannel,
  1699.     PCIBus,
  1700.     VMEBus,
  1701.     NuBus,
  1702.     PCMCIABus,
  1703.     CBus,
  1704.     MPIBus,
  1705.     MPSABus,
  1706.     ProcessorInternal,
  1707.     InternalPowerBus,
  1708.     PNPISABus,
  1709.     PNPBus,
  1710.     MaximumInterfaceType
  1711. }INTERFACE_TYPE, *PINTERFACE_TYPE;
  1712.  
  1713. typedef struct _PLUGPLAY_BUS_TYPE
  1714. {
  1715.     PLUGPLAY_BUS_CLASS  BusClass;
  1716.     union
  1717.     {
  1718.         INTERFACE_TYPE              SystemBusType;
  1719.         PLUGPLAY_VIRTUAL_BUS_TYPE   PlugPlayVirtualBusType;
  1720.     };
  1721. } PLUGPLAY_BUS_TYPE, *PPLUGPLAY_BUS_TYPE;
  1722.  
  1723. typedef struct _PLUGPLAY_BUS_INSTANCE
  1724. {
  1725.     PLUGPLAY_BUS_TYPE   BusType;
  1726.     ULONG               BusNumber;
  1727.     WCHAR               BusName[MAX_BUS_NAME];
  1728. } PLUGPLAY_BUS_INSTANCE, *PPLUGPLAY_BUS_INSTANCE;
  1729.  
  1730. typedef struct _SYSTEM_PLUGPLAY_BUS_INFORMATION
  1731. {
  1732.     ULONG                   BusCount;
  1733.     PLUGPLAY_BUS_INSTANCE   BusInstance[1];
  1734. } SYSTEM_PLUGPLAY_BUS_INFORMATION, *PSYSTEM_PLUGPLAY_BUS_INFORMATION;
  1735.  
  1736. typedef enum _SYSTEM_DOCK_STATE
  1737. {
  1738.     SystemDockStateUnknown,
  1739.     SystemUndocked,
  1740.     SystemDocked
  1741. } SYSTEM_DOCK_STATE, *PSYSTEM_DOCK_STATE;
  1742.  
  1743. typedef struct _SYSTEM_DOCK_INFORMATION
  1744. {
  1745.     SYSTEM_DOCK_STATE   DockState;
  1746.     INTERFACE_TYPE      DeviceBusType;
  1747.     ULONG               DeviceBusNumber;
  1748.     ULONG               SlotNumber;
  1749. } SYSTEM_DOCK_INFORMATION, *PSYSTEM_DOCK_INFORMATION;
  1750.  
  1751. typedef struct _SYSTEM_POWER_INFORMATION    // not for SystemPowerInfo !
  1752. {
  1753.     BOOLEAN         SystemSuspendSupported;
  1754.     BOOLEAN         SystemHibernateSupported;
  1755.     BOOLEAN         ResumeTimerSupportsSuspend;
  1756.     BOOLEAN         ResumeTimerSupportsHibernate;
  1757.     BOOLEAN         LidSupported;
  1758.     BOOLEAN         TurboSettingSupported;
  1759.     BOOLEAN         TurboMode;
  1760.     BOOLEAN         SystemAcOrDc;
  1761.     BOOLEAN         PowerDownDisabled;
  1762.     LARGE_INTEGER   SpindownDrives;
  1763. } SYSTEM_POWER_INFORMATION, *PSYSTEM_POWER_INFORMATION;
  1764.  
  1765. typedef struct _SYSTEM_PROCESSOR_SPEED_INFORMATION  // not for SystemProcessorSpeedInformation !
  1766. {
  1767.     ULONG   MaximumProcessorSpeed;
  1768.     ULONG   CurrentAvailableSpeed;
  1769.     ULONG   ConfiguredSpeedLimit;
  1770.     BOOLEAN PowerLimit;
  1771.     BOOLEAN ThermalLimit;
  1772.     BOOLEAN TurboLimit;
  1773. } SYSTEM_PROCESSOR_SPEED_INFORMATION, *PSYSTEM_PROCESSOR_SPEED_INFORMATION;
  1774.  
  1775. typedef struct _SYSTEM_TIME_ZONE_INFORMATION
  1776. {
  1777.     LONG        Bias;
  1778.     WCHAR       StandardName[32];
  1779.     TIME_FIELDS StandardDate;
  1780.     LONG        StandardBias;
  1781.     WCHAR       DaylightName[32];
  1782.     TIME_FIELDS DaylightDate;
  1783.     LONG        DaylightBias;
  1784. } SYSTEM_TIME_ZONE_INFORMATION, *PSYSTEM_TIME_ZONE_INFORMATION;
  1785.  
  1786. typedef struct _SYSTEM_LOOKASIDE
  1787. {
  1788.     USHORT      Depth;
  1789.     USHORT      MaximumDepth;
  1790.     ULONG       TotalAllocates;
  1791.     ULONG       AllocateMisses;
  1792.     ULONG       TotalFrees;
  1793.     ULONG       FreeMisses;
  1794.     POOL_TYPE   Type;
  1795.     ULONG       Tag;
  1796.     ULONG       Size;
  1797. } SYSTEM_LOOKASIDE, *PSYSTEM_LOOKASIDE;
  1798.  
  1799. typedef struct _SYSTEM_LOOKASIDE_INFORMATION
  1800. {
  1801.     SYSTEM_LOOKASIDE    asl[];
  1802. } SYSTEM_LOOKASIDE_INFORMATION, *PSYSTEM_LOOKASIDE_INFORMATION;
  1803.  
  1804. typedef struct _SYSTEM_SET_TIME_SLIP_EVENT
  1805. {
  1806.     HANDLE  TimeSlipEvent;
  1807. } SYSTEM_SET_TIME_SLIP_EVENT, *PSYSTEM_SET_TIME_SLIP_EVENT;
  1808.  
  1809. typedef struct _SYSTEM_CREATE_SESSION
  1810. {
  1811.     ULONG   Session;
  1812. } SYSTEM_CREATE_SESSION, *PSYSTEM_CREATE_SESSION;
  1813.  
  1814. typedef struct _SYSTEM_DELETE_SESSION
  1815. {
  1816.     ULONG   Session;
  1817. } SYSTEM_DELETE_SESSION, *PSYSTEM_DELETE_SESSION;
  1818.  
  1819. typedef struct _SYSTEM_RANGE_START_INFORMATION
  1820. {
  1821.     PVOID   SystemRangeStart;
  1822. } SYSTEM_RANGE_START_INFORMATION, *PSYSTEM_RANGE_START_INFORMATION;
  1823.  
  1824. NTSYSAPI
  1825. NTSTATUS
  1826. NTAPI
  1827. NtQuerySystemInformation(
  1828.     IN SYSTEMINFOCLASS  SystemInformationClass,
  1829.     OUT PVOID           pSystemInformation,
  1830.     IN ULONG            uSystemInformationLength,
  1831.     OUT PULONG          puReturnLength OPTIONAL
  1832.     );
  1833.  
  1834. NTSYSAPI
  1835. NTSTATUS
  1836. NTAPI
  1837. NtSetSystemInformation(
  1838.     IN SYSTEMINFOCLASS  SystemInformationClass,
  1839.     IN PVOID            pSystemInformation,
  1840.     IN ULONG            uSystemInformationLength
  1841.     );
  1842.  
  1843. // Time functions
  1844. NTSYSAPI
  1845. NTSTATUS
  1846. NTAPI
  1847. NtQuerySystemTime(
  1848.     OUT PLARGE_INTEGER  SystemTime
  1849. );
  1850.  
  1851. NTSYSAPI
  1852. NTSTATUS
  1853. NTAPI
  1854. NtSetSystemTime(
  1855.     IN PLARGE_INTEGER   NewTime,
  1856.     OUT PLARGE_INTEGER  OldTime OPTIONAL
  1857. );
  1858.  
  1859. NTSYSAPI
  1860. VOID
  1861. NTAPI
  1862. RtlTimeToTimeFields(
  1863.     IN PLARGE_INTEGER   pliTime,
  1864.     OUT PTIME_FIELDS    pTimeFields
  1865. );
  1866.  
  1867. NTSYSAPI
  1868. BOOLEAN
  1869. NTAPI
  1870. RtlTimeFieldsToTime(
  1871.     IN  PTIME_FIELDS    pTimeFields,
  1872.     OUT PLARGE_INTEGER  pliTime
  1873. );
  1874.  
  1875. NTSYSAPI
  1876. VOID
  1877. NTAPI
  1878. RtlSecondsSince1970ToTime(
  1879.     IN ULONG            SecondsSince1970,
  1880.     OUT PLARGE_INTEGER  Time
  1881. );
  1882.  
  1883. NTSYSAPI
  1884. VOID
  1885. NTAPI
  1886. RtlTimeToSecondsSince1970(
  1887.     IN PLARGE_INTEGER   Time,
  1888.     OUT PULONG          SecondsSince1970
  1889. );
  1890.  
  1891. // Event functions
  1892. NTSYSAPI
  1893. NTSTATUS
  1894. NTAPI
  1895. NtOpenEvent(
  1896.     PHANDLE             phEvent,
  1897.     ACCESS_MASK         AccessMask,
  1898.     POBJECT_ATTRIBUTES  pObjectAttributes
  1899. );
  1900.  
  1901. NTSYSAPI
  1902. NTSTATUS
  1903. NTAPI
  1904. NtClearEvent(
  1905.     IN HANDLE   hEvent
  1906. );
  1907.  
  1908. NTSYSAPI
  1909. NTSTATUS
  1910. NTAPI
  1911. NtSetEvent(
  1912.     IN HANDLE   hEvent,
  1913.     OUT PLONG   plSignaled OPTIONAL
  1914. );
  1915.  
  1916. NTSYSAPI
  1917. NTSTATUS
  1918. NTAPI
  1919. NtCreateSemaphore(
  1920.     OUT PHANDLE SemaphoreHandle,
  1921.     IN ACCESS_MASK DesiredAccess,
  1922.     IN POBJECT_ATTRIBUTES ObjectAttributes,
  1923.     IN LONG InitialCount,
  1924.     IN LONG MaximumCount
  1925. );
  1926.  
  1927. NTSYSAPI
  1928. NTSTATUS
  1929. NTAPI
  1930. NtOpenSemaphore(
  1931.     OUT PHANDLE SemaphoreHandle,
  1932.     IN ACCESS_MASK DesiredAccess,
  1933.     IN POBJECT_ATTRIBUTES ObjectAttributes
  1934. );
  1935.  
  1936. NTSYSAPI
  1937. NTSTATUS
  1938. NTAPI
  1939. NtReleaseSemaphore(
  1940.     IN HANDLE SemaphoreHandle,
  1941.     IN LONG ReleaseCount,
  1942.     OUT PLONG PreviousCount OPTIONAL
  1943. );
  1944.  
  1945. typedef enum _SEMAPHORE_INFORMATION_CLASS
  1946. {
  1947.     SemaphoreBasicInformation
  1948. } SEMAPHORE_INFORMATION_CLASS;
  1949.  
  1950. NTSYSAPI
  1951. NTSTATUS
  1952. NTAPI
  1953. NtQuerySemaphore(
  1954.     IN HANDLE SemaphoreHandle,
  1955.     IN SEMAPHORE_INFORMATION_CLASS SemaphoreInformationClass,
  1956.     OUT PVOID SemaphoreInformation,
  1957.     IN ULONG SemaphoreInformationLength,
  1958.     OUT PULONG ResultLength OPTIONAL
  1959. );
  1960.  
  1961. typedef struct _SEMAPHORE_BASIC_INFORMATION
  1962. {
  1963.     LONG CurrentCount;
  1964.     LONG MaximumCount;
  1965. } SEMAPHORE_BASIC_INFORMATION, *PSEMAPHORE_BASIC_INFORMATION;
  1966.  
  1967. // Directory and Symbolic Link functions
  1968. NTSYSAPI
  1969. NTSTATUS
  1970. NTAPI
  1971. NtCreateDirectoryObject(
  1972.     OUT PHANDLE             phDirectory,
  1973.     IN ACCESS_MASK          AccessMask,
  1974.     IN POBJECT_ATTRIBUTES   pObjectAttributes
  1975. );
  1976.  
  1977. NTSYSAPI
  1978. NTSTATUS
  1979. NTAPI
  1980. NtOpenDirectoryObject(
  1981.     OUT PHANDLE             DirectoryHandle,
  1982.     IN ACCESS_MASK          DesiredAccess,
  1983.     IN POBJECT_ATTRIBUTES   ObjectAttributes
  1984. );
  1985.  
  1986. typedef struct _DIRECTORY_CONTENTS
  1987. {
  1988.     struct
  1989.     {
  1990.         UNICODE_STRING Name;
  1991.         UNICODE_STRING Type;
  1992.     } Entry[ANYSIZE_ARRAY];
  1993. } DIRECTORY_CONTENTS, *PDIRECTORY_CONTENTS;
  1994.  
  1995. NTSYSAPI
  1996. NTSTATUS
  1997. NTAPI
  1998. NtQueryDirectoryObject(
  1999.     IN HANDLE               DirectoryHandle,
  2000.     OUT PDIRECTORY_CONTENTS Buffer,
  2001.     IN ULONG                Length,
  2002.     IN BOOLEAN              ReturnSingleEntry,
  2003.     IN BOOLEAN              RestartScan,
  2004.     IN OUT PULONG           Index,
  2005.     OUT PULONG              ResultLength OPTIONAL
  2006. );
  2007.  
  2008. NTSYSAPI
  2009. NTSTATUS
  2010. NTAPI
  2011. NtOpenSymbolicLinkObject(
  2012.     OUT PHANDLE             SymbolicLinkHandle,
  2013.     IN ACCESS_MASK          DesiredAccess,
  2014.     IN POBJECT_ATTRIBUTES   ObjectAttributes
  2015. );
  2016.  
  2017. NTSYSAPI
  2018. NTSTATUS
  2019. NTAPI
  2020. NtQuerySymbolicLinkObject(
  2021.     IN HANDLE           SymbolicLinkHandle,
  2022.     OUT PUNICODE_STRING NameString,
  2023.     OUT PULONG          ResultLength OPTIONAL
  2024. );
  2025.  
  2026. // File functions
  2027. NTSYSAPI
  2028. NTSTATUS
  2029. NTAPI
  2030. NtCreateFile(
  2031.     PHANDLE             phFile,
  2032.     ACCESS_MASK         AccessMask,
  2033.     POBJECT_ATTRIBUTES  pObjectAttributes,
  2034.     PIO_STATUS_BLOCK    pIoStatusBlock,
  2035.     PLARGE_INTEGER      pliAllocationSize,
  2036.     ULONG               uFileAttributes,
  2037.     ULONG               uShareAccess,
  2038.     ULONG               uCreateDisposition,
  2039.     ULONG               uCreateOptions,
  2040.     PVOID               pEaBuffer,
  2041.     ULONG               uEaLength
  2042. );
  2043.  
  2044. NTSYSAPI
  2045. NTSTATUS
  2046. NTAPI
  2047. NtOpenFile(
  2048.     PHANDLE             phFile,
  2049.     ACCESS_MASK         AccessMask,
  2050.  
  2051.     POBJECT_ATTRIBUTES  pObjectAttributes,
  2052.     PIO_STATUS_BLOCK    pIoStatusBlock,
  2053.     ULONG               uShareAccess,
  2054.     ULONG               uOpenOptions
  2055. );
  2056.  
  2057. NTSYSAPI
  2058. NTSTATUS
  2059. NTAPI
  2060. NtDeleteFile(
  2061.     IN POBJECT_ATTRIBUTES   pObjectAttributes
  2062. );
  2063.  
  2064. typedef enum _FILE_INFORMATION_CLASS
  2065. {
  2066.     FileDirectoryInformation       = 1,
  2067.     FileFullDirectoryInformation, // 2
  2068.     FileBothDirectoryInformation, // 3
  2069.     FileBasicInformation,         // 4
  2070.     FileStandardInformation,      // 5
  2071.     FileInternalInformation,      // 6
  2072.     FileEaInformation,            // 7
  2073.     FileAccessInformation,        // 8
  2074.     FileNameInformation,          // 9
  2075.     FileRenameInformation,        // 10
  2076.     FileLinkInformation,          // 11
  2077.     FileNamesInformation,         // 12
  2078.     FileDispositionInformation,   // 13
  2079.     FilePositionInformation,      // 14
  2080.     FileFullEaInformation,        // 15
  2081.     FileModeInformation,          // 16
  2082.     FileAlignmentInformation,     // 17
  2083.     FileAllInformation,           // 18
  2084.     FileAllocationInformation,    // 19
  2085.     FileEndOfFileInformation,     // 20
  2086.     FileAlternateNameInformation, // 21
  2087.     FileStreamInformation,        // 22
  2088.     FilePipeInformation,          // 23
  2089.     FilePipeLocalInformation,     // 24
  2090.     FilePipeRemoteInformation,    // 25
  2091.     FileMailslotQueryInformation, // 26
  2092.     FileMailslotSetInformation,   // 27
  2093.     FileCompressionInformation,   // 28
  2094.     FileObjectIdInformation,      // 29
  2095.     FileCompletionInformation,    // 30
  2096.     FileMoveClusterInformation,   // 31
  2097.     FileInformationReserved32,    // 32
  2098.     FileInformationReserved33,    // 33
  2099.     FileNetworkOpenInformation,   // 34
  2100.     FileMaximumInformation
  2101. } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
  2102.  
  2103. NTSYSAPI
  2104. NTSTATUS
  2105. NTAPI
  2106. NtQueryDirectoryFile(
  2107.     IN HANDLE FileHandle,
  2108.     IN HANDLE Event OPTIONAL,
  2109.     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  2110.     IN PVOID ApcContext OPTIONAL,
  2111.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  2112.     OUT PVOID FileInformation,
  2113.     IN ULONG FileInformationLength,
  2114.     IN FILE_INFORMATION_CLASS FileInformationClass,
  2115.     IN BOOLEAN ReturnSingleEntry,
  2116.     IN PUNICODE_STRING FileName OPTIONAL,
  2117.     IN BOOLEAN RestartScan
  2118. );
  2119.  
  2120. typedef struct _FILE_DIRECTORY_INFORMATION
  2121. {
  2122.     ULONG           NextEntryOffset;
  2123.     ULONG           FileIndex;
  2124.     LARGE_INTEGER   CreationTime;
  2125.     LARGE_INTEGER   LastAccessTime;
  2126.     LARGE_INTEGER   LastWriteTime;
  2127.     LARGE_INTEGER   ChangeTime;
  2128.     LARGE_INTEGER   EndOfFile;
  2129.     LARGE_INTEGER   AllocationSize;
  2130.     ULONG           FileAttributes;
  2131.     ULONG           FileNameLength;
  2132.     WCHAR           FileName[1];
  2133. } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
  2134.  
  2135. typedef struct _FILE_FULL_DIR_INFORMATION
  2136. {
  2137.     ULONG           NextEntryOffset;
  2138.     ULONG           FileIndex;
  2139.     LARGE_INTEGER   CreationTime;
  2140.     LARGE_INTEGER   LastAccessTime;
  2141.     LARGE_INTEGER   LastWriteTime;
  2142.     LARGE_INTEGER   ChangeTime;
  2143.     LARGE_INTEGER   EndOfFile;
  2144.     LARGE_INTEGER   AllocationSize;
  2145.     ULONG           FileAttributes;
  2146.     ULONG           FileNameLength;
  2147.     ULONG           EaSize;
  2148.     WCHAR           FileName[1];
  2149. } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
  2150.  
  2151. typedef struct _FILE_BOTH_DIR_INFORMATION
  2152. {
  2153.     ULONG           NextEntryOffset;
  2154.     ULONG           FileIndex;
  2155.     LARGE_INTEGER   CreationTime;
  2156.     LARGE_INTEGER   LastAccessTime;
  2157.     LARGE_INTEGER   LastWriteTime;
  2158.     LARGE_INTEGER   ChangeTime;
  2159.     LARGE_INTEGER   EndOfFile;
  2160.     LARGE_INTEGER   AllocationSize;
  2161.     ULONG           FileAttributes;
  2162.     ULONG           FileNameLength;
  2163.     ULONG           EaSize;
  2164.     CCHAR           ShortNameLength;
  2165.     WCHAR           ShortName[12];
  2166.     WCHAR           FileName[1];
  2167. } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
  2168.  
  2169. typedef struct _FILE_BASIC_INFORMATION
  2170. {                    
  2171.     LARGE_INTEGER   CreationTime;                            
  2172.     LARGE_INTEGER   LastAccessTime;                          
  2173.     LARGE_INTEGER   LastWriteTime;                            
  2174.     LARGE_INTEGER   ChangeTime;                              
  2175.     ULONG           FileAttributes;                                  
  2176. } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;        
  2177.  
  2178. typedef struct _FILE_STANDARD_INFORMATION
  2179. {                
  2180.     LARGE_INTEGER   AllocationSize;                          
  2181.     LARGE_INTEGER   EndOfFile;                                
  2182.     ULONG           NumberOfLinks;                                    
  2183.     BOOLEAN         DeletePending;                                  
  2184.     BOOLEAN         Directory;                                      
  2185. } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;  
  2186.                                                            
  2187. typedef struct _FILE_INTERNAL_INFORMATION
  2188. {
  2189.     LARGE_INTEGER   IndexNumber;
  2190. } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
  2191.  
  2192. typedef struct _FILE_EA_INFORMATION
  2193. {
  2194.     ULONG   EaSize;
  2195. } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
  2196.  
  2197. typedef struct _FILE_ACCESS_INFORMATION
  2198. {
  2199.     ACCESS_MASK AccessFlags;
  2200. } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
  2201.  
  2202. typedef struct _FILE_NAME_INFORMATION
  2203. {
  2204.     ULONG   FileNameLength;
  2205.     WCHAR   FileName[1];
  2206. } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
  2207.  
  2208. typedef struct _FILE_RENAME_INFORMATION
  2209. {
  2210.     BOOLEAN ReplaceIfExists;
  2211.     HANDLE  RootDirectory;
  2212.     ULONG   FileNameLength;
  2213.     WCHAR   FileName[1];
  2214. } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
  2215.  
  2216. typedef struct _FILE_LINK_INFORMATION
  2217. {
  2218.     BOOLEAN ReplaceIfExists;
  2219.     HANDLE  RootDirectory;
  2220.     ULONG   FileNameLength;
  2221.     WCHAR   FileName[1];
  2222. } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
  2223.  
  2224. typedef struct _FILE_NAMES_INFORMATION
  2225. {
  2226.     ULONG   NextEntryOffset;
  2227.     ULONG   FileIndex;
  2228.     ULONG   FileNameLength;
  2229.     WCHAR   FileName[1];
  2230. } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
  2231.  
  2232. typedef struct _FILE_ALLOCATION_INFORMATION
  2233. {
  2234.     LARGE_INTEGER   AllocationSize;
  2235. } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
  2236.  
  2237. typedef struct _FILE_COMPRESSION_INFORMATION
  2238. {
  2239.     LARGE_INTEGER   CompressedFileSize;
  2240.     USHORT          CompressionFormat;
  2241.     UCHAR           CompressionUnitShift;
  2242.     UCHAR           ChunkShift;
  2243.     UCHAR           ClusterShift;
  2244.     UCHAR           Reserved[3];
  2245. } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
  2246.  
  2247. typedef struct _FILE_COMPLETION_INFORMATION
  2248. {
  2249.     HANDLE  Port;
  2250.     ULONG   Key;
  2251. } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
  2252.  
  2253. NTSYSAPI
  2254. NTSTATUS
  2255. NTAPI
  2256. NtQueryInformationFile(
  2257.     IN HANDLE                   FileHandle,
  2258.     OUT PIO_STATUS_BLOCK        IoStatusBlock,
  2259.     OUT PVOID                   FileInformation,
  2260.     IN ULONG                    Length,
  2261.     IN FILE_INFORMATION_CLASS   FileInformationClass
  2262. );
  2263.  
  2264. NTSYSAPI
  2265. NTSTATUS
  2266.  
  2267. NTAPI
  2268. NtDeviceIoControlFile(
  2269.     IN HANDLE               FileHandle,
  2270.     IN HANDLE               Event OPTIONAL,
  2271.     IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  2272.     IN PVOID                ApcContext OPTIONAL,
  2273.     OUT PIO_STATUS_BLOCK    IoStatusBlock,
  2274.     IN ULONG                IoControlCode,
  2275.     IN PVOID                InputBuffer OPTIONAL,
  2276.     IN ULONG                InputBufferLength,
  2277.     OUT PVOID               OutputBuffer OPTIONAL,
  2278.     IN ULONG                OutputBufferLength
  2279. );
  2280.  
  2281. NTSYSAPI
  2282. NTSTATUS
  2283. NTAPI
  2284. NtFsControlFile(
  2285.     IN HANDLE               FileHandle,
  2286.     IN HANDLE               Event OPTIONAL,
  2287.     IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  2288.     IN PVOID                ApcContext OPTIONAL,
  2289.     OUT PIO_STATUS_BLOCK    IoStatusBlock,
  2290.     IN ULONG                FsControlCode,
  2291.     IN PVOID                InputBuffer OPTIONAL,
  2292.     IN ULONG                InputBufferLength,
  2293.     OUT PVOID               OutputBuffer OPTIONAL,
  2294.     IN ULONG                OutputBufferLength
  2295. );
  2296.  
  2297. NTSYSAPI
  2298. NTSTATUS
  2299. NTAPI
  2300. NtQueryVolumeInformationFile(
  2301.     IN HANDLE               FileHandle,
  2302.     OUT PIO_STATUS_BLOCK    IoStatusBlock,
  2303.     OUT PVOID               FsInformation,
  2304.     IN ULONG                Length,
  2305.     IN FS_INFORMATION_CLASS FsInformationClass
  2306. );
  2307.  
  2308. NTSYSAPI
  2309. NTSTATUS
  2310. NTAPI
  2311. NtFlushBuffersFile(
  2312.     IN HANDLE               FileHandle,
  2313.     OUT PIO_STATUS_BLOCK    IoStatusBlock
  2314. );
  2315.  
  2316. // Process functions
  2317. #define NtCurrentProcess()              ((HANDLE) -1)
  2318.  
  2319. NTSYSAPI
  2320. NTSTATUS
  2321. NTAPI
  2322. NtOpenProcess(
  2323.     OUT PHANDLE             phProcess,
  2324.     IN ACCESS_MASK          AccessMask,
  2325.     IN POBJECT_ATTRIBUTES   pObjectAttributes,
  2326.     IN PCLIENT_ID           pClientId
  2327. );
  2328.  
  2329. NTSYSAPI
  2330. NTSTATUS
  2331. NTAPI
  2332. NtCreateProcess(
  2333.     OUT PHANDLE ProcessHandle,
  2334.     IN ACCESS_MASK DesiredAccess,
  2335.     IN POBJECT_ATTRIBUTES ObjectAttributes,
  2336.     IN HANDLE InheritFromProcessHandle,
  2337.     IN BOOLEAN InheritHandles,
  2338.     IN HANDLE SectionHandle OPTIONAL,
  2339.     IN HANDLE DebugPort OPTIONAL,
  2340.     IN HANDLE ExceptionPort OPTIONAL
  2341. );
  2342.  
  2343. typedef enum _PROCESSINFOCLASS
  2344. {
  2345.     ProcessBasicInformation,
  2346.     ProcessQuotaLimits,         // QUOTA_LIMITS
  2347.     ProcessIoCounters,          // IOCOUNTERS
  2348.     ProcessVmCounters,          // VM_COUNTERS
  2349.     ProcessTimes,               // KERNEL_USER_TIMES
  2350.     ProcessBasePriority,        // BASE_PRIORITY_INFORMATION
  2351.     ProcessRaisePriority,
  2352.     ProcessDebugPort,
  2353.     ProcessExceptionPort,
  2354.     ProcessAccessToken,
  2355.     ProcessLdtInformation,
  2356.     ProcessLdtSize,
  2357.     ProcessDefaultHardErrorMode,
  2358.     ProcessIoPortHandlers,          // Note: this is kernel mode only
  2359.     ProcessPooledUsageAndLimits,
  2360.     ProcessWorkingSetWatch,
  2361.     ProcessUserModeIOPL,
  2362.     ProcessEnableAlignmentFaultFixup,
  2363.     ProcessPriorityClass,
  2364.     ProcessWx86Information,
  2365.     ProcessHandleCount,
  2366.     ProcessAffinityMask,        // AFFINITY_MASK
  2367.     ProcessPriorityBoost,
  2368.     ProcessDeviceMap,
  2369.     ProcessSessionInformation,
  2370.     ProcessForegroundInformation,
  2371.     ProcessWow64Information,
  2372.     MaxProcessInfoClass
  2373. } PROCESSINFOCLASS;
  2374.  
  2375. typedef struct _PROCESS_BASIC_INFORMATION
  2376. {
  2377.     NTSTATUS    ExitStatus;
  2378.     PPEB        PebBaseAddress;
  2379.     KAFFINITY   AffinityMask;
  2380.     KPRIORITY   BasePriority;
  2381.     ULONG       uUniqueProcessId;
  2382.     ULONG       uInheritedFromUniqueProcessId;
  2383. } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
  2384.  
  2385. typedef struct _PROCESS_RAISE_PRIORITY
  2386. {
  2387.     KPRIORITY   RaisePriority;
  2388. } PROCESS_RAISE_PRIORITY, *PPROCESS_RAISE_PRIORITY;
  2389.  
  2390. typedef struct _PROCESS_DEBUG_PORT_INFORMATION
  2391. {
  2392.     HANDLE  DebugPort;
  2393. } PROCESS_DEBUG_PORT_INFORMATION, *PPROCESS_DEBUG_PORT_INFORMATION;
  2394.  
  2395. typedef struct _PROCESS_EXCEPTION_PORT
  2396. {
  2397.     HANDLE  ExceptionPort;
  2398. } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;
  2399.  
  2400. typedef struct _PROCESS_ACCESS_TOKEN
  2401. {
  2402.     HANDLE  Token;
  2403.     HANDLE  Thread;
  2404. } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
  2405.  
  2406. #ifndef _LDT_ENTRY_DEFINED
  2407. #define _LDT_ENTRY_DEFINED
  2408.  
  2409. typedef struct _LDT_ENTRY
  2410. {
  2411.     USHORT  LimitLow;
  2412.     USHORT  BaseLow;
  2413.     union
  2414.     {
  2415.         struct
  2416.         {
  2417.             UCHAR   BaseMid;
  2418.             UCHAR   Flags1;     // Declare as bytes to avoid alignment
  2419.             UCHAR   Flags2;     // Problems.
  2420.             UCHAR   BaseHi;
  2421.         } Bytes;
  2422.  
  2423.         struct
  2424.         {
  2425.             ULONG   BaseMid : 8;
  2426.             ULONG   Type : 5;
  2427.             ULONG   Dpl : 2;
  2428.             ULONG   Pres : 1;
  2429.             ULONG   LimitHi : 4;
  2430.             ULONG   Sys : 1;
  2431.             ULONG   Reserved_0 : 1;
  2432.             ULONG   Default_Big : 1;
  2433.             ULONG   Granularity : 1;
  2434.             ULONG   BaseHi : 8;
  2435.         } Bits;
  2436.     } HighWord;
  2437. } LDT_ENTRY, *PLDT_ENTRY;
  2438.  
  2439. #endif
  2440.  
  2441. #define LDT_TABLE_SIZE  (8 * 1024 * sizeof(LDT_ENTRY))
  2442.  
  2443. typedef struct _LDT_INFORMATION
  2444. {
  2445.     ULONG       Start;
  2446.     ULONG       Length;
  2447.     LDT_ENTRY   LdtEntries[1];
  2448. } PROCESS_LDT_INFORMATION, *PPROCESS_LDT_INFORMATION;
  2449.  
  2450. typedef struct _LDT_SIZE
  2451. {
  2452.     ULONG   Length;
  2453. } PROCESS_LDT_SIZE, *PPROCESS_LDT_SIZE;
  2454.  
  2455. typedef struct _PROCESS_DEFAULT_HARDERROR_MODE_INFORMATION
  2456. {
  2457.     ULONG   HardErrorMode;  // SEM_* (SEM_FAILCRITICALERRORS, etc.)
  2458. } PROCESS_DEFAULT_HARDERROR_MODE_INFORMATION, *PPROCESS_DEFAULT_HARDERROR_MODE_INFORMATION;
  2459.  
  2460. typedef struct _PROCESS_POOLED_USAGE_AND_LIMITS_INFORMATION
  2461. {
  2462.     ULONG   PeakPagedPoolUsage;
  2463.     ULONG   PagedPoolUsage;
  2464.     ULONG   PagedPoolLimit;
  2465.     ULONG   PeakNonPagedPoolUsage;
  2466.     ULONG   NonPagedPoolUsage;
  2467.     ULONG   NonPagedPoolLimit;
  2468.     ULONG   PeakPagefileUsage;
  2469.     ULONG   PagefileUsage;
  2470.     ULONG   PagefileLimit;
  2471. } PROCESS_POOLED_USAGE_AND_LIMITS_INFORMATION, *PPROCESS_POOLED_USAGE_AND_LIMITS_INFORMATION;
  2472.  
  2473. typedef struct _PROCESS_WS_WATCH_INFORMATION
  2474. {
  2475.     PVOID   FaultingPc;
  2476.     PVOID   FaultingVa;
  2477. } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
  2478.  
  2479. typedef struct _PROCESS_IOPL
  2480. {
  2481.     ULONG   Iopl;
  2482. } PROCESS_IOPL, *PPROCESS_IOPL;
  2483.  
  2484. typedef struct _PROCESS_ALLIGNMENT_FAULT_FIXUP
  2485. {
  2486.     BOOLEAN EnableAllignmentFaultFixup;
  2487. } PROCESS_ALLIGNMENT_FAULT_FIXUP, *PPROCESS_ALLIGNMENT_FAULT_FIXUP;
  2488.  
  2489. #define KRNL_NORMAL_PRIORITY_CLASS       0x02
  2490. #define KRNL_IDLE_PRIORITY_CLASS         0x01
  2491. #define KRNL_HIGH_PRIORITY_CLASS         0x03
  2492. #define KRNL_REALTIME_PRIORITY_CLASS     0x04
  2493.  
  2494. typedef struct _PROCESS_PRIORITY_CLASS_INFORMATION
  2495. {
  2496.     UCHAR   Unknown;
  2497.     UCHAR   PriorityClass;
  2498. } PROCESS_PRIORITY_CLASS_INFORMATION, *PPROCESS_PRIORITY_CLASS_INFORMATION;
  2499.  
  2500. typedef struct _PROCESS_X86_INFORMATION
  2501. {
  2502.     ULONG   x86Info;
  2503. } PROCESS_X86_INFORMATION, *PPROCESS_X86_INFORMATION;
  2504.  
  2505. typedef struct _PROCESS_HANDLE_COUNT_INFORMATION
  2506. {
  2507.     ULONG   HandleCount;
  2508. } PROCESS_HANDLE_COUNT_INFORMATION, *PPROCESS_HANDLE_COUNT_INFORMATION;
  2509.  
  2510. typedef struct _PROCESS_PRIORITY_BOOST_INFORMATION
  2511. {
  2512.     ULONG   PriorityBoostEnabled;
  2513. } PROCESS_PRIORITY_BOOST_INFORMATION, *PPROCESS_PRIORITY_BOOST_INFORMATION;
  2514.  
  2515. typedef struct _PROCESS_DEVICE_MAP_INFORMATION
  2516. {
  2517.     union
  2518.     {
  2519.         struct
  2520.         {
  2521.             HANDLE  DirectoryHandle;
  2522.         } Set;
  2523.  
  2524.         struct
  2525.         {
  2526.             ULONG   DriveMap;
  2527.             UCHAR   DriveType[32];
  2528.         } Query;
  2529.     };
  2530.  
  2531. } PROCESS_DEVICE_MAP_INFORMATION, *PPROCESS_DEVICE_MAP_INFORMATION;
  2532.  
  2533. typedef struct _PROCESS_SESSION_INFORMATION
  2534. {
  2535.     ULONG   SessionId;
  2536. } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
  2537.  
  2538. NTSYSAPI
  2539. NTSTATUS
  2540. NTAPI
  2541. NtQueryInformationProcess(
  2542.     IN HANDLE           hProcess,
  2543.     IN PROCESSINFOCLASS ProcessInformationClass,
  2544.     OUT PVOID           pProcessInformation,
  2545.     IN ULONG            uProcessInformationLength,
  2546.     OUT PULONG          puReturnLength OPTIONAL
  2547. );
  2548.  
  2549. NTSYSAPI
  2550. NTSTATUS
  2551. NTAPI
  2552. NtSetInformationProcess(
  2553.     IN HANDLE           hProcess,
  2554.     IN PROCESSINFOCLASS ProcessInformationClass,
  2555.     OUT PVOID           pProcessInformation,
  2556.     IN ULONG            uProcessInformationLength
  2557. );
  2558.  
  2559. NTSTATUS
  2560. NTAPI
  2561. RtlCreateProcessParameters(
  2562.     OUT PPROCESS_PARAMETERS *ProcessParameters,
  2563.     IN PUNICODE_STRING ImageFile,
  2564.     IN PUNICODE_STRING DllPath OPTIONAL,
  2565.     IN PUNICODE_STRING CurrentDirectory OPTIONAL,
  2566.     IN PUNICODE_STRING CommandLine OPTIONAL,
  2567.     IN ULONG CreationFlags,
  2568.     IN PUNICODE_STRING WindowTitle OPTIONAL,
  2569.     IN PUNICODE_STRING Desktop OPTIONAL,
  2570.     IN PUNICODE_STRING Reserved OPTIONAL,
  2571.     IN PUNICODE_STRING Reserved2 OPTIONAL
  2572. );
  2573.  
  2574. NTSTATUS
  2575. NTAPI
  2576. RtlDestroyProcessParameters(
  2577.     IN PPROCESS_PARAMETERS ProcessParameters
  2578. );
  2579.  
  2580. // Thread functions
  2581. #define NtCurrentThread()               ((HANDLE) -2)
  2582.  
  2583. typedef struct _USER_STACK
  2584. {
  2585.     PVOID   FixedStackBase;
  2586.     PVOID   FixedStackLimit;
  2587.     PVOID   ExpandableStackBase;
  2588.     PVOID   ExpandableStackLimit;
  2589.     PVOID   ExpandableStackBottom;
  2590. } USER_STACK, *PUSER_STACK;
  2591.  
  2592. NTSYSAPI
  2593. NTSTATUS
  2594. NTAPI
  2595. NtCreateThread(
  2596.     OUT PHANDLE             ThreadHandle,
  2597.     IN ACCESS_MASK          DesiredAccess,
  2598.     IN POBJECT_ATTRIBUTES   ObjectAttributes,
  2599.     IN HANDLE               ProcessHandle,
  2600.     OUT PCLIENT_ID          ClientId,
  2601.     IN PCONTEXT             ThreadContext,
  2602.     IN PUSER_STACK          UserStack,
  2603.     IN BOOLEAN              CreateSuspended
  2604. );
  2605.  
  2606. NTSYSAPI
  2607. NTSTATUS
  2608. NTAPI
  2609. NtOpenThread(
  2610.     OUT PHANDLE             phThread,
  2611.     IN ACCESS_MASK          AccessMask,
  2612.     IN POBJECT_ATTRIBUTES   pObjectAttributes,
  2613.     IN PCLIENT_ID           pClientId
  2614. );
  2615.  
  2616. NTSYSAPI
  2617. NTSTATUS
  2618. NTAPI
  2619. NtTerminateThread(
  2620.     IN HANDLE   ThreadHandle OPTIONAL,
  2621.     IN NTSTATUS ExitStatus
  2622. );
  2623.  
  2624. NTSYSAPI
  2625. NTSTATUS
  2626. NTAPI
  2627. NtSuspendThread(
  2628.     IN HANDLE   ThreadHandle,
  2629.     OUT PULONG  PreviousSuspendCount OPTIONAL
  2630. );
  2631.  
  2632. NTSYSAPI
  2633. NTSTATUS
  2634. NTAPI
  2635. NtResumeThread(
  2636.     IN HANDLE   ThreadHandle,
  2637.     OUT PULONG  PreviousSuspendCount OPTIONAL
  2638. );
  2639.  
  2640. typedef enum _THREADINFOCLASS
  2641. {
  2642.     ThreadBasicInformation,
  2643.     ThreadTimes,                // KERNEL_USER_TIMES
  2644.     ThreadPriority,
  2645.     ThreadBasePriority,         // BASE_PRIORITY_INFORMATION
  2646.     ThreadAffinityMask,         // AFFINITY_MASK
  2647.     ThreadImpersonationToken,
  2648.     ThreadDescriptorTableEntry,
  2649.     ThreadEnableAlignmentFaultFixup,
  2650.     ThreadEventPair,
  2651.     ThreadQuerySetWin32StartAddress,
  2652.     ThreadZeroTlsCell,
  2653.     ThreadPerformanceCount,
  2654.     ThreadAmILastThread,
  2655.     ThreadIdealProcessor,
  2656.     ThreadPriorityBoost,
  2657.     ThreadSetTlsArrayAddress,
  2658.     ThreadIsIoPending,          // W2K
  2659.     ThreadHideFromDebugger,     // W2K
  2660.     MaxThreadInfoClass
  2661. } THREADINFOCLASS;
  2662.  
  2663. typedef struct _THREAD_BASIC_INFORMATION
  2664. {
  2665.     NTSTATUS    ExitStatus;
  2666.     PTEB        TebBaseAddress;
  2667.     CLIENT_ID   ClientId;
  2668.     KAFFINITY   AffinityMask;
  2669.     KPRIORITY   Priority;
  2670.     KPRIORITY   BasePriority;
  2671. } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
  2672.  
  2673. typedef struct _THREAD_PRIORITY
  2674. {
  2675.     KPRIORITY   Priority;
  2676. } THREAD_PRIORITY, *PTHREAD_PRIORITY;
  2677.  
  2678. typedef struct _THREAD_DESCRIPTOR_TABLE_ENTRY_INFORMATION
  2679. {
  2680.     ULONG       Selector;
  2681.     LDT_ENTRY   Descriptor;
  2682. } THREAD_DESCRIPTOR_TABLE_ENTRY_INFORMATION, *PTHREAD_DESCRIPTOR_TABLE_ENTRY_INFORMATION;
  2683.  
  2684. typedef struct _THREAD_EVENTPAIR
  2685. {
  2686.     HANDLE  EventPair;
  2687. } THREAD_EVENTPAIR, *PTHREAD_EVENTPAIR;
  2688.  
  2689. typedef struct _THREAD_WIN32_START_ADDRESS_INFORMATION
  2690. {
  2691.     PVOID   Win32StartAddress;
  2692. } THREAD_WIN32_START_ADDRESS_INFORMATION, *PTHREAD_WIN32_START_ADDRESS_INFORMATION;
  2693.  
  2694. typedef struct _THREAD_ZERO_TLSCELL
  2695. {
  2696.     ULONG   TlsIndex;
  2697. } THREAD_ZERO_TLSCELL, *PTHREAD_ZERO_TLSCELL;
  2698.  
  2699. typedef struct _THREAD_PERFORMANCE_COUNTER_INFORMATION
  2700. {
  2701.     ULONG   Count1;
  2702.     ULONG   Count2;
  2703. } THREAD_PERFORMANCE_COUNTER_INFORMATION, *PTHREAD_PERFORMANCE_COUNTER_INFORMATION;
  2704.  
  2705. typedef struct _THREAD_AMI_LAST_THREAD
  2706. {
  2707.     ULONG   AmILastThread;
  2708. } THREAD_AMI_LAST_THREAD, *PTHREAD_AMI_LAST_THREAD;
  2709.  
  2710. typedef struct _THREAD_IDEAL_PROCESSOR
  2711. {
  2712.     ULONG   IdealProcessor;
  2713. } THREAD_IDEAL_PROCESSOR, *PTHREAD_IDEAL_PROCESSOR;
  2714.  
  2715. typedef struct _THREAD_TLS_ARRAY
  2716. {
  2717.     PULONG  TlsArray;
  2718. } THREAD_TLS_ARRAY, *PTHREAD_TLS_ARRAY;
  2719.  
  2720. typedef struct _THREAD_IS_IO_PENDING_INFORMATION
  2721. {
  2722.     ULONG   IsIOPending;
  2723. } THREAD_IS_IO_PENDING_INFORMATION, *PTHREAD_IS_IO_PENDING_INFORMATION;
  2724.  
  2725. typedef struct _THREAD_HIDE_FROM_DEBUGGER
  2726. {
  2727.     ULONG   HideFromDebugger;
  2728. } THREAD_HIDE_FROM_DEBUGGER, *PTHREAD_HIDE_FROM_DEBUGGER;
  2729.  
  2730. NTSYSAPI
  2731. NTSTATUS
  2732. NTAPI
  2733. NtQueryInformationThread(
  2734.     IN HANDLE           hThread,
  2735.     IN THREADINFOCLASS  ThreadInformationClass,
  2736.     OUT PVOID           pThreadInformation,
  2737.     IN ULONG            uThreadInformationLength,
  2738.     OUT PULONG          puReturnLength OPTIONAL
  2739. );
  2740.  
  2741. NTSYSAPI
  2742. NTSTATUS
  2743. NTAPI
  2744. NtSetInformationThread(
  2745.     IN HANDLE           hThread,
  2746.     IN THREADINFOCLASS  ThreadInformationClass,
  2747.     OUT PVOID           pThreadInformation,
  2748.     IN ULONG            uthreadInformationLength
  2749. );
  2750.  
  2751. NTSYSAPI
  2752. NTSTATUS
  2753. NTAPI
  2754. NtOpenThreadToken(
  2755.     IN HANDLE   hThread,
  2756.     IN ACCESS_MASK  DesiredAccess,
  2757.     IN BOOLEAN      bOpenAsSelf,
  2758.     OUT PHANDLE     phToken
  2759. );
  2760.  
  2761. NTSYSAPI
  2762. NTSTATUS
  2763. NTAPI
  2764. NtImpersonateThread(
  2765.     IN HANDLE                       ThreadHandle,
  2766.     IN HANDLE                       TargetThreadHandle,
  2767.     IN PSECURITY_QUALITY_OF_SERVICE SecurityQos
  2768. );
  2769.  
  2770. NTSYSAPI
  2771. NTSTATUS
  2772. NTAPI
  2773. NtGetContextThread(
  2774.     IN HANDLE       ThreadHandle,
  2775.     OUT PCONTEXT    Context
  2776. );
  2777.  
  2778. NTSYSAPI
  2779. NTSTATUS
  2780. NTAPI
  2781. NtSetContextThread(
  2782.     IN HANDLE   ThreadHandle,
  2783.     IN PCONTEXT Context
  2784. );
  2785.  
  2786. NTSYSAPI
  2787. NTSTATUS
  2788. NTAPI
  2789. NtQueueApcThread(
  2790.     IN HANDLE           ThreadHandle,
  2791.     IN PKNORMAL_ROUTINE ApcRoutine,
  2792.     IN PVOID ApcContext OPTIONAL,
  2793.     IN PVOID Argument1  OPTIONAL,
  2794.     IN PVOID Argument2  OPTIONAL
  2795. );
  2796.  
  2797. NTSYSAPI
  2798. NTSTATUS
  2799. NTAPI
  2800. NtImpersonateAnonymousToken(
  2801.     IN HANDLE   hThread
  2802. );
  2803.  
  2804. NTSYSAPI
  2805. NTSTATUS
  2806. NTAPI
  2807. NtCreateSection(
  2808.     OUT PHANDLE SectionHandle,
  2809.     IN ACCESS_MASK DesiredAccess,
  2810.     IN POBJECT_ATTRIBUTES ObjectAttributes,
  2811.     IN PLARGE_INTEGER SectionSize OPTIONAL,
  2812.     IN ULONG Protect,
  2813.     IN ULONG Attributes,
  2814.     IN HANDLE FileHandle
  2815. );
  2816.  
  2817. NTSYSAPI
  2818. NTSTATUS
  2819. NTAPI
  2820. NtOpenSection(
  2821.     OUT PHANDLE             SectionHandle,
  2822.     IN ACCESS_MASK          DesiredAccess,
  2823.     IN POBJECT_ATTRIBUTES   ObjectAttributes
  2824. );
  2825.  
  2826. typedef enum _SECTION_INFORMATION_CLASS
  2827. {
  2828.     SectionBasicInformation,
  2829.     SectionImageInformation
  2830. } SECTION_INFORMATION_CLASS;
  2831.  
  2832. NTSYSAPI
  2833. NTSTATUS
  2834. NTAPI
  2835. NtQuerySection(
  2836.     IN HANDLE SectionHandle,
  2837.     IN SECTION_INFORMATION_CLASS SectionInformationClass,
  2838.     OUT PVOID SectionInformation,
  2839.     IN ULONG SectionInformationLength,
  2840.     OUT PULONG ResultLength OPTIONAL
  2841. );
  2842.  
  2843. typedef struct _SECTION_BASIC_INFORMATION
  2844. {
  2845.     PVOID           BaseAddress;
  2846.     ULONG           Attributes;
  2847.     LARGE_INTEGER   Size;
  2848. } SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;
  2849.  
  2850. typedef struct _SECTION_IMAGE_INFORMATION
  2851. {
  2852.     PVOID   EntryPoint;
  2853.     ULONG   Unknown1;
  2854.     ULONG   StackReserve;
  2855.     ULONG   StackCommit;
  2856.     ULONG   Subsystem;
  2857.     USHORT  MinorSubsystemVersion;
  2858.     USHORT  MajorSubsystemVersion;
  2859.     ULONG   Unknown2;
  2860.     ULONG   Characteristics;
  2861.     USHORT  ImageNumber;
  2862.     BOOLEAN Executable;
  2863.     UCHAR   Unknown3;
  2864.     ULONG   Unknown4[3];
  2865. } SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;
  2866.  
  2867. NTSYSAPI
  2868. NTSTATUS
  2869. NTAPI
  2870. NtExtendSection(
  2871.     IN HANDLE SectionHandle,
  2872.     IN PLARGE_INTEGER SectionSize
  2873. );
  2874.  
  2875. typedef enum _SECTION_INHERIT
  2876. {
  2877.     ViewShare = 1,
  2878.     ViewUnmap = 2
  2879. } SECTION_INHERIT;
  2880.  
  2881. NTSYSAPI
  2882. NTSTATUS
  2883. NTAPI
  2884. NtMapViewOfSection(
  2885.     HANDLE SectionHandle,
  2886.     HANDLE ProcessHandle,
  2887.     PVOID *BaseAddress,
  2888.     ULONG ZeroBits,
  2889.     ULONG CommitSize,
  2890.     PLARGE_INTEGER SectionOffset,
  2891.     PSIZE_T ViewSize,
  2892.     SECTION_INHERIT InheritDisposition,
  2893.     ULONG AllocationType,
  2894.     ULONG Protect
  2895. );
  2896.  
  2897. NTSYSAPI
  2898. NTSTATUS
  2899. NTAPI
  2900. NtUnmapViewOfSection(
  2901.     IN HANDLE   hProcess,
  2902.     IN PVOID    pBaseAddress
  2903. );
  2904.  
  2905. NTSYSAPI
  2906. NTSTATUS
  2907. NTAPI
  2908. NtWaitForSingleObject(
  2909.     IN HANDLE           hObject,
  2910.     IN BOOL             fAlertable,
  2911.     IN PLARGE_INTEGER   pliTimeout   // NULL = infinite
  2912. );
  2913.  
  2914. // Object functions
  2915. typedef enum _OBJECT_INFORMATION_CLASS
  2916. {
  2917.     ObjectBasicInformation,             // 0    Y       N
  2918.     ObjectNameInformation,              // 1    Y       N
  2919.     ObjectTypeInformation,              // 2    Y       N
  2920.     ObjectAllTypesInformation,          // 3    Y       N
  2921.     ObjectHandleInformation             // 4    Y       Y
  2922. } OBJECT_INFORMATION_CLASS;
  2923.  
  2924. typedef struct _OBJECT_BASIC_INFORMATION
  2925. {
  2926.     ULONG           Attributes;
  2927.     ACCESS_MASK     GrantedAccess;
  2928.     ULONG           HandleCount;
  2929.     ULONG           PointerCount;
  2930.     ULONG           PagedPoolUsage;
  2931.     ULONG           NonPagedPoolUsage;
  2932.     ULONG           Reserved[3];
  2933.     ULONG           NameInformationLength;
  2934.     ULONG           TypeInformationLength;
  2935.     ULONG           SecurityDescriptorLength;
  2936.     LARGE_INTEGER   CreateTime;
  2937. } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
  2938.  
  2939. typedef struct _OBJECT_NAME_INFORMATION
  2940. {              
  2941.     UNICODE_STRING  Name;                                
  2942. } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;  
  2943.  
  2944. typedef struct _OBJECT_TYPE_INFORMATION
  2945. {
  2946.     UNICODE_STRING  Name;
  2947.     ULONG           ObjectCount;
  2948.     ULONG           HandleCount;
  2949.     ULONG           Reserved1[4];
  2950.     ULONG           PeakObjectCount;
  2951.     ULONG           PeakHandleCount;
  2952.     ULONG           Reserved2[4];
  2953.     ULONG           InvalidAttributes;
  2954.     GENERIC_MAPPING GenericMapping;
  2955.     ULONG           ValidAccess;
  2956.     UCHAR           Unknown;
  2957.     BOOLEAN         MaintainHandleDatabase;
  2958.     UCHAR           Reserved3[2];
  2959.     POOL_TYPE       PoolType;
  2960.     ULONG           PagedPoolUsage;
  2961.     ULONG           NonPagedPoolUsage;
  2962. } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
  2963.  
  2964. typedef struct _OBJECT_ALL_TYPES_INFORMATION
  2965. {
  2966.     ULONG                   NumberOfTypes;
  2967.     OBJECT_TYPE_INFORMATION TypeInformation;
  2968. } OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION;
  2969.  
  2970. typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION
  2971. {
  2972.     BOOLEAN Inherit;
  2973.     BOOLEAN ProtectFromClose;
  2974. } OBJECT_HANDLE_ATTRIBUTE_INFORMATION, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION;
  2975.  
  2976. NTSYSAPI
  2977. NTSTATUS
  2978. NTAPI
  2979. NtQueryObject(
  2980.     IN HANDLE ObjectHandle,
  2981.     IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
  2982.     OUT PVOID ObjectInformation,
  2983.     IN ULONG ObjectInformationLength,
  2984.     OUT PULONG ReturnLength OPTIONAL
  2985. );
  2986.  
  2987. NTSYSAPI
  2988. NTSTATUS
  2989. NTAPI
  2990. NtSetInformationObject(
  2991.     IN HANDLE ObjectHandle,
  2992.     IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
  2993.     IN PVOID ObjectInformation,
  2994.     IN ULONG ObjectInformationLength
  2995. );
  2996.  
  2997. NTSYSAPI
  2998. NTSTATUS
  2999. NTAPI
  3000. NtDuplicateObject(
  3001.     IN HANDLE SourceProcessHandle,
  3002.     IN HANDLE SourceHandle,
  3003.     IN HANDLE TargetProcessHandle OPTIONAL,
  3004.     OUT PHANDLE TargetHandle OPTIONAL,
  3005.     IN ACCESS_MASK DesiredAccess,
  3006.     IN ULONG HandleAttributes,
  3007.     IN ULONG Options
  3008. );
  3009.  
  3010. NTSYSAPI
  3011. NTSTATUS
  3012. NTAPI
  3013. NtQuerySecurityObject(
  3014.     IN HANDLE FileHandle,
  3015.     IN SECURITY_INFORMATION SecurityInformation,
  3016.     OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  3017.     IN ULONG Length,
  3018.     OUT PULONG ResultLength
  3019. );
  3020.  
  3021. NTSYSAPI
  3022. NTSTATUS
  3023. NTAPI
  3024. NtSetSecurityObject(
  3025.     IN HANDLE FileHandle,
  3026.     IN SECURITY_INFORMATION SecurityInformation,
  3027.     IN PSECURITY_DESCRIPTOR SecurityDescriptor
  3028. );
  3029.  
  3030. // Memory management functions
  3031. NTSYSAPI
  3032. NTSTATUS
  3033. NTAPI
  3034. NtAllocateVirtualMemory(
  3035.     IN HANDLE ProcessHandle,
  3036.     IN OUT PVOID *BaseAddress,
  3037.     IN ULONG ZeroBits,
  3038.     IN OUT PULONG AllocationSize,
  3039.     IN ULONG AllocationType,
  3040.     IN ULONG Protect
  3041. );
  3042.  
  3043. typedef enum _MEMORY_INFORMATION_CLASS
  3044. {
  3045.     MemoryBasicInformation,
  3046.     MemoryWorkingSetList,
  3047.     MemorySectionName,
  3048.     MemoryBasicVlmInformation
  3049. } MEMORY_INFORMATION_CLASS;
  3050.  
  3051. NTSYSAPI
  3052. NTSTATUS
  3053. NTAPI
  3054. NtQueryVirtualMemory(
  3055.     IN HANDLE ProcessHandle,
  3056.     IN PVOID BaseAddress,
  3057.     IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
  3058.     OUT PVOID MemoryInformation,
  3059.     IN ULONG MemoryInformationLength,
  3060.     OUT PULONG ReturnLength OPTIONAL
  3061. );
  3062.  
  3063. /* Defined in Winnt.h
  3064. typedef struct _MEMORY_BASIC_INFORMATION
  3065. {
  3066.     PVOID   BaseAddress;
  3067.     PVOID   AllocationBase;
  3068.     ULONG   AllocationProtect;
  3069.     ULONG   RegionSize;
  3070.     ULONG   State;
  3071.     ULONG   Protect;
  3072.     ULONG   Type;
  3073. } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
  3074. */
  3075.  
  3076. typedef struct _MEMORY_WORKING_SET_LIST
  3077. {
  3078.     ULONG   NumberOfPages;
  3079.     ULONG   WorkingSetList[1];
  3080. } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;
  3081.  
  3082. typedef struct _MEMORY_SECTION_NAME
  3083. {
  3084.     UNICODE_STRING  SectionFileName;
  3085. } MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;
  3086.  
  3087. NTSYSAPI
  3088. NTSTATUS
  3089. NTAPI
  3090. NtReadVirtualMemory(
  3091.     IN HANDLE ProcessHandle,
  3092.     IN PVOID BaseAddress,
  3093.     OUT PVOID Buffer,
  3094.     IN ULONG BufferLength,
  3095.     OUT PULONG ReturnLength OPTIONAL
  3096. );
  3097.  
  3098. NTSYSAPI
  3099. NTSTATUS
  3100. NTAPI
  3101. NtWriteVirtualMemory(
  3102.     IN HANDLE ProcessHandle,
  3103.     IN PVOID BaseAddress,
  3104.     IN PVOID Buffer,
  3105.     IN ULONG BufferLength,
  3106.     OUT PULONG ReturnLength OPTIONAL
  3107. );
  3108.  
  3109. NTSYSAPI
  3110. NTSTATUS
  3111. NTAPI
  3112. NtProtectVirtualMemory(
  3113.     IN HANDLE ProcessHandle,
  3114.     IN OUT PVOID *BaseAddress,
  3115.     IN OUT PULONG ProtectSize,
  3116.     IN ULONG NewProtect,
  3117.     OUT PULONG OldProtect
  3118. );
  3119.  
  3120. NTSYSAPI
  3121. NTSTATUS
  3122. NTAPI
  3123. NtFlushVirtualMemory(
  3124.     IN HANDLE ProcessHandle,
  3125.     IN OUT PVOID *BaseAddress,
  3126.     IN OUT PULONG FlushSize,
  3127.     OUT PIO_STATUS_BLOCK IoStatusBlock
  3128. );
  3129.  
  3130. // Ldr Functions
  3131. NTSYSAPI
  3132. NTSTATUS
  3133. NTAPI
  3134. LdrDisableThreadCalloutsForDll(
  3135.     IN HANDLE hModule
  3136. );
  3137.  
  3138. // Rtl String Functions
  3139. NTSYSAPI
  3140. VOID
  3141. NTAPI
  3142. RtlInitUnicodeString (
  3143.     OUT PUNICODE_STRING DestinationString,
  3144.     IN PCWSTR SourceString
  3145.     );
  3146.  
  3147. NTSYSAPI
  3148. VOID
  3149. NTAPI
  3150. RtlCreateUnicodeString(
  3151.     OUT PUNICODE_STRING AllocatedString,
  3152.     IN PCWSTR SourceString
  3153.     );
  3154.  
  3155. NTSYSAPI
  3156. VOID
  3157. NTAPI
  3158. RtlFreeUnicodeString(
  3159.     IN PUNICODE_STRING UnicodeString
  3160.     );
  3161.  
  3162. NTSYSAPI
  3163. ULONG
  3164. NTAPI
  3165. RtlAnsiStringToUnicodeSize(
  3166.     IN PANSI_STRING AnsiString
  3167.     );
  3168.  
  3169. NTSYSAPI
  3170. NTSTATUS
  3171. NTAPI
  3172. RtlAnsiStringToUnicodeString(
  3173.     OUT PUNICODE_STRING DestinationString,
  3174.     IN PANSI_STRING SourceString,
  3175.     IN BOOLEAN AllocateDestinationString
  3176.     );
  3177.  
  3178. NTSYSAPI
  3179. NTSTATUS
  3180. NTAPI
  3181. RtlAppendUnicodeStringToString(
  3182.     OUT PUNICODE_STRING Destination,
  3183.     IN PUNICODE_STRING Source
  3184.     );
  3185.  
  3186. NTSYSAPI
  3187. NTSTATUS
  3188. NTAPI
  3189. RtlAppendUnicodeToString(
  3190.     OUT PUNICODE_STRING Destination,
  3191.     IN PWSTR Source
  3192.     );
  3193.  
  3194. NTSYSAPI
  3195. LONG
  3196. NTAPI
  3197. RtlCompareUnicodeString(
  3198.     IN PUNICODE_STRING String1,
  3199.     IN PUNICODE_STRING String2,
  3200.     IN BOOLEAN CaseInSensitive
  3201.     );
  3202.  
  3203. NTSYSAPI
  3204. VOID
  3205. NTAPI
  3206. RtlCopyUnicodeString(
  3207.     OUT PUNICODE_STRING DestinationString,
  3208.     IN PUNICODE_STRING SourceString
  3209.     );
  3210.  
  3211. NTSYSAPI
  3212. NTSTATUS
  3213. NTAPI
  3214. RtlDowncaseUnicodeString(
  3215.     OUT PUNICODE_STRING DestinationString,
  3216.     IN PUNICODE_STRING SourceString,
  3217.     IN BOOLEAN AllocateDestinationString
  3218.     );
  3219.  
  3220. NTSYSAPI
  3221. BOOLEAN
  3222. NTAPI
  3223. RtlEqualUnicodeString(
  3224.     IN PUNICODE_STRING String1,
  3225.     IN PUNICODE_STRING String2,
  3226.     IN BOOLEAN CaseInSensitive
  3227.     );
  3228.  
  3229. NTSYSAPI
  3230. NTSTATUS
  3231. NTAPI
  3232. RtlIntegerToUnicodeString(
  3233.     IN ULONG Value,
  3234.     IN ULONG Base,
  3235.     OUT PUNICODE_STRING String
  3236.     );
  3237.  
  3238. NTSYSAPI
  3239. NTSTATUS
  3240. NTAPI
  3241. RtlUnicodeStringToInteger(
  3242.     IN PUNICODE_STRING String,
  3243.     IN ULONG Base,
  3244.     OUT PULONG Value
  3245.     );
  3246.  
  3247. NTSYSAPI
  3248. NTSTATUS
  3249. NTAPI
  3250. RtlOemStringToUnicodeString(
  3251.     OUT PUNICODE_STRING DestinationString,
  3252.     IN POEM_STRING SourceString,
  3253.     IN BOOLEAN AllocateDestinationString
  3254.     );
  3255.  
  3256. NTSYSAPI
  3257. BOOLEAN
  3258. NTAPI
  3259. RtlPrefixUnicodeString(
  3260.     IN PUNICODE_STRING String1,
  3261.     IN PUNICODE_STRING String2,
  3262.     IN BOOLEAN CaseInSensitive
  3263.     );
  3264.  
  3265. NTSYSAPI
  3266. WCHAR
  3267. NTAPI
  3268. RtlUpcaseUnicodeChar(
  3269.     IN WCHAR SourceCharacter
  3270.     );
  3271.  
  3272. NTSYSAPI
  3273. NTSTATUS
  3274. NTAPI
  3275. RtlUpcaseUnicodeString(
  3276.     OUT PUNICODE_STRING DestinationString,
  3277.     IN PUNICODE_STRING SourceString,
  3278.     IN BOOLEAN AllocateDestinationString
  3279.     );
  3280.  
  3281. NTSYSAPI
  3282. ULONG
  3283. NTAPI
  3284. RtlxAnsiStringToUnicodeSize(
  3285.     IN PANSI_STRING AnsiString
  3286.     );
  3287.  
  3288. NTSYSAPI
  3289. ULONG
  3290. NTAPI
  3291. RtlxOemStringToUnicodeSize(
  3292.     IN POEM_STRING OemString
  3293.     );
  3294.  
  3295. // Rtl Misc Operations
  3296. NTSYSAPI
  3297. NTSTATUS
  3298. NTAPI
  3299. NtReplyPort(
  3300.     IN HANDLE   hPort,
  3301.     OUT PVOID   pReply
  3302. );
  3303.  
  3304. NTSYSAPI
  3305. NTSTATUS
  3306. NTAPI
  3307. NtClose(
  3308.     IN HANDLE   hObject
  3309. );
  3310.  
  3311. NTSYSAPI
  3312. ULONG
  3313. NTAPI
  3314. RtlNtStatusToDosError(
  3315.     NTSTATUS    status
  3316. );
  3317.  
  3318. NTSYSAPI
  3319. UINT
  3320. NTAPI
  3321. RtlGetLongestNtPathLength();
  3322.  
  3323. NTSYSAPI
  3324. UINT
  3325. NTAPI
  3326. RtlDetermineDosPathNameType_U(
  3327.     IN PWSTR    Path
  3328. );
  3329.  
  3330. NTSYSAPI
  3331. UINT
  3332. NTAPI
  3333. RtlIsDosDeviceName_U(
  3334.     IN PWSTR    Path
  3335. );
  3336.  
  3337. NTSYSAPI
  3338. BOOLEAN
  3339. NTAPI
  3340. RtlDosPathNameToNtPathName_U(
  3341.     IN PCWSTR           DosName,
  3342.     OUT PUNICODE_STRING NtName,
  3343.     OUT PCWSTR          *DosFilePath OPTIONAL,
  3344.     OUT PUNICODE_STRING NtFilePath OPTIONAL
  3345. );
  3346.  
  3347. // Rtl Large Integer Operations
  3348.  
  3349. #define RtlLargeIntegerLessThanZero($a) (($a).HighPart &lt; 0)
  3350. #define Li2Double(x)                    ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
  3351.  
  3352. NTSYSAPI
  3353. LARGE_INTEGER
  3354. NTAPI
  3355. RtlEnlargedIntegerMultiply(
  3356.     IN LONG lMultiplicand,
  3357.     IN LONG lMultiplier
  3358.     );
  3359.  
  3360. NTSYSAPI
  3361. ULONG
  3362. NTAPI
  3363. RtlEnlargedUnsignedDivide(
  3364.     IN LARGE_INTEGER    liDividend,
  3365.     IN ULONG            uDivisor,
  3366.     OUT PULONG          puRemainder OPTIONAL
  3367.     );
  3368.  
  3369. NTSYSAPI
  3370. LARGE_INTEGER
  3371. NTAPI
  3372. RtlEnlargedUnsignedMultiply(
  3373.     IN ULONG    uMultiplicand,
  3374.     IN ULONG    uMultiplier
  3375.     );
  3376.  
  3377. NTSYSAPI
  3378. LARGE_INTEGER
  3379. NTAPI
  3380. RtlExtendedIntegerMultiply(
  3381.     IN LARGE_INTEGER    liMultiplicand,
  3382.     IN LONG             lMultiplier
  3383.     );
  3384.  
  3385. NTSYSAPI
  3386. LARGE_INTEGER
  3387. NTAPI
  3388. RtlExtendedLargeIntegerDivide(
  3389.     IN LARGE_INTEGER    liDividend,
  3390.     IN ULONG            uDivisor,
  3391.     OUT PULONG          puRemainder OPTIONAL
  3392.     );
  3393.  
  3394. NTSYSAPI
  3395. LARGE_INTEGER
  3396. NTAPI
  3397. RtlLargeIntegerAdd(
  3398.     IN LARGE_INTEGER    liAddend1,
  3399.     IN LARGE_INTEGER    liAddend2
  3400.     );
  3401.  
  3402. NTSYSAPI
  3403. LARGE_INTEGER
  3404. NTAPI
  3405. RtlLargeIntegerDivide(
  3406.     IN LARGE_INTEGER    liDividend,
  3407.     IN LARGE_INTEGER    liDivisor,
  3408.     OUT PLARGE_INTEGER  pliRemainder OPTIONAL
  3409.     );
  3410.  
  3411. NTSYSAPI
  3412. LARGE_INTEGER
  3413. NTAPI
  3414. RtlLargeIntegerNegate(
  3415.     IN LARGE_INTEGER    liSubtrahend
  3416.     );
  3417.  
  3418. NTSYSAPI
  3419. LARGE_INTEGER
  3420. NTAPI
  3421. RtlLargeIntegerSubtract(
  3422.     IN LARGE_INTEGER    liMinuend,
  3423.     IN LARGE_INTEGER    liSubtrahend
  3424.     );
  3425.  
  3426. // Debug Functions
  3427. typedef struct _DEBUG_BUFFER
  3428. {
  3429.     HANDLE  SectionHandle;
  3430.     PVOID   SectionBase;
  3431.     PVOID   RemoteSectionBase;
  3432.     ULONG   SectionBaseDelta;
  3433.     HANDLE  EventPairHandle;
  3434.     ULONG   Unknown[2];
  3435.     HANDLE  RemoteThreadHandle;
  3436.     ULONG   InfoClassMask;
  3437.     ULONG   SizeOfInfo;
  3438.     ULONG   AllocatedSize;
  3439.     ULONG   SectionSize;
  3440.     PVOID   ModuleInformation;
  3441.     PVOID   BackTraceInformation;
  3442.     PVOID   HeapInformation;
  3443.     PVOID   LockInformation;
  3444.     PVOID   Reserved[8];
  3445. } DEBUG_BUFFER, *PDEBUG_BUFFER;
  3446.  
  3447. #define PDI_MODULES     0x01
  3448. #define PDI_BACKTRACE   0x02
  3449. #define PDI_HEAPS       0x04
  3450. #define PDI_HEAP_TAGS   0x08
  3451. #define PDI_HEAP_BLOCKS 0x10
  3452. #define PDI_LOCKS       0x20
  3453.  
  3454. typedef struct _DEBUG_MODULE_INFORMATION // c.f. SYSTEM_MODULE_INFORMATION
  3455. {
  3456.     ULONG   Reserved[2];
  3457.     ULONG   Base;
  3458.     ULONG   Size;
  3459.     ULONG   Flags;
  3460.     USHORT  Index;
  3461.     USHORT  Unknown;
  3462.     USHORT  LoadCount;
  3463.     USHORT  ModuleNameOffset;
  3464.     CHAR    ImageName[256];
  3465. } DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION;
  3466.  
  3467. typedef struct _DEBUG_HEAP_INFORMATION
  3468. {
  3469.     ULONG   Base;
  3470.     ULONG   Flags;
  3471.     USHORT  Granularity;
  3472.     USHORT  Unknown;
  3473.     ULONG   Allocated;
  3474.     ULONG   Committed;
  3475.     ULONG   TagCount;
  3476.     ULONG   BlockCount;
  3477.     ULONG   Reserved[7];
  3478.     PVOID   Tags;
  3479.     PVOID   Blocks;
  3480. } DEBUG_HEAP_INFORMATION, *PDEBUG_HEAP_INFORMATION;
  3481.  
  3482. typedef struct _DEBUG_LOCK_INFORMATION // c.f. SYSTEM_LOCK_INFORMATION
  3483. {
  3484.     PVOID   Address;
  3485.     USHORT  Type;
  3486.     USHORT  CreatorBackTraceIndex;
  3487.     ULONG   OwnerThreadId;
  3488.     ULONG   ActiveCount;
  3489.     ULONG   ContentionCount;
  3490.     ULONG   EntryCount;
  3491.     ULONG   RecursionCount;
  3492.     ULONG   NumberOfSharedWaiters;
  3493.     ULONG   NumberOfExclusiveWaiters;
  3494. } DEBUG_LOCK_INFORMATION, *PDEBUG_LOCK_INFORMATION;
  3495.  
  3496.  
  3497. NTSYSAPI
  3498. PDEBUG_BUFFER
  3499. NTAPI
  3500. RtlCreateQueryDebugBuffer(
  3501.     IN ULONG Size,
  3502.     IN BOOLEAN EventPair
  3503.     );
  3504.  
  3505. NTSYSAPI
  3506. NTSTATUS
  3507. NTAPI
  3508. RtlQueryProcessDebugInformation(
  3509.     IN ULONG ProcessId,
  3510.     IN ULONG DebugInfoClassMask,
  3511.     IN OUT PDEBUG_BUFFER DebugBuffer
  3512.     );
  3513.  
  3514. NTSYSAPI
  3515. NTSTATUS
  3516. NTAPI
  3517. RtlDestroyQueryDebugBuffer(
  3518.     IN PDEBUG_BUFFER DebugBuffer
  3519.     );
  3520.  
  3521. NTSYSAPI
  3522. NTSTATUS
  3523. NTAPI
  3524. NtLoadDriver(
  3525.     // "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\&lt;DriverName&gt;"
  3526.     IN PUNICODE_STRING RegistryPath
  3527. );
  3528.  
  3529. NTSYSAPI
  3530. NTSTATUS
  3531. NTAPI
  3532. NtUnloadDriver(
  3533.     // "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\&lt;DriverName&gt;"
  3534.     IN PUNICODE_STRING RegistryPath
  3535. );
  3536.  
  3537. NTSYSAPI
  3538. NTSTATUS
  3539. NTAPI
  3540. RtlAdjustPrivilege(
  3541.     IN ULONG Privilege,
  3542.     IN BOOLEAN NewValue,
  3543.     IN BOOLEAN ForThread,
  3544.     OUT PBOOLEAN OldValue
  3545. );
  3546.  
  3547. #ifdef __cplusplus
  3548. }
  3549.  
  3550. #pragma warning(default : 4200)
  3551.  
  3552. #endif
  3553. #endif
  3554.  
Add Comment
Please, Sign In to add comment