IoSetDumpRange
__int64 __fastcall IoSetDumpRange(__int64 a1, char *a2, unsigned __int64 a3, unsigned int a4){
unsigned int v5;
unsigned __int64 v6;
char *v7;
unsigned __int64 v9;
unsigned int v10;
unsigned int v11;
unsigned int v12;
UINT8 *v13;
unsigned __int64 v14;
unsigned int v15;
_QWORD *v16;
unsigned __int64 v17;
char v18;
PHYSICAL_ADDRESS PhysicalAddress;
int v20;
UINT64 v22;
v5 = a4 & 0xF;
v6 = a3;
v7 = a2;
if( v5 == 1 )
{
v9 = (unsigned __int64)MmGetPhysicalAddress(a2).QuadPart >> 12;
LODWORD(v22) = 0;
v10 = IopAddPageToPageMap(
*(_QWORD *)(a1 + 24),
*(_QWORD *)(a1 + 16),
*(UINT64 **)(a1 + 32),
v9,
v6,
*(_BYTE *)(a1 + 40) & 1,
v22);
LABEL_20:
v11 = v10;
}
else
{
if( v5 == 2 )
{
v11 = -1073741503;
v12 = 0;
if( *(_DWORD *)MmPhysicalMemoryBlock )
{
v13 = MmPhysicalMemoryBlock + 24;
do
{
v14 = *((_QWORD *)v13 - 1);
if( v14 > (unsigned __int64)v7 )
break;
if( *(_QWORD *)v13 + v14 > (unsigned __int64)v7 )
{
if( v6 > *(_QWORD *)&MmPhysicalMemoryBlock[16 * v12 + 16]
+ *(_QWORD *)&MmPhysicalMemoryBlock[16 * v12 + 24]
- (_QWORD)v7 )
break;
LABEL_19:
LODWORD(v22) = a4;
v10 = IopAddPageToPageMap(
*(_QWORD *)(a1 + 24),
*(_QWORD *)(a1 + 16),
*(UINT64 **)(a1 + 32),
(UINT64)v7,
v6,
*(_BYTE *)(a1 + 40) & 1,
v22);
goto LABEL_20;
}
++v12;
v13 += 16;
}
while( v12 < *(_DWORD *)MmPhysicalMemoryBlock );
}
if( SpecialMemoryRanges )
{
v15 = 0;
if( *(_DWORD *)SpecialMemoryRanges )
{
v16 = (_QWORD *)(SpecialMemoryRanges + 24);
while( 1 )
{
v17 = *(v16 - 1);
if( v17 > (unsigned __int64)v7 )
break;
if( *v16 + v17 > (unsigned __int64)v7 )
{
if( v6 > *(_QWORD *)(SpecialMemoryRanges + 16i64 * v15 + 16)
+ *(_QWORD *)(SpecialMemoryRanges + 16i64 * v15 + 24)
- (_QWORD)v7 )
goto LABEL_30;
goto LABEL_19;
}
++v15;
v16 += 2;
if( v15 >= *(_DWORD *)SpecialMemoryRanges )
goto LABEL_30;
}
}
}
goto LABEL_30;
}
v18 = 1;
if( !a3 )
return 0;
do
{
if( MmIsAddressValidEx((INT64)v7) )
{
PhysicalAddress = MmGetPhysicalAddress(v7);
LODWORD(v22) = 0;
v20 = IopAddPageToPageMap(
*(_QWORD *)(a1 + 24),
*(_QWORD *)(a1 + 16),
*(UINT64 **)(a1 + 32),
(unsigned __int64)PhysicalAddress.QuadPart >> 12,
1ui64,
*(_BYTE *)(a1 + 40) & 1,
v22);
if( v20 == -1073741789 )
return 3221225507i64;
if( v20 < 0 )
v18 = 0;
}
v7 += 4096;
--v6;
}
while( v6 );
if( v18 == 1 )
return 0;
v11 = -1073741503;
}
if( v11 == -1073741503 )
{
LABEL_30:
if( (*(_BYTE *)(a1 + 40) & 1) != 0 )
return 0;
}
return v11;
}Referenced by:
IoSetDumpRangeForPartialKernelDump
IopAddPageDumpRange