PiIommuGetInterface
NTSTATUS __stdcall PiIommuGetInterface(ULONG MaxDataSize){
_QWORD *v1;
_QWORD *v2;
_DEVICE_OBJECT *v3;
__int64 v4;
NTSTATUS result;
__int16 *p_Type;
_UNICODE_STRING *p_DriverName;
VOID **DeviceNode;
VOID **v9;
_DEVOBJ_EXTENSION *DeviceObjectExtension;
_WORD *v11;
__int64 v12;
_WORD *v13;
__int64 v14;
v2 = v1;
v3 = *(_DEVICE_OBJECT **)&MaxDataSize;
if( !*(_QWORD *)&MaxDataSize )
goto LABEL_22;
v4 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)&MaxDataSize + 312i64) + 40i64);
if( !v4 || (*(_DWORD *)(v4 + 396) & 0x20000) != 0 )
{
IoAddTriageDumpDataBlock(v3, (_BYTE *)v3->Size);
p_Type = &v3->DriverObject->Type;
if( p_Type )
{
IoAddTriageDumpDataBlock(p_Type, (_BYTE *)(unsigned int)p_Type[1]);
p_DriverName = &v3->DriverObject->DriverName;
if( p_DriverName->Length )
{
IoAddTriageDumpDataBlock(p_DriverName, (_BYTE *)2);
IoAddTriageDumpDataBlock(v3->DriverObject->DriverName.Buffer, (_BYTE *)v3->DriverObject->DriverName.Length);
}
}
DeviceNode = (VOID **)v3->DeviceObjectExtension->DeviceNode;
if( DeviceNode )
{
v9 = DeviceNode + 5;
IoAddTriageDumpDataBlock(DeviceNode, (_BYTE *)0x310);
if( *(_WORD *)v9 )
{
IoAddTriageDumpDataBlock(v9, (_BYTE *)2);
IoAddTriageDumpDataBlock(v9[1], (_BYTE *)*(unsigned __int16 *)v9);
}
DeviceObjectExtension = v3->DeviceObjectExtension;
v11 = (char *)DeviceObjectExtension->DeviceNode + 56;
if( *v11 )
{
IoAddTriageDumpDataBlock(v11, (_BYTE *)2);
IoAddTriageDumpDataBlock(
*((VOID **)v3->DeviceObjectExtension->DeviceNode + 8),
(_BYTE *)*((unsigned __int16 *)v3->DeviceObjectExtension->DeviceNode + 28));
DeviceObjectExtension = v3->DeviceObjectExtension;
}
v12 = *((_QWORD *)DeviceObjectExtension->DeviceNode + 2);
if( v12 )
{
v13 = (_WORD *)(v12 + 56);
if( *v13 )
{
IoAddTriageDumpDataBlock(v13, (_BYTE *)2);
v14 = *((_QWORD *)v3->DeviceObjectExtension->DeviceNode + 2);
IoAddTriageDumpDataBlock(*(VOID **)(v14 + 64), (_BYTE *)*(unsigned __int16 *)(v14 + 56));
}
}
}
LABEL_22:
KeBugCheckEx(0xCAu, (PVOID)2, v3, 0i64, 0i64);
}
result = PnpQueryInterface(v3, (_IO_SECURITY_CONTEXT *)&GUID_IOMMU_BUS_INTERFACE, 2, 0x50u, (__int64)v3, v1);
if( result >= 0 )
{
if( v2[2] && v2[3] && v2[8] && v2[7] )
{
return 0;
}
else
{
PiIommuPutInterface((__int64)v2);
return -1073741637;
}
}
return result;
}Referenced by:
PiDmaGuardProcessNewDeviceNode