PspTeardownPartition

INT64 __stdcall PspTeardownPartition(PVOID Object){
  void *v2; 
  void *v3; 
  _ETHREAD *CurrentThread; 
  INT64 v5; 
  struct _DMA_ADAPTER *v6; 
  void *v7; 
  PVOID v8; 
  INT64 result; 
  if( Object == PspSystemPartition )
    KeBugCheckEx(0x18Eu, 1ui64, (ULONG_PTR)Object, 0i64, 0i64);
  v2 = *(void **)Object;
  if( v2 )
  {
    MiDeletePartition(v2);
    *(_QWORD *)Object = 0i64;
  }
  v3 = (void *)*((_QWORD *)Object + 2);
  if( v3 )
  {
    ExpPartitionDestroy(v3);
    *((_QWORD *)Object + 2) = 0i64;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)Object + 96, 0i64);
  v5 = *((_QWORD *)Object + 7);
  v6 = (struct _DMA_ADAPTER *)*((_QWORD *)Object + 13);
  v7 = (void *)*((_QWORD *)Object + 14);
  *((_QWORD *)Object + 7) = MmBadPointer;
  v8 = MmBadPointer;
  *((_QWORD *)Object + 14) = 0i64;
  *((_QWORD *)Object + 13) = v8;
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Object + 12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)Object + 12);
  KeAbPostRelease((char *)Object + 96);
  KeLeaveCriticalRegion();
  if( v6 )
  {
    PsTerminateMinimalProcess(v6);
    KeWaitForSingleObject(v6, Executive, 0, 0, 0i64);
    HalPutDmaAdapter(v6);
    ObCloseHandle(v7, 0);
  }
  PsDereferencePartition(v5);
  LODWORD(result) = ObfDereferenceObjectWithTag(Object, 0x64726148ui64);
  return result;
}

Referenced by:

No references.