KsepGetShimsForDriver
NTSTATUS __stdcall KsepGetShimsForDriver(
_UNICODE_STRING *DriverName,
_UNICODE_STRING *DriverPath,
VOID *BaseAddress,
UINT64 ImageSize,
VOID **Shims,
UINT64 *ShimCount){
unsigned int v9;
int ShimsFromRegistry;
_KSE_SHIMMED_MODULE *v12;
_UNICODE_STRING *v13;
unsigned int v14;
_QWORD *Paged;
_QWORD *v16;
_ETHREAD *CurrentThread;
_QWORD *v18;
__int64 v19;
UINT64 v20;
_UNICODE_STRING *ShimsOut;
_KSE_SHIMMED_MODULE *ModuleInfo;
ShimsOut = 0i64;
LODWORD(v20) = 0;
*Shims = 0i64;
*(_DWORD *)ShimCount = 0;
ModuleInfo = 0i64;
v9 = ImageSize;
if( KsepIsModuleShimmed(&Engine, BaseAddress, &ModuleInfo) )
{
v12 = ModuleInfo;
*Shims = (VOID *)*((_QWORD *)ModuleInfo + 4);
*(_DWORD *)ShimCount = v12[6];
return 0;
}
ShimsFromRegistry = KsepEngineGetShimsFromRegistry(&Engine, DriverName, (_KSE_SHIM_INFO **)&ShimsOut, &v20);
if( ShimsFromRegistry == -1073741275 )
ShimsFromRegistry = KsepDbGetDriverShims(DriverPath, BaseAddress, v9, &ShimsOut, &v20);
if( ShimsFromRegistry < 0 )
goto LABEL_5;
v13 = ShimsOut;
v14 = v20;
ShimsFromRegistry = KsepResolveApplicableShimsForDriver((_KSE_SHIM_INFO *)ShimsOut, (unsigned int)v20);
if( ShimsFromRegistry < 0 )
{
LABEL_12:
if( v13 && v14 )
KsepDbFreeDriverShims((_KSE_SHIM_INFO *)v13, v14);
goto LABEL_6;
}
Paged = KsepPoolAllocatePaged(0x28ui64);
v16 = Paged;
if( !Paged )
{
ShimsFromRegistry = -1073741670;
goto LABEL_12;
}
Paged[4] = v13;
*((_DWORD *)Paged + 6) = v14;
Paged[2] = BaseAddress;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C50350, 0i64);
v18 = qword_140C50348;
if( (_UNKNOWN *)*qword_140C50348 != &unk_140C50340 )
__fastfail(3u);
*v16 = &unk_140C50340;
v16[1] = v18;
*v18 = v16;
qword_140C50348 = v16;
if( (_InterlockedExchangeAdd64(&stru_140C50350._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C50350);
KeAbPostRelease(&stru_140C50350);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
LABEL_5:
*Shims = ShimsOut;
*(_DWORD *)ShimCount = v20;
LABEL_6:
if( ShimsFromRegistry >= 0 )
{
v19 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F;
HIDWORD(KsepHistoryMessages[v19]) = 0;
LODWORD(KsepHistoryMessages[v19]) = 459112;
if( (KsepDebugFlag & 1) != 0 )
KsepDebugPrint(7i64, "KSE: got shim(s) for driver [%ws]\n", DriverName->Buffer);
KsepLogInfo(7, "KSE: got shim(s) for driver [%ws]\n", DriverName->Buffer);
}
return ShimsFromRegistry;
}Referenced by:
KseDriverLoadImage