- 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:
Alex Ionescu 2006-10-06 19:29:25 +00:00
parent 6318f42ad0
commit 9bfa61479f
6 changed files with 99 additions and 9 deletions

View file

@ -150,6 +150,16 @@ typedef struct _NLS_DATA_BLOCK
PVOID UnicodeCodePageData;
} 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
//

View file

@ -18,7 +18,7 @@
#define ROUND_DOWN(a,b) (((a)/(b))*(b))
#endif
#define CMAPI
#define CMAPI NTAPI
struct _HHIVE;
@ -110,6 +110,10 @@ typedef struct _HHIVE
BOOLEAN ReadOnly;
BOOLEAN Log;
BOOLEAN DirtyFlag;
ULONG HvBinHeadersUse;
ULONG HvFreeCellsUse;
ULONG HvUsedcellsUse;
ULONG CmUsedCellsUse;
ULONG HiveFlags;
ULONG LogSize;
ULONG RefreshCount;
@ -146,6 +150,8 @@ HvInitialize(
ULONG Operation,
ULONG_PTR HiveData OPTIONAL,
ULONG Cluster OPTIONAL,
ULONG Flags,
ULONG FileType,
PALLOCATE_ROUTINE Allocate,
PFREE_ROUTINE Free,
PFILE_READ_ROUTINE FileRead,
@ -163,6 +169,9 @@ HvGetCell(
PHHIVE RegistryHive,
HCELL_INDEX CellOffset);
#define HvReleaseCell(h, c) \
if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
LONG CMAPI
HvGetCellSize(
PHHIVE RegistryHive,

View file

@ -306,6 +306,8 @@ NTSTATUS CMAPI
HvInitialize(
PHHIVE RegistryHive,
ULONG Operation,
ULONG HiveType,
ULONG HiveFlags,
ULONG_PTR HiveData OPTIONAL,
ULONG Cluster OPTIONAL,
PALLOCATE_ROUTINE Allocate,

View file

@ -52,7 +52,7 @@ CmImportBinaryHive (PCHAR ChunkBase,
/* Allocate hive header */
((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,
CmpAllocate, CmpFree,
CmpFileRead, CmpFileWrite, CmpFileSetSize,

View file

@ -141,7 +141,7 @@ CmiCreateNewRegFile(HANDLE FileHandle)
CmHive = CmpAllocate(sizeof(EREGISTRY_HIVE), TRUE);
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,
CmpFileRead, CmpFileWrite, CmpFileSetSize,
CmpFileFlush, NULL);
@ -570,7 +570,7 @@ CmiInitNonVolatileRegistryHive (PEREGISTRY_HIVE RegistryHive,
DPRINT("ViewBase %p ViewSize %lx\n", ViewBase, 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,
CmpAllocate, CmpFree,
CmpFileRead, CmpFileWrite, CmpFileSetSize,
@ -622,7 +622,7 @@ CmiCreateTempHive(PEREGISTRY_HIVE *RegistryHive)
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,
CmpFileRead, CmpFileWrite, CmpFileSetSize,
CmpFileFlush, NULL);

View file

@ -14,6 +14,7 @@ extern ULONG NtMinorVersion;
extern FAST_MUTEX ExpEnvironmentLock;
extern ERESOURCE ExpFirmwareTableResource;
extern LIST_ENTRY ExpFirmwareTableProviderListHead;
extern BOOLEAN ExpIsWinPEMode;
ULONG ExpAnsiCodePageDataOffset, ExpOemCodePageDataOffset;
ULONG ExpUnicodeCaseTableDataOffset;
PVOID ExpNlsSectionPointer;
@ -139,6 +140,14 @@ VOID
NTAPI
ExInitPoolLookasidePointers(VOID);
/* Callback Functions ********************************************************/
VOID
NTAPI
ExInitializeCallBack(
IN PEX_CALLBACK Callback
);
/* Rundown Functions ********************************************************/
VOID
@ -312,6 +321,7 @@ static __inline _SEH_FILTER(_SEH_ExSystemExceptionFilter)
#define ExpSetRundown(x, y) InterlockedExchange64((PLONGLONG)x, y)
#else
#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)
#endif
@ -483,6 +493,28 @@ _ExRundownCompleted(IN PEX_RUNDOWN_REF RunRef)
/* 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
* INTERNAL MACRO
@ -545,7 +577,7 @@ ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
/* Try acquiring the lock */
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 */
DbgPrint("%s - Contention!\n", __FUNCTION__);
@ -557,6 +589,44 @@ ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
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
* INTERNAL MACRO
@ -617,8 +687,7 @@ ExReleasePushLockShared(PEX_PUSH_LOCK PushLock)
/* Try to clear the pushlock */
OldValue.Value = EX_PUSH_LOCK_LOCK | EX_PUSH_LOCK_SHARE_INC;
if (InterlockedCompareExchangePointer(PushLock, 0, OldValue.Ptr) !=
OldValue.Ptr)
if (ExpChangePushlock(PushLock, 0, OldValue.Ptr) != OldValue.Ptr)
{
/* There are still other people waiting on it */
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 */
if ((OldValue.Waiting) ||
(InterlockedCompareExchangePointer(PushLock, NewValue.Ptr, OldValue.Ptr) ==
(ExpChangePushlock(PushLock, NewValue.Ptr, OldValue.Ptr) ==
OldValue.Ptr))
{
/* We have waiters, use the long path */