KsepEngineGetShimsFromRegistry
INT64 __fastcall KsepEngineGetShimsFromRegistry(INT64 a1, INT64 a2, INT64 a3, _DWORD *a4){
UNICODE_STRING *v4;
_QWORD *v6;
WCHAR *v8;
UINT64 *v9;
WCHAR *v10;
int DriverShims;
int v13;
__int64 v14;
UNICODE_STRING *v15;
UNICODE_STRING *v16;
__int64 i;
__int64 v18;
UNICODE_STRING *v19;
_QWORD *v20;
UNICODE_STRING *Strings;
UINT64 BufferLength;
UINT64 StringsCount;
INT64 v24;
v24 = a3;
BufferLength = 0i64;
v4 = 0i64;
Strings = 0i64;
LODWORD(StringsCount) = 0;
v6 = (_QWORD *)a3;
if( (*(_DWORD *)(a1 + 8) & 1) != 0 )
{
DriverShims = -1073741275;
goto LABEL_5;
}
KsepPoolAllocatePaged(0x800ui64);
v10 = v8;
if( !v8 )
{
DriverShims = -1073741801;
goto LABEL_5;
}
DriverShims = KsepRegistryQueryDriverShims(*(PWCHAR *)(a2 + 8), v8, v9);
if( DriverShims >= 0 )
{
v13 = KsepStringSplitMultiString(v10, BufferLength, &Strings, &StringsCount);
v14 = (unsigned int)StringsCount;
DriverShims = v13;
if( v13 >= 0 )
{
KsepPoolAllocatePaged(80i64 * (unsigned int)StringsCount);
v15 = Strings;
v4 = v16;
if( !v16 )
{
DriverShims = -1073741801;
LABEL_20:
if( v15 )
{
if( (_DWORD)v14 )
{
v19 = v15;
do
{
KsepStringFree(v19++);
--v14;
}
while( v14 );
}
KsepPoolFreePaged(v15);
}
v6 = (_QWORD *)v24;
goto LABEL_4;
}
for( i = 0i64; (unsigned int)i < (unsigned int)v14; i = (unsigned int)(i + 1) )
{
if( KsepStringDuplicate(&v4[5 * i + 1], v15[(unsigned int)i].Buffer) < 0 )
break;
*(_DWORD *)(&v4[5 * i + 4].MaximumLength + 1) = 0;
}
DriverShims = KsepDbGetShimInfo((INT64)v4, (unsigned int)v14);
if( DriverShims >= 0 )
{
v20 = (_QWORD *)v24;
DriverShims = 0;
*a4 = v14;
*v20 = v4;
goto LABEL_20;
}
v18 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
KsepHistoryErrors[2 * v18 + 1] = DriverShims;
KsepHistoryErrors[2 * v18] = 132101;
if( (KsepDebugFlag & 2) != 0 )
KsepDebugPrint(0i64, "KSE: Cannot resolve registry shims to Sdb: 0x%x\n", (unsigned int)DriverShims);
KsepLogError(0, "KSE: Cannot resolve registry shims to Sdb: 0x%x\n", (unsigned int)DriverShims);
v14 = (unsigned int)StringsCount;
}
v15 = Strings;
goto LABEL_20;
}
LABEL_4:
KsepPoolFreePaged(v10);
if( DriverShims < 0 )
{
LABEL_5:
KsepPoolFreePaged(v4);
*v6 = 0i64;
*a4 = 0;
}
return(unsigned int)DriverShims;
}Referenced by:
KsepGetShimsForDriver