PnprMirrorMarkedPages

INT64 __fastcall PnprMirrorMarkedPages(INT64 a1, INT64 a2, UINT8 *a3){
  __int64 v3; 
  unsigned int v4; 
  bool v5; 
  UINT64 v6; 
  UINT64 v7; 
  RTL_BITMAP *v8; 
  unsigned int i; 
  int v10; 
  UINT8 v11; 
  UINT64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  int v16; 
  int v17; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 StartingIndex; 
  __int64(__fastcall *v21)(_QWORD, _QWORD, unsigned __int64); 
  LODWORD(StartingIndex) = 0;
  v4 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  LODWORD(v3) = *((_DWORD *)KeGetPcr() + 105);
  if( *(_QWORD *)(*(_QWORD *)(PnprContext + 136) + 24 * v3) )
  {
    v5 = (_DWORD)v3 == *(_DWORD *)(PnprContext + 180);
    v21 = *(__int64(__fastcall **)(_QWORD, _QWORD, unsigned __int64))(PnprContext + 20928);
    do
    {
      v6 = PnprContext;
      v7 = PnprContext + 152;
      v8 = *(RTL_BITMAP **)(PnprContext + 152);
      while( 2 )
      {
        if( v8 != (RTL_BITMAP *)v7 )
        {
          KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)(v6 + 168), &LockHandle, (UINT8)a3);
          for( i = RtlFindFirstRunClear(v8 + 2, &StartingIndex);
                ;
                i = RtlFindNextForwardRunClear(v8 + 2, v13, &StartingIndex) )
          {
            v14 = StartingIndex;
            v15 = i;
            if( i )
            {
              if( i >= 0x140 )
                v15 = 320;
              RtlSetBits(v8 + 2, (unsigned int)StartingIndex, v15);
            }
            KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
            if( !v15 )
              break;
            v10 = v21(
                    *(_QWORD *)(PnprContext + 20880),
                    (*(_QWORD *)&v8[1].SizeOfBitMap + v14) << 12,
                    (unsigned __int64)v15 << 12);
            v12 = PnprContext;
            v4 = v10;
            if( v10 < 0 )
            {
              v16 = *(_DWORD *)(PnprContext + 20984);
              if( !v16 )
                v16 = 3568;
              *(_DWORD *)(PnprContext + 20984) = v16;
              v17 = *(_DWORD *)(v12 + 20988);
              if( !v17 )
                v17 = 8;
              *(_DWORD *)(v12 + 20988) = v17;
              goto LABEL_24;
            }
            v13 = v15 + v14;
            LODWORD(StartingIndex) = v13;
            KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)(PnprContext + 168), &LockHandle, v11);
          }
          if( *(_DWORD *)(PnprContext + 200) != 3 )
          {
            v6 = PnprContext;
            v8 = *(RTL_BITMAP **)&v8->SizeOfBitMap;
            v7 = PnprContext + 152;
            continue;
          }
          v5 = 1;
        }
        break;
      }
    }
    while( !v5 );
  }
LABEL_24:
  if( (_DWORD)v3 != *(_DWORD *)(PnprContext + 180) && *(int *)(PnprContext + 200) < 3 )
  {
    do
      _mm_pause();
    while( *(int *)(PnprContext + 200) < 3 );
  }
  return v4;
}

Referenced by:

PnprQuiesceProcessorDpc
PnprSwap