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