MiResolveImageImports
INT64 __fastcall MiResolveImageImports(
_KLDR_DATA_TABLE_ENTRY *DataTableEntry,
INT64 a2,
_UNICODE_STRING *a3,
_UNICODE_STRING *a4,
_BYTE *a5){
char *v5;
unsigned int v9;
VOID *v10;
unsigned int *v11;
VOID *v12;
unsigned int v13;
int v14;
_UNICODE_STRING *v15;
int v16;
unsigned int *v18;
__int64 v19;
char *v20;
char *v21;
int v22;
int i;
int v24;
unsigned int *j;
__int64 v26;
char *v27;
int v28;
int v29;
int Size[18];
UINT64 NumberOfBytes;
_UNICODE_STRING *NamePrefix;
NamePrefix = (_UNICODE_STRING *)a2;
v5 = (char *)*((_QWORD *)DataTableEntry + 6);
LODWORD(NumberOfBytes) = 0;
Size[0] = 0;
v9 = 0;
LODWORD(v10) = RtlImageDirectoryEntryToData(v5, 1u, 0xCu, &NumberOfBytes);
v11 = 0i64;
v12 = v10;
if( !v10 || (v13 = NumberOfBytes) == 0 )
{
v12 = 0i64;
v13 = 0;
LODWORD(v18) = RtlImageDirectoryEntryToData(v5, 1u, 1u, (UINT64 *)Size);
v11 = v18;
if( !v18 )
return 0i64;
do
{
v19 = *v11;
if( !(_DWORD)v19 )
break;
v20 = &v5[v19];
v21 = &v5[v11[4]];
v22 = 0;
for( i = 0; *(_QWORD *)v20; i = v22 )
{
++v22;
v20 += 8;
}
v13 = 8 * i;
LODWORD(NumberOfBytes) = v13;
MiSetImageProtection(DataTableEntry, v21, v13, 4ui64);
if( !v24 )
{
MiLogStrongCodeDriverLoadFailure("UnwritableImportDirectory", (__int64)DataTableEntry);
dword_140C4C958 = 193;
return 3221225595i64;
}
++v9;
v11 += 5;
}
while( v11 );
if( !v9 )
return 0i64;
goto LABEL_5;
}
MiSetImageProtection(DataTableEntry, v10, (unsigned int)NumberOfBytes, 4ui64);
if( v14 )
{
v9 = 1;
LABEL_5:
v15 = NamePrefix;
*((_DWORD *)DataTableEntry + 26) |= 0x1000u;
v16 = MiResolveImageReferences(DataTableEntry, a4, a3, v15, *(_LOAD_IMPORTS ***)Size);
if( *((_QWORD *)MiSectionControlArea(*((_SECTION **)DataTableEntry + 14)) + 18) )
{
if( v12 )
{
MiSetImageProtection(DataTableEntry, v12, v13, 0x100ui64);
}
else
{
for( j = &v11[-5 * v9]; j; j += 5 )
{
v26 = *j;
if( !(_DWORD)v26 )
break;
v27 = &v5[v26];
v28 = 0;
v29 = 0;
while( *(_QWORD *)v27 )
{
++v28;
v27 += 8;
v29 = v28;
}
MiSetImageProtection(DataTableEntry, &v5[j[4]], (unsigned int)(8 * v29), 0x100ui64);
}
}
}
*((_DWORD *)DataTableEntry + 26) &= ~0x1000u;
if( v16 < 0 )
*a5 = 1;
return(unsigned int)v16;
}
MiLogStrongCodeDriverLoadFailure("UnwritableIAT", (__int64)DataTableEntry);
dword_140C4C958 = 192;
return 3221225595i64;
}Referenced by:
MmLoadSystemImageEx