Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1421 lines
36 KiB

  1. /*++ BUILD Version: 0007 // Increment this if a change has global effects
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. ntpsapi.h
  5. Abstract:
  6. This module contains the process structure APIs and any public data
  7. structures needed to call these APIs.
  8. Author:
  9. Mark Lucovsky (markl) 24-Feb-1989
  10. Revision History:
  11. --*/
  12. #ifndef _NTPSAPI_
  13. #define _NTPSAPI_
  14. #if _MSC_VER > 1000
  15. #pragma once
  16. #endif
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. //
  21. // Process Specific Access Rights
  22. //
  23. #define PROCESS_TERMINATE (0x0001) // winnt
  24. #define PROCESS_CREATE_THREAD (0x0002) // winnt
  25. #define PROCESS_SET_SESSIONID (0x0004) // winnt
  26. #define PROCESS_VM_OPERATION (0x0008) // winnt
  27. #define PROCESS_VM_READ (0x0010) // winnt
  28. #define PROCESS_VM_WRITE (0x0020) // winnt
  29. // begin_ntddk begin_wdm begin_ntifs
  30. #define PROCESS_DUP_HANDLE (0x0040) // winnt
  31. // end_ntddk end_wdm end_ntifs
  32. #define PROCESS_CREATE_PROCESS (0x0080) // winnt
  33. #define PROCESS_SET_QUOTA (0x0100) // winnt
  34. #define PROCESS_SET_INFORMATION (0x0200) // winnt
  35. #define PROCESS_QUERY_INFORMATION (0x0400) // winnt
  36. #define PROCESS_SET_PORT (0x0800)
  37. #define PROCESS_SUSPEND_RESUME (0x0800) // winnt
  38. // begin_winnt begin_ntddk begin_wdm begin_ntifs
  39. #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  40. 0xFFF)
  41. // begin_nthal
  42. #if defined(_WIN64)
  43. #define MAXIMUM_PROCESSORS 64
  44. #else
  45. #define MAXIMUM_PROCESSORS 32
  46. #endif
  47. // end_nthal
  48. // end_winnt
  49. //
  50. // Thread Specific Access Rights
  51. //
  52. #define THREAD_TERMINATE (0x0001) // winnt
  53. // end_ntddk end_wdm end_ntifs
  54. #define THREAD_SUSPEND_RESUME (0x0002) // winnt
  55. #define THREAD_ALERT (0x0004)
  56. #define THREAD_GET_CONTEXT (0x0008) // winnt
  57. #define THREAD_SET_CONTEXT (0x0010) // winnt
  58. // begin_ntddk begin_wdm begin_ntifs
  59. #define THREAD_SET_INFORMATION (0x0020) // winnt
  60. // end_ntddk end_wdm end_ntifs
  61. #define THREAD_QUERY_INFORMATION (0x0040) // winnt
  62. // begin_winnt
  63. #define THREAD_SET_THREAD_TOKEN (0x0080)
  64. #define THREAD_IMPERSONATE (0x0100)
  65. #define THREAD_DIRECT_IMPERSONATION (0x0200)
  66. // begin_ntddk begin_wdm begin_ntifs
  67. #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  68. 0x3FF)
  69. // end_ntddk end_wdm end_ntifs
  70. // end_winnt
  71. //
  72. // Job Object Specific Access Rights
  73. //
  74. // begin_winnt
  75. #define JOB_OBJECT_ASSIGN_PROCESS (0x0001)
  76. #define JOB_OBJECT_SET_ATTRIBUTES (0x0002)
  77. #define JOB_OBJECT_QUERY (0x0004)
  78. #define JOB_OBJECT_TERMINATE (0x0008)
  79. #define JOB_OBJECT_SET_SECURITY_ATTRIBUTES (0x0010)
  80. #define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
  81. 0x1F )
  82. typedef struct _JOB_SET_ARRAY {
  83. HANDLE JobHandle; // Handle to job object to insert
  84. ULONG MemberLevel; // Level of this job in the set. Must be > 0. Can be sparse.
  85. ULONG Flags; // Unused. Must be zero
  86. } JOB_SET_ARRAY, *PJOB_SET_ARRAY;
  87. // end_winnt
  88. //
  89. // Process Environment Block
  90. //
  91. #ifdef _MAC
  92. #pragma warning( disable : 4121)
  93. #endif
  94. typedef struct _PEB_LDR_DATA {
  95. ULONG Length;
  96. BOOLEAN Initialized;
  97. HANDLE SsHandle;
  98. LIST_ENTRY InLoadOrderModuleList;
  99. LIST_ENTRY InMemoryOrderModuleList;
  100. LIST_ENTRY InInitializationOrderModuleList;
  101. PVOID EntryInProgress;
  102. } PEB_LDR_DATA, *PPEB_LDR_DATA;
  103. #ifdef _MAC
  104. #pragma warning( default : 4121 )
  105. #endif
  106. //
  107. // Handle tag bits for Peb Stdio File Handles
  108. //
  109. #define PEB_STDIO_HANDLE_NATIVE 0
  110. #define PEB_STDIO_HANDLE_SUBSYS 1
  111. #define PEB_STDIO_HANDLE_PM 2
  112. #define PEB_STDIO_HANDLE_RESERVED 3
  113. #define GDI_HANDLE_BUFFER_SIZE32 34
  114. #define GDI_HANDLE_BUFFER_SIZE64 60
  115. #if !defined(_IA64_) && !defined(_AMD64_)
  116. #define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE32
  117. #else
  118. #define GDI_HANDLE_BUFFER_SIZE GDI_HANDLE_BUFFER_SIZE64
  119. #endif
  120. typedef ULONG GDI_HANDLE_BUFFER32[GDI_HANDLE_BUFFER_SIZE32];
  121. typedef ULONG GDI_HANDLE_BUFFER64[GDI_HANDLE_BUFFER_SIZE64];
  122. typedef ULONG GDI_HANDLE_BUFFER [GDI_HANDLE_BUFFER_SIZE ];
  123. #define FOREGROUND_BASE_PRIORITY 9
  124. #define NORMAL_BASE_PRIORITY 8
  125. typedef struct _PEB_FREE_BLOCK {
  126. struct _PEB_FREE_BLOCK *Next;
  127. ULONG Size;
  128. } PEB_FREE_BLOCK, *PPEB_FREE_BLOCK;
  129. // begin_ntddk begin_wdm begin_nthal begin_ntifs
  130. //
  131. // ClientId
  132. //
  133. typedef struct _CLIENT_ID {
  134. HANDLE UniqueProcess;
  135. HANDLE UniqueThread;
  136. } CLIENT_ID;
  137. typedef CLIENT_ID *PCLIENT_ID;
  138. // end_ntddk end_wdm end_nthal end_ntifs
  139. #if !defined(CLIENT_ID64_DEFINED)
  140. typedef struct _CLIENT_ID64 {
  141. ULONGLONG UniqueProcess;
  142. ULONGLONG UniqueThread;
  143. } CLIENT_ID64;
  144. typedef CLIENT_ID64 *PCLIENT_ID64;
  145. #define CLIENT_ID64_DEFINED
  146. #endif
  147. #define FLS_MAXIMUM_AVAILABLE 128 // winnt
  148. #define TLS_MINIMUM_AVAILABLE 64 // winnt
  149. #define TLS_EXPANSION_SLOTS 1024
  150. typedef
  151. VOID
  152. (*PPS_POST_PROCESS_INIT_ROUTINE) (
  153. VOID
  154. );
  155. // begin_nthal begin_ntddk begin_ntifs
  156. //
  157. // Thread Environment Block (and portable part of Thread Information Block)
  158. //
  159. //
  160. // NT_TIB - Thread Information Block - Portable part.
  161. //
  162. // This is the subsystem portable part of the Thread Information Block.
  163. // It appears as the first part of the TEB for all threads which have
  164. // a user mode component.
  165. //
  166. // end_nthal end_ntddk end_ntifs
  167. // This structure MUST MATCH OS/2 V2.0!
  168. //
  169. // There is another, non-portable part of the TIB which is used
  170. // for by subsystems, i.e. Os2Tib for OS/2 threads. SubSystemTib
  171. // points there.
  172. // begin_nthal begin_ntddk begin_ntifs
  173. //
  174. // begin_winnt
  175. typedef struct _NT_TIB {
  176. struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
  177. PVOID StackBase;
  178. PVOID StackLimit;
  179. PVOID SubSystemTib;
  180. union {
  181. PVOID FiberData;
  182. ULONG Version;
  183. };
  184. PVOID ArbitraryUserPointer;
  185. struct _NT_TIB *Self;
  186. } NT_TIB;
  187. typedef NT_TIB *PNT_TIB;
  188. //
  189. // 32 and 64 bit specific version for wow64 and the debugger
  190. //
  191. typedef struct _NT_TIB32 {
  192. ULONG ExceptionList;
  193. ULONG StackBase;
  194. ULONG StackLimit;
  195. ULONG SubSystemTib;
  196. union {
  197. ULONG FiberData;
  198. ULONG Version;
  199. };
  200. ULONG ArbitraryUserPointer;
  201. ULONG Self;
  202. } NT_TIB32, *PNT_TIB32;
  203. typedef struct _NT_TIB64 {
  204. ULONG64 ExceptionList;
  205. ULONG64 StackBase;
  206. ULONG64 StackLimit;
  207. ULONG64 SubSystemTib;
  208. union {
  209. ULONG64 FiberData;
  210. ULONG Version;
  211. };
  212. ULONG64 ArbitraryUserPointer;
  213. ULONG64 Self;
  214. } NT_TIB64, *PNT_TIB64;
  215. // end_nthal end_ntddk end_ntifs end_winnt
  216. //
  217. // Gdi command batching
  218. //
  219. #define GDI_BATCH_BUFFER_SIZE 310
  220. typedef struct _GDI_TEB_BATCH {
  221. ULONG Offset;
  222. ULONG_PTR HDC;
  223. ULONG Buffer[GDI_BATCH_BUFFER_SIZE];
  224. } GDI_TEB_BATCH,*PGDI_TEB_BATCH;
  225. //
  226. // Wx86 thread state information
  227. //
  228. typedef struct _Wx86ThreadState {
  229. PULONG CallBx86Eip;
  230. PVOID DeallocationCpu;
  231. BOOLEAN UseKnownWx86Dll;
  232. char OleStubInvoked;
  233. } WX86THREAD, *PWX86THREAD;
  234. //
  235. // TEB - The thread environment block
  236. //
  237. #define STATIC_UNICODE_BUFFER_LENGTH 261
  238. #define WIN32_CLIENT_INFO_LENGTH 62
  239. #define WIN32_CLIENT_INFO_SPIN_COUNT 1
  240. typedef PVOID* PPVOID;
  241. #include "pebteb.h"
  242. // begin_winnt
  243. #if !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_)
  244. #define WX86
  245. #endif
  246. // end_winnt
  247. #if defined(WX86)
  248. #define Wx86CurrentTib() ((PWX86TIB)NtCurrentTeb()->Vdm)
  249. #else
  250. #define Wx86CurrentTib() (NULL)
  251. #endif
  252. #if !defined(_X86_) && !defined(_IA64_)
  253. //
  254. // Exception Registration structure
  255. //
  256. // X86 Call frame record definition, normally defined in nti386.h
  257. // which is not included on risc.
  258. //
  259. typedef struct _EXCEPTION_REGISTRATION_RECORD {
  260. struct _EXCEPTION_REGISTRATION_RECORD *Next;
  261. PEXCEPTION_ROUTINE Handler;
  262. } EXCEPTION_REGISTRATION_RECORD;
  263. typedef EXCEPTION_REGISTRATION_RECORD *PEXCEPTION_REGISTRATION_RECORD;
  264. #endif
  265. typedef struct _Wx86TIB {
  266. ULONG Size;
  267. ULONG InitialPc;
  268. VOID * POINTER_32 StackBase;
  269. VOID * POINTER_32 StackLimit;
  270. VOID * POINTER_32 DeallocationStack;
  271. ULONG LogFlags;
  272. ULONG InitialSp;
  273. UCHAR SimulationCount;
  274. BOOLEAN InCpuSimulation;
  275. BOOLEAN EmulateInitialPc;
  276. BOOLEAN Initialized;
  277. EXCEPTION_REGISTRATION_RECORD * POINTER_32 ExceptionList;
  278. VOID * POINTER_32 CpuContext;
  279. CONTEXT * POINTER_32 InitialExceptionContext;
  280. VOID * POINTER_32 pCallersRIID;
  281. VOID * POINTER_32 pCallersUnknown;
  282. ULONG Flags;
  283. VOID * POINTER_32 SelfRegDllName;
  284. VOID * POINTER_32 SelfRegDllHandle;
  285. } WX86TIB, *PWX86TIB;
  286. #define EXCEPTION_CHAIN_END ((struct _EXCEPTION_REGISTRATION_RECORD * POINTER_32)-1)
  287. //
  288. // The version number of OS2
  289. //
  290. #define MAJOR_VERSION 30 // Cruiser uses 20 (not 20H)
  291. #define MINOR_VERSION 00
  292. #define OS2_VERSION (MAJOR_VERSION << 8 | MINOR_VERSION )
  293. #if DBG
  294. //
  295. // Reserve the last 9 SystemReserved pointers for debugging
  296. //
  297. #define DBG_TEB_THREADNAME 16
  298. #define DBG_TEB_RESERVED_1 15
  299. #define DBG_TEB_RESERVED_2 14
  300. #define DBG_TEB_RESERVED_3 13
  301. #define DBG_TEB_RESERVED_4 12
  302. #define DBG_TEB_RESERVED_5 11
  303. #define DBG_TEB_RESERVED_6 10
  304. #define DBG_TEB_RESERVED_7 9
  305. #define DBG_TEB_RESERVED_8 8
  306. #endif // DBG
  307. typedef struct _INITIAL_TEB {
  308. struct {
  309. PVOID OldStackBase;
  310. PVOID OldStackLimit;
  311. #if defined(_IA64_)
  312. PVOID OldBStoreLimit;
  313. #endif // defined(_IA64_)
  314. } OldInitialTeb;
  315. PVOID StackBase;
  316. PVOID StackLimit;
  317. #if defined(_IA64_)
  318. PVOID BStoreLimit;
  319. #endif // defined(_IA64_)
  320. PVOID StackAllocationBase;
  321. } INITIAL_TEB, *PINITIAL_TEB;
  322. #define PROCESS_PRIORITY_CLASS_UNKNOWN 0
  323. #define PROCESS_PRIORITY_CLASS_IDLE 1
  324. #define PROCESS_PRIORITY_CLASS_NORMAL 2
  325. #define PROCESS_PRIORITY_CLASS_HIGH 3
  326. #define PROCESS_PRIORITY_CLASS_REALTIME 4
  327. #define PROCESS_PRIORITY_CLASS_BELOW_NORMAL 5
  328. #define PROCESS_PRIORITY_CLASS_ABOVE_NORMAL 6
  329. typedef struct _PROCESS_PRIORITY_CLASS {
  330. BOOLEAN Foreground;
  331. UCHAR PriorityClass;
  332. } PROCESS_PRIORITY_CLASS, *PPROCESS_PRIORITY_CLASS;
  333. typedef struct _PROCESS_FOREGROUND_BACKGROUND {
  334. BOOLEAN Foreground;
  335. } PROCESS_FOREGROUND_BACKGROUND, *PPROCESS_FOREGROUND_BACKGROUND;
  336. //
  337. // Define process debug flags
  338. //
  339. #define PROCESS_DEBUG_INHERIT 0x00000001
  340. // begin_ntddk begin_ntifs
  341. //
  342. // Process Information Classes
  343. //
  344. typedef enum _PROCESSINFOCLASS {
  345. ProcessBasicInformation,
  346. ProcessQuotaLimits,
  347. ProcessIoCounters,
  348. ProcessVmCounters,
  349. ProcessTimes,
  350. ProcessBasePriority,
  351. ProcessRaisePriority,
  352. ProcessDebugPort,
  353. ProcessExceptionPort,
  354. ProcessAccessToken,
  355. ProcessLdtInformation,
  356. ProcessLdtSize,
  357. ProcessDefaultHardErrorMode,
  358. ProcessIoPortHandlers, // Note: this is kernel mode only
  359. ProcessPooledUsageAndLimits,
  360. ProcessWorkingSetWatch,
  361. ProcessUserModeIOPL,
  362. ProcessEnableAlignmentFaultFixup,
  363. ProcessPriorityClass,
  364. ProcessWx86Information,
  365. ProcessHandleCount,
  366. ProcessAffinityMask,
  367. ProcessPriorityBoost,
  368. ProcessDeviceMap,
  369. ProcessSessionInformation,
  370. ProcessForegroundInformation,
  371. ProcessWow64Information,
  372. ProcessImageFileName,
  373. ProcessLUIDDeviceMapsEnabled,
  374. ProcessBreakOnTermination,
  375. ProcessDebugObjectHandle,
  376. ProcessDebugFlags,
  377. ProcessHandleTracing,
  378. MaxProcessInfoClass // MaxProcessInfoClass should always be the last enum
  379. } PROCESSINFOCLASS;
  380. //
  381. // Thread Information Classes
  382. //
  383. typedef enum _THREADINFOCLASS {
  384. ThreadBasicInformation,
  385. ThreadTimes,
  386. ThreadPriority,
  387. ThreadBasePriority,
  388. ThreadAffinityMask,
  389. ThreadImpersonationToken,
  390. ThreadDescriptorTableEntry,
  391. ThreadEnableAlignmentFaultFixup,
  392. ThreadEventPair_Reusable,
  393. ThreadQuerySetWin32StartAddress,
  394. ThreadZeroTlsCell,
  395. ThreadPerformanceCount,
  396. ThreadAmILastThread,
  397. ThreadIdealProcessor,
  398. ThreadPriorityBoost,
  399. ThreadSetTlsArrayAddress,
  400. ThreadIsIoPending,
  401. ThreadHideFromDebugger,
  402. ThreadBreakOnTermination,
  403. MaxThreadInfoClass
  404. } THREADINFOCLASS;
  405. // end_ntddk end_ntifs
  406. #define PROCESS_PRIORITY_SEPARATION_MASK 0x00000003
  407. #define PROCESS_PRIORITY_SEPARATION_MAX 0x00000002
  408. #define PROCESS_QUANTUM_VARIABLE_MASK 0x0000000c
  409. #define PROCESS_QUANTUM_VARIABLE_DEF 0x00000000
  410. #define PROCESS_QUANTUM_VARIABLE_VALUE 0x00000004
  411. #define PROCESS_QUANTUM_FIXED_VALUE 0x00000008
  412. #define PROCESS_QUANTUM_LONG_MASK 0x00000030
  413. #define PROCESS_QUANTUM_LONG_DEF 0x00000000
  414. #define PROCESS_QUANTUM_LONG_VALUE 0x00000010
  415. #define PROCESS_QUANTUM_SHORT_VALUE 0x00000020
  416. #define PROCESS_HARDERROR_ALIGNMENT_BIT 0x0004 // from winbase.h, but not tagged
  417. //
  418. // thread base priority ranges
  419. //
  420. // begin_winnt
  421. #define THREAD_BASE_PRIORITY_LOWRT 15 // value that gets a thread to LowRealtime-1
  422. #define THREAD_BASE_PRIORITY_MAX 2 // maximum thread base priority boost
  423. #define THREAD_BASE_PRIORITY_MIN (-2) // minimum thread base priority boost
  424. #define THREAD_BASE_PRIORITY_IDLE (-15) // value that gets a thread to idle
  425. // end_winnt
  426. // begin_ntddk begin_ntifs
  427. //
  428. // Process Information Structures
  429. //
  430. //
  431. // PageFaultHistory Information
  432. // NtQueryInformationProcess using ProcessWorkingSetWatch
  433. //
  434. typedef struct _PROCESS_WS_WATCH_INFORMATION {
  435. PVOID FaultingPc;
  436. PVOID FaultingVa;
  437. } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
  438. //
  439. // Basic Process Information
  440. // NtQueryInformationProcess using ProcessBasicInfo
  441. //
  442. typedef struct _PROCESS_BASIC_INFORMATION {
  443. NTSTATUS ExitStatus;
  444. PPEB PebBaseAddress;
  445. ULONG_PTR AffinityMask;
  446. KPRIORITY BasePriority;
  447. ULONG_PTR UniqueProcessId;
  448. ULONG_PTR InheritedFromUniqueProcessId;
  449. } PROCESS_BASIC_INFORMATION;
  450. typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
  451. // end_ntddk end_ntifs
  452. typedef struct _PROCESS_BASIC_INFORMATION64 {
  453. NTSTATUS ExitStatus;
  454. ULONG32 Pad1;
  455. ULONG64 PebBaseAddress;
  456. ULONG64 AffinityMask;
  457. KPRIORITY BasePriority;
  458. ULONG32 Pad2;
  459. ULONG64 UniqueProcessId;
  460. ULONG64 InheritedFromUniqueProcessId;
  461. } PROCESS_BASIC_INFORMATION64;
  462. typedef PROCESS_BASIC_INFORMATION64 *PPROCESS_BASIC_INFORMATION64;
  463. #if !defined(SORTPP_PASS) && !defined(MIDL_PASS) && !defined(RC_INVOKED) && defined(_WIN64) && !defined(_X86AMD64_)
  464. C_ASSERT(sizeof(PROCESS_BASIC_INFORMATION) == sizeof(PROCESS_BASIC_INFORMATION64));
  465. #endif
  466. // begin_ntddk begin_ntifs
  467. //
  468. // Process Device Map information
  469. // NtQueryInformationProcess using ProcessDeviceMap
  470. // NtSetInformationProcess using ProcessDeviceMap
  471. //
  472. typedef struct _PROCESS_DEVICEMAP_INFORMATION {
  473. union {
  474. struct {
  475. HANDLE DirectoryHandle;
  476. } Set;
  477. struct {
  478. ULONG DriveMap;
  479. UCHAR DriveType[ 32 ];
  480. } Query;
  481. };
  482. } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
  483. typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
  484. union {
  485. struct {
  486. HANDLE DirectoryHandle;
  487. } Set;
  488. struct {
  489. ULONG DriveMap;
  490. UCHAR DriveType[ 32 ];
  491. } Query;
  492. };
  493. ULONG Flags; // specifies that the query type
  494. } PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;
  495. //
  496. // PROCESS_DEVICEMAP_INFORMATION_EX flags
  497. //
  498. #define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001
  499. //
  500. // Multi-User Session specific Process Information
  501. // NtQueryInformationProcess using ProcessSessionInformation
  502. //
  503. typedef struct _PROCESS_SESSION_INFORMATION {
  504. ULONG SessionId;
  505. } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
  506. typedef struct _PROCESS_HANDLE_TRACING_ENABLE {
  507. ULONG Flags;
  508. } PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE;
  509. typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX {
  510. ULONG Flags;
  511. ULONG TotalSlots;
  512. } PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX;
  513. #define PROCESS_HANDLE_TRACING_MAX_STACKS 16
  514. typedef struct _PROCESS_HANDLE_TRACING_ENTRY {
  515. HANDLE Handle;
  516. CLIENT_ID ClientId;
  517. ULONG Type;
  518. PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS];
  519. } PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY;
  520. typedef struct _PROCESS_HANDLE_TRACING_QUERY {
  521. HANDLE Handle;
  522. ULONG TotalTraces;
  523. PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1];
  524. } PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY;
  525. //
  526. // Process Quotas
  527. // NtQueryInformationProcess using ProcessQuotaLimits
  528. // NtQueryInformationProcess using ProcessPooledQuotaLimits
  529. // NtSetInformationProcess using ProcessQuotaLimits
  530. //
  531. // begin_winnt
  532. typedef struct _QUOTA_LIMITS {
  533. SIZE_T PagedPoolLimit;
  534. SIZE_T NonPagedPoolLimit;
  535. SIZE_T MinimumWorkingSetSize;
  536. SIZE_T MaximumWorkingSetSize;
  537. SIZE_T PagefileLimit;
  538. LARGE_INTEGER TimeLimit;
  539. } QUOTA_LIMITS, *PQUOTA_LIMITS;
  540. #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
  541. #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
  542. #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
  543. #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
  544. typedef struct _QUOTA_LIMITS_EX {
  545. SIZE_T PagedPoolLimit;
  546. SIZE_T NonPagedPoolLimit;
  547. SIZE_T MinimumWorkingSetSize;
  548. SIZE_T MaximumWorkingSetSize;
  549. SIZE_T PagefileLimit;
  550. LARGE_INTEGER TimeLimit;
  551. SIZE_T Reserved1;
  552. SIZE_T Reserved2;
  553. SIZE_T Reserved3;
  554. SIZE_T Reserved4;
  555. ULONG Flags;
  556. ULONG Reserved5;
  557. } QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
  558. // end_winnt
  559. //
  560. // Process I/O Counters
  561. // NtQueryInformationProcess using ProcessIoCounters
  562. //
  563. // begin_winnt
  564. typedef struct _IO_COUNTERS {
  565. ULONGLONG ReadOperationCount;
  566. ULONGLONG WriteOperationCount;
  567. ULONGLONG OtherOperationCount;
  568. ULONGLONG ReadTransferCount;
  569. ULONGLONG WriteTransferCount;
  570. ULONGLONG OtherTransferCount;
  571. } IO_COUNTERS;
  572. typedef IO_COUNTERS *PIO_COUNTERS;
  573. // end_winnt
  574. //
  575. // Process Virtual Memory Counters
  576. // NtQueryInformationProcess using ProcessVmCounters
  577. //
  578. typedef struct _VM_COUNTERS {
  579. SIZE_T PeakVirtualSize;
  580. SIZE_T VirtualSize;
  581. ULONG PageFaultCount;
  582. SIZE_T PeakWorkingSetSize;
  583. SIZE_T WorkingSetSize;
  584. SIZE_T QuotaPeakPagedPoolUsage;
  585. SIZE_T QuotaPagedPoolUsage;
  586. SIZE_T QuotaPeakNonPagedPoolUsage;
  587. SIZE_T QuotaNonPagedPoolUsage;
  588. SIZE_T PagefileUsage;
  589. SIZE_T PeakPagefileUsage;
  590. } VM_COUNTERS;
  591. typedef VM_COUNTERS *PVM_COUNTERS;
  592. typedef struct _VM_COUNTERS_EX {
  593. SIZE_T PeakVirtualSize;
  594. SIZE_T VirtualSize;
  595. ULONG PageFaultCount;
  596. SIZE_T PeakWorkingSetSize;
  597. SIZE_T WorkingSetSize;
  598. SIZE_T QuotaPeakPagedPoolUsage;
  599. SIZE_T QuotaPagedPoolUsage;
  600. SIZE_T QuotaPeakNonPagedPoolUsage;
  601. SIZE_T QuotaNonPagedPoolUsage;
  602. SIZE_T PagefileUsage;
  603. SIZE_T PeakPagefileUsage;
  604. SIZE_T PrivateUsage;
  605. } VM_COUNTERS_EX;
  606. typedef VM_COUNTERS_EX *PVM_COUNTERS_EX;
  607. //
  608. // Process Pooled Quota Usage and Limits
  609. // NtQueryInformationProcess using ProcessPooledUsageAndLimits
  610. //
  611. typedef struct _POOLED_USAGE_AND_LIMITS {
  612. SIZE_T PeakPagedPoolUsage;
  613. SIZE_T PagedPoolUsage;
  614. SIZE_T PagedPoolLimit;
  615. SIZE_T PeakNonPagedPoolUsage;
  616. SIZE_T NonPagedPoolUsage;
  617. SIZE_T NonPagedPoolLimit;
  618. SIZE_T PeakPagefileUsage;
  619. SIZE_T PagefileUsage;
  620. SIZE_T PagefileLimit;
  621. } POOLED_USAGE_AND_LIMITS;
  622. typedef POOLED_USAGE_AND_LIMITS *PPOOLED_USAGE_AND_LIMITS;
  623. //
  624. // Process Security Context Information
  625. // NtSetInformationProcess using ProcessAccessToken
  626. // PROCESS_SET_ACCESS_TOKEN access to the process is needed
  627. // to use this info level.
  628. //
  629. typedef struct _PROCESS_ACCESS_TOKEN {
  630. //
  631. // Handle to Primary token to assign to the process.
  632. // TOKEN_ASSIGN_PRIMARY access to this token is needed.
  633. //
  634. HANDLE Token;
  635. //
  636. // Handle to the initial thread of the process.
  637. // A process's access token can only be changed if the process has
  638. // no threads or one thread. If the process has no threads, this
  639. // field must be set to NULL. Otherwise, it must contain a handle
  640. // open to the process's only thread. THREAD_QUERY_INFORMATION access
  641. // is needed via this handle.
  642. HANDLE Thread;
  643. } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
  644. //
  645. // Process/Thread System and User Time
  646. // NtQueryInformationProcess using ProcessTimes
  647. // NtQueryInformationThread using ThreadTimes
  648. //
  649. typedef struct _KERNEL_USER_TIMES {
  650. LARGE_INTEGER CreateTime;
  651. LARGE_INTEGER ExitTime;
  652. LARGE_INTEGER KernelTime;
  653. LARGE_INTEGER UserTime;
  654. } KERNEL_USER_TIMES;
  655. typedef KERNEL_USER_TIMES *PKERNEL_USER_TIMES;
  656. // end_ntddk end_ntifs
  657. //
  658. // Thread Information Structures
  659. //
  660. //
  661. // Basic Thread Information
  662. // NtQueryInformationThread using ThreadBasicInfo
  663. //
  664. typedef struct _THREAD_BASIC_INFORMATION {
  665. NTSTATUS ExitStatus;
  666. PTEB TebBaseAddress;
  667. CLIENT_ID ClientId;
  668. ULONG_PTR AffinityMask;
  669. KPRIORITY Priority;
  670. LONG BasePriority;
  671. } THREAD_BASIC_INFORMATION;
  672. typedef THREAD_BASIC_INFORMATION *PTHREAD_BASIC_INFORMATION;
  673. #if defined(_AMD64_) || defined(_IA64_)
  674. #include <pshpck16.h>
  675. #endif
  676. typedef struct _FIBER {
  677. PVOID FiberData;
  678. //
  679. // Matches first three DWORDs of TEB
  680. //
  681. struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
  682. PVOID StackBase;
  683. PVOID StackLimit;
  684. //
  685. // Used by base to free a thread's stack
  686. //
  687. PVOID DeallocationStack;
  688. CONTEXT FiberContext;
  689. PWX86TIB Wx86Tib;
  690. #ifdef _IA64_
  691. PVOID DeallocationBStore;
  692. PVOID BStoreLimit;
  693. #endif
  694. //
  695. // Fiber local storage data.
  696. //
  697. PVOID FlsData;
  698. } FIBER, *PFIBER;
  699. #if defined(_AMD64_) || defined(_IA64_)
  700. #include <poppack.h>
  701. #endif
  702. //
  703. //
  704. // Process Object APIs
  705. //
  706. NTSYSCALLAPI
  707. NTSTATUS
  708. NTAPI
  709. NtCreateProcess(
  710. OUT PHANDLE ProcessHandle,
  711. IN ACCESS_MASK DesiredAccess,
  712. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  713. IN HANDLE ParentProcess,
  714. IN BOOLEAN InheritObjectTable,
  715. IN HANDLE SectionHandle OPTIONAL,
  716. IN HANDLE DebugPort OPTIONAL,
  717. IN HANDLE ExceptionPort OPTIONAL
  718. );
  719. #define PROCESS_CREATE_FLAGS_BREAKAWAY 0x00000001
  720. #define PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT 0x00000002
  721. #define PROCESS_CREATE_FLAGS_INHERIT_HANDLES 0x00000004
  722. #define PROCESS_CREATE_FLAGS_OVERRIDE_ADDRESS_SPACE 0x00000008
  723. #define PROCESS_CREATE_FLAGS_LEGAL_MASK 0x0000000f
  724. NTSYSCALLAPI
  725. NTSTATUS
  726. NTAPI
  727. NtCreateProcessEx(
  728. OUT PHANDLE ProcessHandle,
  729. IN ACCESS_MASK DesiredAccess,
  730. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  731. IN HANDLE ParentProcess,
  732. IN ULONG Flags,
  733. IN HANDLE SectionHandle OPTIONAL,
  734. IN HANDLE DebugPort OPTIONAL,
  735. IN HANDLE ExceptionPort OPTIONAL,
  736. IN ULONG JobMemberLevel
  737. );
  738. // begin_ntddk begin_ntifs
  739. NTSYSCALLAPI
  740. NTSTATUS
  741. NTAPI
  742. NtOpenProcess (
  743. OUT PHANDLE ProcessHandle,
  744. IN ACCESS_MASK DesiredAccess,
  745. IN POBJECT_ATTRIBUTES ObjectAttributes,
  746. IN PCLIENT_ID ClientId OPTIONAL
  747. );
  748. // end_ntddk end_ntifs
  749. NTSYSCALLAPI
  750. NTSTATUS
  751. NTAPI
  752. NtTerminateProcess(
  753. IN HANDLE ProcessHandle OPTIONAL,
  754. IN NTSTATUS ExitStatus
  755. );
  756. #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 ) // ntddk wdm ntifs
  757. #define ZwCurrentProcess() NtCurrentProcess() // ntddk wdm ntifs
  758. #if defined(RTL_USE_KERNEL_PEB_RTN) || defined(NTOS_KERNEL_RUNTIME)
  759. #define NtCurrentPeb() (PsGetCurrentProcess ()->Peb)
  760. #else
  761. #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
  762. #endif
  763. // begin_ntddk begin_ntifs
  764. NTSYSCALLAPI
  765. NTSTATUS
  766. NTAPI
  767. NtQueryInformationProcess(
  768. IN HANDLE ProcessHandle,
  769. IN PROCESSINFOCLASS ProcessInformationClass,
  770. OUT PVOID ProcessInformation,
  771. IN ULONG ProcessInformationLength,
  772. OUT PULONG ReturnLength OPTIONAL
  773. );
  774. // end_ntddk end_ntifs
  775. NTSYSCALLAPI
  776. NTSTATUS
  777. NTAPI
  778. NtGetNextProcess (
  779. IN HANDLE ProcessHandle,
  780. IN ACCESS_MASK DesiredAccess,
  781. IN ULONG HandleAttributes,
  782. IN ULONG Flags,
  783. OUT PHANDLE NewProcessHandle
  784. );
  785. NTSYSCALLAPI
  786. NTSTATUS
  787. NTAPI
  788. NtGetNextThread (
  789. IN HANDLE ProcessHandle,
  790. IN HANDLE ThreadHandle,
  791. IN ACCESS_MASK DesiredAccess,
  792. IN ULONG HandleAttributes,
  793. IN ULONG Flags,
  794. OUT PHANDLE NewThreadHandle
  795. );
  796. NTSYSCALLAPI
  797. NTSTATUS
  798. NTAPI
  799. NtQueryPortInformationProcess(
  800. VOID
  801. );
  802. NTSYSCALLAPI
  803. ULONG
  804. NTAPI
  805. NtGetCurrentProcessorNumber(
  806. VOID
  807. );
  808. NTSYSCALLAPI
  809. NTSTATUS
  810. NTAPI
  811. NtSetInformationProcess(
  812. IN HANDLE ProcessHandle,
  813. IN PROCESSINFOCLASS ProcessInformationClass,
  814. IN PVOID ProcessInformation,
  815. IN ULONG ProcessInformationLength
  816. );
  817. //
  818. // Thread Object APIs
  819. //
  820. NTSYSCALLAPI
  821. NTSTATUS
  822. NTAPI
  823. NtCreateThread(
  824. OUT PHANDLE ThreadHandle,
  825. IN ACCESS_MASK DesiredAccess,
  826. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  827. IN HANDLE ProcessHandle,
  828. OUT PCLIENT_ID ClientId,
  829. IN PCONTEXT ThreadContext,
  830. IN PINITIAL_TEB InitialTeb,
  831. IN BOOLEAN CreateSuspended
  832. );
  833. NTSYSCALLAPI
  834. NTSTATUS
  835. NTAPI
  836. NtOpenThread (
  837. OUT PHANDLE ThreadHandle,
  838. IN ACCESS_MASK DesiredAccess,
  839. IN POBJECT_ATTRIBUTES ObjectAttributes,
  840. IN PCLIENT_ID ClientId OPTIONAL
  841. );
  842. NTSYSCALLAPI
  843. NTSTATUS
  844. NTAPI
  845. NtTerminateThread(
  846. IN HANDLE ThreadHandle OPTIONAL,
  847. IN NTSTATUS ExitStatus
  848. );
  849. #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 ) // ntddk wdm ntifs
  850. #define ZwCurrentThread() NtCurrentThread() // ntddk wdm ntifs
  851. NTSYSCALLAPI
  852. NTSTATUS
  853. NTAPI
  854. NtSuspendThread(
  855. IN HANDLE ThreadHandle,
  856. OUT PULONG PreviousSuspendCount OPTIONAL
  857. );
  858. NTSYSCALLAPI
  859. NTSTATUS
  860. NTAPI
  861. NtResumeThread(
  862. IN HANDLE ThreadHandle,
  863. OUT PULONG PreviousSuspendCount OPTIONAL
  864. );
  865. NTSYSCALLAPI
  866. NTSTATUS
  867. NTAPI
  868. NtSuspendProcess (
  869. IN HANDLE ProcessHandle
  870. );
  871. NTSYSCALLAPI
  872. NTSTATUS
  873. NTAPI
  874. NtResumeProcess (
  875. IN HANDLE ProcessHandle
  876. );
  877. NTSYSCALLAPI
  878. NTSTATUS
  879. NTAPI
  880. NtGetContextThread(
  881. IN HANDLE ThreadHandle,
  882. IN OUT PCONTEXT ThreadContext
  883. );
  884. NTSYSCALLAPI
  885. NTSTATUS
  886. NTAPI
  887. NtSetContextThread(
  888. IN HANDLE ThreadHandle,
  889. IN PCONTEXT ThreadContext
  890. );
  891. NTSYSCALLAPI
  892. NTSTATUS
  893. NTAPI
  894. NtQueryInformationThread(
  895. IN HANDLE ThreadHandle,
  896. IN THREADINFOCLASS ThreadInformationClass,
  897. OUT PVOID ThreadInformation,
  898. IN ULONG ThreadInformationLength,
  899. OUT PULONG ReturnLength OPTIONAL
  900. );
  901. // begin_ntifs
  902. NTSYSCALLAPI
  903. NTSTATUS
  904. NTAPI
  905. NtSetInformationThread(
  906. IN HANDLE ThreadHandle,
  907. IN THREADINFOCLASS ThreadInformationClass,
  908. IN PVOID ThreadInformation,
  909. IN ULONG ThreadInformationLength
  910. );
  911. // end_ntifs
  912. NTSYSCALLAPI
  913. NTSTATUS
  914. NTAPI
  915. NtAlertThread(
  916. IN HANDLE ThreadHandle
  917. );
  918. NTSYSCALLAPI
  919. NTSTATUS
  920. NTAPI
  921. NtAlertResumeThread(
  922. IN HANDLE ThreadHandle,
  923. OUT PULONG PreviousSuspendCount OPTIONAL
  924. );
  925. NTSYSCALLAPI
  926. NTSTATUS
  927. NTAPI
  928. NtImpersonateThread(
  929. IN HANDLE ServerThreadHandle,
  930. IN HANDLE ClientThreadHandle,
  931. IN PSECURITY_QUALITY_OF_SERVICE SecurityQos
  932. );
  933. NTSYSCALLAPI
  934. NTSTATUS
  935. NTAPI
  936. NtTestAlert(
  937. VOID
  938. );
  939. NTSYSCALLAPI
  940. NTSTATUS
  941. NTAPI
  942. NtRegisterThreadTerminatePort(
  943. IN HANDLE PortHandle
  944. );
  945. NTSYSCALLAPI
  946. NTSTATUS
  947. NTAPI
  948. NtSetLdtEntries(
  949. IN ULONG Selector0,
  950. IN ULONG Entry0Low,
  951. IN ULONG Entry0Hi,
  952. IN ULONG Selector1,
  953. IN ULONG Entry1Low,
  954. IN ULONG Entry1High
  955. );
  956. typedef
  957. VOID
  958. (*PPS_APC_ROUTINE) (
  959. IN PVOID ApcArgument1,
  960. IN PVOID ApcArgument2,
  961. IN PVOID ApcArgument3
  962. );
  963. NTSYSCALLAPI
  964. NTSTATUS
  965. NTAPI
  966. NtQueueApcThread(
  967. IN HANDLE ThreadHandle,
  968. IN PPS_APC_ROUTINE ApcRoutine,
  969. IN PVOID ApcArgument1,
  970. IN PVOID ApcArgument2,
  971. IN PVOID ApcArgument3
  972. );
  973. //
  974. // Job Object APIs
  975. //
  976. NTSYSCALLAPI
  977. NTSTATUS
  978. NTAPI
  979. NtCreateJobObject (
  980. OUT PHANDLE JobHandle,
  981. IN ACCESS_MASK DesiredAccess,
  982. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
  983. );
  984. NTSYSCALLAPI
  985. NTSTATUS
  986. NTAPI
  987. NtOpenJobObject(
  988. OUT PHANDLE JobHandle,
  989. IN ACCESS_MASK DesiredAccess,
  990. IN POBJECT_ATTRIBUTES ObjectAttributes
  991. );
  992. NTSYSCALLAPI
  993. NTSTATUS
  994. NTAPI
  995. NtAssignProcessToJobObject(
  996. IN HANDLE JobHandle,
  997. IN HANDLE ProcessHandle
  998. );
  999. NTSYSCALLAPI
  1000. NTSTATUS
  1001. NTAPI
  1002. NtTerminateJobObject(
  1003. IN HANDLE JobHandle,
  1004. IN NTSTATUS ExitStatus
  1005. );
  1006. NTSYSCALLAPI
  1007. NTSTATUS
  1008. NTAPI
  1009. NtIsProcessInJob (
  1010. IN HANDLE ProcessHandle,
  1011. IN HANDLE JobHandle
  1012. );
  1013. NTSYSCALLAPI
  1014. NTSTATUS
  1015. NTAPI
  1016. NtCreateJobSet (
  1017. IN ULONG NumJob,
  1018. IN PJOB_SET_ARRAY UserJobSet,
  1019. IN ULONG Flags);
  1020. // begin_winnt
  1021. typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
  1022. LARGE_INTEGER TotalUserTime;
  1023. LARGE_INTEGER TotalKernelTime;
  1024. LARGE_INTEGER ThisPeriodTotalUserTime;
  1025. LARGE_INTEGER ThisPeriodTotalKernelTime;
  1026. ULONG TotalPageFaultCount;
  1027. ULONG TotalProcesses;
  1028. ULONG ActiveProcesses;
  1029. ULONG TotalTerminatedProcesses;
  1030. } JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
  1031. typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  1032. LARGE_INTEGER PerProcessUserTimeLimit;
  1033. LARGE_INTEGER PerJobUserTimeLimit;
  1034. ULONG LimitFlags;
  1035. SIZE_T MinimumWorkingSetSize;
  1036. SIZE_T MaximumWorkingSetSize;
  1037. ULONG ActiveProcessLimit;
  1038. ULONG_PTR Affinity;
  1039. ULONG PriorityClass;
  1040. ULONG SchedulingClass;
  1041. } JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
  1042. typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
  1043. JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
  1044. IO_COUNTERS IoInfo;
  1045. SIZE_T ProcessMemoryLimit;
  1046. SIZE_T JobMemoryLimit;
  1047. SIZE_T PeakProcessMemoryUsed;
  1048. SIZE_T PeakJobMemoryUsed;
  1049. } JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
  1050. typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
  1051. ULONG NumberOfAssignedProcesses;
  1052. ULONG NumberOfProcessIdsInList;
  1053. ULONG_PTR ProcessIdList[1];
  1054. } JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
  1055. typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
  1056. ULONG UIRestrictionsClass;
  1057. } JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
  1058. typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
  1059. ULONG SecurityLimitFlags ;
  1060. HANDLE JobToken ;
  1061. PTOKEN_GROUPS SidsToDisable ;
  1062. PTOKEN_PRIVILEGES PrivilegesToDelete ;
  1063. PTOKEN_GROUPS RestrictedSids ;
  1064. } JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;
  1065. typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
  1066. ULONG EndOfJobTimeAction;
  1067. } JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
  1068. typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
  1069. PVOID CompletionKey;
  1070. HANDLE CompletionPort;
  1071. } JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
  1072. typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
  1073. JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
  1074. IO_COUNTERS IoInfo;
  1075. } JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
  1076. typedef struct _JOBOBJECT_JOBSET_INFORMATION {
  1077. ULONG MemberLevel;
  1078. } JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;
  1079. #define JOB_OBJECT_TERMINATE_AT_END_OF_JOB 0
  1080. #define JOB_OBJECT_POST_AT_END_OF_JOB 1
  1081. //
  1082. // Completion Port Messages for job objects
  1083. //
  1084. // These values are returned via the lpNumberOfBytesTransferred parameter
  1085. //
  1086. #define JOB_OBJECT_MSG_END_OF_JOB_TIME 1
  1087. #define JOB_OBJECT_MSG_END_OF_PROCESS_TIME 2
  1088. #define JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT 3
  1089. #define JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO 4
  1090. #define JOB_OBJECT_MSG_NEW_PROCESS 6
  1091. #define JOB_OBJECT_MSG_EXIT_PROCESS 7
  1092. #define JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS 8
  1093. #define JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT 9
  1094. #define JOB_OBJECT_MSG_JOB_MEMORY_LIMIT 10
  1095. //
  1096. // Basic Limits
  1097. //
  1098. #define JOB_OBJECT_LIMIT_WORKINGSET 0x00000001
  1099. #define JOB_OBJECT_LIMIT_PROCESS_TIME 0x00000002
  1100. #define JOB_OBJECT_LIMIT_JOB_TIME 0x00000004
  1101. #define JOB_OBJECT_LIMIT_ACTIVE_PROCESS 0x00000008
  1102. #define JOB_OBJECT_LIMIT_AFFINITY 0x00000010
  1103. #define JOB_OBJECT_LIMIT_PRIORITY_CLASS 0x00000020
  1104. #define JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME 0x00000040
  1105. #define JOB_OBJECT_LIMIT_SCHEDULING_CLASS 0x00000080
  1106. //
  1107. // Extended Limits
  1108. //
  1109. #define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100
  1110. #define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200
  1111. #define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400
  1112. #define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800
  1113. #define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000
  1114. #define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000
  1115. #define JOB_OBJECT_LIMIT_RESERVED2 0x00004000
  1116. #define JOB_OBJECT_LIMIT_RESERVED3 0x00008000
  1117. #define JOB_OBJECT_LIMIT_RESERVED4 0x00010000
  1118. #define JOB_OBJECT_LIMIT_RESERVED5 0x00020000
  1119. #define JOB_OBJECT_LIMIT_RESERVED6 0x00040000
  1120. #define JOB_OBJECT_LIMIT_VALID_FLAGS 0x0007ffff
  1121. #define JOB_OBJECT_BASIC_LIMIT_VALID_FLAGS 0x000000ff
  1122. #define JOB_OBJECT_EXTENDED_LIMIT_VALID_FLAGS 0x00003fff
  1123. #define JOB_OBJECT_RESERVED_LIMIT_VALID_FLAGS 0x0007ffff
  1124. //
  1125. // UI restrictions for jobs
  1126. //
  1127. #define JOB_OBJECT_UILIMIT_NONE 0x00000000
  1128. #define JOB_OBJECT_UILIMIT_HANDLES 0x00000001
  1129. #define JOB_OBJECT_UILIMIT_READCLIPBOARD 0x00000002
  1130. #define JOB_OBJECT_UILIMIT_WRITECLIPBOARD 0x00000004
  1131. #define JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS 0x00000008
  1132. #define JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 0x00000010
  1133. #define JOB_OBJECT_UILIMIT_GLOBALATOMS 0x00000020
  1134. #define JOB_OBJECT_UILIMIT_DESKTOP 0x00000040
  1135. #define JOB_OBJECT_UILIMIT_EXITWINDOWS 0x00000080
  1136. #define JOB_OBJECT_UILIMIT_ALL 0x000000FF
  1137. #define JOB_OBJECT_UI_VALID_FLAGS 0x000000FF
  1138. #define JOB_OBJECT_SECURITY_NO_ADMIN 0x00000001
  1139. #define JOB_OBJECT_SECURITY_RESTRICTED_TOKEN 0x00000002
  1140. #define JOB_OBJECT_SECURITY_ONLY_TOKEN 0x00000004
  1141. #define JOB_OBJECT_SECURITY_FILTER_TOKENS 0x00000008
  1142. #define JOB_OBJECT_SECURITY_VALID_FLAGS 0x0000000f
  1143. typedef enum _JOBOBJECTINFOCLASS {
  1144. JobObjectBasicAccountingInformation = 1,
  1145. JobObjectBasicLimitInformation,
  1146. JobObjectBasicProcessIdList,
  1147. JobObjectBasicUIRestrictions,
  1148. JobObjectSecurityLimitInformation,
  1149. JobObjectEndOfJobTimeInformation,
  1150. JobObjectAssociateCompletionPortInformation,
  1151. JobObjectBasicAndIoAccountingInformation,
  1152. JobObjectExtendedLimitInformation,
  1153. JobObjectJobSetInformation,
  1154. MaxJobObjectInfoClass
  1155. } JOBOBJECTINFOCLASS;
  1156. //
  1157. // end_winnt
  1158. //
  1159. NTSYSCALLAPI
  1160. NTSTATUS
  1161. NTAPI
  1162. NtQueryInformationJobObject(
  1163. IN HANDLE JobHandle,
  1164. IN JOBOBJECTINFOCLASS JobObjectInformationClass,
  1165. OUT PVOID JobObjectInformation,
  1166. IN ULONG JobObjectInformationLength,
  1167. OUT PULONG ReturnLength OPTIONAL
  1168. );
  1169. NTSYSCALLAPI
  1170. NTSTATUS
  1171. NTAPI
  1172. NtSetInformationJobObject(
  1173. IN HANDLE JobHandle,
  1174. IN JOBOBJECTINFOCLASS JobObjectInformationClass,
  1175. IN PVOID JobObjectInformation,
  1176. IN ULONG JobObjectInformationLength
  1177. );
  1178. #ifdef __cplusplus
  1179. }
  1180. #endif
  1181. #endif // _NTPSAPI_