PnprMmAddRange
INT64 __stdcall PnprMmAddRange(LIST_ENTRY *MemoryMapList, LARGE_INTEGER PhysicalAddress, LARGE_INTEGER a3){
unsigned __int64 v3;
unsigned int v4;
unsigned __int64 v5;
__int64 v7;
RTL_BITMAP *PoolWithTag;
_LIST_ENTRY *v9;
_LIST_ENTRY *i;
_LIST_ENTRY *Flink;
UINT64 v12;
int v13;
int v14;
v3 = (unsigned __int64)PhysicalAddress.QuadPart >> 12;
v4 = 0;
v5 = (unsigned __int64)a3.QuadPart >> 12;
if( (unsigned __int64)a3.QuadPart >> 12 )
{
while( 1 )
{
v7 = v5;
if( v5 > 0x80000000 )
v7 = 0x80000000i64;
PoolWithTag = (RTL_BITMAP *)ExAllocatePoolWithTag(
NonPagedPoolNx,
((((_DWORD)v7 + 32) & 0xFFFFFFE0) >> 3) + 48,
0x52706E50ui64);
v9 = (_LIST_ENTRY *)PoolWithTag;
if( !PoolWithTag )
break;
*(_QWORD *)&PoolWithTag[1].SizeOfBitMap = v3;
PoolWithTag[1].Buffer = (unsigned int *)v7;
PoolWithTag[2].Buffer = &PoolWithTag[3].SizeOfBitMap;
PoolWithTag[2].SizeOfBitMap = (v7 + 32) & 0xFFFFFFE0;
RtlSetAllBits(PoolWithTag + 2);
for( i = MemoryMapList->Blink; i != MemoryMapList; i = i->Blink )
{
if( i[1].Flink < v9[1].Flink )
break;
}
Flink = i->Flink;
if( i->Flink->Blink != i )
__fastfail(3u);
v9->Flink = Flink;
v3 += v7;
v9->Blink = i;
Flink->Blink = v9;
i->Flink = v9;
v5 -= v7;
if( !v5 )
return v4;
}
v12 = PnprContext;
v4 = -1073741670;
v13 = *(_DWORD *)(PnprContext + 20984);
if( !v13 )
v13 = 4366;
*(_DWORD *)(PnprContext + 20984) = v13;
v14 = *(_DWORD *)(v12 + 20988);
if( !v14 )
v14 = 10;
*(_DWORD *)(v12 + 20988) = v14;
}
return v4;
}Referenced by:
PnprMmConstruct