IoReportTargetDeviceChangeAsynchronous
NTSTATUS __fastcall IoReportTargetDeviceChangeAsynchronous(UINT64 a1, INT64 a2, VOID *a3, INT64 a4){
__int64 v8;
GUID *v9;
__int64 v10;
int v11;
_WORK_QUEUE_ITEM *PoolWithTag;
__int16 *v14;
_WORD *v15;
VOID **v16;
VOID **v17;
__int64 v18;
_WORD *v19;
__int64 v20;
_WORD *v21;
__int64 v22;
if( !a1 )
goto LABEL_31;
v8 = *(_QWORD *)(*(_QWORD *)(a1 + 312) + 40i64);
if( !v8 || (*(_DWORD *)(v8 + 396) & 0x20000) != 0 )
{
IoAddTriageDumpDataBlock((VOID *)a1, (_BYTE *)*(unsigned __int16 *)(a1 + 2));
v14 = *(__int16 **)(a1 + 8);
if( v14 )
{
IoAddTriageDumpDataBlock(v14, (_BYTE *)(unsigned int)v14[1]);
v15 = (_WORD *)(*(_QWORD *)(a1 + 8) + 56i64);
if( *v15 )
{
IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*(VOID **)(*(_QWORD *)(a1 + 8) + 64i64),
(_BYTE *)*(unsigned __int16 *)(*(_QWORD *)(a1 + 8) + 56i64));
}
}
v16 = *(VOID ***)(*(_QWORD *)(a1 + 312) + 40i64);
if( v16 )
{
v17 = v16 + 5;
IoAddTriageDumpDataBlock(v16, (_BYTE *)0x310);
if( *(_WORD *)v17 )
{
IoAddTriageDumpDataBlock(v17, (_BYTE *)2);
IoAddTriageDumpDataBlock(v17[1], (_BYTE *)*(unsigned __int16 *)v17);
}
v18 = *(_QWORD *)(a1 + 312);
v19 = (_WORD *)(*(_QWORD *)(v18 + 40) + 56i64);
if( *v19 )
{
IoAddTriageDumpDataBlock(v19, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*(VOID **)(*(_QWORD *)(*(_QWORD *)(a1 + 312) + 40i64) + 64i64),
(_BYTE *)*(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(a1 + 312) + 40i64) + 56i64));
v18 = *(_QWORD *)(a1 + 312);
}
v20 = *(_QWORD *)(*(_QWORD *)(v18 + 40) + 16i64);
if( v20 )
{
v21 = (_WORD *)(v20 + 56);
if( *v21 )
{
IoAddTriageDumpDataBlock(v21, (_BYTE *)2);
v22 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 312) + 40i64) + 16i64);
IoAddTriageDumpDataBlock(*(VOID **)(v22 + 64), (_BYTE *)*(unsigned __int16 *)(v22 + 56));
}
}
}
LABEL_31:
KeBugCheckEx(0xCAu, (PVOID)2, (PVOID)a1, 0i64, 0i64);
}
v9 = (GUID *)(a2 + 4);
if( (GUID *)(a2 + 4) == &GUID_TARGET_DEVICE_QUERY_REMOVE )
return -1073741808;
if( RtlCompareMemory(v9, &GUID_TARGET_DEVICE_QUERY_REMOVE, 16) == (_SIZE_T *)16 )
return -1073741808;
if( v9 == &GUID_TARGET_DEVICE_REMOVE_CANCELLED )
return -1073741808;
if( RtlCompareMemory(v9, &GUID_TARGET_DEVICE_REMOVE_CANCELLED, 16) == (_SIZE_T *)16 )
return -1073741808;
if( v9 == &GUID_TARGET_DEVICE_REMOVE_COMPLETE )
return -1073741808;
if( RtlCompareMemory(v9, &GUID_TARGET_DEVICE_REMOVE_COMPLETE, 16) == (_SIZE_T *)16 )
return -1073741808;
v10 = *(unsigned __int16 *)(a2 + 2);
if( (unsigned __int16)v10 < 0x24u )
return -1073741808;
v11 = *(_DWORD *)(a2 + 32);
if( v11 != -1 && v11 > (int)v10 - 36 )
return -1073741808;
if( KeGetCurrentIrql() != 2 )
return PnpSetCustomTargetEvent((PVOID)a1, 0i64, 0i64, (__int64)a3, a4, (VOID *)a2);
PoolWithTag = (_WORK_QUEUE_ITEM *)ExAllocatePoolWithTag(0x200ui64, v10 + 64, 946892368i64);
if( !PoolWithTag )
return -1073741670;
ObfReferenceObjectWithTag((VOID *)a1, 0x4E706E50ui64);
PoolWithTag[1].List.Flink = (_LIST_ENTRY *)a1;
PoolWithTag[1].Parameter = &PoolWithTag[2];
memmove(&PoolWithTag[2], (const VOID *)a2, *(unsigned __int16 *)(a2 + 2));
PoolWithTag[1].List.Blink = (_LIST_ENTRY *)a3;
PoolWithTag[1].WorkerRoutine = (void(__fastcall *)(void *))a4;
PoolWithTag->WorkerRoutine = (void(__fastcall *)(void *))PnpReportTargetDeviceChangeAsyncWorker;
PoolWithTag->Parameter = PoolWithTag;
PoolWithTag->List.Flink = 0i64;
ExQueueWorkItem(PoolWithTag, DelayedWorkQueue);
return 259;
}Referenced by:
FsRtlNotifyVolumeEventEx
PnpDeviceActionWorker