KseShimDatabaseClose
VOID __stdcall KseShimDatabaseClose(PVOID DbHandleIn){
_ETHREAD *CurrentThread;
int v3;
__int64 v4;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&KsepShimDbLock, 0i64);
if( DbHandleIn != (PVOID)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", 0x233u, 0i64);
}
if( KsepShimDbDuringBoot )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&KsepShimDbLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&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((volatile signed __int64 *)&KsepShimDbLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&KsepShimDbLock);
KeAbPostRelease(&KsepShimDbLock);
KeLeaveCriticalRegion();
}
}Referenced by:
KseInitialize
KsepDbCacheReadDevice
KsepDbGetDriverShims
KsepDbGetShimInfo