/* GLOBAL VARIABLES *********************************************************/
-extern TIME_ZONE_INFORMATION ExpTimeZoneInfo;
+extern RTL_TIME_ZONE_INFORMATION ExpTimeZoneInfo;
extern LARGE_INTEGER ExpTimeZoneBias;
extern ULONG ExpTimeZoneId;
extern ULONG ExpTickCountMultiplier;
extern ULONG ExpLastTimeZoneBias;
extern POBJECT_TYPE ExEventPairObjectType;
extern POBJECT_TYPE _ExEventObjectType, _ExSemaphoreObjectType;
-extern ULONG NtBuildNumber;
-extern ULONG NtMajorVersion;
-extern ULONG NtMinorVersion;
extern FAST_MUTEX ExpEnvironmentLock;
extern ERESOURCE ExpFirmwareTableResource;
extern LIST_ENTRY ExpFirmwareTableProviderListHead;
extern ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
extern ULONG ExpUnicodeCaseTableDataOffset;
extern PVOID ExpNlsSectionPointer;
-extern CHAR NtBuildLab[];
-extern ULONG CmNtCSDVersion;
extern ULONG NtGlobalFlag;
+extern UNICODE_STRING NtSystemRoot;
extern ULONG ExpInitializationPhase;
extern ULONG ExpAltTimeZoneBias;
extern LIST_ENTRY ExSystemLookasideListHead;
extern PCALLBACK_OBJECT PowerStateCallback;
+extern LIST_ENTRY ExPoolLookasideListHead;
+extern LIST_ENTRY ExpNonPagedLookasideListHead;
+extern LIST_ENTRY ExpPagedLookasideListHead;
+extern KSPIN_LOCK ExpNonPagedLookasideListLock;
+extern KSPIN_LOCK ExpPagedLookasideListLock;
+extern ULONG ExCriticalWorkerThreads;
+extern ULONG ExDelayedWorkerThreads;
+
+extern PVOID ExpDefaultErrorPort;
+extern PEPROCESS ExpDefaultErrorPortProcess;
+
+/*
+ * NT/Cm Version Info variables
+ */
+extern ULONG NtMajorVersion;
+extern ULONG NtMinorVersion;
+extern ULONG NtBuildNumber;
+extern ULONG CmNtSpBuildNumber;
+extern ULONG CmNtCSDVersion;
+extern ULONG CmNtCSDReleaseType;
+extern UNICODE_STRING CmVersionString;
+extern UNICODE_STRING CmCSDVersionString;
+extern CHAR NtBuildLab[];
-typedef struct _EXHANDLE
+// #ifdef _WINKD_
+/*
+ * WinDBG Debugger Worker State Machine data (see dbgctrl.c)
+ */
+typedef enum _WINKD_WORKER_STATE
{
- union
- {
- struct
- {
- ULONG TagBits:2;
- ULONG Index:30;
- };
- HANDLE GenericHandleOverlay;
- ULONG_PTR Value;
- };
+ WinKdWorkerReady = 0,
+ WinKdWorkerStart,
+ WinKdWorkerInitialized
+} WINKD_WORKER_STATE;
+
+extern WORK_QUEUE_ITEM ExpDebuggerWorkItem;
+extern WINKD_WORKER_STATE ExpDebuggerWork;
+extern PEPROCESS ExpDebuggerProcessAttach;
+extern PEPROCESS ExpDebuggerProcessKill;
+extern ULONG_PTR ExpDebuggerPageIn;
+
+VOID NTAPI ExpDebuggerWorker(IN PVOID Context);
+// #endif /* _WINKD_ */
+
+#ifdef _WIN64
+#define HANDLE_LOW_BITS (PAGE_SHIFT - 4)
+#define HANDLE_HIGH_BITS (PAGE_SHIFT - 3)
+#else
+#define HANDLE_LOW_BITS (PAGE_SHIFT - 3)
+#define HANDLE_HIGH_BITS (PAGE_SHIFT - 2)
+#endif
+#define HANDLE_TAG_BITS (2)
+#define HANDLE_INDEX_BITS (HANDLE_LOW_BITS + 2*HANDLE_HIGH_BITS)
+#define KERNEL_FLAG_BITS (sizeof(PVOID)*8 - HANDLE_INDEX_BITS - HANDLE_TAG_BITS)
+
+typedef union _EXHANDLE
+{
+ struct
+ {
+ ULONG_PTR TagBits: HANDLE_TAG_BITS;
+ ULONG_PTR Index: HANDLE_INDEX_BITS;
+ ULONG_PTR KernelFlag : KERNEL_FLAG_BITS;
+ };
+ struct
+ {
+ ULONG_PTR TagBits2: HANDLE_TAG_BITS;
+ ULONG_PTR LowIndex: HANDLE_LOW_BITS;
+ ULONG_PTR MidIndex: HANDLE_HIGH_BITS;
+ ULONG_PTR HighIndex: HANDLE_HIGH_BITS;
+ ULONG_PTR KernelFlag2: KERNEL_FLAG_BITS;
+ };
+ HANDLE GenericHandleOverlay;
+ ULONG_PTR Value;
+ ULONG AsULONG;
} EXHANDLE, *PEXHANDLE;
typedef struct _ETIMER
#define MAX_MID_INDEX (MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES)
#define MAX_HIGH_INDEX (MID_LEVEL_ENTRIES * MID_LEVEL_ENTRIES * LOW_LEVEL_ENTRIES)
-//
-// Detect old GCC
-//
-#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40300) || \
- (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ == 40303)
-
-#define DEFINE_WAIT_BLOCK(x) \
- struct _AlignHack \
- { \
- UCHAR Hack[15]; \
- EX_PUSH_LOCK_WAIT_BLOCK UnalignedBlock; \
- } WaitBlockBuffer; \
- PEX_PUSH_LOCK_WAIT_BLOCK x = (PEX_PUSH_LOCK_WAIT_BLOCK) \
- ((ULONG_PTR)&WaitBlockBuffer.UnalignedBlock &~ 0xF);
-
-#else
-
-//
-// This is only for compatibility; the compiler will optimize the extra
-// local variable (the actual pointer) away, so we don't take any perf hit
-// by doing this.
-//
-#define DEFINE_WAIT_BLOCK(x) \
- EX_PUSH_LOCK_WAIT_BLOCK WaitBlockBuffer; \
- PEX_PUSH_LOCK_WAIT_BLOCK x = &WaitBlockBuffer;
-
-#endif
-
#define ExpChangeRundown(x, y, z) (ULONG_PTR)InterlockedCompareExchangePointer(&x->Ptr, (PVOID)y, (PVOID)z)
#define ExpChangePushlock(x, y, z) InterlockedCompareExchangePointer((PVOID*)x, (PVOID)y, (PVOID)z)
#define ExpSetRundown(x, y) InterlockedExchangePointer(&x->Ptr, (PVOID)y)
IN OUT PULONG ReturnLength OPTIONAL
);
+typedef struct _UUID_CACHED_VALUES_STRUCT
+{
+ ULONGLONG Time;
+ LONG AllocatedCount;
+ UCHAR ClockSeqHiAndReserved;
+ UCHAR ClockSeqLow;
+ UCHAR NodeId [ 6 ] ;
+} UUID_CACHED_VALUES_STRUCT, *PUUID_CACHED_VALUES_STRUCT;
+
/* INITIALIZATION FUNCTIONS *************************************************/
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpWin32kInit(VOID);
IN PVOID Context
);
+INIT_FUNCTION
VOID
NTAPI
ExpInitializePushLocks(VOID);
IN PLARGE_INTEGER SystemBootTime
);
+INIT_FUNCTION
VOID
NTAPI
ExpInitializeWorkerThreads(VOID);
NTAPI
ExSwapinWorkerThreads(IN BOOLEAN AllowSwap);
+INIT_FUNCTION
VOID
NTAPI
ExpInitLookasideLists(VOID);
+INIT_FUNCTION
VOID
NTAPI
ExInitializeSystemLookasideList(
IN PLIST_ENTRY ListHead
);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeCallbacks(VOID);
-VOID
+INIT_FUNCTION
+BOOLEAN
+NTAPI
+ExpUuidInitialization(VOID);
+
+INIT_FUNCTION
+BOOLEAN
NTAPI
-ExpInitUuids(VOID);
+ExLuidInitialization(VOID);
+INIT_FUNCTION
VOID
NTAPI
ExpInitializeExecutive(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
+VOID
+NTAPI
+ExShutdownSystem(VOID);
+
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeEventImplementation(VOID);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeKeyedEventImplementation(VOID);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeEventPairImplementation(VOID);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeSemaphoreImplementation(VOID);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeMutantImplementation(VOID);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeTimerImplementation(VOID);
+INIT_FUNCTION
BOOLEAN
NTAPI
ExpInitializeProfileImplementation(VOID);
+INIT_FUNCTION
VOID
NTAPI
ExpResourceInitialization(VOID);
+INIT_FUNCTION
VOID
NTAPI
ExInitPoolLookasidePointers(VOID);
ULONG_PTR Context
);
+INIT_FUNCTION
VOID
NTAPI
ExpInitializeHandleTables(
IN PVOID Context
);
+PHANDLE_TABLE_ENTRY
+NTAPI
+ExpLookupHandleTableEntry(
+ IN PHANDLE_TABLE HandleTable,
+ IN EXHANDLE Handle
+);
+
+BOOLEAN
+NTAPI
+ExpLockHandleTableEntry(
+ IN PHANDLE_TABLE HandleTable,
+ IN PHANDLE_TABLE_ENTRY HandleTableEntry
+);
+
/* PSEH EXCEPTION HANDLING **************************************************/
LONG
/* RUNDOWN *******************************************************************/
+FORCEINLINE
+PEX_RUNDOWN_REF
+ExGetRunRefForGivenProcessor(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
+ IN ULONG ProcNumber)
+{
+ return (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs +
+ RunRefCacheAware->RunRefSize *
+ (ProcNumber % RunRefCacheAware->Number));
+}
+
/*++
* @name ExfAcquireRundownProtection
* INTERNAL MACRO
/* Sanity checks */
ASSERT(PushLock->Locked);
- ASSERT(PushLock->Waiting || PushLock->Shared > 0);
}
/*++
/* Sanity checks */
ASSERT(PushLock->Locked);
- ASSERT(PushLock->Waiting || PushLock->Shared > 0);
/* Try to clear the pushlock */
OldValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
/* Sanity checks */
ASSERT(PushLock->Locked);
- ASSERT(PushLock->Waiting || PushLock->Shared == 0);
/* Unlock the pushlock */
OldValue.Value = InterlockedExchangeAddSizeT((PSIZE_T)PushLock,
);
NTSTATUS
-ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation);
+ExpSetTimeZoneInformation(
+ IN PRTL_TIME_ZONE_INFORMATION TimeZoneInformation
+);
BOOLEAN
NTAPI
-ExAcquireTimeRefreshLock(BOOLEAN Wait);
+ExAcquireTimeRefreshLock(
+ IN BOOLEAN Wait
+);
VOID
NTAPI
-ExReleaseTimeRefreshLock(VOID);
+ExReleaseTimeRefreshLock(
+ VOID
+);
VOID
NTAPI
-ExUpdateSystemTimeFromCmos(IN BOOLEAN UpdateInterruptTime,
- IN ULONG MaxSepInSeconds);
+ExUpdateSystemTimeFromCmos(
+ IN BOOLEAN UpdateInterruptTime,
+ IN ULONG MaxSepInSeconds
+);
-NTSTATUS
+VOID
NTAPI
-ExpAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId);
+ExAllocateLocallyUniqueId(
+ OUT LUID *LocallyUniqueId
+);
VOID
NTAPI
-ExTimerRundown(VOID);
+ExTimerRundown(
+ VOID
+);
+INIT_FUNCTION
VOID
NTAPI
HeadlessInit(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
+INIT_FUNCTION
VOID
NTAPI
XIPInit(
#define InterlockedCompareExchangeUL(Destination, Exchange, Comperand) \
(ULONG)InterlockedCompareExchange((PLONG)(Destination), (LONG)(Exchange), (LONG)(Comperand))
+#define InterlockedCompareExchangeSizeT(Destination, Exchange, Comperand) \
+ (SIZE_T)InterlockedCompareExchangePointer((PVOID*)(Destination), (PVOID)(SIZE_T)(Exchange), (PVOID)(SIZE_T)(Comperand))
+
#define ExfInterlockedCompareExchange64UL(Destination, Exchange, Comperand) \
(ULONGLONG)ExfInterlockedCompareExchange64((PLONGLONG)(Destination), (PLONGLONG)(Exchange), (PLONGLONG)(Comperand))