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.