PnprMapPhysicalPages

__int64 __fastcall PnprMapPhysicalPages(__int64 a1, unsigned __int64 a2, unsigned __int64 *a3, _QWORD *a4){
  __int64 v6; 
  int v9; 
  int v10; 
  __int64 result; 
  unsigned __int64 v12; 
  _MDL *v13; 
  _MDL *v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  _QWORD *v17; 
  VOID *v18; 
  __int64 v19; 
  int v20; 
  int v21; 
  int v22; 
  int v23; 

  v6 = PnprContext;
  if( (*(_DWORD *)(PnprContext + 64) & 4) != 0 )
  {
    if( (a2 & 0xFFF) != 0 || (v12 = *a3) == 0 || (v12 & 0xFFF) != 0 )
    {
      v22 = *(_DWORD *)(PnprContext + 20984);
      if( !v22 )
        v22 = 4079;
      *(_DWORD *)(PnprContext + 20984) = v22;
      v23 = *(_DWORD *)(v6 + 20988);
      if( !v23 )
        v23 = 8;
      *(_DWORD *)(v6 + 20988) = v23;
      return 3221225485i64;
    }
    else
    {
      v13 = *(_MDL **)a1;
      if( v12 > 0x10000 )
        v12 = 0x10000i64;
      if( (v13->MdlFlags & 1) != 0 )
      {
        MmUnmapReservedMapping(*(_QWORD *)(a1 + 8), 0x51706E50ui64, (INT64)v13);
        v13 = *(_MDL **)a1;
      }
      v13->Next = 0i64;
      v13->MdlFlags = 0;
      v13->Size = 8 * (((v12 + 4095) >> 12) + 6);
      v13->StartVa = 0i64;
      v13->ByteOffset = 0;
      v13->ByteCount = v12;
      v14 = *(_MDL **)a1;
      v15 = a2 >> 12;
      v16 = v12 >> 12;
      v17 = (_QWORD *)(*(_QWORD *)a1 + 48i64);
      if( v12 >> 12 )
      {
        do
        {
          *v17++ = v15++;
          --v16;
        }
        while( v16 );
        v14 = *(_MDL **)a1;
      }
      v14->MdlFlags |= *(_WORD *)(a1 + 16);
      v18 = MmMapLockedPagesWithReservedMapping(*(VOID **)(a1 + 8), 0x51706E50ui64, *(_MDL **)a1, MmCached);
      if( v18 )
      {
        *a4 = v18;
        result = 0i64;
        *a3 = v12;
      }
      else
      {
        v19 = PnprContext;
        v20 = *(_DWORD *)(PnprContext + 20984);
        if( !v20 )
          v20 = 4134;
        *(_DWORD *)(PnprContext + 20984) = v20;
        v21 = *(_DWORD *)(v19 + 20988);
        if( !v21 )
          v21 = 10;
        *(_DWORD *)(v19 + 20988) = v21;
        return 3221225626i64;
      }
    }
  }
  else
  {
    v9 = *(_DWORD *)(PnprContext + 20984);
    if( !v9 )
      v9 = 4071;
    *(_DWORD *)(PnprContext + 20984) = v9;
    v10 = *(_DWORD *)(v6 + 20988);
    if( !v10 )
      v10 = 8;
    *(_DWORD *)(v6 + 20988) = v10;
    return 3221225498i64;
  }
  return result;
}

Referenced by:

PnprMapTargetSparePhysicalPages