bnetlauncher blunders

When I wrote bnetlauncher everything worked fine, I had been using it for days without any issues, so I figured why not release it in case someone else also found it useful?

But as feedback started to come in I realized that what I had created was utterly broken on other people’s computers! I felt shame and embarrassment on how I had managed to push so many blunders in such a tiny program.

As I pushed forwarded I decided to document my mistakes for future me and any one curious for the technical side of things.

What’s was going on?

When testing an application on your computer things are easy, you can press run on visual studio and step trough every instruction checking their result and effect. On someone else’s computer there’s no such thing. So I figured it would be good to have some sort of log file that would record debug messages as bnetlauncher ran trough it’s steps.

Has bug reports started to come in this proved invaluable, has it allowed me to see at what step of the process things where blowing up and gi what part s problem reports came in the first thing I ended up doing was implementing a Log file to try and give me a clue of what was going on.

Too slow to start

I keep my blizzard games on an SSD, further more I have 16gb of RAM and rarely shutdown my PC (i simply put it on standby). This meant that 99% when I launched the blizzard games I play they would already be cached and start “instantly” sadly though not everyone is running their games under the same conditions.

And for those people bnetlauncher was crashing most of the time, it was only when I used RAMMap to flush my file cache of memory with the game on a regular HDD did I manage to reproduce the issue myself, and after some debugging I realized what was going on.

The way bnetlauncher works is it tries to find the game the client started and copy it’s arguments. On my computer due to everything being cashed this worked fine, however on a non cached start the game would be found but it’s parameters wouldn’t be available yet which would just result in a crash 🙁

This was fixed by adding error catching code that simply keeps retrying to get the parameters until it succeeds.

Dude, where’s my files?

To my surprise I got reports that bnetlauncher simply did not work, Diablo 3 said it couldn’t find files, Hearthstone showed a black screen, what was going on?

Well the thing is I originally kept my bnetlauncher inside the game folder, only later moving it inside my steam folder this meant on Steam my “Start at” parameter was pointing to the game folder.

Notice the Start In is pointing to the game folder.
Notice the Start In is pointing to the game folder.

As it turns out blizzard games are quite trusting and take the “Start at” parameter as gospel when it comes to finding it’s files. So what was going on was that people leaving their “Start in” parameter unchanged (since they obviously had no idea) it would cause blizzard games to try and find their files in places where they where not.

I looked for a way to obtain the “CurrentDirectory” of another process and began to sweat when every place I looked kept telling me I would have to “inject a thread into the process to make calls in it’s context”. I value my account a lot and that sounded like something that could be miss interpreted by Blizzard’s anti-cheat systems.

So in the end the solution I picked was to just use the exe folder as the “Start in” parameter, which seems to work for all the games *fingers crossed*.

Launcher Inception

I suck at RTS games, I really do. So it’s only natural Starcraft 2 and Heroes of the Storm never held any appeal to me. Ironically those two proved to be somewhat unique in the way they start up. Even after all the bug fixes above those two where still not working. client launching Starcraft 2
Did I also mention is started by a launcher that starts a launcher that starts

So I downloaded them and took a look at what they normally and this was what I saw:

Starcraft 2 had a launcher of it’s own! Comparing what bnetlauncher was doing and the client was doing I realised the diference. client launched SC2Switcher_x64.exe which in turn launched SC2_x64.exe using it’s own directory as the SC2_x64.exe “Start in” parameter.

bnetlauncher just launched SC2_x64.exe and tried to launch it usin it’s own folder as “Start in” parameter, which simply did not work.

This made me realize a fundamental flaw in the logic of what bnetlauncher was doing, I was looking for the last started process instead of the very first.

So that was fixed and the code upgraded to handle closing a process and it’s children so it could properly close Hots and Sc2 (else you’d get a error 2:-2000).

Click me baby one more time

What would happen when you started two instances of bnetlauncher (be it by accident or on purpose)? As I found out a lot, and none of it good.

Games could get swaped, so the D3 shortcut would bet WoW and the WoW shortcut would D3 and even worse if client was launched trough bnetlauncher the second instance would simply hang as the first closed the client making it impossible to actually launch then second game.

So how to fix this issue, first thing I thought was to simply stop bnetlauncher from starting if another instance was already running. It worked but I felt I could do better!

So instead of simply exiting I decided to implement a “wait” system where each instance of bnetlauncher would simply wait for the previous instance to finish before starting it’s own thing with the last in line closing the client if the first one had to start it.

Do the way I decided to fix this it challenging one with me cursing Microsoft vague documentation on Named Mutexes and how they’re suppose to be used. Was this overkill? Probably, but maybe people playing hearthstone while they wait for their turn in WoW’s dungeon queue to pop up might appreciate the feature…

Playing it safe

All these issues left me somewhat paranoid so also ended up adding error checks, logging and crashing protection to almost every step of the process.

Now it may have a bit too much but it’s certainly better then having too little like before.

In conclusion

Hopefully the lesson is learned and I will try to avoid releasing anything without more serious testing. To those that tried bnetlauncher early I can only extend my deepest apologies for the trouble I’ve caused you.

Latest bnetlauncher can be download at it’s page. games under Steam

Ever since steam allowed to add non steam games to it that it become my gaming hub having all my games there ready to be launched.

However every big developer/publisher has it’s own launcher these days which means trying to use steam as a launcher doesn’t always work as intended.

I originally discovered a solution in a reddit post, it worked but felt very clunky so I fired up Visual Studio to see if I could do any better.

The result was bnetlauncher. While not the most elegant solution it does work. and makes adding current and future blizzard games to steam a lot easier.

Additionally I have also the full source code under GPL for those who take their security very seriously or are simply curious about what’s actually happening under the hood.

To use just add it as a non-steam game and put in the appropriate case sensitive code in front as a parameter like in the screenshot bellow.

Example bnetlauncher use


Warning: The downloads below are outdated and buggy, please grab the current version from (Beta version that should fix crashing issue)


Recovering Wiko BLOOM IMEI

Sometimes wanting everything your own way can bite you in the ass HARD, after flashing a custom ROM my Wiko BLOOM I realized it had turned my IMEI invalid.

After trying dozens of guides (most of which I had to google translate) and several programs, without getting anywhere I was almost about to give up, fortunatly I finally saw this post mentioning BPLGU which eventually lead me to fixing the phone.

So, in the hopes of saving others from the hours of frustration I had to go trough I’m writing this guide,

Understanding my problem
After fixing it I came to the conclusion that when I booted the custom ROM it corrupted/erased all of the NVRAM. This not only removed the IMEI’s but it also removed all the Baseband information. So before I could try and restore the IMEI i’d first need to restore the Baseband information so it looks like the picture below (when broken mine would simply show “—” in the red box).

MTK Droidtools showing WIko BLOOM info
Correct Baseband (highlighted in red box) for a Wiko BLOOM using MTK Droidtools

Fixing the problem
To fix the baseband we’ll first need a BPLGU file to flash into it, lucky for us Wiko actually provides all the files we’ll need with their system update packages.

So go to Wiko’s website support section (the global site lacks a support section so select the proper country website) and download the latest BLOOM update (BLOOM_V16.exe when I did it) and run it.

Wiko BLOOM Upgrade application
Upgrade application for Wiko Bloom

Once you see the upgrade application close it, you’ll see that the upgrade application created a folder with the same name as the exe, navigate that folder until you see these files:

Wiko BLOOM ROM files
Wiko BLOOM ROM files

These are the files we’ll use with SP Flash Tool to restore the nvram, but before we’ll need to edit the MT6582_Android_scatter.txt so that the flash tool will also write the NVRAM. So open the file in a text editor and search for “nvram”, on the block it finds you’ll need to change “is_downloaded: false” to “is_downloaded: true” like shown bellow:

- partition_index: SYS4
partition_name: NVRAM
file_name: NONE
is_download: true

Now run SP Flash Tool, change to the Download tab and use the Scatter-loading button and point to the MT6582_Android_scatter.txt file we just edited, NVRAM will show in the list unticked and without a filename, click the file box and select the BPLGU file in the directory (BPLGUInfoCustomAppSrcP_MT6582_S00_MOLY_WR8_W1315_MD_WG_MP_V34_1_wg_n in my case) and make sure the line is checked so it’s flashed. It should look like the picture bellow:

SP Flash Tool
SP Flash Tool with NVRAM selected and properly configured

For the next step I did a full ROM flash (everything selected), however it’s possible you can get away with just having NVRAM selected but like I said I did a full flash. So just follow the normal SP Flash Tool procedure to flash the files.

After the flash completes the phone should boot with the proper Baseband and guides to edit your IMEI using MTK Droidtools should work now.

Tools I used to fix the baseband and edit the IMEI:

Colorix developements

Well, it was about time I got of my lazy ass and did something so I took a look inside 7-Zip source and added primitive support for external Icons.

It’s still unfinished and it’s implementation isn’t “perfect”, but it’s simple. I’m still working around it to provide a way to do something like “7zFM.exe /refresh-icons” (done) to make it easy for icon pack authors like myself to distribute their work.

Time will tell if it becomes a base feature of 7-Zip but for now those that want to take an early peak can check the beta, you’ll need 7-Zip 9.04 beta for it to work properly.

Update: I’ve refreshed the files with the addition of the “/refresh-icons” command line option to 7zFM.exe.