Getting Winhlp32 work on Windows 10

If you came here directly, you probably already google’d quite a while to find a solution for the sad fact that Windows 10 lets you run many old apps, but without letting you use the included HLP-files. The problem itself is rather old, it already arose in Vista and all later Windows versions are affected by it.

After a lot of moaning from the customers base, Microsoft released some patches that fix the inablility to open *.hlp-files. Unfortunately there is no such solution for Windows 10 yet.

If you are impatient like me, you may want to try the following aproach. At least it fixed the issue for me:

  • Go to an download the patch for Windows 8.1 matching your cpu’s architecture (32 or 64 bit).
  • Copy&Paste the code below to a text file and save it as “install.bat” to the same location where you saved the patch.
  • Launch a CMD-window with admin rights (right-click on the start-symbol, then “command prompt (Administrator)”.
  • Navigate using “cd” to the location where you saved both files.
  • Start “install.bat” by typing the name and pressing enter.
  • Wait until the script has finished it’s work.
  • Be happy đŸ˜‰

(Many thanks to spectologic for digging this out and to “Boris” [see comments] for reporting a bug in my script)


Here’s the code for “install.bat”:

@echo off

echo expanding msu...

for /f "delims=" %%i in ('dir /b Windows8.1-KB917607-*.msu') do set msufile=%%i
md ContentMSU
expand -F:* %msufile% ContentMSU >NUL
cd ContentMSU
md ContentCAB
expand -F:* Windows8.1-KB917607-*.cab ContentCAB >NUL
cd ContentCAB

echo getting MUI language string...

for /f "delims=" %%i in ('wmic os get MUILanguages ^| find "{"') do set muilang=%%i
for /f delims^=^"^ tokens^=2 %%i in ('echo %muilang%') do set muilang=%%i

echo getting architecture from filename...

echo.%msufile% | findstr /C:"x64" 1>nul
if errorlevel 1 (
set arch=x86
) ELSE (
set arch=amd64

echo finding correct files for MUI language...

for /f "delims=" %%i in ('dir /B winhlp32.exe.mui /s ^| find "%arch%" ^| find /i "%muilang%"') do set muidir=%%i
for /f "delims=" %%i in ('dir /B winhlp32.exe /s ^| find "%arch%"') do set exedir=%%i

echo replacing files in %windir%...

takeown /f "%SystemRoot%\%muilang%\winhlp32.exe.mui"
icacls "%SystemRoot%\%muilang%\winhlp32.exe.mui" /grant "%UserName%":F
ren %SystemRoot%\%muilang%\winhlp32.exe.mui winhlp32.exe.mui.w10
copy %muidir% %SystemRoot%\%muilang%\winhlp32.exe.mui

takeown /f "%SystemRoot%\winhlp32.exe"
icacls "%SystemRoot%\winhlp32.exe" /grant "%UserName%":F
ren %SystemRoot%\winhlp32.exe winhlp32.exe.w10
copy %exedir% %SystemRoot%\winhlp32.exe

echo cleaning up...

cd ..
cd ..
rd /s /q ContentMSU

echo done!



  1. Boris

    Hello Chris,

    Thank you for posting(re-posting)this script.

    From reading the script there is perhaps one small change required:
    “copy %muidir% %SystemRoot%\de-de\winhlp32.exe.mui”
    “copy %muidir% %SystemRoot%\%muilang%\winhlp32.exe.mui”

    Best Regards,

    1. chris (Post author)

      Hi Boris,

      thanks for reporting this bug. I just fixed the script now.


  2. Piotr

    It works! Thank you!

  3. Laszlo Kocsis

    Thank you, Chris, works perfectly!

  4. Jack Duijf

    One small tip.
    Run this from a folder in the C:\ drive
    If run form D:\ it fails.

    1. chris (Post author)

      I’m not quite sure what you mean with “run from”? Can you please explain some more?

  5. gigi

    Hi. Operations on winhlp32.exe are not allowed even if I am logged in with user with administrator privileges.

    1. chris (Post author)

      it is important that the CMD-Window or Powershell-Window actually has admin privileges, being logged in with an account that has administrative rights is not enough.

  6. Wullschi

    Thanx Chris. Works very well.

    If any access denied errors occure, remove older winhlp32.exe or winhlp32.mui files in system directories first.

    1. Prado

      This solved the problem but its kind of weird because the msu is not really expanded, at least in the current folder.

    2. Prado

      I overlooked the rd command in the script, it deletes the directory after expanding. That said, if you get errors, make sure the folder/path where you execute the script doesn’t contain any spaces. No need to manually delete the files.

  7. Mace Tracer

    Great job!! Thank you.

  8. DRaw

    Awesome script! Thank you.

    1. chris (Post author)

      You’re welcome!


Leave a Comment

Your email address will not be published. Required fields are marked *