VOID CmpLockRegistry( VOID ) /*++ Routine Description: Lock the registry for shared (read-only) access Arguments: None. Return Value: None, the registry lock will be held for shared access upon return. --*/ { #if DBG PVOID Caller; PVOID CallerCaller; #endif KeEnterCriticalRegion(); ExAcquireResourceShared(&CmpRegistryLock, TRUE); #if DBG RtlGetCallersAddress(&Caller, &CallerCaller); CMLOG(CML_FLOW, CMS_LOCKING) { KdPrint(("CmpLockRegistry: c, cc: %08lx %08lx\n", Caller, CallerCaller)); }
PVOID CmpAllocate( ULONG Size, BOOLEAN UseForIo, ULONG Tag ) /*++ Routine Description: This routine makes more memory available to a hive. It is environment specific. Arguments: Size - amount of space caller wants UseForIo - TRUE if object allocated will be target of I/O, FALSE if not. Return Value: NULL if failure, address of allocated block if not. --*/ { PVOID result; ULONG pooltype; #if DBG PVOID Caller; PVOID CallerCaller; RtlGetCallersAddress(&Caller, &CallerCaller); #endif if (CmpClaimGlobalQuota(Size) == FALSE) { return NULL; } pooltype = (UseForIo) ? PagedPoolCacheAligned : PagedPool; result = ExAllocatePoolWithTag( pooltype, Size, Tag ); CmKdPrintEx((DPFLTR_CONFIG_ID,CML_POOL,"**CmpAllocate: allocate:%08lx, ", Size)); CmKdPrintEx((DPFLTR_CONFIG_ID,CML_POOL,"type:%d, at:%08lx ", PagedPool, result)); CmKdPrintEx((DPFLTR_CONFIG_ID,CML_POOL,"c:%p cc:%p\n", Caller, CallerCaller)); if (result == NULL) { CmpReleaseGlobalQuota(Size); } return result; }
VOID CmpFree( PVOID MemoryBlock, ULONG GlobalQuotaSize ) /*++ Routine Description: This routine frees memory that has been allocated by the registry. It is environment specific Arguments: MemoryBlock - supplies address of memory object to free GlobalQuotaSize - amount of global quota to release Return Value: NONE --*/ { #if DBG PVOID Caller; PVOID CallerCaller; RtlGetCallersAddress(&Caller, &CallerCaller); CmKdPrintEx((DPFLTR_CONFIG_ID,CML_POOL,"**FREEING:%08lx c,cc:%p,%p\n", MemoryBlock, Caller, CallerCaller)); #endif ASSERT(GlobalQuotaSize > 0); CmpReleaseGlobalQuota(GlobalQuotaSize); ExFreePool(MemoryBlock); return; }