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