mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 17:16:04 +00:00
- Add PROFILE_ACPI_DOCKING_STATE.
- Fix HvInitialize definition to match more closely NT's since I need some of the extra parameters for the cm rewrite. - Implement ExInitializePushLock and ExConvertPushLockSharedToExclusive macros. svn path=/trunk/; revision=24426
This commit is contained in:
parent
6318f42ad0
commit
9bfa61479f
6 changed files with 99 additions and 9 deletions
|
@ -150,6 +150,16 @@ typedef struct _NLS_DATA_BLOCK
|
||||||
PVOID UnicodeCodePageData;
|
PVOID UnicodeCodePageData;
|
||||||
} NLS_DATA_BLOCK, *PNLS_DATA_BLOCK;
|
} NLS_DATA_BLOCK, *PNLS_DATA_BLOCK;
|
||||||
|
|
||||||
|
//
|
||||||
|
// ACPI Docking State
|
||||||
|
//
|
||||||
|
typedef struct _PROFILE_ACPI_DOCKING_STATE
|
||||||
|
{
|
||||||
|
USHORT DockingState;
|
||||||
|
USHORT SerialLength;
|
||||||
|
WCHAR SerialNumber[1];
|
||||||
|
} PROFILE_ACPI_DOCKING_STATE, *PPROFILE_ACPI_DOCKING_STATE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Subsystem Specific Loader Blocks
|
// Subsystem Specific Loader Blocks
|
||||||
//
|
//
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#define ROUND_DOWN(a,b) (((a)/(b))*(b))
|
#define ROUND_DOWN(a,b) (((a)/(b))*(b))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CMAPI
|
#define CMAPI NTAPI
|
||||||
|
|
||||||
struct _HHIVE;
|
struct _HHIVE;
|
||||||
|
|
||||||
|
@ -110,6 +110,10 @@ typedef struct _HHIVE
|
||||||
BOOLEAN ReadOnly;
|
BOOLEAN ReadOnly;
|
||||||
BOOLEAN Log;
|
BOOLEAN Log;
|
||||||
BOOLEAN DirtyFlag;
|
BOOLEAN DirtyFlag;
|
||||||
|
ULONG HvBinHeadersUse;
|
||||||
|
ULONG HvFreeCellsUse;
|
||||||
|
ULONG HvUsedcellsUse;
|
||||||
|
ULONG CmUsedCellsUse;
|
||||||
ULONG HiveFlags;
|
ULONG HiveFlags;
|
||||||
ULONG LogSize;
|
ULONG LogSize;
|
||||||
ULONG RefreshCount;
|
ULONG RefreshCount;
|
||||||
|
@ -146,6 +150,8 @@ HvInitialize(
|
||||||
ULONG Operation,
|
ULONG Operation,
|
||||||
ULONG_PTR HiveData OPTIONAL,
|
ULONG_PTR HiveData OPTIONAL,
|
||||||
ULONG Cluster OPTIONAL,
|
ULONG Cluster OPTIONAL,
|
||||||
|
ULONG Flags,
|
||||||
|
ULONG FileType,
|
||||||
PALLOCATE_ROUTINE Allocate,
|
PALLOCATE_ROUTINE Allocate,
|
||||||
PFREE_ROUTINE Free,
|
PFREE_ROUTINE Free,
|
||||||
PFILE_READ_ROUTINE FileRead,
|
PFILE_READ_ROUTINE FileRead,
|
||||||
|
@ -163,6 +169,9 @@ HvGetCell(
|
||||||
PHHIVE RegistryHive,
|
PHHIVE RegistryHive,
|
||||||
HCELL_INDEX CellOffset);
|
HCELL_INDEX CellOffset);
|
||||||
|
|
||||||
|
#define HvReleaseCell(h, c) \
|
||||||
|
if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
|
||||||
|
|
||||||
LONG CMAPI
|
LONG CMAPI
|
||||||
HvGetCellSize(
|
HvGetCellSize(
|
||||||
PHHIVE RegistryHive,
|
PHHIVE RegistryHive,
|
||||||
|
|
|
@ -306,6 +306,8 @@ NTSTATUS CMAPI
|
||||||
HvInitialize(
|
HvInitialize(
|
||||||
PHHIVE RegistryHive,
|
PHHIVE RegistryHive,
|
||||||
ULONG Operation,
|
ULONG Operation,
|
||||||
|
ULONG HiveType,
|
||||||
|
ULONG HiveFlags,
|
||||||
ULONG_PTR HiveData OPTIONAL,
|
ULONG_PTR HiveData OPTIONAL,
|
||||||
ULONG Cluster OPTIONAL,
|
ULONG Cluster OPTIONAL,
|
||||||
PALLOCATE_ROUTINE Allocate,
|
PALLOCATE_ROUTINE Allocate,
|
||||||
|
|
|
@ -52,7 +52,7 @@ CmImportBinaryHive (PCHAR ChunkBase,
|
||||||
|
|
||||||
/* Allocate hive header */
|
/* Allocate hive header */
|
||||||
((PHBASE_BLOCK)ChunkBase)->Length = ChunkSize;
|
((PHBASE_BLOCK)ChunkBase)->Length = ChunkSize;
|
||||||
Status = HvInitialize(&Hive->Hive, HV_OPERATION_MEMORY,
|
Status = HvInitialize(&Hive->Hive, HV_OPERATION_MEMORY, 0, 0,
|
||||||
(ULONG_PTR)ChunkBase, 0,
|
(ULONG_PTR)ChunkBase, 0,
|
||||||
CmpAllocate, CmpFree,
|
CmpAllocate, CmpFree,
|
||||||
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
||||||
|
|
|
@ -141,7 +141,7 @@ CmiCreateNewRegFile(HANDLE FileHandle)
|
||||||
|
|
||||||
CmHive = CmpAllocate(sizeof(EREGISTRY_HIVE), TRUE);
|
CmHive = CmpAllocate(sizeof(EREGISTRY_HIVE), TRUE);
|
||||||
CmHive->HiveHandle = FileHandle;
|
CmHive->HiveHandle = FileHandle;
|
||||||
Status = HvInitialize(&CmHive->Hive, HV_OPERATION_CREATE_HIVE, 0, 0,
|
Status = HvInitialize(&CmHive->Hive, HV_OPERATION_CREATE_HIVE, 0, 0, 0, 0,
|
||||||
CmpAllocate, CmpFree,
|
CmpAllocate, CmpFree,
|
||||||
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
||||||
CmpFileFlush, NULL);
|
CmpFileFlush, NULL);
|
||||||
|
@ -570,7 +570,7 @@ CmiInitNonVolatileRegistryHive (PEREGISTRY_HIVE RegistryHive,
|
||||||
DPRINT("ViewBase %p ViewSize %lx\n", ViewBase, ViewSize);
|
DPRINT("ViewBase %p ViewSize %lx\n", ViewBase, ViewSize);
|
||||||
|
|
||||||
((PHBASE_BLOCK)ViewBase)->Length = ViewSize;
|
((PHBASE_BLOCK)ViewBase)->Length = ViewSize;
|
||||||
Status = HvInitialize(&RegistryHive->Hive, HV_OPERATION_MEMORY,
|
Status = HvInitialize(&RegistryHive->Hive, HV_OPERATION_MEMORY, 0, 0,
|
||||||
(ULONG_PTR)ViewBase, 0,
|
(ULONG_PTR)ViewBase, 0,
|
||||||
CmpAllocate, CmpFree,
|
CmpAllocate, CmpFree,
|
||||||
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
||||||
|
@ -622,7 +622,7 @@ CmiCreateTempHive(PEREGISTRY_HIVE *RegistryHive)
|
||||||
|
|
||||||
DPRINT("Hive 0x%p\n", Hive);
|
DPRINT("Hive 0x%p\n", Hive);
|
||||||
|
|
||||||
Status = HvInitialize(&Hive->Hive, HV_OPERATION_CREATE_HIVE, 0, 0,
|
Status = HvInitialize(&Hive->Hive, HV_OPERATION_CREATE_HIVE, 0, 0, 0, 0,
|
||||||
CmpAllocate, CmpFree,
|
CmpAllocate, CmpFree,
|
||||||
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
CmpFileRead, CmpFileWrite, CmpFileSetSize,
|
||||||
CmpFileFlush, NULL);
|
CmpFileFlush, NULL);
|
||||||
|
|
|
@ -14,6 +14,7 @@ extern ULONG NtMinorVersion;
|
||||||
extern FAST_MUTEX ExpEnvironmentLock;
|
extern FAST_MUTEX ExpEnvironmentLock;
|
||||||
extern ERESOURCE ExpFirmwareTableResource;
|
extern ERESOURCE ExpFirmwareTableResource;
|
||||||
extern LIST_ENTRY ExpFirmwareTableProviderListHead;
|
extern LIST_ENTRY ExpFirmwareTableProviderListHead;
|
||||||
|
extern BOOLEAN ExpIsWinPEMode;
|
||||||
ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
|
ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
|
||||||
ULONG ExpUnicodeCaseTableDataOffset;
|
ULONG ExpUnicodeCaseTableDataOffset;
|
||||||
PVOID ExpNlsSectionPointer;
|
PVOID ExpNlsSectionPointer;
|
||||||
|
@ -139,6 +140,14 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
ExInitPoolLookasidePointers(VOID);
|
ExInitPoolLookasidePointers(VOID);
|
||||||
|
|
||||||
|
/* Callback Functions ********************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
ExInitializeCallBack(
|
||||||
|
IN PEX_CALLBACK Callback
|
||||||
|
);
|
||||||
|
|
||||||
/* Rundown Functions ********************************************************/
|
/* Rundown Functions ********************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -312,6 +321,7 @@ static __inline _SEH_FILTER(_SEH_ExSystemExceptionFilter)
|
||||||
#define ExpSetRundown(x, y) InterlockedExchange64((PLONGLONG)x, y)
|
#define ExpSetRundown(x, y) InterlockedExchange64((PLONGLONG)x, y)
|
||||||
#else
|
#else
|
||||||
#define ExpChangeRundown(x, y, z) InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z))
|
#define ExpChangeRundown(x, y, z) InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z))
|
||||||
|
#define ExpChangePushlock(x, y, z) LongToPtr(InterlockedCompareExchange((PLONG)x, PtrToLong(y), PtrToLong(z)))
|
||||||
#define ExpSetRundown(x, y) InterlockedExchange((PLONG)x, y)
|
#define ExpSetRundown(x, y) InterlockedExchange((PLONG)x, y)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -483,6 +493,28 @@ _ExRundownCompleted(IN PEX_RUNDOWN_REF RunRef)
|
||||||
|
|
||||||
/* PUSHLOCKS *****************************************************************/
|
/* PUSHLOCKS *****************************************************************/
|
||||||
|
|
||||||
|
/*++
|
||||||
|
* @name ExInitializePushLock
|
||||||
|
* INTERNAL MACRO
|
||||||
|
*
|
||||||
|
* The ExInitializePushLock macro initializes a PushLock.
|
||||||
|
*
|
||||||
|
* @params PushLock
|
||||||
|
* Pointer to the pushlock which is to be initialized.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
* @remarks None.
|
||||||
|
*
|
||||||
|
*--*/
|
||||||
|
VOID
|
||||||
|
FORCEINLINE
|
||||||
|
ExInitializePushLock(IN PEX_PUSH_LOCK PushLock)
|
||||||
|
{
|
||||||
|
/* Set the value to 0 */
|
||||||
|
PushLock->Value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
* @name ExAcquirePushLockExclusive
|
* @name ExAcquirePushLockExclusive
|
||||||
* INTERNAL MACRO
|
* INTERNAL MACRO
|
||||||
|
@ -545,7 +577,7 @@ ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
|
|
||||||
/* Try acquiring the lock */
|
/* Try acquiring the lock */
|
||||||
NewValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
|
NewValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
|
||||||
if (InterlockedCompareExchangePointer(PushLock, NewValue.Ptr, 0))
|
if (ExpChangePushlock(PushLock, NewValue.Ptr, 0))
|
||||||
{
|
{
|
||||||
/* Someone changed it, use the slow path */
|
/* Someone changed it, use the slow path */
|
||||||
DbgPrint("%s - Contention!\n", __FUNCTION__);
|
DbgPrint("%s - Contention!\n", __FUNCTION__);
|
||||||
|
@ -557,6 +589,44 @@ ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
ASSERT(PushLock->Waiting || PushLock->Shared > 0);
|
ASSERT(PushLock->Waiting || PushLock->Shared > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*++
|
||||||
|
* @name ExConvertPushLockSharedToExclusive
|
||||||
|
* INTERNAL MACRO
|
||||||
|
*
|
||||||
|
* The ExConvertPushLockSharedToExclusive macro converts an exclusive
|
||||||
|
* pushlock to a shared pushlock.
|
||||||
|
*
|
||||||
|
* @params PushLock
|
||||||
|
* Pointer to the pushlock which is to be converted.
|
||||||
|
*
|
||||||
|
* @return FALSE if conversion failed, TRUE otherwise.
|
||||||
|
*
|
||||||
|
* @remarks The function attempts the quickest route to convert the lock, which is
|
||||||
|
* to simply set the lock bit and remove any other bits.
|
||||||
|
*
|
||||||
|
*--*/
|
||||||
|
BOOLEAN
|
||||||
|
FORCEINLINE
|
||||||
|
ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock)
|
||||||
|
{
|
||||||
|
EX_PUSH_LOCK OldValue;
|
||||||
|
|
||||||
|
/* Set the expected old value */
|
||||||
|
OldValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
|
||||||
|
|
||||||
|
/* Try converting the lock */
|
||||||
|
if (ExpChangePushlock(PushLock, EX_PUSH_LOCK_LOCK, OldValue.Value) !=
|
||||||
|
OldValue.Ptr)
|
||||||
|
{
|
||||||
|
/* Conversion failed */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanity check */
|
||||||
|
ASSERT(PushLock->Locked);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
* @name ExWaitOnPushLock
|
* @name ExWaitOnPushLock
|
||||||
* INTERNAL MACRO
|
* INTERNAL MACRO
|
||||||
|
@ -617,8 +687,7 @@ ExReleasePushLockShared(PEX_PUSH_LOCK PushLock)
|
||||||
|
|
||||||
/* Try to clear the pushlock */
|
/* Try to clear the pushlock */
|
||||||
OldValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
|
OldValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
|
||||||
if (InterlockedCompareExchangePointer(PushLock, 0, OldValue.Ptr) !=
|
if (ExpChangePushlock(PushLock, 0, OldValue.Ptr) != OldValue.Ptr)
|
||||||
OldValue.Ptr)
|
|
||||||
{
|
{
|
||||||
/* There are still other people waiting on it */
|
/* There are still other people waiting on it */
|
||||||
DbgPrint("%s - Contention!\n", __FUNCTION__);
|
DbgPrint("%s - Contention!\n", __FUNCTION__);
|
||||||
|
@ -716,7 +785,7 @@ ExReleasePushLock(PEX_PUSH_LOCK PushLock)
|
||||||
|
|
||||||
/* Check if nobody is waiting on us and try clearing the lock here */
|
/* Check if nobody is waiting on us and try clearing the lock here */
|
||||||
if ((OldValue.Waiting) ||
|
if ((OldValue.Waiting) ||
|
||||||
(InterlockedCompareExchangePointer(PushLock, NewValue.Ptr, OldValue.Ptr) ==
|
(ExpChangePushlock(PushLock, NewValue.Ptr, OldValue.Ptr) ==
|
||||||
OldValue.Ptr))
|
OldValue.Ptr))
|
||||||
{
|
{
|
||||||
/* We have waiters, use the long path */
|
/* We have waiters, use the long path */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue