MiBackSystemImageWithPagefile
VOID __stdcall MiBackSystemImageWithPagefile(
_KLDR_DATA_TABLE_ENTRY *DataTableEntry,
_MI_IMPORT_LIST_CHAIN *ImportListChain,
INT64 a3,
VOID *a4){
int GpValue_high;
void *DllBase;
_MI_IMPORT_LIST_CHAIN *v7;
INT64 v8;
VOID *v9;
int v10;
unsigned __int64 LoadedImports;
int v12;
unsigned int v13;
__int64 v14;
_KLDR_DATA_TABLE_ENTRY *v15;
unsigned int v16;
__int128 v17;
GpValue_high = HIDWORD(DataTableEntry[1].GpValue);
v17 = 0i64;
if( (GpValue_high & 0xC) == 0 )
{
DllBase = DataTableEntry->DllBase;
if( MiGetSystemRegionType((UINT64)DllBase) != 1 )
{
v10 = GpValue_high;
if( DataTableEntry->SectionPointer && (GpValue_high & 2) == 0 && !MI_IS_PHYSICAL_ADDRESS(DllBase) )
{
MiBackSingleImageWithPagefile(DataTableEntry);
v10 = HIDWORD(DataTableEntry[1].GpValue);
}
LoadedImports = (unsigned __int64)DataTableEntry->LoadedImports;
v12 = 0;
if( LoadedImports != -2i64 && LoadedImports != 1 )
{
if( (LoadedImports & 1) != 0 )
{
*(_QWORD *)&v17 = 1i64;
*((_QWORD *)&v17 + 1) = LoadedImports & 0xFFFFFFFFFFFFFFFEui64;
LoadedImports = (unsigned __int64)&v17;
}
HIDWORD(DataTableEntry[1].GpValue) = v10 | 8;
v13 = 0;
if( *(_QWORD *)LoadedImports )
{
v14 = 0i64;
do
{
v15 = *(_KLDR_DATA_TABLE_ENTRY **)(LoadedImports + 8 * v14 + 8);
if( !v15 )
break;
if( v15->LoadedImports != (void *)1 )
{
MiBackSystemImageWithPagefile(v15, v7, v8, v9);
if( v12 < 0 )
break;
}
v14 = ++v13;
}
while( (unsigned __int64)v13 < *(_QWORD *)LoadedImports );
}
}
v16 = HIDWORD(DataTableEntry[1].GpValue) & 0xFFFFFFF7;
HIDWORD(DataTableEntry[1].GpValue) = v16;
if( v12 >= 0 )
HIDWORD(DataTableEntry[1].GpValue) = v16 | 4;
}
}
}Referenced by:
MiBackSystemImageWithPagefile
MmBackSystemImageWithPagefile