PnpHandleEnumerateHandlesAgainstPdoStack
__int64 __fastcall PnpHandleEnumerateHandlesAgainstPdoStack(PVOID Object, __int64 a2, __int64 a3){
PVOID v4;
INT64 v5;
unsigned int v6;
INT64 v7;
UINT8 v8;
__int64 v9;
_DEVICE_OBJECT *v10;
UINT8 v11;
INT64 v12;
INT64 v13;
_DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag;
UINT8 v15;
void *v16;
UINT8 v17;
v4 = Object;
ObfReferenceObjectWithTag(Object, 0x746C6644ui64);
while( 1 )
{
v6 = PnpHandleEnumerateHandlesAgainstDeviceObject((__int64)v4, (__int64)PnpCollectOpenHandlesCallBack, a3);
if( v6 )
break;
v8 = KeAcquireQueuedSpinLock(9i64, v5, v7);
v9 = *((_QWORD *)v4 + 7);
v10 = 0i64;
v11 = v8;
if( v9 )
{
v10 = *(_DEVICE_OBJECT **)(v9 + 8);
if( v10 )
ObfReferenceObjectWithTag(*(VOID **)(v9 + 8), 0x746C6644ui64);
}
KeReleaseQueuedSpinLock(LockQueueIoVpbLock, v11);
if( v10 )
{
DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(v10, 0x746C6644ui64);
v6 = PnpHandleEnumerateHandlesAgainstDeviceObject(
(__int64)DeviceAttachmentBaseRefWithTag,
(__int64)PnpCollectOpenHandlesCallBack,
a3);
ObfDereferenceObjectWithTag(DeviceAttachmentBaseRefWithTag, 0x746C6644ui64);
ObfDereferenceObjectWithTag(v10, 0x746C6644ui64);
if( v6 )
break;
}
v15 = KeAcquireQueuedSpinLock(10i64, v12, v13);
v16 = (void *)*((_QWORD *)v4 + 3);
v17 = v15;
if( v16 )
ObfReferenceObjectWithTag(*((VOID **)v4 + 3), 0x746C6644ui64);
KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v17);
ObfDereferenceObjectWithTag(v4, 0x746C6644ui64);
v4 = v16;
if( !v16 )
return v6;
}
ObfDereferenceObjectWithTag(v4, 0x746C6644ui64);
return v6;
}Referenced by:
PnpCollectOpenHandles