IopUncacheInterfaceInformation
VOID __stdcall IopUncacheInterfaceInformation(PDEVICE_OBJECT DeviceObject, LOGICAL AcquireLock){
_ETHREAD *CurrentThread;
_QWORD *DeviceNode;
_QWORD *v6;
_QWORD *v7;
_QWORD *v8;
_QWORD *v9;
__int64 v10;
void *v11;
__int64 v12;
void *v13;
if( AcquireLock )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 6016, 4, 0, 0, 0i64);
}
if( DeviceObject )
DeviceNode = DeviceObject->DeviceObjectExtension->DeviceNode;
else
DeviceNode = 0i64;
v6 = DeviceNode + 61;
v7 = (_QWORD *)DeviceNode[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 = DeviceNode + 63;
v9 = (_QWORD *)DeviceNode[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);
}
DeviceNode[62] = DeviceNode + 61;
*v6 = v6;
DeviceNode[64] = DeviceNode + 63;
*v8 = v8;
DeviceNode[65] = 0i64;
if( AcquireLock )
{
KeReleaseSemaphore((_KSEMAPHORE *)&PnpReplaceEvent + 188, 0i64, 1i64, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
}Referenced by:
IopDestroyDeviceNode
IopRemoveDevice
PipProcessStartPhase1