SdbReleaseDatabase

VOID __fastcall SdbReleaseDatabase(PVOID hSDB){
  UINT64 v2; 
  _DB *v3; 
  _QWORD **v4; 

  AslLogCallPrintf(3ui64, (INT8 *)"SdbReleaseDatabase", 0x53ui64, (INT8 *)"Enter.");
  if( *((_DWORD *)hSDB + 248) )
  {
    if( _InterlockedDecrement((volatile signed __int32 *)(*((_QWORD *)hSDB + 125) + 1000i64)) < 0 )
    {
      _InterlockedIncrement((volatile signed __int32 *)(*((_QWORD *)hSDB + 125) + 1000i64));
      AslLogCallPrintf(
        1ui64,
        (INT8 *)"SdbReleaseDatabase",
        0x64ui64,
        (INT8 *)"SDB Handle count was decremented after zero.");
    }
    goto LABEL_8;
  }
  if( *((int *)hSDB + 250) <= 0 )
  {
    SdbpCleanupLocalDatabaseSupport(hSDB, v2);
    if( (*((_DWORD *)hSDB + 30) & 2) != 0 )
      SdbCloseDatabaseRead(*((_DB **)hSDB + 14));
    v3 = (_DB *)*((_QWORD *)hSDB + 1);
    if( v3 )
      SdbCloseDatabaseRead(v3);
    while( 1 )
    {
      v4 = (_QWORD **)*((_QWORD *)hSDB + 71);
      if( !v4 )
        break;
      if( v4[1] == v4 )
      {
        *((_QWORD *)hSDB + 71) = 0i64;
      }
      else
      {
        *((_QWORD *)hSDB + 71) = *v4;
        *v4[1] = *v4;
        (*v4)[1] = v4[1];
      }
      ExFreePoolWithTag(v4, 0x74705041u);
    }
LABEL_8:
    ExFreePoolWithTag(hSDB, 0x74705041u);
    return;
  }
  AslLogCallPrintf(
    1ui64,
    (INT8 *)"SdbReleaseDatabase",
    0x72ui64,
    (INT8 *)"Attempt to release SDB handle that still has unreleased duplicates.");
}

Referenced by:

KsepSdbBootRelease
KsepSdbUnmapFromMemory
PiReleaseDDB
PpReleaseBootDDB