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