KsepDbGetShimInfo
NTSTATUS __stdcall KsepDbGetShimInfo(_KSE_SHIM_INFO *Shims, UINT64 ShimCount){
_KSE_SHIM_INFO *v2;
__m128i *v3;
__int64 v4;
NTSTATUS v5;
VOID **v6;
int SdbString;
__int64 v8;
__m128i *Paged;
VOID *v10;
__m128i *v11;
__int64 v12;
WCHAR *v13;
_DB *v14;
unsigned int FirstStringIndexedTag;
_DB *v16;
VOID *v17;
int v18;
_DB *v19;
unsigned int FirstTag;
_GUID *v21;
__m128i v22;
unsigned __int64 v23;
UINT64 v24;
unsigned int v25;
unsigned int v26;
_DWORD *v27;
signed __int64 v28;
__int128 v29;
UINT64 ptiWhich;
PVOID DbHandleOut[2];
_DB *ppdb;
VOID *hSDB;
__int64 v35;
_KSE_SHIM_INFO *v36;
_FIND_INFO pFindInfo[4];
__int128 v38;
__int64 v39;
_GUID result;
__int128 v41;
v36 = Shims;
v2 = Shims;
LODWORD(ptiWhich) = 0;
ppdb = 0i64;
v41 = 0i64;
v3 = 0i64;
DbHandleOut[0] = 0i64;
v4 = (unsigned int)ShimCount;
v5 = KseShimDatabaseOpen(DbHandleOut);
v6 = (VOID **)DbHandleOut[0];
SdbString = v5;
if( v5 >= 0 )
{
v8 = (unsigned int)v4;
Paged = (__m128i *)KsepPoolAllocatePaged(80 * v4);
HIDWORD(ptiWhich) = 0;
v3 = Paged;
v10 = *v6;
SdbString = -1073741275;
hSDB = *v6;
if( (_DWORD)v4 )
{
v11 = Paged + 4;
v12 = (char *)v2 - (char *)Paged;
v35 = (char *)v2 - (char *)v3;
while( 1 )
{
v13 = *(WCHAR **)((char *)&v11[-2] + v12 - 8);
v14 = (_DB *)*((_QWORD *)v10 + 1);
LODWORD(DbHandleOut[0]) = 0;
v39 = 0i64;
*(_OWORD *)pFindInfo = 0i64;
v38 = 0i64;
FirstStringIndexedTag = SdbFindFirstStringIndexedTag(v14, 0x7025u, 0x6001u, v13, pFindInfo);
v16 = v14;
v17 = hSDB;
v18 = -SdbTagIDToTagRef(hSDB, v16, FirstStringIndexedTag, (UINT64 *)DbHandleOut);
if( (v18 != 0 ? LODWORD(DbHandleOut[0]) : 0) == 0 )
break;
if( SdbTagRefToTagID(v17, v18 != 0 ? (__int64)DbHandleOut[0] : 0, &ppdb, &ptiWhich) )
{
v19 = ppdb;
FirstTag = SdbFindFirstTag(ppdb, (unsigned int)ptiWhich, 0x9010u);
if( !FirstTag )
break;
*(_OWORD *)DbHandleOut = 0i64;
v21 = SdbReadGUIDTag(&result, v19, FirstTag, (_GUID *)DbHandleOut);
v22 = *(__m128i *)v21;
v23 = *(_QWORD *)&v21->Data1 - v41;
if( !v23 )
v23 = _mm_srli_si128(v22, 8).m128i_u64[0] - *((_QWORD *)&v41 + 1);
if( !v23 )
break;
v24 = (unsigned int)ptiWhich;
v11[-4] = v22;
v25 = SdbFindFirstTag(v19, v24, 0x6003u);
if( !v25 )
break;
SdbString = KsepDbGetSdbString(v19, v25, (_UNICODE_STRING *)&v3[5 * HIDWORD(ptiWhich) + 2]);
if( SdbString < 0 )
break;
v26 = SdbFindFirstTag(v19, (unsigned int)ptiWhich, 0x4017u);
if( !v26 )
break;
v11->m128i_i32[0] = SdbReadDWORDTag(v19, v26, 0);
}
v11 += 5;
v10 = hSDB;
++HIDWORD(ptiWhich);
v12 = v35;
if( HIDWORD(ptiWhich) >= (unsigned int)v4 )
{
v2 = v36;
goto LABEL_16;
}
}
}
else
{
LABEL_16:
SdbString = 0;
if( (_DWORD)v4 )
{
v27 = v2 + 16;
v28 = (char *)v3 - (char *)v2;
do
{
*v27 = *(_DWORD *)((char *)v27 + v28);
v29 = *(_OWORD *)((char *)v27 + v28 - 32);
v27 += 20;
*((_OWORD *)v27 - 7) = v29;
*((_OWORD *)v27 - 9) = *(_OWORD *)((char *)v27 + v28 - 144);
--v8;
}
while( v8 );
}
}
}
if( v6 )
KseShimDatabaseClose(v6);
if( SdbString >= 0 )
KsepPoolFreePaged(v3);
else
KsepDbFreeDriverShims(v3->m128i_i32, (unsigned int)v4);
return SdbString;
}Referenced by:
KsepEngineGetShimsFromRegistry