1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H
4 /* GLOBAL VARIABLES *********************************************************/
6 extern TIME_ZONE_INFORMATION ExpTimeZoneInfo
;
7 extern LARGE_INTEGER ExpTimeZoneBias
;
8 extern ULONG ExpTimeZoneId
;
9 extern ULONG ExpTickCountMultiplier
;
10 extern ULONG ExpLastTimeZoneBias
;
11 extern POBJECT_TYPE ExEventPairObjectType
;
12 extern POBJECT_TYPE _ExEventObjectType
, _ExSemaphoreObjectType
;
13 extern ULONG NtBuildNumber
;
14 extern ULONG NtMajorVersion
;
15 extern ULONG NtMinorVersion
;
16 extern FAST_MUTEX ExpEnvironmentLock
;
17 extern ERESOURCE ExpFirmwareTableResource
;
18 extern LIST_ENTRY ExpFirmwareTableProviderListHead
;
19 extern BOOLEAN ExpIsWinPEMode
;
20 extern LIST_ENTRY ExpSystemResourcesList
;
21 ULONG ExpAnsiCodePageDataOffset
, ExpOemCodePageDataOffset
;
22 ULONG ExpUnicodeCaseTableDataOffset
;
23 PVOID ExpNlsSectionPointer
;
24 extern CHAR NtBuildLab
[];
25 extern ULONG CmNtCSDVersion
;
26 extern ULONG NtGlobalFlag
;
27 extern ULONG ExpInitializationPhase
;
28 extern ULONG ExpAltTimeZoneBias
;
29 extern LIST_ENTRY ExSystemLookasideListHead
;
31 typedef struct _EXHANDLE
40 HANDLE GenericHandleOverlay
;
43 } EXHANDLE
, *PEXHANDLE
;
45 typedef struct _ETIMER
50 LIST_ENTRY ActiveTimerListEntry
;
53 BOOLEAN ApcAssociated
;
55 LIST_ENTRY WakeTimerListEntry
;
60 PCALLBACK_OBJECT
*CallbackObject
;
64 #define MAX_FAST_REFS 7
66 #define ExAcquireRundownProtection _ExAcquireRundownProtection
67 #define ExReleaseRundownProtection _ExReleaseRundownProtection
68 #define ExInitializeRundownProtection _ExInitializeRundownProtection
69 #define ExWaitForRundownProtectionRelease _ExWaitForRundownProtectionRelease
70 #define ExRundownCompleted _ExRundownCompleted
71 #define ExGetPreviousMode KeGetPreviousMode
75 // Various bits tagged on the handle or handle table
77 #define EXHANDLE_TABLE_ENTRY_LOCK_BIT 1
78 #define FREE_HANDLE_MASK -1
81 // Number of entries in each table level
83 #define LOW_LEVEL_ENTRIES (PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY))
84 #define MID_LEVEL_ENTRIES (PAGE_SIZE / sizeof(PHANDLE_TABLE_ENTRY))
85 #define HIGH_LEVEL_ENTRIES (16777216 / (LOW_LEVEL_ENTRIES * MID_LEVEL_ENTRIES))
88 // Maximum index in each table level before we need another table
90 #define MAX_LOW_INDEX LOW_LEVEL_ENTRIES
91 #define MAX_MID_INDEX (MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES)
92 #define MAX_HIGH_INDEX (MID_LEVEL_ENTRIES * MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES)
97 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40300)
99 #define DEFINE_WAIT_BLOCK(x) \
103 EX_PUSH_LOCK_WAIT_BLOCK UnalignedBlock; \
105 PEX_PUSH_LOCK_WAIT_BLOCK x = (PEX_PUSH_LOCK_WAIT_BLOCK) \
106 ((ULONG_PTR)&WaitBlockBuffer.UnalignedBlock &~ 0xF);
111 // This is only for compatibility; the compiler will optimize the extra
112 // local variable (the actual pointer) away, so we don't take any perf hit
115 #define DEFINE_WAIT_BLOCK(x) \
116 EX_PUSH_LOCK_WAIT_BLOCK WaitBlockBuffer; \
117 PEX_PUSH_LOCK_WAIT_BLOCK x = &WaitBlockBuffer;
121 /* INITIALIZATION FUNCTIONS *************************************************/
133 Phase1Initialization(
139 ExpInitializePushLocks(VOID
);
143 ExRefreshTimeZoneInformation(
144 IN PLARGE_INTEGER SystemBootTime
149 ExpInitializeWorkerThreads(VOID
);
153 ExpInitLookasideLists(VOID
);
157 ExInitializeSystemLookasideList(
158 IN PGENERAL_LOOKASIDE List
,
162 IN USHORT MaximumDepth
,
163 IN PLIST_ENTRY ListHead
168 ExpInitializeCallbacks(VOID
);
176 ExpInitializeExecutive(
178 IN PLOADER_PARAMETER_BLOCK LoaderBlock
183 ExpInitializeEventImplementation(VOID
);
187 ExpInitializeEventImplementation(VOID
);
191 ExpInitializeEventPairImplementation(VOID
);
195 ExpInitializeSemaphoreImplementation(VOID
);
199 ExpInitializeMutantImplementation(VOID
);
203 ExpInitializeTimerImplementation(VOID
);
207 ExpInitializeProfileImplementation(VOID
);
211 ExpResourceInitialization(VOID
);
215 ExInitPoolLookasidePointers(VOID
);
217 /* Callback Functions ********************************************************/
221 ExInitializeCallBack(
222 IN OUT PEX_CALLBACK Callback
225 PEX_CALLBACK_ROUTINE_BLOCK
228 IN PEX_CALLBACK_FUNCTION Function
,
235 IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
240 ExCompareExchangeCallBack (
241 IN OUT PEX_CALLBACK CallBack
,
242 IN PEX_CALLBACK_ROUTINE_BLOCK NewBlock
,
243 IN PEX_CALLBACK_ROUTINE_BLOCK OldBlock
246 PEX_CALLBACK_ROUTINE_BLOCK
248 ExReferenceCallBackBlock(
249 IN OUT PEX_CALLBACK CallBack
254 ExDereferenceCallBackBlock(
255 IN OUT PEX_CALLBACK CallBack
,
256 IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
259 PEX_CALLBACK_FUNCTION
261 ExGetCallBackBlockRoutine(
262 IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
267 ExGetCallBackBlockContext(
268 IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
274 IN PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
277 /* Rundown Functions ********************************************************/
281 ExfInitializeRundownProtection(
282 OUT PEX_RUNDOWN_REF RunRef
287 ExfReInitializeRundownProtection(
288 OUT PEX_RUNDOWN_REF RunRef
293 ExfAcquireRundownProtection(
294 IN OUT PEX_RUNDOWN_REF RunRef
299 ExfAcquireRundownProtectionEx(
300 IN OUT PEX_RUNDOWN_REF RunRef
,
306 ExfReleaseRundownProtection(
307 IN OUT PEX_RUNDOWN_REF RunRef
312 ExfReleaseRundownProtectionEx(
313 IN OUT PEX_RUNDOWN_REF RunRef
,
320 OUT PEX_RUNDOWN_REF RunRef
325 ExfWaitForRundownProtectionRelease(
326 IN OUT PEX_RUNDOWN_REF RunRef
329 /* HANDLE TABLE FUNCTIONS ***************************************************/
332 (NTAPI
*PEX_SWEEP_HANDLE_CALLBACK
)(
333 PHANDLE_TABLE_ENTRY HandleTableEntry
,
339 (NTAPI
*PEX_DUPLICATE_HANDLE_CALLBACK
)(
340 IN PEPROCESS Process
,
341 IN PHANDLE_TABLE HandleTable
,
342 IN PHANDLE_TABLE_ENTRY HandleTableEntry
,
343 IN PHANDLE_TABLE_ENTRY NewEntry
347 (NTAPI
*PEX_CHANGE_HANDLE_CALLBACK
)(
348 PHANDLE_TABLE_ENTRY HandleTableEntry
,
354 ExpInitializeHandleTables(
361 IN PEPROCESS Process OPTIONAL
366 ExUnlockHandleTableEntry(
367 IN PHANDLE_TABLE HandleTable
,
368 IN PHANDLE_TABLE_ENTRY HandleTableEntry
374 IN PHANDLE_TABLE HandleTable
,
375 IN PHANDLE_TABLE_ENTRY HandleTableEntry
380 ExDestroyHandleTable(
381 IN PHANDLE_TABLE HandleTable
,
382 IN PVOID DestroyHandleProcedure OPTIONAL
388 IN PHANDLE_TABLE HandleTable
,
390 IN PHANDLE_TABLE_ENTRY HandleTableEntry OPTIONAL
395 ExMapHandleToPointer(
396 IN PHANDLE_TABLE HandleTable
,
403 IN PEPROCESS Process
,
404 IN PHANDLE_TABLE HandleTable
,
405 IN PEX_DUPLICATE_HANDLE_CALLBACK DupHandleProcedure
,
412 IN PHANDLE_TABLE HandleTable
,
414 IN PEX_CHANGE_HANDLE_CALLBACK ChangeRoutine
,
421 IN PHANDLE_TABLE HandleTable
,
422 IN PEX_SWEEP_HANDLE_CALLBACK EnumHandleProcedure
,
426 /* PSEH EXCEPTION HANDLING **************************************************/
430 ExSystemExceptionFilter(VOID
);
432 /* CALLBACKS *****************************************************************/
436 ExDoCallBack(IN OUT PEX_CALLBACK Callback
,
441 PEX_CALLBACK_ROUTINE_BLOCK CallbackRoutineBlock
;
442 PEX_CALLBACK_FUNCTION Function
;
444 /* Reference the block */
445 CallbackRoutineBlock
= ExReferenceCallBackBlock(Callback
);
446 if (CallbackRoutineBlock
)
448 /* Get the function */
449 Function
= ExGetCallBackBlockRoutine(CallbackRoutineBlock
);
451 /* Do the callback */
452 Function(Context
, Argument1
, Argument2
);
454 /* Now dereference it */
455 ExDereferenceCallBackBlock(Callback
, CallbackRoutineBlock
);
459 /* RUNDOWN *******************************************************************/
462 #define ExpChangeRundown(x, y, z) InterlockedCompareExchange64((PLONGLONG)x, y, z)
463 #define ExpSetRundown(x, y) InterlockedExchange64((PLONGLONG)x, y)
465 #define ExpChangeRundown(x, y, z) PtrToUlong(InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z)))
466 #define ExpChangePushlock(x, y, z) LongToPtr(InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z)))
467 #define ExpSetRundown(x, y) InterlockedExchange((PLONG)x, y)
471 * @name ExfAcquireRundownProtection
474 * The ExfAcquireRundownProtection routine acquires rundown protection for
475 * the specified descriptor.
478 * Pointer to a rundown reference descriptor.
480 * @return TRUE if access to the protected structure was granted, FALSE otherwise.
482 * @remarks This is the internal macro for system use only.In case the rundown
483 * was active, then the slow-path will be called through the exported
489 _ExAcquireRundownProtection(IN PEX_RUNDOWN_REF RunRef
)
491 ULONG_PTR Value
, NewValue
;
493 /* Get the current value and mask the active bit */
494 Value
= RunRef
->Count
&~ EX_RUNDOWN_ACTIVE
;
496 /* Add a reference */
497 NewValue
= Value
+ EX_RUNDOWN_COUNT_INC
;
499 /* Change the value */
500 NewValue
= ExpChangeRundown(RunRef
, NewValue
, Value
);
501 if (NewValue
!= Value
)
503 /* Rundown was active, use long path */
504 return ExfAcquireRundownProtection(RunRef
);
512 * @name ExReleaseRundownProtection
515 * The ExReleaseRundownProtection routine releases rundown protection for
516 * the specified descriptor.
519 * Pointer to a rundown reference descriptor.
521 * @return TRUE if access to the protected structure was granted, FALSE otherwise.
523 * @remarks This is the internal macro for system use only.In case the rundown
524 * was active, then the slow-path will be called through the exported
530 _ExReleaseRundownProtection(IN PEX_RUNDOWN_REF RunRef
)
532 ULONG_PTR Value
, NewValue
;
534 /* Get the current value and mask the active bit */
535 Value
= RunRef
->Count
&~ EX_RUNDOWN_ACTIVE
;
537 /* Remove a reference */
538 NewValue
= Value
- EX_RUNDOWN_COUNT_INC
;
540 /* Change the value */
541 NewValue
= ExpChangeRundown(RunRef
, NewValue
, Value
);
543 /* Check if the rundown was active */
544 if (NewValue
!= Value
)
546 /* Rundown was active, use long path */
547 ExfReleaseRundownProtection(RunRef
);
552 ASSERT((Value
>= EX_RUNDOWN_COUNT_INC
) || (KeNumberProcessors
> 1));
557 * @name ExInitializeRundownProtection
560 * The ExInitializeRundownProtection routine initializes a rundown
561 * protection descriptor.
564 * Pointer to a rundown reference descriptor.
568 * @remarks This is the internal macro for system use only.
573 _ExInitializeRundownProtection(IN PEX_RUNDOWN_REF RunRef
)
575 /* Set the count to zero */
580 * @name ExWaitForRundownProtectionRelease
583 * The ExWaitForRundownProtectionRelease routine waits until the specified
584 * rundown descriptor has been released.
587 * Pointer to a rundown reference descriptor.
591 * @remarks This is the internal macro for system use only. If a wait is actually
592 * necessary, then the slow path is taken through the exported function.
597 _ExWaitForRundownProtectionRelease(IN PEX_RUNDOWN_REF RunRef
)
601 /* Set the active bit */
602 Value
= ExpChangeRundown(RunRef
, EX_RUNDOWN_ACTIVE
, 0);
603 if ((Value
) && (Value
!= EX_RUNDOWN_ACTIVE
))
605 /* If the the rundown wasn't already active, then take the long path */
606 ExfWaitForRundownProtectionRelease(RunRef
);
611 * @name ExRundownCompleted
614 * The ExRundownCompleted routine completes the rundown of the specified
615 * descriptor by setting the active bit.
618 * Pointer to a rundown reference descriptor.
622 * @remarks This is the internal macro for system use only.
627 _ExRundownCompleted(IN PEX_RUNDOWN_REF RunRef
)
630 ASSERT((RunRef
->Count
& EX_RUNDOWN_ACTIVE
) != 0);
632 /* Mark the counter as active */
633 ExpSetRundown(&RunRef
->Count
, EX_RUNDOWN_ACTIVE
);
636 /* PUSHLOCKS *****************************************************************/
638 /* FIXME: VERIFY THESE! */
643 IN PEX_PUSH_LOCK PushLock
,
650 IN PEX_PUSH_LOCK PushLock
,
651 IN PVOID CurrentWaitBlock
656 ExWaitForUnblockPushLock(
657 IN PEX_PUSH_LOCK PushLock
,
662 * @name ExInitializePushLock
665 * The ExInitializePushLock macro initializes a PushLock.
668 * Pointer to the pushlock which is to be initialized.
677 ExInitializePushLock(IN PULONG_PTR PushLock
)
679 /* Set the value to 0 */
684 * @name ExAcquirePushLockExclusive
687 * The ExAcquirePushLockExclusive macro exclusively acquires a PushLock.
690 * Pointer to the pushlock which is to be acquired.
694 * @remarks The function attempts the quickest route to acquire the lock, which is
695 * to simply set the lock bit.
696 * However, if the pushlock is already shared, the slower path is taken.
698 * Callers of ExAcquirePushLockShared must be running at IRQL <= APC_LEVEL.
699 * This macro should usually be paired up with KeAcquireCriticalRegion.
704 ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock
)
706 /* Try acquiring the lock */
707 if (InterlockedBitTestAndSet((PLONG
)PushLock
, EX_PUSH_LOCK_LOCK_V
))
709 /* Someone changed it, use the slow path */
710 ExfAcquirePushLockExclusive(PushLock
);
714 ASSERT(PushLock
->Locked
);
718 * @name ExTryToAcquirePushLockExclusive
721 * The ExAcquirePushLockExclusive macro exclusively acquires a PushLock.
724 * Pointer to the pushlock which is to be acquired.
728 * @remarks The function attempts the quickest route to acquire the lock, which is
729 * to simply set the lock bit.
730 * However, if the pushlock is already shared, the slower path is taken.
732 * Callers of ExAcquirePushLockShared must be running at IRQL <= APC_LEVEL.
733 * This macro should usually be paired up with KeAcquireCriticalRegion.
738 ExTryToAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock
)
740 /* Try acquiring the lock */
741 if (InterlockedBitTestAndSet((PLONG
)PushLock
, EX_PUSH_LOCK_LOCK_V
))
748 ASSERT (PushLock
->Locked
);
753 * @name ExAcquirePushLockShared
756 * The ExAcquirePushLockShared macro acquires a shared PushLock.
759 * Pointer to the pushlock which is to be acquired.
763 * @remarks The function attempts the quickest route to acquire the lock, which is
764 * to simply set the lock bit and set the share count to one.
765 * However, if the pushlock is already shared, the slower path is taken.
767 * Callers of ExAcquirePushLockShared must be running at IRQL <= APC_LEVEL.
768 * This macro should usually be paired up with KeAcquireCriticalRegion.
773 ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock
)
775 EX_PUSH_LOCK NewValue
;
777 /* Try acquiring the lock */
778 NewValue
.Value
= EX_PUSH_LOCK_LOCK
| EX_PUSH_LOCK_SHARE_INC
;
779 if (ExpChangePushlock(PushLock
, NewValue
.Ptr
, 0))
781 /* Someone changed it, use the slow path */
782 ExfAcquirePushLockShared(PushLock
);
786 ASSERT(PushLock
->Locked
);
787 ASSERT(PushLock
->Waiting
|| PushLock
->Shared
> 0);
791 * @name ExConvertPushLockSharedToExclusive
794 * The ExConvertPushLockSharedToExclusive macro converts an exclusive
795 * pushlock to a shared pushlock.
798 * Pointer to the pushlock which is to be converted.
800 * @return FALSE if conversion failed, TRUE otherwise.
802 * @remarks The function attempts the quickest route to convert the lock, which is
803 * to simply set the lock bit and remove any other bits.
808 ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock
)
810 EX_PUSH_LOCK OldValue
;
812 /* Set the expected old value */
813 OldValue
.Value
= EX_PUSH_LOCK_LOCK
| EX_PUSH_LOCK_SHARE_INC
;
815 /* Try converting the lock */
816 if (ExpChangePushlock(PushLock
, EX_PUSH_LOCK_LOCK
, OldValue
.Value
) !=
819 /* Conversion failed */
824 ASSERT(PushLock
->Locked
);
829 * @name ExWaitOnPushLock
832 * The ExWaitOnPushLock macro acquires and instantly releases a pushlock.
835 * Pointer to a pushlock.
839 * @remarks The function attempts to get any exclusive waiters out of their slow
840 * path by forcing an instant acquire/release operation.
842 * Callers of ExWaitOnPushLock must be running at IRQL <= APC_LEVEL.
847 ExWaitOnPushLock(PEX_PUSH_LOCK PushLock
)
849 /* Check if we're locked */
850 if (PushLock
->Locked
)
852 /* Acquire the lock */
853 ExfAcquirePushLockExclusive(PushLock
);
854 ASSERT(PushLock
->Locked
);
857 ExfReleasePushLockExclusive(PushLock
);
862 * @name ExReleasePushLockShared
865 * The ExReleasePushLockShared macro releases a previously acquired PushLock.
868 * Pointer to a previously acquired pushlock.
872 * @remarks The function attempts the quickest route to release the lock, which is
873 * to simply decrease the share count and remove the lock bit.
874 * However, if the pushlock is being waited on then the long path is taken.
876 * Callers of ExReleasePushLockShared must be running at IRQL <= APC_LEVEL.
877 * This macro should usually be paired up with KeLeaveCriticalRegion.
882 ExReleasePushLockShared(PEX_PUSH_LOCK PushLock
)
884 EX_PUSH_LOCK OldValue
;
887 ASSERT(PushLock
->Locked
);
888 ASSERT(PushLock
->Waiting
|| PushLock
->Shared
> 0);
890 /* Try to clear the pushlock */
891 OldValue
.Value
= EX_PUSH_LOCK_LOCK
| EX_PUSH_LOCK_SHARE_INC
;
892 if (ExpChangePushlock(PushLock
, 0, OldValue
.Ptr
) != OldValue
.Ptr
)
894 /* There are still other people waiting on it */
895 ExfReleasePushLockShared(PushLock
);
900 * @name ExReleasePushLockExclusive
903 * The ExReleasePushLockExclusive macro releases a previously
904 * exclusively acquired PushLock.
907 * Pointer to a previously acquired pushlock.
911 * @remarks The function attempts the quickest route to release the lock, which is
912 * to simply clear the locked bit.
913 * However, if the pushlock is being waited on, the slow path is taken
914 * in an attempt to wake up the lock.
916 * Callers of ExReleasePushLockExclusive must be running at IRQL <= APC_LEVEL.
917 * This macro should usually be paired up with KeLeaveCriticalRegion.
922 ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock
)
924 EX_PUSH_LOCK OldValue
;
927 ASSERT(PushLock
->Locked
);
928 ASSERT(PushLock
->Waiting
|| PushLock
->Shared
== 0);
930 /* Unlock the pushlock */
931 OldValue
.Value
= InterlockedExchangeAddSizeT((PLONG
)PushLock
,
932 -(LONG
)EX_PUSH_LOCK_LOCK
);
935 ASSERT(OldValue
.Locked
);
936 ASSERT(OldValue
.Waiting
|| OldValue
.Shared
== 0);
938 /* Check if anyone is waiting on it and it's not already waking*/
939 if ((OldValue
.Waiting
) && !(OldValue
.Waking
))
942 ExfTryToWakePushLock(PushLock
);
947 * @name ExReleasePushLock
950 * The ExReleasePushLock macro releases a previously acquired PushLock.
953 * Pointer to a previously acquired pushlock.
957 * @remarks The function attempts the quickest route to release the lock, which is
958 * to simply clear all the fields and decrease the share count if required.
959 * However, if the pushlock is being waited on then the long path is taken.
961 * Callers of ExReleasePushLock must be running at IRQL <= APC_LEVEL.
962 * This macro should usually be paired up with KeLeaveCriticalRegion.
967 ExReleasePushLock(PEX_PUSH_LOCK PushLock
)
969 EX_PUSH_LOCK OldValue
= *PushLock
;
970 EX_PUSH_LOCK NewValue
;
973 ASSERT(OldValue
.Locked
);
975 /* Check if the pushlock is shared */
976 if (OldValue
.Shared
> 1)
978 /* Decrease the share count */
979 NewValue
.Value
= OldValue
.Value
- EX_PUSH_LOCK_SHARE_INC
;
983 /* Clear the pushlock entirely */
987 /* Check if nobody is waiting on us and try clearing the lock here */
988 if ((OldValue
.Waiting
) ||
989 (ExpChangePushlock(PushLock
, NewValue
.Ptr
, OldValue
.Ptr
) !=
992 /* We have waiters, use the long path */
993 ExfReleasePushLock(PushLock
);
997 /* OTHER FUNCTIONS **********************************************************/
1001 ExTryToAcquireResourceExclusiveLite(
1002 IN PERESOURCE Resource
1006 ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation
);
1010 ExAcquireTimeRefreshLock(BOOLEAN Wait
);
1014 ExReleaseTimeRefreshLock(VOID
);
1018 ExUpdateSystemTimeFromCmos(IN BOOLEAN UpdateInterruptTime
,
1019 IN ULONG MaxSepInSeconds
);
1023 ExpAllocateLocallyUniqueId(OUT LUID
*LocallyUniqueId
);
1027 ExTimerRundown(VOID
);
1032 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1038 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1041 #define InterlockedDecrementUL(Addend) \
1042 (ULONG)InterlockedDecrement((PLONG)(Addend))
1044 #define InterlockedIncrementUL(Addend) \
1045 (ULONG)InterlockedIncrement((PLONG)(Addend))
1047 #define InterlockedExchangeUL(Target, Value) \
1048 (ULONG)InterlockedExchange((PLONG)(Target), (LONG)(Value))
1050 #define InterlockedExchangeAddUL(Addend, Value) \
1051 (ULONG)InterlockedExchangeAdd((PLONG)(Addend), (LONG)(Value))
1053 #define InterlockedCompareExchangeUL(Destination, Exchange, Comperand) \
1054 (ULONG)InterlockedCompareExchange((PLONG)(Destination), (LONG)(Exchange), (LONG)(Comperand))
1056 #define ExfInterlockedCompareExchange64UL(Destination, Exchange, Comperand) \
1057 (ULONGLONG)ExfInterlockedCompareExchange64((PLONGLONG)(Destination), (PLONGLONG)(Exchange), (PLONGLONG)(Comperand))
1059 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H */