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.

1154 lines
22 KiB

  1. /*++
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. psp.h
  5. Abstract:
  6. Private Interfaces for process structure.
  7. Author:
  8. Mark Lucovsky (markl) 20-Apr-1989
  9. Revision History:
  10. --*/
  11. #ifndef _PSP_
  12. #define _PSP_
  13. #pragma warning(disable:4054) // Cast of function pointer to PVOID
  14. #pragma warning(disable:4055) // Cast of function pointer
  15. #pragma warning(disable:4115) // named type definition in parentheses
  16. #pragma warning(disable:4127) // condition expression is constant
  17. #pragma warning(disable:4152) // Casting function pointers
  18. #pragma warning(disable:4201) // nameless struct/union
  19. #pragma warning(disable:4214) // bit field types other than int
  20. #pragma warning(disable:4324) // alignment sensitive to declspec
  21. #pragma warning(disable:4327) // alignment on assignment
  22. #pragma warning(disable:4328) // alignment on assignment
  23. #include "ntos.h"
  24. #include "ntrtl.h"
  25. #include "nturtl.h"
  26. #include "zwapi.h"
  27. #include "ki.h"
  28. #if defined(_X86_)
  29. #include <vdmntos.h>
  30. #endif
  31. #define NOEXTAPI
  32. #include "wdbgexts.h"
  33. #include "ntdbg.h"
  34. #include <string.h>
  35. #if defined(_WIN64)
  36. #include <wow64t.h>
  37. #endif
  38. //
  39. // Working Set Watcher is 8kb. This lets us watch about 4mb of working
  40. // set.
  41. //
  42. #define WS_CATCH_SIZE 8192
  43. #define WS_OVERHEAD 16
  44. #define MAX_WS_CATCH_INDEX (((WS_CATCH_SIZE-WS_OVERHEAD)/sizeof(PROCESS_WS_WATCH_INFORMATION)) - 2)
  45. //
  46. // Process Quota Charges:
  47. //
  48. // PagedPool
  49. // Directory Base Page - PAGE_SIZE
  50. //
  51. // NonPaged
  52. // Object Body - sizeof(EPROCESS)
  53. //
  54. #define PSP_PROCESS_PAGED_CHARGE (PAGE_SIZE)
  55. #define PSP_PROCESS_NONPAGED_CHARGE (sizeof(EPROCESS))
  56. //
  57. // Thread Quota Charges:
  58. //
  59. // PagedPool
  60. // Kernel Stack - 0
  61. //
  62. // NonPaged
  63. // Object Body - sizeof(ETHREAD)
  64. //
  65. #define PSP_THREAD_PAGED_CHARGE (0)
  66. #define PSP_THREAD_NONPAGED_CHARGE (sizeof(ETHREAD))
  67. //
  68. // Define routines to get trap and exception frame addresses
  69. //
  70. #define PSPALIGN_DOWN(address,amt) ((ULONG)(address) & ~(( amt ) - 1))
  71. #define PSPALIGN_UP(address,amt) (PSPALIGN_DOWN( (address + (amt) - 1), (amt) ))
  72. #if defined(_IA64_)
  73. #define PspGetBaseTrapFrame(Thread) (PKTRAP_FRAME)((ULONG_PTR)Thread->Tcb.InitialStack - \
  74. KTHREAD_STATE_SAVEAREA_LENGTH - KTRAP_FRAME_LENGTH)
  75. #define PspGetBaseExceptionFrame(Thread) ((PKEXCEPTION_FRAME)(((ULONG_PTR)PspGetBaseTrapFrame(Thread) + STACK_SCRATCH_AREA - \
  76. sizeof(KEXCEPTION_FRAME)) & ~((ULONG_PTR)15)))
  77. #elif defined(_AMD64_)
  78. #define PspGetBaseTrapFrame(Thread) (PKTRAP_FRAME)((ULONG_PTR)Thread->Tcb.InitialStack - KTRAP_FRAME_LENGTH)
  79. #define PspGetBaseExceptionFrame(Thread) ((PKEXCEPTION_FRAME)((ULONG_PTR)PspGetBaseTrapFrame(Thread) - \
  80. KEXCEPTION_FRAME_LENGTH))
  81. #elif defined(_X86_)
  82. #define PspGetBaseTrapFrame(Thread) (PKTRAP_FRAME)((ULONG_PTR)Thread->Tcb.InitialStack - \
  83. PSPALIGN_UP(sizeof(KTRAP_FRAME),KTRAP_FRAME_ALIGN) - \
  84. sizeof(FX_SAVE_AREA))
  85. #define PspGetBaseExceptionFrame(Thread) (NULL)
  86. #else
  87. #error "no target architecture"
  88. #endif // defined(_IA64_)
  89. typedef struct _GETSETCONTEXT {
  90. KAPC Apc;
  91. KPROCESSOR_MODE Mode;
  92. KEVENT OperationComplete;
  93. CONTEXT Context;
  94. KNONVOLATILE_CONTEXT_POINTERS NonVolatileContext;
  95. } GETSETCONTEXT, *PGETSETCONTEXT;
  96. typedef struct _SYSTEM_DLL {
  97. PVOID Section;
  98. PVOID DllBase;
  99. PKNORMAL_ROUTINE LoaderInitRoutine;
  100. EX_PUSH_LOCK DllLock;
  101. } SYSTEM_DLL, PSYSTEM_DLL;
  102. typedef struct _JOB_WORKING_SET_CHANGE_HEAD {
  103. LIST_ENTRY Links;
  104. KGUARDED_MUTEX Lock;
  105. SIZE_T MinimumWorkingSetSize;
  106. SIZE_T MaximumWorkingSetSize;
  107. } JOB_WORKING_SET_CHANGE_HEAD, *PJOB_WORKING_SET_CHANGE_HEAD;
  108. typedef struct _JOB_WORKING_SET_CHANGE_RECORD {
  109. LIST_ENTRY Links;
  110. PEPROCESS Process;
  111. } JOB_WORKING_SET_CHANGE_RECORD, *PJOB_WORKING_SET_CHANGE_RECORD;
  112. JOB_WORKING_SET_CHANGE_HEAD PspWorkingSetChangeHead;
  113. //
  114. // Private Entry Points
  115. //
  116. VOID
  117. PspProcessDump(
  118. IN PVOID Object,
  119. IN POB_DUMP_CONTROL Control OPTIONAL
  120. );
  121. VOID
  122. PspProcessDelete(
  123. IN PVOID Object
  124. );
  125. VOID
  126. PspThreadDump(
  127. IN PVOID Object,
  128. IN POB_DUMP_CONTROL Control OPTIONAL
  129. );
  130. VOID
  131. PspInheritQuota(
  132. IN PEPROCESS NewProcess,
  133. IN PEPROCESS ParentProcess
  134. );
  135. VOID
  136. PspDereferenceQuota(
  137. IN PEPROCESS Process
  138. );
  139. VOID
  140. PspThreadDelete(
  141. IN PVOID Object
  142. );
  143. NTSTATUS
  144. PspWriteTebImpersonationInfo (
  145. IN PETHREAD Thread,
  146. IN PETHREAD CurrentThread
  147. );
  148. //
  149. // Initialization and loader entrypoints
  150. //
  151. BOOLEAN
  152. PspInitPhase0 (
  153. IN PLOADER_PARAMETER_BLOCK LoaderBlock
  154. );
  155. BOOLEAN
  156. PspInitPhase1 (
  157. IN PLOADER_PARAMETER_BLOCK LoaderBlock
  158. );
  159. NTSTATUS
  160. PspInitializeSystemDll( VOID );
  161. NTSTATUS
  162. PspLookupSystemDllEntryPoint(
  163. IN PSZ EntryPointName,
  164. OUT PVOID *EntryPointAddress
  165. );
  166. NTSTATUS
  167. PspLookupKernelUserEntryPoints(
  168. VOID
  169. );
  170. USHORT
  171. PspNameToOrdinal(
  172. IN PSZ EntryPointName,
  173. IN ULONG DllBase,
  174. IN ULONG NumberOfNames,
  175. IN PULONG NameTableBase,
  176. IN PUSHORT OrdinalTableBase
  177. );
  178. //
  179. // Internal Creation Functions
  180. //
  181. NTSTATUS
  182. PspCreateProcess(
  183. OUT PHANDLE ProcessHandle,
  184. IN ACCESS_MASK DesiredAccess,
  185. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  186. IN HANDLE ParentProcess OPTIONAL,
  187. IN ULONG Flags,
  188. IN HANDLE SectionHandle OPTIONAL,
  189. IN HANDLE DebugPort OPTIONAL,
  190. IN HANDLE ExceptionPort OPTIONAL,
  191. IN ULONG JobMemberLevel
  192. );
  193. #define PSP_MAX_CREATE_PROCESS_NOTIFY 8
  194. //
  195. // Define process callouts. These are of type PCREATE_PROCESS_NOTIFY_ROUTINE
  196. // Called on process create and delete.
  197. //
  198. ULONG PspCreateProcessNotifyRoutineCount;
  199. EX_CALLBACK PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];
  200. #define PSP_MAX_CREATE_THREAD_NOTIFY 8
  201. //
  202. // Define thread callouts. These are of type PCREATE_THREAD_NOTIFY_ROUTINE
  203. // Called on thread create and delete.
  204. //
  205. ULONG PspCreateThreadNotifyRoutineCount;
  206. EX_CALLBACK PspCreateThreadNotifyRoutine[PSP_MAX_CREATE_THREAD_NOTIFY];
  207. #define PSP_MAX_LOAD_IMAGE_NOTIFY 8
  208. //
  209. // Define image load callbacks. These are of type PLOAD_IMAGE_NOTIFY_ROUTINE
  210. // Called on image load.
  211. //
  212. ULONG PspLoadImageNotifyRoutineCount;
  213. EX_CALLBACK PspLoadImageNotifyRoutine[PSP_MAX_LOAD_IMAGE_NOTIFY];
  214. NTSTATUS
  215. PspCreateThread(
  216. OUT PHANDLE ThreadHandle,
  217. IN ACCESS_MASK DesiredAccess,
  218. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  219. IN HANDLE ProcessHandle,
  220. IN PEPROCESS ProcessPointer,
  221. OUT PCLIENT_ID ClientId OPTIONAL,
  222. IN PCONTEXT ThreadContext OPTIONAL,
  223. IN PINITIAL_TEB InitialTeb OPTIONAL,
  224. IN BOOLEAN CreateSuspended,
  225. IN PKSTART_ROUTINE StartRoutine OPTIONAL,
  226. IN PVOID StartContext
  227. );
  228. //
  229. // Startup Routines
  230. //
  231. VOID
  232. PspUserThreadStartup(
  233. IN PKSTART_ROUTINE StartRoutine,
  234. IN PVOID StartContext
  235. );
  236. VOID
  237. PspSystemThreadStartup(
  238. IN PKSTART_ROUTINE StartRoutine,
  239. IN PVOID StartContext
  240. );
  241. VOID
  242. PspReaper(
  243. IN PVOID StartContext
  244. );
  245. VOID
  246. PspNullSpecialApc(
  247. IN PKAPC Apc,
  248. IN OUT PKNORMAL_ROUTINE *NormalRoutine,
  249. IN OUT PVOID *NormalContext,
  250. IN OUT PVOID *SystemArgument1,
  251. IN OUT PVOID *SystemArgument2
  252. );
  253. //
  254. // Thread Exit Support
  255. //
  256. VOID
  257. PspExitApcRundown(
  258. IN PKAPC Apc
  259. );
  260. DECLSPEC_NORETURN
  261. VOID
  262. PspExitThread(
  263. IN NTSTATUS ExitStatus
  264. );
  265. NTSTATUS
  266. PspTerminateThreadByPointer(
  267. IN PETHREAD Thread,
  268. IN NTSTATUS ExitStatus,
  269. IN BOOLEAN DirectTerminate
  270. );
  271. VOID
  272. PspExitSpecialApc(
  273. IN PKAPC Apc,
  274. IN OUT PKNORMAL_ROUTINE *NormalRoutine,
  275. IN OUT PVOID *NormalContext,
  276. IN OUT PVOID *SystemArgument1,
  277. IN OUT PVOID *SystemArgument2
  278. );
  279. VOID
  280. PspExitProcess(
  281. IN BOOLEAN TrimAddressSpace,
  282. IN PEPROCESS Process
  283. );
  284. NTSTATUS
  285. PspWaitForUsermodeExit(
  286. IN PEPROCESS Process
  287. );
  288. //
  289. // Context Management
  290. //
  291. VOID
  292. PspSetContext(
  293. OUT PKTRAP_FRAME TrapFrame,
  294. OUT PKNONVOLATILE_CONTEXT_POINTERS NonVolatileContext,
  295. IN PCONTEXT Context,
  296. KPROCESSOR_MODE Mode
  297. );
  298. VOID
  299. PspGetContext(
  300. IN PKTRAP_FRAME TrapFrame,
  301. IN PKNONVOLATILE_CONTEXT_POINTERS NonVolatileContext,
  302. IN OUT PCONTEXT Context
  303. );
  304. VOID
  305. PspGetSetContextSpecialApc(
  306. IN PKAPC Apc,
  307. IN OUT PKNORMAL_ROUTINE *NormalRoutine,
  308. IN OUT PVOID *NormalContext,
  309. IN OUT PVOID *SystemArgument1,
  310. IN OUT PVOID *SystemArgument2
  311. );
  312. VOID
  313. PspExitNormalApc(
  314. IN PVOID NormalContext,
  315. IN PVOID SystemArgument1,
  316. IN PVOID SystemArgument2
  317. );
  318. //
  319. // private security routines
  320. //
  321. NTSTATUS
  322. PspInitializeProcessSecurity(
  323. IN PEPROCESS Parent OPTIONAL,
  324. IN PEPROCESS Child
  325. );
  326. VOID
  327. PspDeleteProcessSecurity(
  328. IN PEPROCESS Process
  329. );
  330. VOID
  331. PspInitializeThreadSecurity(
  332. IN PEPROCESS Process,
  333. IN PETHREAD Thread
  334. );
  335. VOID
  336. PspDeleteThreadSecurity(
  337. IN PETHREAD Thread
  338. );
  339. NTSTATUS
  340. PspAssignPrimaryToken(
  341. IN PEPROCESS Process,
  342. IN HANDLE Token OPTIONAL,
  343. IN PACCESS_TOKEN TokenPointer OPTIONAL
  344. );
  345. NTSTATUS
  346. PspSetPrimaryToken(
  347. IN HANDLE ProcessHandle,
  348. IN PEPROCESS ProcessPointer OPTIONAL,
  349. IN HANDLE TokenHandle OPTIONAL,
  350. IN PACCESS_TOKEN TokenPointer OPTIONAL,
  351. IN BOOLEAN PrivilegeChecked
  352. );
  353. //
  354. // Ldt support routines
  355. //
  356. #if defined(i386)
  357. NTSTATUS
  358. PspLdtInitialize(
  359. );
  360. #endif
  361. //
  362. // Vdm support Routines
  363. #if defined(i386)
  364. NTSTATUS
  365. PspVdmInitialize(
  366. );
  367. #endif
  368. NTSTATUS
  369. PspQueryLdtInformation(
  370. IN PEPROCESS Process,
  371. OUT PVOID LdtInformation,
  372. IN ULONG LdtInformationLength,
  373. OUT PULONG ReturnLength
  374. );
  375. NTSTATUS
  376. PspSetLdtInformation(
  377. IN PEPROCESS Process,
  378. IN PVOID LdtInformation,
  379. IN ULONG LdtInformationLength
  380. );
  381. NTSTATUS
  382. PspSetLdtSize(
  383. IN PEPROCESS Process,
  384. IN PVOID LdtSize,
  385. IN ULONG LdtSizeLength
  386. );
  387. VOID
  388. PspDeleteLdt(
  389. IN PEPROCESS Process
  390. );
  391. //
  392. // Io handling support routines
  393. //
  394. NTSTATUS
  395. PspSetProcessIoHandlers(
  396. IN PEPROCESS Process,
  397. IN PVOID IoHandlerInformation,
  398. IN ULONG IoHandlerLength
  399. );
  400. VOID
  401. PspDeleteVdmObjects(
  402. IN PEPROCESS Process
  403. );
  404. NTSTATUS
  405. PspQueryDescriptorThread (
  406. PETHREAD Thread,
  407. PVOID ThreadInformation,
  408. ULONG ThreadInformationLength,
  409. PULONG ReturnLength
  410. );
  411. //
  412. // Job Object Support Routines
  413. //
  414. VOID
  415. PspInitializeJobStructures(
  416. VOID
  417. );
  418. VOID
  419. PspInitializeJobStructuresPhase1(
  420. VOID
  421. );
  422. VOID
  423. PspJobTimeLimitsWork(
  424. IN PVOID Context
  425. );
  426. VOID
  427. PspJobTimeLimitsDpcRoutine(
  428. IN PKDPC Dpc,
  429. IN PVOID DeferredContext,
  430. IN PVOID SystemArgument1,
  431. IN PVOID SystemArgument2
  432. );
  433. VOID
  434. PspJobDelete(
  435. IN PVOID Object
  436. );
  437. VOID
  438. PspJobClose (
  439. IN PEPROCESS Process,
  440. IN PVOID Object,
  441. IN ACCESS_MASK GrantedAccess,
  442. IN ULONG_PTR ProcessHandleCount,
  443. IN ULONG_PTR SystemHandleCount
  444. );
  445. NTSTATUS
  446. PspAddProcessToJob(
  447. PEJOB Job,
  448. PEPROCESS Process
  449. );
  450. VOID
  451. PspRemoveProcessFromJob(
  452. PEJOB Job,
  453. PEPROCESS Process
  454. );
  455. VOID
  456. PspExitProcessFromJob(
  457. PEJOB Job,
  458. PEPROCESS Process
  459. );
  460. VOID
  461. PspApplyJobLimitsToProcessSet(
  462. PEJOB Job
  463. );
  464. VOID
  465. PspApplyJobLimitsToProcess(
  466. PEJOB Job,
  467. PEPROCESS Process
  468. );
  469. BOOLEAN
  470. PspTerminateAllProcessesInJob(
  471. PEJOB Job,
  472. NTSTATUS Status,
  473. BOOLEAN IncCounter
  474. );
  475. VOID
  476. PspFoldProcessAccountingIntoJob(
  477. PEJOB Job,
  478. PEPROCESS Process
  479. );
  480. NTSTATUS
  481. PspCaptureTokenFilter(
  482. KPROCESSOR_MODE PreviousMode,
  483. PJOBOBJECT_SECURITY_LIMIT_INFORMATION SecurityLimitInfo,
  484. PPS_JOB_TOKEN_FILTER * TokenFilter
  485. );
  486. VOID
  487. PspShutdownJobLimits(
  488. VOID
  489. );
  490. NTSTATUS
  491. PspTerminateProcess(
  492. PEPROCESS Process,
  493. NTSTATUS Status
  494. );
  495. NTSTATUS
  496. PspGetJobFromSet (
  497. IN PEJOB ParentJob,
  498. IN ULONG JobMemberLevel,
  499. OUT PEJOB *pJob);
  500. NTSTATUS
  501. PspWin32SessionCallout(
  502. IN PKWIN32_JOB_CALLOUT CalloutRoutine,
  503. IN PKWIN32_JOBCALLOUT_PARAMETERS Parameters,
  504. IN ULONG SessionId
  505. );
  506. //
  507. // This test routine is called on checked systems to test this path
  508. //
  509. VOID
  510. PspImageNotifyTest(
  511. IN PUNICODE_STRING FullImageName,
  512. IN HANDLE ProcessId,
  513. IN PIMAGE_INFO ImageInfo
  514. );
  515. PEPROCESS
  516. PspGetNextJobProcess (
  517. IN PEJOB Job,
  518. IN PEPROCESS Process
  519. );
  520. VOID
  521. PspQuitNextJobProcess (
  522. IN PEPROCESS Process
  523. );
  524. VOID
  525. PspInsertQuotaBlock (
  526. IN PEPROCESS_QUOTA_BLOCK QuotaBlock
  527. );
  528. VOID
  529. FORCEINLINE
  530. PspInitializeProcessLock (
  531. IN PEPROCESS Process
  532. )
  533. {
  534. ExInitializePushLock (&Process->ProcessLock);
  535. }
  536. VOID
  537. FORCEINLINE
  538. PspLockProcessExclusive (
  539. IN PEPROCESS Process,
  540. IN PETHREAD CurrentThread
  541. )
  542. {
  543. KeEnterCriticalRegionThread (&CurrentThread->Tcb);
  544. ExAcquirePushLockExclusive (&Process->ProcessLock);
  545. }
  546. VOID
  547. FORCEINLINE
  548. PspLockProcessShared (
  549. IN PEPROCESS Process,
  550. IN PETHREAD CurrentThread
  551. )
  552. {
  553. KeEnterCriticalRegionThread (&CurrentThread->Tcb);
  554. ExAcquirePushLockShared (&Process->ProcessLock);
  555. }
  556. VOID
  557. FORCEINLINE
  558. PspUnlockProcessShared (
  559. IN PEPROCESS Process,
  560. IN PETHREAD CurrentThread
  561. )
  562. {
  563. ExReleasePushLockShared (&Process->ProcessLock);
  564. KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
  565. }
  566. VOID
  567. FORCEINLINE
  568. PspUnlockProcessExclusive (
  569. IN PEPROCESS Process,
  570. IN PETHREAD CurrentThread
  571. )
  572. {
  573. ExReleasePushLockExclusive (&Process->ProcessLock);
  574. KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
  575. }
  576. //
  577. // Define macros to lock the security fields of the process and thread
  578. //
  579. VOID
  580. FORCEINLINE
  581. PspLockProcessSecurityExclusive (
  582. IN PEPROCESS Process,
  583. IN PETHREAD CurrentThread
  584. )
  585. {
  586. PspLockProcessExclusive (Process, CurrentThread);
  587. }
  588. VOID
  589. FORCEINLINE
  590. PspLockProcessSecurityShared (
  591. IN PEPROCESS Process,
  592. IN PETHREAD CurrentThread
  593. )
  594. {
  595. PspLockProcessShared (Process, CurrentThread);
  596. }
  597. VOID
  598. FORCEINLINE
  599. PspUnlockProcessSecurityShared (
  600. IN PEPROCESS Process,
  601. IN PETHREAD CurrentThread
  602. )
  603. {
  604. PspUnlockProcessShared (Process, CurrentThread);
  605. }
  606. VOID
  607. FORCEINLINE
  608. PspUnlockProcessSecurityExclusive (
  609. IN PEPROCESS Process,
  610. IN PETHREAD CurrentThread
  611. )
  612. {
  613. PspUnlockProcessExclusive (Process, CurrentThread);
  614. }
  615. VOID
  616. FORCEINLINE
  617. PspInitializeThreadLock (
  618. IN PETHREAD Thread
  619. )
  620. {
  621. ExInitializePushLock (&Thread->ThreadLock);
  622. }
  623. VOID
  624. FORCEINLINE
  625. PspLockThreadSecurityExclusive (
  626. IN PETHREAD Thread,
  627. IN PETHREAD CurrentThread
  628. )
  629. {
  630. KeEnterCriticalRegionThread (&CurrentThread->Tcb);
  631. ExAcquirePushLockExclusive (&Thread->ThreadLock);
  632. }
  633. VOID
  634. FORCEINLINE
  635. PspLockThreadSecurityShared (
  636. IN PETHREAD Thread,
  637. IN PETHREAD CurrentThread
  638. )
  639. {
  640. KeEnterCriticalRegionThread (&CurrentThread->Tcb);
  641. ExAcquirePushLockShared (&Thread->ThreadLock);
  642. }
  643. VOID
  644. FORCEINLINE
  645. PspUnlockThreadSecurityShared (
  646. IN PETHREAD Thread,
  647. IN PETHREAD CurrentThread
  648. )
  649. {
  650. ExReleasePushLockShared (&Thread->ThreadLock);
  651. KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
  652. }
  653. VOID
  654. FORCEINLINE
  655. PspUnlockThreadSecurityExclusive (
  656. IN PETHREAD Thread,
  657. IN PETHREAD CurrentThread
  658. )
  659. {
  660. ExReleasePushLockExclusive (&Thread->ThreadLock);
  661. KeLeaveCriticalRegionThread (&CurrentThread->Tcb);
  662. }
  663. //
  664. // Define macros to lock the global process list
  665. //
  666. extern KGUARDED_MUTEX PspActiveProcessMutex;
  667. VOID
  668. FORCEINLINE
  669. PspInitializeProcessListLock (
  670. VOID
  671. )
  672. {
  673. KeInitializeGuardedMutex (&PspActiveProcessMutex);
  674. };
  675. VOID
  676. FORCEINLINE
  677. PspLockProcessList (
  678. IN PETHREAD CurrentThread
  679. )
  680. {
  681. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  682. KeAcquireGuardedMutexUnsafe (&PspActiveProcessMutex);
  683. }
  684. VOID
  685. FORCEINLINE
  686. PspUnlockProcessList (
  687. IN PETHREAD CurrentThread
  688. )
  689. {
  690. KeReleaseGuardedMutexUnsafe (&PspActiveProcessMutex);
  691. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  692. }
  693. //
  694. // Routines to lock and unlock the job list mutex
  695. //
  696. extern KGUARDED_MUTEX PspJobListLock;
  697. VOID
  698. FORCEINLINE
  699. PspInitializeJobListLock (
  700. VOID
  701. )
  702. {
  703. KeInitializeGuardedMutex (&PspJobListLock);
  704. }
  705. VOID
  706. FORCEINLINE
  707. PspLockJobListExclusive (
  708. IN PETHREAD CurrentThread
  709. )
  710. {
  711. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  712. KeAcquireGuardedMutexUnsafe (&PspJobListLock);
  713. }
  714. VOID
  715. FORCEINLINE
  716. PspLockJobListShared (
  717. IN PETHREAD CurrentThread
  718. )
  719. {
  720. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  721. KeAcquireGuardedMutexUnsafe (&PspJobListLock);
  722. }
  723. VOID
  724. FORCEINLINE
  725. PspUnlockJobListExclusive (
  726. IN PETHREAD CurrentThread
  727. )
  728. {
  729. KeReleaseGuardedMutexUnsafe (&PspJobListLock);
  730. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  731. }
  732. VOID
  733. FORCEINLINE
  734. PspUnlockJobListShared (
  735. IN PETHREAD CurrentThread
  736. )
  737. {
  738. KeReleaseGuardedMutexUnsafe (&PspJobListLock);
  739. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  740. }
  741. //
  742. // Routines to lock the job memory list lock
  743. //
  744. VOID
  745. FORCEINLINE
  746. PspInitializeJobLimitsLock (
  747. IN PEJOB Job
  748. )
  749. {
  750. KeInitializeGuardedMutex (&Job->MemoryLimitsLock);
  751. }
  752. VOID
  753. FORCEINLINE
  754. PspLockJobLimitsExclusive (
  755. IN PEJOB Job,
  756. IN PETHREAD CurrentThread
  757. )
  758. {
  759. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  760. KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  761. }
  762. VOID
  763. FORCEINLINE
  764. PspLockJobLimitsExclusiveUnsafe (
  765. IN PEJOB Job
  766. )
  767. {
  768. ASSERT (KeAreAllApcsDisabled());
  769. KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  770. }
  771. VOID
  772. FORCEINLINE
  773. PspLockJobLimitsShared (
  774. IN PEJOB Job,
  775. IN PETHREAD CurrentThread
  776. )
  777. {
  778. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  779. KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  780. }
  781. VOID
  782. FORCEINLINE
  783. PspLockJobLimitsSharedUnsafe (
  784. IN PEJOB Job
  785. )
  786. {
  787. ASSERT (KeAreAllApcsDisabled());
  788. KeAcquireGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  789. }
  790. VOID
  791. FORCEINLINE
  792. PspUnlockJobLimitsExclusive (
  793. IN PEJOB Job,
  794. IN PETHREAD CurrentThread
  795. )
  796. {
  797. KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  798. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  799. }
  800. VOID
  801. FORCEINLINE
  802. PspUnlockJobLimitsExclusiveUnsafe (
  803. IN PEJOB Job
  804. )
  805. {
  806. ASSERT (KeAreAllApcsDisabled());
  807. KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  808. }
  809. VOID
  810. FORCEINLINE
  811. PspUnlockJobLimitsShared (
  812. IN PEJOB Job,
  813. IN PETHREAD CurrentThread
  814. )
  815. {
  816. KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  817. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  818. }
  819. VOID
  820. FORCEINLINE
  821. PspUnlockJobLimitsSharedUnsafe (
  822. IN PEJOB Job
  823. )
  824. {
  825. ASSERT (KeAreAllApcsDisabled());
  826. KeReleaseGuardedMutexUnsafe (&Job->MemoryLimitsLock);
  827. }
  828. //
  829. // Routines to lock job time limits structures
  830. //
  831. extern KGUARDED_MUTEX PspJobTimeLimitsLock;
  832. VOID
  833. FORCEINLINE
  834. PspInitializeJobTimeLimitsLock (
  835. VOID
  836. )
  837. {
  838. KeInitializeGuardedMutex (&PspJobTimeLimitsLock);
  839. }
  840. VOID
  841. FORCEINLINE
  842. PspLockJobTimeLimitsExclusive (
  843. IN PETHREAD CurrentThread
  844. )
  845. {
  846. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  847. KeAcquireGuardedMutexUnsafe (&PspJobTimeLimitsLock);
  848. }
  849. VOID
  850. FORCEINLINE
  851. PspUnlockJobTimeLimitsExclusive (
  852. IN PETHREAD CurrentThread
  853. )
  854. {
  855. KeReleaseGuardedMutexUnsafe (&PspJobTimeLimitsLock);
  856. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  857. }
  858. VOID
  859. FORCEINLINE
  860. PspLockJobTimeLimitsShared (
  861. IN PETHREAD CurrentThread
  862. )
  863. {
  864. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  865. KeAcquireGuardedMutexUnsafe (&PspJobTimeLimitsLock);
  866. }
  867. VOID
  868. FORCEINLINE
  869. PspUnlockJobTimeLimitsShared (
  870. IN PETHREAD CurrentThread
  871. )
  872. {
  873. KeReleaseGuardedMutexUnsafe (&PspJobTimeLimitsLock);
  874. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  875. }
  876. //
  877. // Routines for locking working set change lock
  878. //
  879. VOID
  880. FORCEINLINE
  881. PspInitializeWorkingSetChangeLock (
  882. VOID
  883. )
  884. {
  885. KeInitializeGuardedMutex (&PspWorkingSetChangeHead.Lock);
  886. }
  887. VOID
  888. FORCEINLINE
  889. PspLockWorkingSetChangeExclusive (
  890. IN PETHREAD CurrentThread
  891. )
  892. {
  893. KeEnterGuardedRegionThread (&CurrentThread->Tcb);
  894. KeAcquireGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
  895. }
  896. VOID
  897. FORCEINLINE
  898. PspUnlockWorkingSetChangeExclusive (
  899. IN PETHREAD CurrentThread
  900. )
  901. {
  902. KeReleaseGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
  903. KeLeaveGuardedRegionThread (&CurrentThread->Tcb);
  904. }
  905. VOID
  906. FORCEINLINE
  907. PspLockWorkingSetChangeExclusiveUnsafe (
  908. VOID
  909. )
  910. {
  911. ASSERT (KeAreAllApcsDisabled());
  912. KeAcquireGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
  913. }
  914. VOID
  915. FORCEINLINE
  916. PspUnlockWorkingSetChangeExclusiveUnsafe (
  917. VOID
  918. )
  919. {
  920. KeReleaseGuardedMutexUnsafe (&PspWorkingSetChangeHead.Lock);
  921. ASSERT (KeAreAllApcsDisabled());
  922. }
  923. //
  924. //
  925. // Global Data
  926. //
  927. extern PHANDLE_TABLE PspCidTable;
  928. extern HANDLE PspInitialSystemProcessHandle;
  929. extern PACCESS_TOKEN PspBootAccessToken;
  930. extern KSPIN_LOCK PspEventPairLock;
  931. extern SYSTEM_DLL PspSystemDll;
  932. extern PETHREAD PspShutdownThread;
  933. extern ULONG PspDefaultPagedLimit;
  934. extern ULONG PspDefaultNonPagedLimit;
  935. extern ULONG PspDefaultPagefileLimit;
  936. extern ULONG PsMinimumWorkingSet;
  937. extern EPROCESS_QUOTA_BLOCK PspDefaultQuotaBlock;
  938. extern BOOLEAN PspDoingGiveBacks;
  939. extern PKWIN32_PROCESS_CALLOUT PspW32ProcessCallout;
  940. extern PKWIN32_THREAD_CALLOUT PspW32ThreadCallout;
  941. extern PKWIN32_JOB_CALLOUT PspW32JobCallout;
  942. extern ULONG PspW32ProcessSize;
  943. extern ULONG PspW32ThreadSize;
  944. extern SCHAR PspForegroundQuantum[3];
  945. #define PSP_NUMBER_OF_SCHEDULING_CLASSES 10
  946. #define PSP_DEFAULT_SCHEDULING_CLASSES 5
  947. extern const SCHAR PspJobSchedulingClasses[PSP_NUMBER_OF_SCHEDULING_CLASSES];
  948. extern BOOLEAN PspUseJobSchedulingClasses;
  949. extern LIST_ENTRY PspJobList;
  950. extern KDPC PspJobLimeLimitsDpc;
  951. extern KTIMER PspJobTimeLimitsTimer;
  952. extern WORK_QUEUE_ITEM PspJobTimeLimitsWorkItem;
  953. extern KSPIN_LOCK PspQuotaLock;
  954. #endif // _PSP_