MmChangeImageProtection

VOID __stdcall MmChangeImageProtection(
        _MDL *CodeMdl,
        PVOID SignatureAddress,
        UINT64 SignatureSize,
        UINT64 ExecuteFlags){
  char *v5; 
  unsigned int ByteCount; 
  unsigned int v8; 
  _ETHREAD *Lock; 
  INT64 v10; 
  __int64 v11; 
  __int64 v12; 
  char *v13; 
  unsigned __int64 v14; 
  char *v15; 
  int v16; 
  int v17; 
  UINT8 v18; 
  WCHAR *v19; 
  unsigned int v20; 
  UNICODE_STRING *PfnDb; 
  _MDL *v22; 
  _MDL *v23; 
  int v24; 
  ULONG_PTR v25; 
  _SECTION *v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  int v29; 
  UINT64 v30; 
  __int64 v31; 
  _MMPFN *v32; 
  int v35; 
  v35 = ExecuteFlags;
  v5 = (char *)SignatureAddress;
  if( (unsigned int)(ExecuteFlags - 1) <= 1 && (CodeMdl->MdlFlags & 7) == 2 && !CodeMdl->ByteOffset )
  {
    ByteCount = CodeMdl->ByteCount;
    if( (ByteCount & 0xFFF) == 0 )
    {
      v8 = ByteCount >> 12;
      Lock = MmAcquireLoadLock();
      --*((_WORD *)Lock + 242);
      --*((_WORD *)Lock + 242);
      ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, 1u);
      v11 = MiLookupDataTableEntry((unsigned __int64)CodeMdl->StartVa, 0i64, v10);
      v12 = v11;
      if( v11 )
      {
        v13 = *(char **)(v11 + 48);
        v14 = (unsigned __int64)&v5[SignatureSize];
        v15 = &v13[*(unsigned int *)(v11 + 64)];
        if( (char *)CodeMdl->StartVa + CodeMdl->ByteCount > v15
          || v5 < v13
          || v14 > (unsigned __int64)v15
          || v14 - 1 < (unsigned __int64)v5 )
        {
          v17 = -1073741800;
        }
        else
        {
          v16 = *(_DWORD *)(v12 + 104);
          if( (v16 & 0x80000) != 0 )
          {
            v17 = -1073741757;
          }
          else
          {
            v17 = 0;
            *(_DWORD *)(v12 + 104) = v16 | 0x80000;
            if( (unsigned int)MiGetSystemRegionType((UINT64)v13) == 1 )
              MiSessionReferenceImage(v13);
            else
              ++*(_WORD *)(v12 + 108);
          }
        }
      }
      else
      {
        v17 = -1073741275;
      }
      ExReleaseResourceLite(&PsLoadedModuleResource);
      KeLeaveCriticalRegionThread((__int64)Lock);
      MmReleaseLoadLock(Lock);
      if( v17 >= 0 )
      {
        if( !(unsigned int)MI_IS_PHYSICAL_ADDRESS(*(PVOID *)(v12 + 48)) )
        {
          v20 = 0;
          PfnDb = (UNICODE_STRING *)MmGetPfnDb();
          v22 = CodeMdl + 1;
          if( v8 )
          {
            v23 = CodeMdl + 1;
            while( 1 )
            {
              LOBYTE(v24) = MI_PFN_IS_PROTO(&PfnDb[3 * (__int64)v23->Next], PfnDb, v18, v19);
              if( v24 || (MiGetPagePrivilege(v25, 0, 0i64) & 0x40) != 0 )
                break;
              ++v20;
              PfnDb = (UNICODE_STRING *)MmGetPfnDb();
              v23 = (_MDL *)((char *)v23 + 8);
              if( v20 >= v8 )
              {
                v5 = (char *)SignatureAddress;
                goto LABEL_25;
              }
            }
          }
          else
          {
LABEL_25:
            MiSetImageProtection((_KLDR_DATA_TABLE_ENTRY *)v12, CodeMdl->StartVa, CodeMdl->ByteCount, 1ui64);
            if( v35 == 1 )
            {
              v26 = *(_SECTION **)(v12 + 112);
              if( v26
                && (v27 = *(_QWORD *)(*((_QWORD *)MiSectionControlArea(v26) + 12) + 40i64),
                    (v27 & 0xFFFFFFFFFFFFFFF8ui64) > 8) )
              {
                v28 = v27 & 0xFFFFFFFFFFFFFFF8ui64;
              }
              else
              {
                v28 = 0i64;
              }
              if( qword_140C1D950 )
              {
                v29 = qword_140C1D950(v28, CodeMdl, v5, SignatureSize, &v5[-*(_QWORD *)(v12 + 48)]);
                if( v29 >= 0 )
                {
                  v30 = 3i64;
                  if( (MiFlags & 0x10000) != 0 && v29 == 300 )
                    v30 = 19i64;
                  MiSetImageProtection((_KLDR_DATA_TABLE_ENTRY *)v12, CodeMdl->StartVa, CodeMdl->ByteCount, v30);
                }
              }
            }
            else if( (MiFlags & 0x10000) != 0 && v8 )
            {
              v31 = v8;
              v32 = MmGetPfnDb();
              do
              {
                MiClearPfnImageVerified((UINT64)v32 + 48 * (__int64)v22->Next, 24);
                v22 = (_MDL *)((char *)v22 + 8);
                --v31;
              }
              while( v31 );
            }
          }
        }
        MmAcquireLoadLock();
        --*((_WORD *)Lock + 242);
        ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, 1u);
        *(_DWORD *)(v12 + 104) &= ~0x80000u;
        ExReleaseResourceLite(&PsLoadedModuleResource);
        KeLeaveCriticalRegionThread((__int64)Lock);
        MiUnloadSystemImage((PVOID)v12, 0xFFFFFFFFui64);
        MmReleaseLoadLock(Lock);
      }
      KeLeaveCriticalRegionThread((__int64)Lock);
    }
  }
}

Referenced by:

No references.