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