As you might know Microsoft distributes updates and hotfixes with in installer, update.exe. When you run update.exe it looks into the supplied .inf files to see what it has to install. It’s not possible to make changes to the inf files however because that will invalidate it’s signature (and update.exe checks the signature that is stored in an accompanying .cat file).

In my case I wanted to deploy the MUI pack for Internet Explorer 7 to be able to support multiple languages. By default this pack installs 35 (!) languages and I wanted to install only Dutch language on top of existing English.

I first left out the directories with the languages I didn’t want but update.exe refuses to install, you can see lines like this in the install log:

1.453: Missing file trk\wininet.dll.mui

Next I tried to edit the inf file, in my case (for Server 2003) update_srv03.inf. I removed all lines pointing to other languages (the file extension has a 3 letter abbreviation, for example:

[ProductInstall.CopyFilesAlways]
CopyFiles=CopyAlways.Help.Files.ara
CopyFiles=CopyAlways.Inf.IEM.MUI.Files.ara
CopyFiles=CopyAlways.InternetExplorer.Mui.Files.ara
CopyFiles=CopyAlways.System32.Mui.Files.ara
CopyFiles=CopyAlways.Help.Files.chs
CopyFiles=CopyAlways.Inf.IEM.MUI.Files.chs
CopyFiles=CopyAlways.InternetExplorer.Mui.Files.chs
CopyFiles=CopyAlways.System32.Mui.Files.chs

[SourceDisksFiles]
enu\srv03sp1\ieframe.dll=1
enu\ieframe.dll.mui=1
ara\ieakmmc.chm=1
ara\ieeula.chm=1
ara\iesupp.chm=1
ara\iexplore.chm=1
ara\inetcorp.iem=1

Don’t remove lines with enu…

Then I ran the update again and it failed because of the signature I mentioned, once again the log file is clear about that:

1.250: IsInfFileTrusted: ValidateSingleFileSignature Failed: STR_FAILED_INF_INTEGRITY

How convenient that the name of the function is mentioned 😉
So I decided to patch update.exe. I opened it in Ida and luckily Microsoft’s public symbols contain this function, so the patch was really easy:

It’s signature is: __stdcall IsInfFileTrusted(x) @.0104A33F

We can simply make it return true by changing the first bytes of the function:

.text:0104A33F ; __stdcall IsInfFileTrusted(x)
.text:0104A33F _IsInfFileTrusted@4:
.text:0104A33F 53 push ebx
.text:0104A340 55 push ebp
.text:0104A341 56 push esi
.text:0104A342 FF 35 48 10 09 01 push _g_hInf

to:

.text:0104A33F ; __stdcall IsInfFileTrusted(x)
.text:0104A33F _IsInfFileTrusted@4:
.text:0104A33F ; InventoryThread(x)+4CFp
.text:0104A33F B8 01 00 00 00 mov eax, 1
.text:0104A344 C2 04 00 retn 4

And now the update runs fine, you can use the /passive switch to make it unattended and deploy it with your favorite deployment tool.

You can download the generic patch for update.exe here: Windows Service Pack Setup Patcher (1653 downloads ) . It is based on update.exe 6.2.29.0 dd 27-06-2007 but it uses a search/replace patch method so you might be able to use it with other versions too.