CcDeletePartition

NTSTATUS __stdcall CcDeletePartition(PVOID P){
  void *v2; 
  UINT64 v3; 
  __int64 v4; 
  unsigned __int8 v5; 
  unsigned __int64 v6; 
  __int64 **v7; 
  __int64 *v8; 
  __int64 v9; 
  __int64 **v10; 
  __int64 *v11; 
  __int64 v12; 
  __int64 **v13; 
  __int64 *v14; 
  __int64 v15; 
  void *v16; 
  NTSTATUS result; 
  KeSetEvent((PRKEVENT)((char *)P + 976), 0);
  CcDereferencePartition((INT64)P);
  v2 = (void *)*((_QWORD *)P + 128);
  if( v2 )
  {
    ZwWaitForSingleObject(v2, 0, 0i64);
    ZwClose(*((HANDLE *)P + 128));
    *((_QWORD *)P + 128) = 0i64;
  }
  if( !KeCancelTimer((PKTIMER)((char *)P + 568)) )
    KeFlushQueuedDpcs();
  if( *((_BYTE *)P + 965) )
  {
    KeAcquireSpinLockRaiseToDpc(&CcGlobalPartitionLock, v3);
    v4 = *((_QWORD *)P + 1);
    v6 = v5;
    --CcPartitionCount;
    *(_QWORD *)(v4 + 8) = 0i64;
    KxReleaseSpinLock(&CcGlobalPartitionLock);
    __writecr8(v6);
  }
  v7 = (__int64 **)((char *)P + 208);
  while( 1 )
  {
    v8 = *v7;
    if( *v7 == (__int64 *)v7 )
      break;
    v9 = *v8;
    if( (__int64 **)v8[1] != v7 || *(__int64 **)(v9 + 8) != v8 )
LABEL_22:
      __fastfail(3u);
    *v7 = (__int64 *)v9;
    *(_QWORD *)(v9 + 8) = v7;
    ExFreePoolWithTag(v8, 0x71576343u);
  }
  v10 = (__int64 **)((char *)P + 304);
  while( 1 )
  {
    v11 = *v10;
    if( *v10 == (__int64 *)v10 )
      break;
    v12 = *v11;
    if( (__int64 **)v11[1] != v10 || *(__int64 **)(v12 + 8) != v11 )
      goto LABEL_22;
    *v10 = (__int64 *)v12;
    *(_QWORD *)(v12 + 8) = v10;
    ExFreePoolWithTag(v11, 0x71576343u);
  }
  v13 = (__int64 **)((char *)P + 328);
  while( 1 )
  {
    v14 = *v13;
    if( *v13 == (__int64 *)v13 )
      break;
    v15 = *v14;
    if( (__int64 **)v14[1] != v13 || *(__int64 **)(v15 + 8) != v14 )
      goto LABEL_22;
    *v13 = (__int64 *)v15;
    *(_QWORD *)(v15 + 8) = v13;
    ExFreePoolWithTag(v14, 0x71576343u);
  }
  v16 = (void *)*((_QWORD *)P + 90);
  if( v16 )
  {
    ExFreePoolWithTag(v16, 0x70546343u);
    *((_QWORD *)P + 90) = 0i64;
  }
  CcUninitializePartitionVacbs((_VACB *)P, v3);
  CcUninitializeAsyncRead(P);
  DbgPrintEx(0x7Fu, 2u, "CcDeletePartition: Partition Deleted=%p, PartitionObject=%p \n", P, *((const void **)P + 1));
  ExFreePoolWithTag(P, 0x72506343u);
  return result;
}

Referenced by:

CcCreatePartition
CcExitPartition
CcGetPartitionWithCreate