KdpSearchPhysicalPage
UINT64 __stdcall KdpSearchPhysicalPage(
UINT64 PageFrameIndex,
UINT64 RangeStart,
UINT64 RangeEnd,
UINT64 Flags,
UINT64 MmFlags){
UINT64 v5;
unsigned int v6;
char v7;
unsigned int v9;
int v10;
unsigned int v11;
unsigned int v13;
UINT64 v14;
__int64 v15;
int v16;
int v17;
UINT64 Flagsa;
unsigned __int64 Buffer;
__int64 v20[8];
char v24;
v24 = Flags;
v5 = PageFrameIndex << 12;
v6 = 0;
v7 = Flags;
if( KdpSearchPfnValue )
{
Buffer = 0i64;
v9 = 0;
while( 1 )
{
LODWORD(Flagsa) = MmFlags | 2;
if( (int)MmDbgCopyMemory(v5 + v9, &Buffer, 8ui64, 8ui64, Flagsa) >= 0
&& ((Buffer >> 12) & 0xFFFFFFFFFi64) == RangeStart )
{
if( (unsigned int)KdpSearchPageHitIndex < 0x1000 )
{
KdpSearchPageHits[KdpSearchPageHitIndex] = PageFrameIndex;
KdpSearchPageHitOffsets[KdpSearchPageHitIndex++] = v9;
}
if( (v7 & 1) == 0 )
break;
}
v9 += 8;
if( v9 >= 0x1000 )
return v6;
}
}
else
{
v10 = KdpSearchInProgress & 2;
v20[0] = 0i64;
if( (KdpSearchInProgress & 0x3C) != 0 )
{
v11 = ((unsigned int)KdpSearchInProgress >> 2) & 0xF;
if( v11 > 8 )
return 0i64;
}
else
{
v11 = 8;
}
v13 = 0;
while( 1 )
{
LODWORD(Flagsa) = MmFlags | 2;
if( (int)MmDbgCopyMemory(v5 + v13, v20, v11, 0i64, Flagsa) >= 0 )
{
if( v20[0] >= RangeStart && v20[0] <= RangeEnd )
goto LABEL_26;
if( !v10 )
{
v14 = RangeStart ^ v20[0];
v15 = 64i64;
v16 = 0;
do
{
v17 = v16 + 1;
if( (v14 & 1) == 0 )
v17 = v16;
v14 >>= 1;
v16 = v17;
--v15;
}
while( v15 );
if( v17 == 1 )
{
LABEL_26:
if( (unsigned int)KdpSearchPageHitIndex < 0x1000 )
{
KdpSearchPageHits[KdpSearchPageHitIndex] = PageFrameIndex;
KdpSearchPageHitOffsets[KdpSearchPageHitIndex++] = v13;
}
if( (v24 & 1) == 0 )
break;
}
}
}
v13 += v11;
if( v13 >= 0x1000 )
return v6;
}
}
return 1;
}Referenced by:
KdpSearchPhysicalPageRange