MiApplyHotPatchToLoadedDriver

NTSTATUS __fastcall MiApplyHotPatchToLoadedDriver(UINT64 BlockId, _UNICODE_STRING *ImageFileName, UINT64 LoadFlags){
  VOID *v3; 
  unsigned int v7; 
  _MMPTE *PteAddress; 
  unsigned int v9; 
  _MMPTE *v10; 
  NTSTATUS result; 
  UINT64 v12; 
  void *v13; 
  _SECTION *v14; 
  _CONTROL_AREA *v15; 
  unsigned int TotalNumberOfPtes; 
  _SECTION *v17; 
  VOID *SystemAddressForImage; 
  int active; 
  NTSTATUS v20; 
  _CONTROL_AREA *v21; 
  int v22; 
  int v23; 
  VOID *v24; 
  UINT64 v25; 
  _GUID **BaseDirectory; 
  _UNICODE_STRING *BaseDirectorya; 
  _GUID *ApplicationId; 
  _KLDR_DATA_TABLE_ENTRY *NewDataTableEntry; 
  _UNICODE_STRING PrefixedImageName; 
  _UNICODE_STRING BaseName; 
  _UNICODE_STRING v32; 
  UINT64 SharePages; 
  _UNICODE_STRING *ImageFileNamea; 
  unsigned int v35; 

  ImageFileNamea = ImageFileName;
  v3 = *(VOID **)(BlockId + 48);
  ApplicationId = 0i64;
  NewDataTableEntry = 0i64;
  LODWORD(SharePages) = 0;
  v7 = 0;
  BaseName = 0i64;
  v32 = 0i64;
  PrefixedImageName = 0i64;
  if( MI_IS_PHYSICAL_ADDRESS(v3) )
  {
    PteAddress = MiGetPteAddress(v3);
    v10 = &PteAddress[((v9 >> 12) + ((v9 & 0xFFF) != 0) + 511i64) & 0xFFFFFFFFFFFFFE00ui64];
    if( !MiMakeZeroedPageTables(
            v10,
            &v10[((unsigned int)dword_140C4C9F0 >> 12) - 1 + ((dword_140C4C9F0 & 0xFFF) != 0)],
            0i64,
            MiVaDriverImages) )
      return -1073741670;
  }
  result = MiGenerateSystemImageNames(ImageFileName, 0i64, 0i64, &BaseName, &v32, &PrefixedImageName);
  if( result >= 0 )
  {
    BaseDirectory = &ApplicationId;
    result = MiObtainSectionForDriver(
               &PrefixedImageName,
               ImageFileName,
               LoadFlags,
               (_KLDR_DATA_TABLE_ENTRY **)0x40000000);
    if( result == 272 )
    {
      if( (*(_DWORD *)&ApplicationId[12].Data2 & 0x20) == 0 )
        return 272;
      if( *(_QWORD *)ApplicationId[17].Data4 == BlockId )
        return MiApplyDriverHotPatch(ApplicationId, BlockId, ApplicationId, v12, (INT64)&ApplicationId);
      return -1073741791;
    }
    if( result < 0 )
      return result;
    v13 = ApplicationId;
    v14 = *(_SECTION **)&ApplicationId[7].Data1;
    if( !v14 )
    {
      ExFreePoolWithTag(ApplicationId, 0);
      return -1073741792;
    }
    v15 = MiSectionControlArea(*(_SECTION **)&ApplicationId[7].Data1);
    TotalNumberOfPtes = v15->Segment->TotalNumberOfPtes;
    *((_DWORD *)v13 + 16) = TotalNumberOfPtes << 12;
    v35 = TotalNumberOfPtes;
    SystemAddressForImage = MiGetSystemAddressForImage(v17, 0i64, &SharePages);
    if( !SystemAddressForImage )
    {
      ObDereferenceObjectDeferDelete((UINT64)v14);
      ExFreePoolWithTag(v13, 0);
      return -1073741670;
    }
    MiCheckPurgeAndUpMapCount(v15);
    *((_QWORD *)v13 + 6) = SystemAddressForImage;
    v20 = MiControlAreaRequiresCharge((INT64)v15);
    if( !v20 )
    {
      active = -1073740277;
      goto LABEL_18;
    }
    if( v20 == 2 )
    {
      active = MiReferenceActiveSubsection((_SUBSECTION *)&v15[1], 0x88ui64, 0x11u);
      if( active < 0 )
      {
        v20 = 1;
LABEL_18:
        if( v13 )
        {
          if( v20 == 2 && (v7 & 4) == 0 )
          {
            v21 = MiSectionControlArea(*((_SECTION **)v13 + 14));
            MiReturnCrossPartitionControlAreaCharges((INT64)v21);
          }
          MiUnloadSystemImage(v13, v7);
        }
        return active;
      }
    }
    MiMapSystemImage(v14, SystemAddressForImage, 0i64);
    active = v22;
    if( v22 < 0 )
      goto LABEL_18;
    _InterlockedExchangeAdd((_DWORD *)&stru_140C4DB30 + 1144, v35);
    v13 = ApplicationId;
    v23 = SharePages;
    LODWORD(BaseDirectory) = SharePages;
    v7 = 1;
    active = MiConstructLoaderEntry(
               (_KLDR_DATA_TABLE_ENTRY *)ApplicationId,
               &BaseName,
               &PrefixedImageName,
               0i64,
               (UINT64)BaseDirectory,
               &NewDataTableEntry);
    if( active < 0 )
      goto LABEL_18;
    ExFreePoolWithTag(v13, 0);
    v13 = NewDataTableEntry;
    v7 = 5;
    if( v20 == 2 )
      HIDWORD(NewDataTableEntry[1].GpValue) |= 0x80u;
    active = VslPrepareDriverForPatch(*(_QWORD *)(BlockId + 48));
    if( active < 0 )
      goto LABEL_18;
    if( !v23 )
      MiBackSingleImageWithPagefile((_KLDR_DATA_TABLE_ENTRY *)v13);
    active = MiHandleDriverNonPagedSections((_KLDR_DATA_TABLE_ENTRY *)v13, 0i64, 1ui64);
    if( active < 0 )
      goto LABEL_18;
    active = MiApplyDriverHotPatch((const _GUID *)v13, BlockId, v24, v25, (INT64)BaseDirectorya);
    if( active < 0 )
      goto LABEL_18;
    if( (MiFlags & 0x80000) != 0 )
      *((_DWORD *)v13 + 26) |= 0x2100u;
    MiDriverLoadSucceeded(
      (_KLDR_DATA_TABLE_ENTRY *)v13,
      v14,
      ImageFileNamea,
      &PrefixedImageName,
      &BaseName,
      1u,
      (UINT64)ApplicationId);
    return 0;
  }
  return result;
}

Referenced by:

MiApplyHotPatchToDriver