IopLiveDumpMirrorPhysicalMemoryCallback

NTSTATUS __stdcall IopLiveDumpMirrorPhysicalMemoryCallback(_LARGE_INTEGER PhysicalAddress, _LARGE_INTEGER a2){
  LARGE_INTEGER PerformanceCounter; 
  GUID *v3; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  UINT64 NextForwardRunClear; 
  UINT64 v11; 
  UINT64 v12; 
  INT64 Data4; 
  int v14; 
  LONGLONG v15; 
  INT64 v17[2]; 
  _MMPFN_IDENTITY Identity; 
  UINT64 v19; 
  UINT64 v20; 
  v19 = 0i64;
  PerformanceCounter.QuadPart = 0i64;
  v3 = IopLiveDumpContext;
  if( (IopLiveDumpContext[5].Data1 & 0x80u) != 0 )
    PerformanceCounter = KeQueryPerformanceCounter(0i64);
  v6 = *(_QWORD *)&v3[36].Data1;
  v7 = (unsigned __int64)PhysicalAddress.QuadPart >> 12;
  v8 = (a2.QuadPart >> 12) + ((a2.LowPart & 0xFFF) != 0i64);
  v9 = v8 + v7 - 1;
  if( v7 < v6 )
  {
    if( v9 >= v6 )
    {
      v9 = v6 - 1;
      v8 = v6 - v7;
    }
    if( v8 )
    {
      v17[0] = v9 + 1;
      v17[1] = *(_QWORD *)v3[36].Data4;
      while( 1 )
      {
        NextForwardRunClear = RtlFindNextForwardRunClearEx((INT64)v17, v7, &v19);
        v11 = NextForwardRunClear ? v19 - v7 : v8;
        if( v11 )
          break;
LABEL_22:
        if( v8 <= v11 + NextForwardRunClear )
        {
          v8 = 0i64;
        }
        else
        {
          v7 = NextForwardRunClear + v19;
          v8 -= v11 + NextForwardRunClear;
        }
        if( !v8 )
          goto LABEL_26;
      }
      v12 = v7;
      v20 = v11;
      while( 1 )
      {
        if( (*(_DWORD *)v3[2].Data4 & 4) == 0 )
          goto LABEL_14;
        memset(&Identity, 0, sizeof(Identity));
        MmTryIdentifyPage(v12, &Identity);
        if( v14 )
          break;
LABEL_21:
        ++v12;
        if( !--v20 )
          goto LABEL_22;
      }
      if( Identity.u2.FileObject >= (PVOID)0xFFFF800000000000i64 )
      {
LABEL_14:
        Data4 = (INT64)v3[37].Data4;
      }
      else
      {
        if( (*(_DWORD *)v3[2].Data4 & 4) == 0 || (unsigned __int64)Identity.u2.FileObject - 1 > 0x7FFFFFFEFFFEi64 )
          goto LABEL_21;
        Data4 = (INT64)&v3[41];
      }
      RtlSetBitsEx(Data4, v12, 1ui64);
      goto LABEL_21;
    }
  }
LABEL_26:
  if( (v3[5].Data1 & 0x80u) != 0 )
  {
    v15 = *(_QWORD *)&KeQueryPerformanceCounter(0i64) - PerformanceCounter.QuadPart;
    if( (v3[5].Data1 & 1) != 0 )
    {
      *(_QWORD *)v3[29].Data4 += a2.QuadPart;
      *(_QWORD *)v3[28].Data4 += v15;
    }
    else
    {
      *(_QWORD *)v3[32].Data4 += a2.QuadPart;
      *(_QWORD *)v3[31].Data4 += v15;
    }
  }
  return 0;
}

Referenced by:

No references.