CcGetPartitionWithCreate
CHAR *__fastcall CcGetPartitionWithCreate(INT64 a1){
CHAR *v1;
CHAR *v2;
CHAR *Partition;
UINT64 v6;
unsigned __int8 v7;
unsigned __int64 v8;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v1 = *(CHAR **)(a1 + 8);
v2 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( v1 )
goto LABEL_2;
Partition = CcCreatePartition();
v1 = Partition;
if( Partition )
{
KeAcquireInStackQueuedSpinLock((UINT64 *)Partition + 16, &LockHandle);
KeAcquireSpinLockRaiseToDpc(&CcGlobalPartitionLock, v6);
v8 = v7;
if( *(_QWORD *)(a1 + 8) )
{
v2 = v1;
v1 = *(CHAR **)(a1 + 8);
}
else
{
++CcPartitionCount;
*(_QWORD *)(a1 + 8) = v1;
v1[965] = 1;
if( PsReferencePartitionSafe(a1) )
PsDereferencePartition(a1);
else
v1[966] = 1;
}
KxReleaseSpinLock(&CcGlobalPartitionLock);
__writecr8(v8);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v2 )
CcDeletePartition(v2);
if( v1 )
{
LABEL_2:
if( (unsigned __int8)v1[966] >= 2u )
KeBugCheckEx(0x34u, 0x5A3ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
}
}
return v1;
}Referenced by:
CcInitializeCacheMapEx