VfIoDeleteDevice
VOID __stdcall VfIoDeleteDevice(DEVICE_OBJECT *DeviceObject, PVOID CallerAddress){
const VOID *v2;
_LIST_ENTRY *v3;
__int64 v4;
_LIST_ENTRY *v5;
UINT64 v6;
INT64 v7;
void *LowerDeviceObjectWithTag;
v2 = CallerAddress;
v3 = (_LIST_ENTRY *)DeviceObject;
if( ViVerifyDma )
{
v4 = *((_QWORD *)DeviceObject + 39);
if( !v4 )
goto LABEL_17;
do
{
CallerAddress = *(PVOID *)(v4 + 48);
if( !CallerAddress )
break;
v4 = *((_QWORD *)CallerAddress + 39);
DeviceObject = (DEVICE_OBJECT *)CallerAddress;
}
while( v4 );
if( DeviceObject == (DEVICE_OBJECT *)v3 )
{
LABEL_17:
while( 1 )
{
v5 = VF_FIND_DEVICE_INFORMATION_AND_REMOVE(v3, (UINT64)CallerAddress);
if( !v5 )
break;
ViReleaseDmaAdapter((__int64)v5, v6);
}
}
else
{
VF_MARK_FOR_DEFERRED_REMOVE(DeviceObject);
}
}
if( !VfIoDisabled )
{
ViDevObjRemove((_DEVICE_OBJECT *)v3);
if( (unsigned int)IovUtilIsDeviceObjectMarked((__int64)v3, 0) )
VfErrorReport9(576i64, v2);
IovUtilMarkDeviceObject((__int64)v3, 0);
LowerDeviceObjectWithTag = IovUtilGetLowerDeviceObjectWithTag(v7);
if( LowerDeviceObjectWithTag )
{
VfErrorReport9(513i64, v2);
ObfDereferenceObjectWithTag(LowerDeviceObjectWithTag, 0x49667256ui64);
}
VfIrpLogDeleteDeviceLogs((_DEVICE_OBJECT *)v3);
}
}Referenced by:
IovDeleteDevice