IopUncacheInterfaceInformation
VOID __stdcall IopUncacheInterfaceInformation(_DEVICE_OBJECT *DeviceObject, UINT64 AcquireLock){
int v2;
_ETHREAD *CurrentThread;
_QWORD *v5;
_QWORD *v6;
_QWORD *v7;
_QWORD *v8;
_QWORD *v9;
__int64 v10;
void *v11;
__int64 v12;
void *v13;
v2 = AcquireLock;
if( (_DWORD)AcquireLock )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
KeWaitForSingleObject(&PpRegistrySemaphore, DelayExecution, 0, 0, 0i64);
}
if( DeviceObject )
v5 = *(_QWORD **)(*((_QWORD *)DeviceObject + 39) + 40i64);
else
v5 = 0i64;
v6 = v5 + 61;
v7 = (_QWORD *)v5[61];
while( v7 != v6 )
{
v10 = v7[3];
v11 = v7;
if( v10 )
{
(*(void(__fastcall **)(_QWORD))(v10 + 24))(*(_QWORD *)(v10 + 8));
ExFreePoolWithTag((PVOID)v10, 0);
}
v7 = (_QWORD *)*v7;
ExFreePoolWithTag(v11, 0);
}
v8 = v5 + 63;
v9 = (_QWORD *)v5[63];
while( v9 != v8 )
{
v12 = v9[3];
v13 = v9;
if( v12 )
{
(*(void(__fastcall **)(_QWORD))(v12 + 24))(*(_QWORD *)(v12 + 8));
ExFreePoolWithTag((PVOID)v12, 0);
}
v9 = (_QWORD *)*v9;
ExFreePoolWithTag(v13, 0);
}
v5[62] = v5 + 61;
*v6 = v6;
v5[64] = v5 + 63;
*v8 = v8;
v5[65] = 0i64;
if( v2 )
{
KeReleaseSemaphore(&PpRegistrySemaphore, 0i64, 1i64, 0);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
}Referenced by:
IopDestroyDeviceNode
IopRemoveDevice
PipProcessStartPhase1