SdbpOpenCompressedDatabase
__int64 __fastcall SdbpOpenCompressedDatabase(_DB **a1, __int64 a2, INT64 a3){
_DB *v3;
unsigned int v4;
_DB *v5;
INT8 *v7;
UINT64 v8;
__m128i *v9;
VOID *v10;
VOID *v11;
INT64 v12;
_DB *v13;
__int64 result;
UINT64 dwSize;
LODWORD(dwSize) = a3;
v3 = *a1;
v4 = 0;
LODWORD(dwSize) = 0;
v5 = 0i64;
if( !*(&SbiVmbusArrivalEvent + 347) )
{
v7 = (INT8 *)"No expand callback method set. Cannot expand ZDB file.";
v8 = 147i64;
LABEL_3:
AslLogCallPrintf(1ui64, (INT8 *)"SdbpOpenCompressedDatabase", v8, v7);
goto LABEL_22;
}
if( (unsigned int)v3[5] < 0x14 )
{
v7 = "SDB file too small to be valid";
v8 = 152i64;
goto LABEL_3;
}
v9 = (__m128i *)*((_QWORD *)v3 + 1);
v10 = (VOID *)v9[1].m128i_u32[0];
if( _mm_cvtsi128_si32(_mm_srli_si128(*v9, 8)) != 1717724282 )
{
v7 = "SDB is not compressed";
v8 = 159i64;
goto LABEL_3;
}
if( HIDWORD(*(unsigned __int128 *)v9) != *(&SbiVmbusArrivalEvent + 692) )
{
v7 = "SDB compression algorithm does not match callback algorithm.";
v8 = 164i64;
goto LABEL_3;
}
LODWORD(dwSize) = v9[1].m128i_i32[0];
v11 = AslAlloc(v10, (_SIZE_T)v10, a3);
if( !v11 )
{
v7 = "SdbpOpenCompressedDatabase failed to allocate expanded buffer - out of memory";
v8 = 183i64;
goto LABEL_3;
}
if( (unsigned int)(*(&SbiVmbusArrivalEvent + 347))(
v11,
&dwSize,
*((_QWORD *)v3 + 1) + 20i64,
(unsigned int)(v3[5] - 20)) )
{
v13 = SdbpOpenDatabaseInMemory(v11, (unsigned int)dwSize, v12);
v5 = v13;
if( v13 )
{
v13[6] |= 0xCu;
v11 = 0i64;
LODWORD(dwSize) = 0;
v4 = 1;
}
}
else
{
AslLogCallPrintf(
1ui64,
(INT8 *)"SdbpOpenCompressedDatabase",
0xC1ui64,
(INT8 *)"Expand callback failed to expand SDB");
}
if( v11 )
{
ExFreePoolWithTag(v11, 0x74705041u);
LODWORD(dwSize) = 0;
if( v5 )
*((_QWORD *)v5 + 1) = 0i64;
}
if( !v4 && v5 )
{
SdbCloseDatabaseRead(v5);
v5 = 0i64;
}
LABEL_22:
SdbCloseDatabaseRead(*a1);
result = v4;
*a1 = v5;
return result;
}Referenced by:
SdbOpenDatabaseEx