PnprMmAddRange

__int64 __fastcall PnprMmAddRange(unsigned int *a1, unsigned __int64 a2, unsigned __int64 a3){
  unsigned __int64 v3; 
  unsigned int v4; 
  unsigned __int64 v5; 
  __int64 v7; 
  VOID **PoolWithTag; 
  VOID **v9; 
  __int64 i; 
  _QWORD *v11; 
  __int64 v12; 
  int v13; 
  int v14; 

  v3 = a2 >> 12;
  v4 = 0;
  v5 = a3 >> 12;
  if( a3 >> 12 )
  {
    while( 1 )
    {
      v7 = v5;
      if( v5 > 0x80000000 )
        v7 = 0x80000000i64;
      PoolWithTag = ExAllocatePoolWithTag(0x200ui64, ((((_DWORD)v7 + 32) & 0xFFFFFFE0) >> 3) + 48, 1383099984i64);
      v9 = PoolWithTag;
      if( !PoolWithTag )
        break;
      PoolWithTag[2] = (VOID *)v3;
      PoolWithTag[3] = (VOID *)v7;
      PoolWithTag[5] = PoolWithTag + 6;
      *((_DWORD *)PoolWithTag + 8) = (v7 + 32) & 0xFFFFFFE0;
      RtlSetAllBits((PRTL_BITMAP)PoolWithTag + 2);
      for( i = *((_QWORD *)a1 + 1); (unsigned int *)i != a1; i = *(_QWORD *)(i + 8) )
      {
        if( *(_QWORD *)(i + 16) < (unsigned __int64)v9[2] )
          break;
      }
      v11 = *(_QWORD **)i;
      if( *(_QWORD *)(*(_QWORD *)i + 8i64) != i )
        __fastfail(3u);
      *v9 = v11;
      v3 += v7;
      v9[1] = (VOID *)i;
      v11[1] = v9;
      *(_QWORD *)i = 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