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.