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