PipIommuRetrieveSecondaryDeviceId

INT64 __fastcall PipIommuRetrieveSecondaryDeviceId(INT64 a1, _QWORD *a2){
  _DWORD *Pool2; 
  unsigned int(__fastcall *v3)(_QWORD, _QWORD, _QWORD, UINT64 *); 
  int v6; 
  INT64 result; 
  UINT64 v8; 
  v8 = 0i64;
  Pool2 = 0i64;
  v3 = *(unsigned int(__fastcall **)(_QWORD, _QWORD, _QWORD, UINT64 *))(a1 + 72);
  if( !v3 )
  {
    v6 = -1073741637;
    goto LABEL_15;
  }
  if( v3(*(_QWORD *)(a1 + 8), 0i64, 0i64, &v8) != -1073741789 || !v8 )
  {
    v6 = -1073741823;
LABEL_12:
    if( v6 >= 0 )
      goto LABEL_15;
    goto LABEL_13;
  }
  Pool2 = ExAllocatePool2(256i64, v8, 0x64706E50ui64);
  if( !Pool2 )
  {
    v6 = -1073741670;
    goto LABEL_15;
  }
  v6 = (*(__int64(__fastcall **)(_QWORD, UINT64, _DWORD *, _QWORD))(a1 + 72))(*(_QWORD *)(a1 + 8), v8, Pool2, 0i64);
  if( v6 < 0 )
    goto LABEL_13;
  if( *Pool2 == 1 )
  {
    PipIommuValidateDeviceId(a1, (INT64)Pool2, v8);
    goto LABEL_12;
  }
  v6 = -1073741637;
LABEL_13:
  if( Pool2 )
  {
    ExFreePoolWithTag(Pool2, 0x64706E50u);
    Pool2 = 0i64;
  }
LABEL_15:
  result = (unsigned int)v6;
  *a2 = Pool2;
  return result;
}

Referenced by:

PiIommuAllocateExtension