KseShimDatabaseClose
VOID __stdcall KseShimDatabaseClose(VOID *DbHandleIn){
_ETHREAD *CurrentThread;
int v3;
__int64 v4;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&KsepShimDbLock, 0i64);
if( DbHandleIn != (VOID *)KsepShimDbHandle )
{
v4 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
KsepHistoryErrors[2 * v4 + 1] = -1073740768;
KsepHistoryErrors[2 * v4] = 590387;
if( (KsepDebugFlag & 4) != 0 )
RtlAssert("DbHandleIn == KsepShimDbHandle", "minkernel\\ntos\\kshim\\ksesdb.c", 563i64, 0i64);
}
if( KsepShimDbDuringBoot )
{
if( (_InterlockedExchangeAdd64(&KsepShimDbLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&KsepShimDbLock);
KeAbPostRelease(&KsepShimDbLock);
KeLeaveCriticalRegion();
KseShimDatabaseBootRelease();
}
else
{
if( KsepShimDbHandle )
{
v3 = KsepShimDbRefCount;
if( !KsepShimDbRefCount || (--KsepShimDbRefCount, v3 == 1) )
{
KsepSdbUnmapFromMemory((INT64)&KsepShimDb);
KsepSdbUnmapFromMemory((INT64)&qword_140C2ACD8);
KsepShimDbHandle = 0i64;
}
}
if( (_InterlockedExchangeAdd64(&KsepShimDbLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&KsepShimDbLock);
KeAbPostRelease(&KsepShimDbLock);
KeLeaveCriticalRegion();
}
}Referenced by:
KseInitialize
KsepDbCacheReadDevice
KsepDbGetDriverShims
KsepDbGetShimInfo