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