IoRequestDeviceRemovalForReset
NTSTATUS __stdcall IoRequestDeviceRemovalForReset(PVOID DeviceObject, UINT64 Flags){
int v2;
VOID **PoolWithTag;
__int64 v5;
INT64 v6;
int v7;
INT64 v8;
INT64 v9;
INT64 v10;
v2 = Flags;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0xE0ui64, 1164996176i64);
v5 = 0i64;
v6 = (INT64)PoolWithTag;
if( !PoolWithTag )
goto LABEL_2;
memset(PoolWithTag, 0i64, 0xE0u);
KeInitializeDpc((PRKDPC)(v6 + 64), (PKDEFERRED_ROUTINE)PfSnTracingStateDpcRoutine, (PVOID)v6);
KeInitializeTimerEx(v6, 0);
*(_QWORD *)(v6 + 152) = v6;
*(_QWORD *)(v6 + 144) = IopRetryDeviceRemovalForReset;
*(_QWORD *)(v6 + 128) = 0i64;
ObfReferenceObjectWithTag(DeviceObject, 0x52706E50ui64);
*(_QWORD *)(v6 + 184) = DeviceObject;
*(_QWORD *)(v6 + 160) = 0i64;
*(_DWORD *)(v6 + 192) = 0;
*(_DWORD *)(v6 + 216) = v2;
*(_OWORD *)(v6 + 200) = 0i64;
if( IopAllocateUnicodeString((_UNICODE_STRING *)(v6 + 200), 0x200u) >= 0 )
v7 = IopQueueDeviceResetEvent((_RESET_REMOVAL_CONTEXT *)v6);
else
LABEL_2:
v7 = -1073741670;
PnpTraceRequestDeviceRemovalForReset((__int64)DeviceObject, v2, v7);
if( v7 >= 0 )
{
if( DeviceObject )
v5 = *(_QWORD *)(*((_QWORD *)DeviceObject + 39) + 40i64);
if( (byte_140C130BB & 8) != 0 )
McTemplateK0hzr0_EtwWriteTransfer(v9, v8, v10, *(_WORD *)(v5 + 40) >> 1, *(_QWORD *)(v5 + 48));
}
else if( v6 )
{
IopFreeResetRemovalContext((_RESET_REMOVAL_CONTEXT *)v6);
}
return v7;
}Referenced by:
No references.