KseShimDatabaseOpen
NTSTATUS __stdcall KseShimDatabaseOpen(PVOID *DbHandleOut){
_ETHREAD *CurrentThread;
int v3;
char v4;
INT64 v6;
INT64 v7;
WCHAR v8;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&KsepShimDbLock, 0i64);
if( KsepShimDbDuringBoot )
{
if( KsepShimDbHandle )
{
++KsepShimDbRefCount;
v3 = 0;
*DbHandleOut = (PVOID)KsepShimDbHandle;
_InterlockedIncrement(&dword_140C2A7D0);
goto LABEL_4;
}
*DbHandleOut = 0i64;
LABEL_15:
v3 = -1073741823;
goto LABEL_4;
}
if( KsepShimDbHandle )
{
++KsepShimDbRefCount;
v3 = 0;
*DbHandleOut = (PVOID)KsepShimDbHandle;
_InterlockedIncrement(&dword_140C2A7D8);
goto LABEL_4;
}
v3 = KsepSdbMapToMemory(L"\\SystemRoot\\AppPatch\\drvmain.sdb");
if( v3 < 0 )
{
*DbHandleOut = 0i64;
_InterlockedIncrement(&dword_140C2A7DC);
goto LABEL_15;
}
if( KsepSdbMapToMemory(L"\\SystemRoot\\AppPatch\\drvpatch.sdb") >= 0
&& dword_140C2ACD0 >= (unsigned int)dword_140C2AD08 )
{
KsepSdbUnmapFromMemory((INT64)&qword_140C2ACD8);
KsepDeletePatchSdb(v7, v6, v8);
}
++KsepShimDbRefCount;
KsepShimDbHandle = (__int64)&KsepShimDb;
*DbHandleOut = &KsepShimDb;
_InterlockedIncrement(&dword_140C2A7D4);
LABEL_4:
v4 = _InterlockedExchangeAdd64((volatile signed __int64 *)&KsepShimDbLock, 0xFFFFFFFFFFFFFFFFui64);
if( (v4 & 2) != 0 && (v4 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)&KsepShimDbLock);
KeAbPostRelease(&KsepShimDbLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v3;
}Referenced by:
KseInitialize
KsepDbCacheReadDevice
KsepDbGetDriverShims
KsepDbGetShimInfo