HvlRegisterDeviceId

INT64 __stdcall HvlRegisterDeviceId(
        UINT16 CompressionFormat,
        UINT8 **CompressedBuffer,
        UINT8 *EndOfCompressedBufferPlus1,
        UINT8 **ChunkBuffer,
        UINT64 ChunkSize){
  __int64 v5; 
  __int64 v7; 
  unsigned int v8; 
  __int64 v9; 
  LONGLONG *v10; 
  LONGLONG v11; 
  UINT8 *v12; 
  INT16 v13; 
  UINT16 v14; 
  unsigned int v15; 
  __int128 v17[2]; 
  v5 = -1i64;
  memset(v17, 0, sizeof(v17));
  v7 = CompressionFormat;
  if( *(_DWORD *)CompressionFormat == 1 )
  {
    v8 = 0;
  }
  else
  {
    if( *(_DWORD *)CompressionFormat != 2 )
      return 3221225659i64;
    v9 = -1i64;
    do
      ++v9;
    while( *(_BYTE *)(*(_QWORD *)(CompressionFormat + 8i64) + v9) );
    v8 = (v9 + 8) & 0xFFFFFFF8;
  }
  if( (unsigned __int64)CompressedBuffer > 0x3FFFFFFFFFFFFFFFi64 || (unsigned __int64)v8 + 40 > 0x1000 )
    return 3221225485i64;
  v10 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v17, 1, 0i64, 0i64);
  memset((INT64)v10, 0i64);
  v11 = v10[1];
  *v10 = -1i64;
  if( *(_DWORD *)v7 == 1 )
  {
    v10[1] = v11 & 0x3FFFFFFFFFFFFFFFi64 | 0x4000000000000000i64;
    *((_WORD *)v10 + 4) = *(_WORD *)(v7 + 12);
    *((_WORD *)v10 + 5) = *(_WORD *)(v7 + 8);
  }
  else
  {
    v10[1] = v11 | 0xC000000000000000ui64;
    v12 = *(UINT8 **)(v7 + 8);
    do
      ++v5;
    while( v12[v5] );
    memmove((UINT8 *)v10 + 40, v12, v5 + 1);
  }
  *((_DWORD *)v10 + 4) |= 1u;
  v10[3] = (LONGLONG)CompressedBuffer;
  while( 1 )
  {
    HvcallInitiateHypercall();
    if( !HvlpHvStatusIsInsufficientMemory(v13) )
      break;
    if( HvlpHandleInsufficientMemory() < 0 )
    {
      v15 = -1073741670;
      goto LABEL_19;
    }
  }
  v15 = HvlpHvToNtStatus(v14);
LABEL_19:
  HvlpReleaseHypercallPage((unsigned int *)v17);
  return v15;
}

Referenced by:

No references.