MiBuildImportsForBootDrivers
NTSTATUS __stdcall MiBuildImportsForBootDrivers(){
INT64 v0;
int v1;
unsigned int v2;
INT64 v3;
INT64 v4;
PVOID v5;
__int16 v6;
char *Pool;
INT64 i;
unsigned __int64 *v9;
unsigned __int64 v10;
unsigned int v11;
unsigned __int64 v12;
unsigned int j;
unsigned int v14;
__int64 v15;
__int64 *v16;
__int64 v17;
__int64 v18;
_QWORD *v19;
unsigned int v20;
char *v21;
__int64 v22;
__int64 v23;
INT64 v24;
unsigned int v25;
unsigned __int64 v26;
unsigned __int64 v27;
INT64 k;
void *v30;
UINT64 Size;
INT64 *v32;
v0 = PsLoadedModuleList;
v1 = 0;
v32 = &PsLoadedModuleList;
LODWORD(Size) = 0;
v2 = 0;
v3 = 0i64;
v4 = 0i64;
if( (INT64 *)PsLoadedModuleList == &PsLoadedModuleList )
return -1073741275;
do
{
v5 = *(PVOID *)(v0 + 48);
if( (PVOID)PsNtosImageBase == v5 )
{
v3 = v0;
}
else if( PsHalImageBase == v5 )
{
v4 = v0;
}
v6 = (*(_DWORD *)(v0 + 104) & 0x4000000) == 0 || v0 == v4 || v0 == v3;
*(_WORD *)(v0 + 108) = v6;
++v2;
*(_QWORD *)(v0 + 136) = 1i64;
v0 = *(_QWORD *)v0;
}
while( (INT64 *)v0 != &PsLoadedModuleList );
if( !v3 || !v4 )
return -1073741275;
Pool = (char *)MiAllocatePool(256i64, 8i64 * v2, 0x54446D4Dui64);
if( Pool )
{
for( i = PsLoadedModuleList; (INT64 *)i != &PsLoadedModuleList; i = *(_QWORD *)i )
{
v9 = (unsigned __int64 *)RtlImageDirectoryEntryToData(*(VOID **)(i + 48), 1u, 0xCu, &Size);
if( !v9 )
goto LABEL_15;
memset(Pool, 0i64, 8 * v2);
v10 = 0i64;
v11 = (unsigned int)Size >> 3;
v12 = 0i64;
for( j = 0; j < v11; ++v9 )
{
if( !v10 || *v9 < v10 || *v9 >= v12 )
{
v24 = PsLoadedModuleList;
v25 = 0;
if( (INT64 *)PsLoadedModuleList != &PsLoadedModuleList )
{
v26 = *v9;
while( 1 )
{
v10 = *(_QWORD *)(v24 + 48);
v12 = v10 + *(unsigned int *)(v24 + 64);
if( v26 >= v10 && v26 < v12 )
break;
v24 = *(_QWORD *)v24;
++v25;
if( (INT64 *)v24 == v32 )
goto LABEL_40;
}
*(_QWORD *)&Pool[8 * v25] = v24;
}
LABEL_40:
v27 = *v9;
if( *v9 < v10 || v27 >= v12 )
{
if( v27 )
goto LABEL_59;
v10 = 0i64;
}
}
++j;
}
LODWORD(Size) = 0;
v14 = 0;
v15 = 0i64;
if( !v2 )
goto LABEL_15;
v16 = (__int64 *)Pool;
v17 = v2;
do
{
v18 = *v16;
if( *v16 && v18 != v3 && v18 != i && v18 != v4 )
{
v15 = *v16;
++v14;
}
++v16;
--v17;
}
while( v17 );
LODWORD(Size) = v14;
if( v14 )
{
if( v14 == 1 )
{
*(_QWORD *)(i + 136) = v15 | 1;
++*(_WORD *)(v15 + 108);
}
else
{
if( v14 > 0x1FFFFFFE || (v19 = MiAllocatePool(256i64, 8 * v14 + 8, 0x54446D4Dui64)) == 0i64 )
{
LABEL_59:
v1 = 1;
break;
}
v20 = 0;
*v19 = v14;
v21 = Pool;
v22 = v2;
do
{
v23 = *(_QWORD *)v21;
if( *(_QWORD *)v21 && v23 != v3 && v23 != i && v23 != v4 )
{
v19[v20 + 1] = v23;
++*(_WORD *)(*(_QWORD *)v21 + 108i64);
++v20;
}
v21 += 8;
--v22;
}
while( v22 );
*(_QWORD *)(i + 136) = v19;
}
}
else
{
LABEL_15:
*(_QWORD *)(i + 136) = -2i64;
}
}
ExFreePoolWithTag(Pool, 0);
*(_QWORD *)(v3 + 136) = 1i64;
*(_QWORD *)(v4 + 136) = 1i64;
if( v1 != 1 )
return 0;
for( k = PsLoadedModuleList; (INT64 *)k != &PsLoadedModuleList; k = *(_QWORD *)k )
{
v30 = *(void **)(k + 136);
if( v30 != (void *)1 && v30 != (void *)-2i64 && ((unsigned __int8)v30 & 1) == 0 )
ExFreePoolWithTag(v30, 0);
*(_QWORD *)(k + 136) = 1i64;
*(_WORD *)(k + 108) = 1;
}
}
return -1073741670;
}Referenced by:
MiInitializeLoadedModuleList