MiSnapDriverRange
NTSTATUS __stdcall MiSnapDriverRange(
_KLDR_DATA_TABLE_ENTRY *DataTableEntry,
UINT64 SectionIndex,
UINT64 Flags,
_MMPTE **StartPte,
_MMPTE **EndPte){
NTSTATUS v5;
unsigned int v6;
char v8;
_BYTE *DllBase;
__int64 v10;
__int64 v11;
char *v12;
unsigned __int64 v13;
unsigned int v14;
unsigned __int64 v15;
__int64 v16;
_MMPTE *PteAddress;
_MMPTE *v18;
_IMAGE_SECTION_HEADER *v19;
union {unsigned int PhysicalAddress;unsigned int VirtualSize;} v20;
__int64 v21;
unsigned int v22;
NTSTATUS v23;
bool v24;
__int64 v25;
_MMPTE *v26;
unsigned __int64 v27;
__int16 v28;
PVOID v29;
int v30;
union {unsigned int PhysicalAddress;unsigned int VirtualSize;} v31;
_MMPTE *v32;
unsigned __int64 VirtualAddress;
union {unsigned int PhysicalAddress;unsigned int VirtualSize;} v35;
unsigned int v36;
char *v37;
_BYTE *v39;
__int64 v41;
__int64 v42;
__int64 v43;
int v44;
__int128 v45;
__int64 v46;
int v47;
_MMPTE **v48;
v5 = 0;
v6 = SectionIndex;
v43 = 0i64;
*EndPte = 0i64;
v8 = Flags;
v45 = 0i64;
*v48 = 0i64;
DllBase = DataTableEntry->DllBase;
v46 = 0i64;
v39 = DllBase;
LODWORD(v10) = RtlImageNtHeader((UINT64)DllBase);
v11 = v10;
v41 = v10;
v12 = (char *)((char *)StartPte - DllBase);
v13 = *(unsigned int *)(v10 + 56);
v14 = *(unsigned __int16 *)(v10 + 6);
v15 = (unsigned int)v13;
v37 = (char *)((char *)StartPte - DllBase);
if( v13 > 0x1000 )
v15 = 4096i64;
v36 = *(unsigned __int16 *)(v10 + 6);
if( v6 > v14 )
return 0;
v16 = *(unsigned __int16 *)(v10 + 20);
v42 = v16;
PteAddress = 0i64;
v47 = 0x40000000;
v18 = 0i64;
DWORD1(v45) = v16 + 40 * v14 + v10 + 24 - (_DWORD)DllBase;
v44 = DWORD1(v45);
while( 1 )
{
if( v6 )
v19 = (_IMAGE_SECTION_HEADER *)(v16 + 40i64 * (v6 - 1) + v11 + 24);
else
v19 = (_IMAGE_SECTION_HEADER *)&v43;
v20.PhysicalAddress = v19->SizeOfRawData;
if( v20.PhysicalAddress < v19->Misc.PhysicalAddress )
v20.PhysicalAddress = (unsigned int)v19->Misc;
v35.PhysicalAddress = v20.PhysicalAddress;
if( !StartPte )
break;
VirtualAddress = v19->VirtualAddress;
if( (unsigned __int64)v12 < VirtualAddress
|| (unsigned __int64)v12 >= (unsigned int)(v20.PhysicalAddress + VirtualAddress) )
{
goto LABEL_18;
}
if( (v8 & 0x40) != 0 && (v19->Characteristics & 0x2000000) != 0 )
return 0;
LABEL_24:
v25 = v19->VirtualAddress;
if( !PteAddress )
PteAddress = MiGetPteAddress((VOID *)((unsigned __int64)&DllBase[v25 + 4095] & 0xFFFFFFFFFFFFF000ui64));
v26 = MiGetPteAddress((VOID *)(-(__int64)v15 & (unsigned __int64)&DllBase[v15 - 1 + v20.PhysicalAddress + v25]));
v18 = v26;
if( (v28 & 0xFFF) == 0 || (v8 & 0xC) == 0 || v15 >= 0x1000 )
v18 = v26 - 1;
if( v27 > 0x1000 )
goto LABEL_18;
LABEL_19:
if( ++v6 > v14 )
{
if( PteAddress )
{
v31.PhysicalAddress = v19->SizeOfRawData;
if( v31.PhysicalAddress < v19->Misc.PhysicalAddress )
v31.PhysicalAddress = (unsigned int)v19->Misc;
v32 = MiGetPteAddress((VOID *)(((-(__int64)v15 & (unsigned __int64)&DllBase[v15
- 1
+ v31.PhysicalAddress
+ v19->VirtualAddress])
+ 4095) & 0xFFFFFFFFFFFFF000ui64))
- 1;
if( PteAddress <= v32 )
{
*EndPte = PteAddress;
*v48 = v32;
}
}
return 0;
}
v11 = v41;
v16 = v42;
}
if( (v8 & 8) != 0 )
{
v21 = (v19->Characteristics & 0xE0000000) != 0;
goto LABEL_23;
}
if( (v8 & 1) != 0 )
{
LODWORD(v21) = MmImageSectionPagable(v19);
goto LABEL_22;
}
if( (v8 & 4) != 0 )
{
v22 = v19->Characteristics & 0xE0000000;
v23 = MmImageSectionPagable(v19);
v24 = v22 != 0;
DllBase = v39;
LODWORD(v21) = v24 && v23 == 0;
LABEL_22:
v14 = v36;
v20.PhysicalAddress = v35.PhysicalAddress;
v12 = v37;
goto LABEL_23;
}
if( (v8 & 0x10) != 0 )
{
LODWORD(v21) = v19->Characteristics & 0x20000000;
goto LABEL_23;
}
if( (v8 & 0x20) != 0 )
{
if( v19->Name[0] != 80
|| v19->Name[1] != 65
|| v19->Name[2] != 71
|| v19->Name[3] != 69
|| v19->Name[4] != 75
|| v19->Name[5] != 68 )
{
goto LABEL_18;
}
goto LABEL_24;
}
if( !*(_DWORD *)v19->Name && v19 != (_IMAGE_SECTION_HEADER *)&v43 )
return 0;
LODWORD(v21) = v19->Characteristics & 0x2000000;
if( (DataTableEntry->Flags & 0x4000000) != 0 && *(_DWORD *)v19->Name == 1414090313 )
LODWORD(v21) = 0;
if( (_DWORD)v21 )
{
v29 = DataTableEntry->DllBase;
if( v29 == (PVOID)PsNtosImageBase || v29 == PsHalImageBase )
{
LOBYTE(v30) = MiIsKernelHalPadSection((INT64)v19);
if( v30 )
LODWORD(v21) = 0;
}
LABEL_23:
if( !(_DWORD)v21 )
goto LABEL_18;
goto LABEL_24;
}
LABEL_18:
if( !PteAddress )
goto LABEL_19;
if( PteAddress > v18 )
{
PteAddress = 0i64;
goto LABEL_19;
}
*EndPte = PteAddress;
*v48 = v18;
if( v6 + 1 <= v14 )
return v6 + 1;
return v5;
}Referenced by:
MiBackSingleImageWithPagefile
MiCheckForDiscardableLongJumpTable
MiDisablePagingOfDriver
MiEnablePagingOfDriver
MiFreeDriverInitialization
MiHandleDriverNonPagedSections
MiMarkKernelImageCfgBits
MmDiscardDriverSection