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.