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