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. 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. Hi Boris,

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


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

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

    1. Hi,
      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.

  3. Thanx Chris. Works very well.

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

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

    2. 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.

  4. Hi, thanks a lot for your help, a little bugfix:

    the lines:

    copy %muidir% %SystemRoot%\%muilang%\winhlp32.exe.mui

    copy %exedir% %SystemRoot%\winhlp32.exe

    should be:

    copy “%muidir%” %SystemRoot%\%muilang%\winhlp32.exe.mui

    copy “%exedir%” %SystemRoot%\winhlp32.exe

    note the ” for the source files, because if the path have spaces on it the file copy operation fails.

    Regards from Colombia.

    1. Hi there,
      you’re right, the quotes were missing.
      I’ll add them to the script.
      Thanks for this finding!

    1. You can’t directly install a MSU-File that is originally for Win 8. Just follow the instructions in the blog entry.

  5. Hi Chris, glad to discover this, I’d been looking at writing something. Thanks so much! Does this prevent windows update and file verification from changing back to the non-functional winhlp32.dll, or would a .bat file need to be run repeatedly as needed?

    1. Hi Tom,
      glad to help!
      I never noticed that the system-file check reverts the changes, so maybe the files involved here are not handled by the verification at all?
      Honestly, I did not try to force a verification yet but at least the changes seems to last even after doing a full-blown release-update of Windows.

      1. Thanks so much! It is working fine so far, if it gets removed I have a good way to put it back. Very much appreciated, and well done.

  6. Worked for me Chris, on a 64-bit W10 system. Now I can read the help files of good old NEC Win Pro antenna simulation sw again. Many thanks!

Leave a comment

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