PspTeardownPartition

NTSTATUS __stdcall PspTeardownPartition(PVOID Object){
  void *v2; 
  void *v3; 
  _ETHREAD *CurrentThread; 
  INT64 v5; 
  _ADAPTER_OBJECT *v6; 
  VOID *v7; 
  PVOID v8; 

  if( Object == (PVOID)PspSystemPartition )
    KeBugCheckEx(0x18Eu, (PVOID)1, 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();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object + 12, 0i64);
  v5 = *((_QWORD *)Object + 7);
  v6 = (_ADAPTER_OBJECT *)*((_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((_EX_PUSH_LOCK *)Object + 12);
  KeAbPostRelease((char *)Object + 96);
  KeLeaveCriticalRegion();
  if( v6 )
  {
    PsTerminateMinimalProcess((ULONG_PTR)v6);
    KeWaitForSingleObject((UINT64)v6, 0, 0, 0, 0i64);
    HalPutDmaAdapter(v6);
    ObCloseHandle(v7, 0);
  }
  PsDereferencePartition(v5);
  return ObfDereferenceObjectWithTag(Object, 0x64726148ui64);
}

Referenced by:

No references.