KsepDbGetShimInfo
INT64 __fastcall KsepDbGetShimInfo(INT64 a1, UINT64 a2){
INT64 v2;
UNICODE_STRING *v3;
__int64 v4;
NTSTATUS v5;
__int64 *v6;
NTSTATUS SdbString;
__int64 v8;
_DWORD *v9;
__int64 v10;
__m128i *v11;
__int64 v12;
WCHAR *v13;
RTL_RUN_ONCE *v14;
unsigned int FirstStringIndexedTag;
__int64 v16;
__int64 v17;
int v18;
unsigned int v19;
RTL_RUN_ONCE *v20;
unsigned int FirstTag;
__m128i *v22;
__m128i v23;
unsigned __int64 v24;
UINT64 v25;
unsigned int v26;
unsigned int v27;
_DWORD *v28;
char *v29;
__int128 v30;
unsigned int v32;
unsigned int v33;
PVOID DbHandleOut[2];
INT64 v35;
__int64 v36;
__int64 v37;
INT64 v38;
INT64 a5[2];
__int128 v40;
__int64 v41;
__int128 v42;
__int128 v43;
v38 = a1;
v2 = a1;
v32 = 0;
v35 = 0i64;
v43 = 0i64;
v3 = 0i64;
DbHandleOut[0] = 0i64;
v4 = (unsigned int)a2;
v5 = KseShimDatabaseOpen(DbHandleOut);
v6 = (__int64 *)DbHandleOut[0];
SdbString = v5;
if( v5 >= 0 )
{
v8 = (unsigned int)v4;
KsepPoolAllocatePaged(80 * v4);
v33 = 0;
v3 = (UNICODE_STRING *)v9;
v10 = *v6;
SdbString = -1073741275;
v36 = *v6;
if( (_DWORD)v4 )
{
v11 = (__m128i *)(v9 + 16);
v12 = v2 - (_QWORD)v9;
v37 = v2 - (_QWORD)v3;
while( 1 )
{
v13 = *(WCHAR **)((char *)&v11[-2] + v12 - 8);
v14 = *(RTL_RUN_ONCE **)(v10 + 8);
LODWORD(DbHandleOut[0]) = 0;
v41 = 0i64;
*(_OWORD *)a5 = 0i64;
v40 = 0i64;
FirstStringIndexedTag = SdbFindFirstStringIndexedTag(v14, 28709, 24577, v13, (INT64)a5);
v16 = (__int64)v14;
v17 = v36;
v18 = SdbTagIDToTagRef(v36, v16, FirstStringIndexedTag, (unsigned int *)DbHandleOut);
v19 = v18 != 0 ? LODWORD(DbHandleOut[0]) : 0;
if( !v19 )
break;
if( (unsigned int)SdbTagRefToTagID(v17, v19, (PVOID **)&v35, (int *)&v32) )
{
v20 = (RTL_RUN_ONCE *)v35;
FirstTag = SdbFindFirstTag(v35, v32, 36880);
if( !FirstTag )
break;
*(_OWORD *)DbHandleOut = 0i64;
v22 = (__m128i *)SdbReadGUIDTag(&v42, (INT64)v20, FirstTag, DbHandleOut);
v23 = *v22;
v24 = v22->m128i_i64[0] - v43;
if( !v24 )
v24 = _mm_srli_si128(v23, 8).m128i_u64[0] - *((_QWORD *)&v43 + 1);
if( !v24 )
break;
v25 = v32;
v11[-4] = v23;
v26 = SdbFindFirstTag((INT64)v20, v25, 24579);
if( !v26 )
break;
SdbString = KsepDbGetSdbString(v20, v26, &v3[5 * v33 + 2]);
if( SdbString < 0 )
break;
v27 = SdbFindFirstTag((INT64)v20, v32, 16407);
if( !v27 )
break;
v11->m128i_i32[0] = SdbReadDWORDTag((INT64)v20, v27, 0i64);
}
v11 += 5;
v10 = v36;
++v33;
v12 = v37;
if( v33 >= (unsigned int)v4 )
{
v2 = v38;
goto LABEL_16;
}
}
}
else
{
LABEL_16:
SdbString = 0;
if( (_DWORD)v4 )
{
v28 = (_DWORD *)(v2 + 64);
v29 = (char *)v3 - v2;
do
{
*v28 = *(_DWORD *)((char *)v28 + (_QWORD)v29);
v30 = *(_OWORD *)((char *)v28 + (_QWORD)v29 - 32);
v28 += 20;
*((_OWORD *)v28 - 7) = v30;
*((_OWORD *)v28 - 9) = *(_OWORD *)((char *)v28 + (_QWORD)v29 - 144);
--v8;
}
while( v8 );
}
}
}
if( v6 )
KseShimDatabaseClose(v6);
if( SdbString >= 0 )
KsepPoolFreePaged(v3);
else
KsepDbFreeDriverShims((CHAR *)v3, (unsigned int)v4);
return(unsigned int)SdbString;
}Referenced by:
KsepEngineGetShimsFromRegistry