SdbpOpenCompressedDatabase
INT64 __fastcall SdbpOpenCompressedDatabase(PVOID *a1, INT64 a2, INT64 a3){
PVOID v3;
unsigned int v4;
_QWORD *v5;
__m128i *v7;
UINT64 v8;
VOID *v9;
INT64 v10;
_QWORD *v11;
INT64 result;
INT64 v13;
LODWORD(v13) = a3;
v3 = *a1;
v4 = 0;
LODWORD(v13) = 0;
v5 = 0i64;
if( g_ExpandCallback )
{
if( *((_DWORD *)v3 + 5) >= 0x14u )
{
v7 = (__m128i *)*((_QWORD *)v3 + 1);
v8 = v7[1].m128i_u32[0];
if( _mm_cvtsi128_si32(_mm_srli_si128(*v7, 8)) == 1717724282 )
{
if( HIDWORD(*(unsigned __int128 *)v7) == g_ExpectedAlgorithm )
{
LODWORD(v13) = v7[1].m128i_i32[0];
v9 = AslAlloc((VOID *)v8, v8, a3);
if( v9 )
{
if( (unsigned int)((__int64(__fastcall *)(VOID *, INT64 *, __int64, _QWORD))g_ExpandCallback)(
v9,
&v13,
*((_QWORD *)v3 + 1) + 20i64,
(unsigned int)(*((_DWORD *)v3 + 5) - 20)) )
{
v11 = SdbpOpenDatabaseInMemory(v9, (unsigned int)v13, v10);
v5 = v11;
if( v11 )
{
*((_DWORD *)v11 + 6) |= 0xCu;
v9 = 0i64;
LODWORD(v13) = 0;
v4 = 1;
}
}
else
{
AslLogCallPrintf(1ui64, "SdbpOpenCompressedDatabase", 0xC1ui64, "Expand callback failed to expand SDB");
}
if( v9 )
{
ExFreePoolWithTag(v9, 0x74705041u);
LODWORD(v13) = 0;
if( v5 )
v5[1] = 0i64;
}
if( !v4 && v5 )
{
SdbCloseDatabaseRead(v5);
v5 = 0i64;
}
}
else
{
AslLogCallPrintf(
1ui64,
"SdbpOpenCompressedDatabase",
0xB7ui64,
"SdbpOpenCompressedDatabase failed to allocate expanded buffer - out of memory");
}
}
else
{
AslLogCallPrintf(
1ui64,
"SdbpOpenCompressedDatabase",
0xA4ui64,
"SDB compression algorithm does not match callback algorithm.");
}
}
else
{
AslLogCallPrintf(1ui64, "SdbpOpenCompressedDatabase", 0x9Fui64, "SDB is not compressed");
}
}
else
{
AslLogCallPrintf(1ui64, "SdbpOpenCompressedDatabase", 0x98ui64, "SDB file too small to be valid");
}
}
else
{
AslLogCallPrintf(
1ui64,
"SdbpOpenCompressedDatabase",
0x93ui64,
"No expand callback method set. Cannot expand ZDB file.");
}
SdbCloseDatabaseRead(*a1);
result = v4;
*a1 = v5;
return result;
}Referenced by:
SdbOpenDatabaseEx