PnprMirrorMarkedPages

__int64 __fastcall PnprMirrorMarkedPages(){
  __int64 v0; 
  unsigned int v1; 
  bool v2; 
  __int64 v3; 
  __int64 v4; 
  _RTL_BITMAP *v5; 
  unsigned int i; 
  int v7; 
  __int64 v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned int v11; 
  int v12; 
  int v13; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 StartingIndex; 
  __int64(__fastcall *v17)(_QWORD, _QWORD, unsigned __int64); 

  LODWORD(StartingIndex) = 0;
  v1 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  LODWORD(v0) = KeGetPcr()->Prcb.Number;
  if( *(_QWORD *)(*(_QWORD *)(PnprContext + 136) + 24 * v0) )
  {
    v2 = (_DWORD)v0 == *(_DWORD *)(PnprContext + 180);
    v17 = *(__int64(__fastcall **)(_QWORD, _QWORD, unsigned __int64))(PnprContext + 20928);
    do
    {
      v3 = PnprContext;
      v4 = PnprContext + 152;
      v5 = *(_RTL_BITMAP **)(PnprContext + 152);
      while( 2 )
      {
        if( v5 != (_RTL_BITMAP *)v4 )
        {
          KeAcquireInStackQueuedSpinLockAtDpcLevel((PKSPIN_LOCK)(v3 + 168), &LockHandle);
          for( i = RtlFindFirstRunClear(v5 + 2, &StartingIndex);
                ;
                i = RtlFindNextForwardRunClear((INT64)&v5[2], v9, &StartingIndex) )
          {
            v10 = StartingIndex;
            v11 = i;
            if( i )
            {
              if( i >= 0x140 )
                v11 = 320;
              RtlSetBits(v5 + 2, (unsigned int)StartingIndex, v11);
            }
            KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
            if( !v11 )
              break;
            v7 = v17(
                   *(_QWORD *)(PnprContext + 20880),
                   (*(_QWORD *)&v5[1].SizeOfBitMap + v10) << 12,
                   (unsigned __int64)v11 << 12);
            v8 = PnprContext;
            v1 = v7;
            if( v7 < 0 )
            {
              v12 = *(_DWORD *)(PnprContext + 20984);
              if( !v12 )
                v12 = 3568;
              *(_DWORD *)(PnprContext + 20984) = v12;
              v13 = *(_DWORD *)(v8 + 20988);
              if( !v13 )
                v13 = 8;
              *(_DWORD *)(v8 + 20988) = v13;
              goto LABEL_24;
            }
            v9 = v11 + v10;
            LODWORD(StartingIndex) = v9;
            KeAcquireInStackQueuedSpinLockAtDpcLevel((PKSPIN_LOCK)(PnprContext + 168), &LockHandle);
          }
          if( *(_DWORD *)(PnprContext + 200) != 3 )
          {
            v3 = PnprContext;
            v5 = *(_RTL_BITMAP **)&v5->SizeOfBitMap;
            v4 = PnprContext + 152;
            continue;
          }
          v2 = 1;
        }
        break;
      }
    }
    while( !v2 );
  }
LABEL_24:
  if( (_DWORD)v0 != *(_DWORD *)(PnprContext + 180) && *(int *)(PnprContext + 200) < 3 )
  {
    do
      _mm_pause();
    while( *(int *)(PnprContext + 200) < 3 );
  }
  return v1;
}

Referenced by:

PnprQuiesceProcessorDpc
PnprSwap