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