MiMakeImageReadOnly

VOID __stdcall MiMakeImageReadOnly(_CONTROL_AREA *ControlArea){
  _CONTROL_AREA *v1; 
  ULONG_PTR v2; 
  UINT64 v3; 
  __int64 NumberOfMappedViews_high; 
  UINT64 v5; 
  _MMPFN *v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  int v9; 
  unsigned __int64 v10; 
  int v11; 
  _MMPFN *v12; 
  UINT8 PageIrql; 
  _CONTROL_AREA *v14; 

  v1 = ControlArea + 1;
  PageIrql = 17;
  v2 = 0;
  v14 = ControlArea + 1;
  if( ControlArea != (_CONTROL_AREA *)-128i64 )
  {
    do
    {
      if( (v1->NumberOfPfnReferences & 0x3E) != 2 )
      {
        v3 = *(_QWORD *)v1->gap8;
        NumberOfMappedViews_high = HIDWORD(v1->NumberOfMappedViews);
        LOWORD(v1->NumberOfPfnReferences) = v1->NumberOfPfnReferences & 0xFFC1 | 2;
        v5 = v3 + 8 * NumberOfMappedViews_high;
        if( v3 < v5 )
        {
          do
          {
            if( (v3 & 0xFFF) == 0 || PageIrql == 17 )
            {
              if( PageIrql != 17 )
                MiUnlockProtoPoolPage(v2, PageIrql);
              while( 1 )
              {
                v12 = MiLockProtoPoolPage((_MMPTE *)v3, &PageIrql);
                v2 = (unsigned int)v12;
                if( v12 )
                  break;
                MmAccessFault(2ui64, (PVOID)v3, 0, 0i64);
              }
            }
            v6 = MiLockLeafPage((_MMPTE *)v3, 0i64);
            LODWORD(v7) = MI_READ_PTE_LOCK_FREE(v3);
            if( v6 )
            {
              if( (v7 & 1) == 0 )
              {
                v10 = v7 & 0xFFFFFFFFFFFFFC1Fui64 | 0x20;
                LOBYTE(v11) = MiPteInShadowRange(v3);
                if( v11 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v10 & 1) != 0 )
                  v10 |= 0x8000000000000000ui64;
                *(_QWORD *)v3 = v10;
                v6->OriginalPte.u.Long = v6->OriginalPte.u.Long & 0xFFFFFFFFFFFFFC1Fui64 | 0x20;
              }
              _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            }
            else if( (v7 & 0x400) != 0 || v7 )
            {
              v8 = v7 & 0xFFFFFFFFFFFFFC1Fui64 | 0x20;
              LOBYTE(v9) = MiPteInShadowRange(v3);
              if( v9 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
                v8 |= 0x8000000000000000ui64;
              *(_QWORD *)v3 = v8;
            }
            v3 += 8i64;
          }
          while( v3 < v5 );
          v1 = v14;
        }
        if( PageIrql != 17 )
        {
          MiUnlockProtoPoolPage(v2, PageIrql);
          PageIrql = 17;
        }
      }
      v1 = *(_CONTROL_AREA **)&v1->gap8[8];
      v14 = v1;
    }
    while( v1 );
  }
}

Referenced by:

No references.