HvlRegisterDeviceId
NTSTATUS __stdcall HvlRegisterDeviceId(
UINT16 CompressionFormat,
UINT8 **CompressedBuffer,
UINT8 *EndOfCompressedBufferPlus1,
UINT8 **ChunkBuffer,
UINT64 ChunkSize){
__int64 v5;
__int64 v7;
unsigned int v8;
__int64 v9;
_QWORD *v10;
__int64 v11;
_BYTE *v12;
INT16 v13;
INT64 v14;
UINT64 v15;
int v16;
NTSTATUS v17;
__int128 PageInfo[2];
v5 = -1i64;
memset(PageInfo, 0, sizeof(PageInfo));
v7 = CompressionFormat;
if( *(_DWORD *)CompressionFormat == 1 )
{
v8 = 0;
}
else
{
if( *(_DWORD *)CompressionFormat != 2 )
return -1073741637;
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 -1073741811;
v10 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)PageInfo, 1ui64, 0i64, 0i64);
memset(v10, 0i64, v8 + 40);
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 = *(_BYTE **)(v7 + 8);
do
++v5;
while( v12[v5] );
memmove(v10 + 5, v12, v5 + 1);
}
*((_DWORD *)v10 + 4) |= 1u;
v10[3] = CompressedBuffer;
while( 1 )
{
HvcallInitiateHypercall();
if( !HvlpHvStatusIsInsufficientMemory(v13) )
break;
HvlpHandleInsufficientMemory(v15, v14);
if( v16 < 0 )
{
v17 = -1073741670;
goto LABEL_19;
}
}
v17 = HvlpHvToNtStatus(v15);
LABEL_19:
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
return v17;
}Referenced by:
No references.