World of Warcraft: Cataclysm Win2K Fix

Per Hansson

Posts: 1,978   +234
Staff member
------Introduction------
After seeing the latest news on the expansion for WoW I had to reactivate my account.
I had managed to keep away for 18 months but the ingame water rendering quality was always one of my pet peeves with WoW.
So I just had to see the new graphics in game, resistance was futile :D

After spending an hour or so trying to get my addons to a workable shape again after installing the new patch I kinda gave up and just ran the game bare bones...
The new graphics surely are amazing, and I always laugh at people saying you can play WoW at any kind of computer, take a look at my specs.
With everything at max on 1600x1200 and only 2xMSAA the game slows to a crawl in Dalaran, it uses too much video memory and in general simply loads the computer too much...
The same is true for any area with many people and allot of activity, for example in a RAID...

A few months earlier I had read that people where having issues with Win2K and the new WoW 4.0 patch in Win2K.
So feeling a bit nostalgic I decided to fire up my Windows 2000 install, because I had not used it for over two years...
its harddrive had long gone to harddrive heaven so I had to transfer my backup to a new drive, and off I went. (Or so I thought).
And after only about 3 hours of troubleshooting I figured out why it hardlocked on the 12:th blue Windows loading bar each time,
even when trying to do a clean install; The BIOS USB Configuration setting "BIOS EHCI Hand-Off" needed to be enabled! :confused:


------Background------
As I had already patched the game from within Windows XP x64 I did not need to download anything to play.
So I simply tried starting the game via Wow.exe, however it gave an error message;
"The procedure entry point SetFileValidData could not be located in the dynamic link library KERNEL32.DLL"
All these files gave the same error message;
Wow.exe
Blizzard Updater.exe
Repair.exe
Launcher.exe
WoW-x.x.x.x-4.0.0.12911-Updater.exe
wow-4.0.0.1807-to-4.0.0.1987-enUS-tools-downloader.exe
wow-4.0.0.1807-to-4.0.0.1987-enUS-tools-patch.exe


Now as you may know Repair.exe is an optional file for verifying the integrity of the WoW gamefiles.
Launcher.exe is a tool that both makes sure the game is up to date, but also that no keyloggers or other
viruses specific to WoW are installed on the system trying to steal your account data...
Launcher.exe is however also optional, it is not required to start the game this way,
it will infact load quicker if you start it with Wow.exe directly instead...

The file Launcher.exe will call Blizzard Updater.exe if a patch has been downloaded by the Blizzard Downloader.exe (another file).
This file, Blizzard Downloader.exe requires another API, if you try launching Blizzard Downloader.exe you will get this error:
"The procedure entry point RegisterRawInputDevices could not be located in the dynamic link library USER32.DLL."
Note that the rest of the EXE files will be explained in the section "The Dirty Fix for subdirectories".


------The Dirty EXE Quick Fix------
Warning; To the best of my knowledge modifying the EXE files will not set off any cheat detection systems by Blizzard.
That said you modify the EXE files entirely at your own risk! Don't hold me responsible if Blizzard bans you!
And please read below for the proper fix instead which is 100% safe to do instead...

So to wrap up there are two ways to go about this, you can fix the problems in all of the EXE files.
However they are only really needed when a new patch is released.
So for example if you dualboot or have a friend that downloads and installs the patches for you on a USB disk,
then it would not really matter that these EXE files are not useable, the only one we need to fix is Wow.exe (obviously).

Now the API call it fails with, SetFileValidData seems to be an API written to enable faster writing of large files.
As you might understand this only happens when you patch the game, when playing the game no data at all is written to the harddrive.
Only a few kilobytes are written into the games settings files when you exit the game (if you changed any settings).
So it is my educated guess that this call is not necessary for Wow.exe, but only for the actual patcher EXE files.
Therefore you could make a backup of Wow.exe (for safe keeping) and then open up the original in your favourite HEX Editor, I like Hex Workshop.
Search for the API call SetFileValidData and replace it with something that will just return a value to make it happy.
For example ExitProcess, pad the rest of the string with zeroes.

I have tested this on the enGB game client version 4.0.1.13164 and it worked fine, the game played great on Win2K.
A small caveat is that if you run the Repair.exe after modifying the EXE files they will be restored to the original unmodified state. ;)
And obviously when the game is updated with the next patch version the fix will need to be redone, since the files are overwritten...


------The Wrapper DLL Fix------
Now if you are looking for the proper fix for all the EXE files it is a little more involved, but depending on your knowledge of HEX Editors it might be much easier!
My friend OldBoy2k runs a site called "Windows 2000 Gaming; Playing XP games on Windows 2000".
He and a buddy of his, OldCigarette have been making Win2K API wrappers that make hundreds of games compatible with Win2K that otherwise would not work.
This is a way more elegant solution than simply removing the call in the EXE and hoping things works, the wrapper actually backports the unsupported call to Windows 2000!
So the game will work if you update it (unless new unsupported API calls are introduced of course) and the Repair.exe will not remove the fixes...

The way it's done is you change a setting in the Windows registry, so that when the game looks for the files (in this case) KERNEL32.DLL and USER32.DLL.
It first looks in the binaries own directory (in this case C:\Program Files\World of Warcraft).
There it will find the wrapper DLL's which will take care of the calls that are not originally supported by Windows 2000.
The calls that however are supported by Windows 2000 are not handled by the wrapper, they are sent to the systems original KERNEL32.DLL and USER32.DLL files.

These files should therefore be copied to the games binary directory aswell, and renamed to KERNEL32_ORG.DLL in the case of OldCigarettes wrapper DLL is used (OCW).
Or renamed to KERNEL2K.DLL in the case of the wrapper DLL's written by BlackWingCat (KDW) is used.
By now you are probably wondering why we are using wrappers from two different people, the reason is that they support different API's as of when this text was written.
The KDW wrapper does not actually implement RegisterRawInputDevices in its USER32.DLL yet, it simply discards it like I do in my dirty EXE fix above.
That is fine if that API is not really needed, but if it is we will have an issue...
The OCW wrapper however does implement it, but on the other hand it does not implement the other API call SetFileValidData in KERNEL32.DLL at all, so it simply won't work...

As a sidenote I tried to replace the API call RegisterRawInputDevices in Blizzard Downloader.exe in a similar way as I did for the Crysis Win2K fix.
It no longer raised any error message but when the Launcher.exe tried to invoke it simply timed out, so probably this call was necessary for its functionality...


------Download Wrapper DLL Fix------
Now that you have a little understanding of how this works I offer this WinRAR Archive for you to download, you should extract the files in your World of Warcraft binary directory.
By default this will be; C:\Program Files\World of Warcraft. You can rightclick your World of Warcraft shortcut and select properties then "Find target" if you are having trouble locating the installation directory. This is where you should extract the files.
The included file KERNEL32.DLL comes from BlackWingCat's KDW Wrapper v0.83c
The included file USER32.DLL comes from OldCigarette's OCW Wrapper v1.9
The included file ExcludeUser32dll-Kernel32dll.reg will add entries for USER32.DLL & KERNEL32.DLL to the Windows registry key ExcludeFromKnownDlls.
The included file OriginalDLLCopy.bat is written by me.
OriginalDLLCopy.bat is a simple batch file that will copy your original Windows DLL files to the games directory, and rename them to the proper names for the two different wrappers KDW and OCW.
You only need to run it once, keep in mind though that your Windows USER32.DLL & KERNEL32.DLL files should be the same version as the renamed copies in the binary directory. (This is not the wrappers files).
So if you install a Windows Update fix that updates these files you should run the batch file again to update the files for World of Warcraft aswell.
Note that since Windows 2000 now has reached its end of extended support it would be a good idea to run Windows Update and install any security updates and Service Packs before you install the wrapper, since no new updates will be coming out later anyway.
Also note that after the registry key ExcludeFromKnownDlls under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager has been modified by the included .reg file you will need to reboot for the changes to become effective.
Lastly it should be said that this registry key should not be modified using regedit.exe, but instead regedt32.exe.
Update 2010-10-22: Another file has been included; win2k_xp_kernel32.ini
It changes the input method to "DirectInput" which solved a problem with the mouse pointer lagging when closing down the Launcher.exe


------The Dirty Fix for subdirectories------
Note that the World of Warcraft Background downloader usually downloads patches to a subdirectory named "Updates".
Here it puts an installer EXE file named "WoW-x.x.x.x-4.x.x.x-Updater.exe", this file too depends on the SetFileValidData API call.
Since it is located in a subdirectory from the games own binary files where we put the wrapper this will actually fail.
Because the Wrapper only gets invoked when it is in the same directory as the executable file being launched...

The Blizzard Downloader is similar, but it downloads patches to a subdirectory named "Temp" instead.
Here it puts one or several installer EXE files named "wow-4.x.x.x-to-4.x.x.x-enUS-tools-patch.exe" and/or;
wow-4.x.x.x-to-4.x.x.x-enUS-tools-downloader.exe. These files also depend on the SetFileValidData API call.
So you will need to copy the wrapper to these directories aswell.


------The Elegant Fix for subdirectories------
You could also do this in a more elegant way, Windows 2000 support NTFS Hard Links.
So you can make a link to a file in the filesystem, and it will appear to the filesystem as a real file.
The Windows XP utility "fsutil.exe" can be used to create these links, you can copy it from any Windows XP machine.
That is if you do not trust downloading an EXE from me (In general regarding World of Warcraft you should be extremely
suspicious of downloading EXE files off the internet, that said I of course promise this file is genuine...)


------Download Elegant Fix for subdirectories------
The WinRAR Archive linked above will contain two files, fsutil.exe described above.
And CreateHardlinks.bat, the batch file that will create the NTFS hard links. (And also take care of creating the directories if they do not already exist).
Extract these two files just like you did before in the games binaries directory, I.e. "C:\Program Files\World of Warcraft" by default.
Or put fsutil.exe in C:\WINNT\System32 where it really belongs...
Then run CreateHardlinks.bat in the World of Warcraft binaries directory.
If you now go into the subdirectories "Temp" and "Updates" you should see the 4 DLL files in there, they are actually just links so they do not take up any space.



WinRAR; http://www.rarsoft.com
World of Warcraft backporting info; http://win2kgaming.site90.com/phpBB2/viewtopic.php?f=3&t=701&p=2437#p2437
The big Windows 2000 & Wrapper FAQ; http://win2kgaming.site90.com/phpBB2/viewtopic.php?f=3&t=319
Wrapper DLL-moving Questions; http://win2kgaming.site90.com/phpBB2/viewtopic.php?f=6&t=647&p=2281#p2281
 

Attachments

  • LauncherSmall.png
    LauncherSmall.png
    140.8 KB · Views: 139
cant get DLLs

Hi Per, very interesting and useful.
I've got a problem in that I cant get hold of the DLLs of that website. Are you in a position to send to me please? Thanks, Carlos
 
Hi carlosthejackal, Welcome to Techspot!
The links above are actually clickable...
Scroll back up and click on "------Download Wrapper DLL Fix------" and it will prompt you to download the WinRAR archive :)
 
Exiting WoW hangs

Hi,
Thanks for this, it really helped me continue playing WoW!

I was wondering if anyone else had a problem exiting.

If I don't actually login I can click on the Quit button, and it exits fine.

However if I've logged in (I think I've also played) I can logout back to the choose a character screen, and I can click on Back to get to the login screen, but then if I click on the Quit button, WoW just freezes, and I have to alt-tab, or if that doesn't work ctrl-alt-del to get a task manager and end the WoW application.

That's not really so terrible, since playing works fine, but I wondered if anyone else had encountered that.
 
Hi mlippert, Welcome to Techspot!
Thank you very much for reporting this issue.
Yes, I have seen the same problem; there are still some unsupported calls when I launch Wow.exe in dependency walker, so maybe updated versions of the wrappers will fix this in the future. But since I do not develop them I have no idea when or if they will be released...

The reason I did not mention it before is that my Windows 2000 Advanced Server installation is quite old, and has many modifications. So I was not sure if it would happen on a "clean" installation of Win2K.
You are the first one to report it; if I ever find the reason for the issue I'll update the fix.
Biggest problem to troubleshoot though is that as soon as I login to Battle.net Wow.exe crashes, because it does not allow any debuggers (I use Dependency Walker) to run in-game.
And as you know it is only after logging in and then quitting the game that it hangs, so it is quite a catch 22...
I've also noticed a ca 10 second long lag if I ALT+TAB out of the game while playing, have you seen the same aswell?
 
Hi Per,
Thanks for confirming the issue. I noticed a lag using alt-tab, but that didn't feel all that different from the delay with the previous version of WoW (it may be longer now, but I feel there was always a delay, and of course I can't go back to verify :-( )

I haven't been reading the threads, but while googling for the solution you provided (thanks again), I see a lot of hits for wine on linux. I wonder if they've experienced the same issue and fixed it.

I'll read around and if I come across anything plausible I'll post back.

Mike
 
Some updates for the v4.0.3 patch released recently.
It seems that Blizzard agreed with my call about SetFileValidData
"It is my educated guess that this call is not necessary for Wow.exe, but only for the actual patcher EXE files"

As of patch v4.0.3 the SetFileValidData API has been removed from Wow.exe and Repair.exe.
So now you only need the Wrapper for the Launcher.exe, Blizzard Updater.exe & Blizzard Downloader.exe (The latter still depending on the RegisterRawInputDevices API).

So with this in mind you can remove the wrapper files from the games directory and the issue with closing it down reported by mlippert above is gone.
However in these days leading up to the Cataclysm expansion it is also quite good to use the Launcher, because it predownloads game content and patches etc for the expansion...

I did however find a workaround for that problem, I noticed that the game only crashes when you logout while you are getting rested, so if you logout "outside" it works fine.
But if you logout in a City or an Inn then it hangs...
The addon "Broker Exit" gets you around this issue if you use it's own function for exiting the game. (Ctrl + Left click it's icon).
 
Back