ExpPartitionDestroy

NTSTATUS __stdcall ExpPartitionDestroy(PVOID P){
  unsigned __int16 i; 
  __int64 v3; 
  void *v4; 
  unsigned __int16 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  _DWORD *v9; 

  if( *((_QWORD *)P + 2) )
  {
    for( i = 0; i < (unsigned __int16)KeNumberNodes; ++i )
    {
      v3 = *(_QWORD *)(*((_QWORD *)P + 2) + 8i64 * i);
      if( v3 )
      {
        if( *(_QWORD *)(v3 + 264) )
        {
          *(_DWORD *)(v3 + 272) = 1;
          KeSetEvent((PRKEVENT)(v3 + 16), 0, 0);
          ZwWaitForSingleObject(*(_QWORD *)(v3 + 264), 0, 0i64);
          ZwClose(*(_QWORD *)(v3 + 264));
        }
        KeCancelTimer2(v3 + 128);
        KeCancelTimer(v3 + 40);
        KeFlushQueuedDpcs();
        ExFreePoolWithTag(*(PVOID *)(*((_QWORD *)P + 2) + 8i64 * i), 0);
      }
    }
    ExFreePoolWithTag(*((PVOID *)P + 2), 0);
  }
  v4 = (void *)*((_QWORD *)P + 1);
  if( v4 )
  {
    v5 = 0;
    if( KeNumberNodes )
    {
      do
      {
        if( *(_QWORD *)(*((_QWORD *)P + 1) + 8i64 * v5) )
        {
          v6 = 0i64;
          v7 = 0i64;
          if( (_UNKNOWN *)KeNodeBlock[v5] != (_UNKNOWN *)((char *)&KiNodeInit + 384 * v5) )
            v6 = KeNodeBlock[v5];
          do
          {
            v8 = *(_QWORD *)(*((_QWORD *)P + 1) + 8i64 * *(unsigned __int16 *)(v6 + 146));
            v9 = *(_DWORD **)(v8 + v7);
            if( ((unsigned __int8)v9 & 1) == 0 && v9 )
            {
              if( v9[1] )
                KeBugCheckEx(0x18Eu, (PVOID)2, *(PVOID *)P, *(PVOID *)(v8 + v7), 0i64);
              ExpWorkQueueDestroy(*(VOID **)(v8 + v7));
              ExFreePoolWithTag(v9, 0);
            }
            v7 += 8i64;
          }
          while( v7 < 64 );
          ExFreePoolWithTag(*(PVOID *)(*((_QWORD *)P + 1) + 8i64 * v5), 0);
        }
        ++v5;
      }
      while( v5 < (unsigned __int16)KeNumberNodes );
      v4 = (void *)*((_QWORD *)P + 1);
    }
    ExFreePoolWithTag(v4, 0);
  }
  return(unsigned int)ExFreePoolWithTag(P, 0);
}

Referenced by:

ExpPartitionInitialize
PspTeardownPartition