HalpIvtCreateReservedDevice

UINT64 __stdcall HalpIvtCreateReservedDevice(INT64 a1, INT64 a2){
  _QWORD **v2; 
  _QWORD *v4; 
  int v5; 
  INT64 v6; 
  INT64 v7; 
  _QWORD *v8; 
  __int64 v9; 
  _QWORD *v10; 
  __int64 v11; 
  INT64 v13; 

  v13 = a1;
  v2 = (_QWORD **)(a2 + 16);
  v4 = *(_QWORD **)(a2 + 16);
  v5 = 0;
  while( v4 != v2 )
  {
    v4 = (_QWORD *)*v4;
    ++v5;
  }
  v13 = 0i64;
  ExtEnvAllocateMemory(a1, (unsigned int)(24 * v5 + 32), &v13);
  v6 = v13;
  if( v13 )
  {
    memset((VOID *)v13, 0i64, 24 * v5 + 32);
    *(_DWORD *)(v6 + 24) = v5;
    if( v6 )
    {
      v8 = *v2;
      v9 = 0i64;
      while( v8 != v2 )
      {
        v10 = v8;
        v8 = (_QWORD *)*v8;
        if( (unsigned int)v9 >= *(_DWORD *)(v6 + 24) )
          goto LABEL_11;
        v7 = 3 * v9;
        *(_QWORD *)(v6 + 8 * v7 + 32) = v10[2];
        v9 = (unsigned int)(v9 + 1);
        *(_QWORD *)(v6 + 8 * v7 + 40) = v10[3];
      }
      LODWORD(v11) = DmrConvertDeviceScope(*(unsigned __int16 *)(a2 + 32), (_BYTE *)(a2 + 34));
      *(_QWORD *)v6 = v11;
      if( v11 )
        return v6;
LABEL_11:
      if( *(_QWORD *)v6 )
      {
        ExtEnvFreeMemory(v7, *(_QWORD *)v6);
        *(_QWORD *)v6 = 0i64;
      }
      ExtEnvFreeMemory(v7, v6);
      return 0i64;
    }
  }
  return v6;
}

Referenced by:

IvtEnumerateRmrrDevices