Category Archives: MSLU

Sorted it all Out


I am Jan and I am currently running this blog. In case this is your only contact point with Michael I thought you should know that Michael has passed away on October 21, 2015 in Redmond, after 25 years of fighting multiple sclerosis.

Michael was the loving son of Patty and Steve Kaplan, beloved brother of Meredith and Zachary Glazer, dear uncle of Rachel, Mara and Kayla Glazer, nephew of Rick Eisberg, Overland Park, KS, special friend of Teresa Hennig, Seattle, WA and dearest cousin to many across the country. He was preceded in death by his adoring grandparents – Bee and Joe Eisberg and Reva and Isadore Kaplan.

To me, he was a great source of inspiration and meeting him in India was an unforgettable moment. This blog helped me to become better developer, learn a language, graduate from university, visit parts of the world I would have never imagined, make lifetime friends and many more and I am sure I am not the only one.

Thank you, Michael.

From the ‘Questions that I never imagined I would be asking’ file….

aka How do I get Microsoft to stop paying me my salary?

My career at Microsoft has been colorful, from MSLU as a vendor to MSKLC and World Readiness as an FTE.

When I first moved to Seattle I opened up a business checking account for Trigeminal Software and a personal account for corporate me to pay personal me my salary (this was pre interstate banking rules and pre Microsoft direct deposit so the local account made check deposits easier) at Seafirst Bank, which was acquired by Bank of America, on its road to being TBTF (Too Big To Fail) before the financial meltdown.

Vivid in my memory though is when a teller at Seafirst was horrified at my suggestion that no one should have to show ID to deposit money into my account.

“Do you know the risks you’d be taking?” she asked

Little did I know that almost twenty years later Microsoft would prove how right she was.

But I digress.

I actually ran several v- types as Trigeminal Software employees before I went FTE at end of my 37th contract (for MSLU, the Microsoft Layer for Unicode).

Eventually I went full time, and direct deposited my salary twice a month for years. Which I admit was quite convenient for a long time.

Then after they decided to fold my RIF (Reduction In Force) into the layoffs of 2014 even though I was off on disability at the time? *THAT’S* when things started to get really complicated.

Here is the breakdown of how it was laid out for me in the end.

• the news I can live with is that someone from Microsoft HR looked at the money I was owed for lost & missing stuff and the money for which they were sending me to collections even though they were the ones overpaying me and decided that they kinda cancelled each other out so everything was settled for the sake of closure. I agreed. 2014 tax issues solved, which I could live with.

• the bad news is that the stock options that would have vested in end of August had I not been laid off did not vest since I was in fact laid off and they paid me for the shares last year so they weren’t gonna stretch it out two years. Reasonable but annoying, basically bad news.

• the really good news is that since I was deemed permanently disabled a technicality in the Microsoft stock vesting rules causes ALL stocks for ALL years to automatically vest upon the formal separation. Four years instead of one? Cool!

• the WTF news is that the money I was given at the of May and again in the middle of August nominally for unpaid vacation time (different amounts each time) was paid both times. WTF for the 2015 taxes!

Here is point where I present the old meme of Oolong, the rabbit with a pancake atop his head.

Because he is the one who shows up when you have nothing to say.

What CAN I say?f

In truth, I’m honestly worried about the tax implications of trying to explain this for 2015, so I find myself asking the questions that I never thought I’d find myself asking:

How do I get Microsoft to stop paying me my salary now that I have been offically laid off?

Maybe they should *write* the freaking manual!

It was about a decade ago that I wrote about The book idea that didn’t happen

You can read all about it, but no publisher wanted to get behind it. The idea of a book entitled RTFM interested many of them, but not even one of them believed that *any* book could deliver on the promise of better strategies to find information in Microsoft’s documentation.

They were probably right.

In my heart, I only started with the official documentation and white papers. From there, I moved on to

  • header files in the SDK/DDK/WDK
  • interrogation techniques for.LIB files and their imports
  • interrogation techniques for .DLL files, and their exports
  • excavation of the mountains of protocol documents that Microsoft itself released to level the playing field for external competitors
  • sliding through the disassembly of compiled executables to find clues of “magic” constants

It was those kinds of spelunking exercises that taught me a great many of the things that I eventually wrote blog posts about, all based on publicly accessible information that nobody in the public was finding on their own.

Now I wasn’t trying to hone a more cogent book proposal so much as looking for the inspiration for future blog posts, but at least I knew that I was on a track in which I could believe.

And then Microsoft took my Blog down and a few determined fans/friends/colleagues helped me to reconstitute it.

At this point, I can look at WordPress stats on sites referring to specific blog posts and searching for more information that they may or may not be finding. Each such point is one that Microsoft really ought to seriously consider covering if they want to be able to credibly claim that they are focused on what their customers need.

There is literally not a single day that goes by that people don’t come for more information on MSKLC, MSLU, keyboard layouts in general, diacritic stripping, and more, including a particular blog post that has without fail been getting at least dozens and occasionally hundreds of hits a day:

Private fonts: For members only

This entire area is an undocumented mess that I am willing to let them just take the text and use it.

Because if I can’t write a book named RTFM, then maybe someone from Microsoft could take a moment out their busy schedule to WTFM (or at least one of these under documented chapters from it!).

Sorry, but Sorting it all Out has often been about sex for the last decade

The persona of SiaO started out on the CompuServe MS Access forum hosted by Microsoft many years ago.

And starting in the end of 2004, it took on the support of Microsoft Windows, Microsoft Office, Unicode, and language/linguistic issues in general as a theme.

Then, it died for having the nerve to be outraged at certain specific aspects of Microsoft’s patent policy — ending on one patent plaque representing a specific patent based entirely on prior art (which I contrasted with another patent that Google fought for and eventually lost despite the fact that Microsoft specifically chose to not develop and two other technologies — MSLU and MSKLC — that I chose not to pursue patents for since despite some of their groundbreaking, industry changing themes were also based on prior art).

As an aside, I’ll mention my outrage over the fact that to date despite the decreasing relevance for both Microsoft and the entire industry for MSLU coupled with the opposite for MSKLC, the former has a specific Wikipedia article while the latter does not.

And finally, SiaO has been reborn as a hosted WordPress Blog in large part to help keep the information — and faith — alive, despite Microsoft’s efforts to squelch it.

In one sense, Microsoft has won, since they have obliterated most of my samples.

In another, deeper sense, Microsoft has lost, since the entire season SiaO Blog has mainly been about something else the entire time.


Not just the obvious flirting in almost the very beginning between Andrea and I in which led shortly thereafter into one of the most more intense yet brief sexual relationships in my life, followed by one of the best friendships unafraid to overtly hint at a sex life neither of us could ever have.

And not in one of the more longer running friendships of my life — my one with Liz that would have been a lot about sex if I had only been smart enough to realize that love and sex was what it was about, until she was gone, leaving only an easter egg type reference in a DLL name in Microsoft Windows (which would have been much more brilliant had it been intentional but even so).

Or one of the blogs that was almost more about sex than any other — the one about alphabet soup — a blog that never had to stoop to such obvious — and tacky — clichés as “cunning linguist”  to make it’s obfuscationarily obvious point.

I could even point out blogs like the one about the power over women (and men!) by knowing more about Schrödinger’s cat than even Erwin intended — but that just of proves the point. Besides, Erwin might’ve been gettin some out of it, too!

Of course, the interest in talented singer/songwriters in general has led to its own share as well, mostly not from the singer/songwriters themselves. It is just something their creativity inspires, I suppose.

I cannot underestimate the fans of SiaO Blog and even the CompuServe MS Access forum who each decided that if I was anything like my online persona that I would be worth at least a thirty day try. Thus from Claire to Trisha to Lynn to Debra to Clarissa to the rest of the women who were intrigued enough by me to give me a try but smart enough to escape, I suppose in the end it was largely about sex too.

Finally, there were the literally dozens and dozens of blogs about genitive date formats.

Though I guess those were principally based on gender.

Which is another word for sex, of course.

This blog is about a love story. And a breakup. With Dell…

Alternate title: Dell has succeeded in permanently curing me of my love of Dell Latitudes

I used be addicted to Dell laptops.

For the last twenty years, I have had at no fewer than one and at times up to five Dell laptops.

Usually Latitudes, but occasionally Inspirons.

I always bought them myself and did almost all of the dev and PM work on them, using my share of the hardware budgets for test machines and 2nd monitor flat screens.

But now, after two decades, after having written every line of code of consequence, be it Microsoft Access wizard or VB wizard or MSLU or MSKLC, I am four years into my last Dell laptop.

After one abortive bout with an Inspiron, I have always had next business day service for problems, which I needed less often in the earlier days and more often as the years went on and as refurbished replacements proved to be less properly refurbished.

This last Dell Latitude E6500 required 12 attempts at system board replacements for five repairs, due to either the wireless network card (on the system board) or the smart card reader (also on the system board) not working properly, or both.

it got to the point where I would request they send 4 refurbished system boards at a time so that when one or the other (or both) wasn’t working, they wouldn’t have to wait another day but they always refused, as the service agreement didn’t cover it.

Thus the multiple visits and the increased cost (to Dell, not to me) for the service calls, which my request for sending multiple refurbished system boards would have saved!

In other words, their policies combined with the incompetence of the quality of their refurbishing have viciously conspired to cost Dell a large amount of money.

The most recent attempt at replacing the system board ended in failure after five attempts, keeping one of the boards with a working wireless card but a non-working smart card reader the best available option after the final badly refurbished system board introduced problems to the touchpad not working properly.

I now use an external smart card reader attached via USB.

The service techs (usually but not always the same guys from visit to visit) agree with my requesting sending multiple system boards, for the same reason I do. But it isn’t up to them, and the asinine Dell policies that cost them more money and time and me more time and that caused the last failed attempt at next day onsite service to take nearly two weeks have succeeded in permanently curing me of my love of Dell Latitudes.

I just can’t do it anymore. It isn’t the company it once was, and I can’t waste any more time for the mythical next business day onsite service that can’t be fixed even after weeks of trying.

Well, if Michael Dell called me up after reading this blog and told me was instituting a zero tolerance policy on faulty refurbishings and promised to let them send out four system boards, I would gladly come back. but otherwise…

As I move on to my Lenovo and my Surface, I’ll think back to the old days and what I used to have with the old Latitudes. The C600, the D800, the D820, and all the others, ending with the E6500.

This relationship quite literally gave birth to the Partial Replica Wizard in Microsoft Access.

And the Publish to the Web Wizard in Microsoft Access.

And the Exchange and Outlook Import Wizard in Microsoft Access.

And the bulk of the maintenance of almost all of the wizards in Microsoft Access from 1997 to 2000.

And the independently produced Form/Report to Data Access Page Wizard and the many Trigeminal Software free utilities, components, and tools.

And the VBA in VB Wizard.

And the Desktop Passthrough feature in WIN CE that I wrote the spec for as a contract PM on a Dell Latitude over 15 years ago – my first feature PM role ever!

And a lot of code and data involving collation.

And hundreds of thousands of data updates and fixes involving locales.

And almost every keyboard layout added to Windows from XP SP2 to the upcoming Windows 8.1.

And the Microsoft Layer for Unicode on Win95/98/ME Systems (aka MSLU, aka unicows.dll).

And the Microsoft Keyboard Layout Creator (aka MSKLC 1.3 and 1.4).

These are by no means children. But they are as close as I’ll ever come to having them for reasons previously stated and they have helped a lot of people, all over the world. I have a bit of ‘father’s pride’ for some of them – certainly for MAKLC, who I am working on again now, mostly on my Dell Latitude E65000.

I leave with no regrets. I’m only mildly embarrassed to call this the fourth most meaningful relationship I have ever had. And, all things considered, one of the most significant ones. Certainly the one with the most impact to everyone else.

When my decisions come back to haunt me (and/or others!)

A little over two half decades ago, I made a particular technical decision for a project I was working on at Microsoft.

I mention the reason over a half decade ago in a blog in this Blog o’ mine.

And a little under two days ago, a blog by Eric Lawrence brought it all home to roost.

His blog on EricLaw’s IEInterals titled Brain Dump: Shims, Detours, and other “magic” is a good read, and describes a fascinating bug involving IE10, a third party extension IE10 ships, and MSLU, the Microsoft Layer for Unicode.

You can read the full blog (it’s a good read!) but I’ll quote the relevant portion here:

I spent several hours pondering this question and aimlessly touring around in the debugger. I was whining about this scenario to a colleague, complaining about code so ancient that it was shipping with unicows.dll, when I realized that I’d never used this library myself, and in fact I’d never seen a toolbar use it before. When trying to explain what it did to the colleague, I decided that I’d probably stop hand-waving and pulled up unicows up on Wikipedia. And bam, there it was, plain as day: 

By adding the UNICOWS.LIB to the link command-line [ … ] the linker will resolve referenced symbols with the one provided by UNICOWS.LIB instead. When a wide-character function is called for the first time at runtime, the function stub in UNICOWS.LIB first receives control and [ … ] if the OS natively supports the W version (i.e. Windows NT/2000/XP/2003), then the function stub updates the in-memory import table so that future calls will directly invoke the native W version without any more overhead.

…and there’s the problem!

When IE first loads a toolbar, the shims run against the module and wrap all calls to CreateWindow with a call to the compatibility wrapper function. But when IE loaded this toolbar, it didn’t find any calls to CreateWindow, because those calls had been pointed at a function inside unicows.dll instead of at the original function in user32.dll. As a result, the compatibility shim wasn’t applied, and the function call failed.

Now, this wouldn’t have happened if unicows did its import-table fixup the “normal” way, using the GetProcAddress function. That’s because the compatibility shims are applied to GetProcAddress as well, and the fixup would have been applied properly at the time that unicows did the update of the import table. However, for reasons lost to the mists of time, the implementers of unicows instead copied the source code of GetProcAddress from user32 into their own DLL, so the shims had no way to recognize it. While we could add a new shim to handle unicows.dll, the obscurity and low priority of this scenario mean that we instead decided to outreach to the vendor and request that they update their build process to remove the long-defunct support for Windows ‘9x.

Well, I’ll object a little about the characterization that things that feel so recent to me are “lost to the mists of time”. :-)

Though I won’t complain too much, since the issue in question caused him to be randomized so obnoxiously!

The blog my mine that covers the issue is from point one of May of 2005’s Why does MSLU wrap ________ ?:

1) There is, for example, the GetProcAddress function. It takes a string, but never a Unicode string, on NT or otherwise. So why would it need to be wrapped?
Well, it turns out that the GetMonitorInfo function, defined in multimon.h, is not just a simple prototype. There is a bunch of complex code in it that conditionally calls various APIs, including GetProcAddress, to get a function pointer to replace any call to GetMonitorInfo. Because of this, MSLU could not wrap the GetMonitorInfo function, because the wrapper would never be used. The only way to allow the to wrapper to work was to wrap GetProcAddress and look for where someone was trying to retrieve the address of GetMonitorInfoA or GetMonitorInfoW!

This was back in the heady days when I had the DaveC like power to have influence on pretty much any function in multiple versions of Windows.

Even if the versions were Windows 95, Windows 98, and Windows Me.

I suppose there is a small procedural problem with trusting a troubled perfectionist such as myself to act as sole architect/program manager, principal developer, and only tester on a project.

But my manager at the time had quite a knack for making me feel slightly foolish while asking questions that in retrospect seem quite reasonable like

Don’t we need someone with PM experience here?


Should I really be in the only one in charge of testing  code I wrote myself?

while simultaneously making me feel like I could get the job done.

So perhaps I can be forgiven this particular sin.

Though really I think I owe Eric lunch one of these days to apologize.

Eric — sorry about that! Call me after I get back from Brisbane in a couple of weeks! :-)

LOAD_LIBRARY_AS_DATAFILE intends to be an underachiever

The recent question reminded me of something:


We recently switched over to using LOAD_LIBRARY_AS_DATAFILE for our INTL dlls, which excludes the DLL from the list of loaded modules.

We tend to get a lot of Watson crashes of mismatched intl dll testing. Without having the intl DLLs in the list of modules, we can’t tell the version anymore.

Is there a workaround other than manually loading the version and sticking it in some global?

It reminded me of how when you linked to unicows.lib to load/use the Microsoft Layer for Unicode, you’d suddenly “lose” all of your Unicode exports in the binary’s official export table!

Kind of a required feature of the MSLU loader, that — to redirect all those Unicode calls! :-)

In this case, LOAD_LIBRARY_AS_DATAFILE really is working as designed.

One of the features of it is lower overhead, which includes both not running init code, and not showing up in the loaded dependent modules.

If you need that info, you either have to back out the change, or load all of the information yourself.

Other solutions such as loading them the okld way under debug won’t help if you want to look at Watson crashes, since customers will seldomly be using a debug build of your product!

Since you are loading the DLL as a datafile to get it’s string resources, you can definitely load up the version info.

You can even write code to detect problems or even fix them — and even find bugs earlier! :-)

Now you know what it’s like to live in my brain….

Where were you at 10:54am on February 28, 2001?

It was a Wednesday, if that helps you remember.

Or, if you are more event oriented, it was the date and time that the “clocked at 6.8” Nisqually intraplate earthquake happened.

I was at work, in Building 9 at Microsoft.

I had come in early that day because I was excited about finding the fix for a bug in the Microsoft Layer for Unicode on Win9x Systems, which was going to be announced soon. In fact Cathy and I got the approval to not turn in our slides for our stodgy sounding Unicode on Downlevel Windows talk at the 18th Internationalization and Unicode conference in Kowloon Bay (HongKong). We broadly hinted that it was something e couldn’t talk about yet but they wouldn’t regret sticking with us (our slides were technically late at that point, but since both of us were on the committee for the conference we had some ability to influence and plead to not be replaced by a backup talk.

But alas, I digress.

Anyway, I was working on this bug that I had found a fix for, and wanted to make sure it wouldn’t cause performance problems.

Going on with me personally, the Multiple Sclerosis was (really just in the few months prior) starting to have a more marked effect on my balance, as I had been moving from an ‘occasionally falls down” place to a more “depends on the cane to not fall down all the time” place. and I had moved from mere disequilibrium (where I wouldn’t feel unsteady but the ground would suddenly come up at me) to a more overt feeling of unsteadiness that I could no longer ignore but was doing my best to not pay attention to.

People in the hallway were making noise all of the sudden. So I grabbed my cane and got up to investigate.

Everyone described what was happening with us all pretty much poking our heads out of our office doors, basically standing in our door frames because of some vague notion that this would be safer.

We were a bunch of n00bs when it came to earthquakes, and all of my previous seismic experience (time spent in Japan and in Southern California) usually involved my being somewhat intoxicated and/or romantically entangled, so it wasn’t like I had much to add anyway.

I didn’t feel anything different, though.

My world had been going topsy turvy all the time now. Though I did have one comment on the matter that I made to the people looking out into the hallway:

Now you know, now you know what it’s like to live in my brain.

We had no injuries; the epicenter was far away from us.

And we did all get back to work after that, and much later when an “emergency procedure” manual showed up in all our offices, even the page explaining what to do in case of volcanic eruption (call reception, don’t leave the building or touch lava) had a slight edge to it beyond the obvious humor, since if we could feel an earthquake did lava seem so very out of the question?

Of course those manuals are gone, so we have no idea what to do In Case of Lava….

But alas, I digress again.

Anyway, there you go — my experience of the Nisqually intraplate earthquake of 2001. It was good it happened late enough that people were around or I may not have even noticed the ~46 seconds that everyone in the Pacific Northwest got a little bit of what it was like to be me….

You’re welcome, of course.

I serve at the pleasure of the customer (except maybe when they annoy me?)

Over in the Suggestion Box, regular reader Yuhing Bao asked:

What do you think about going to you directly via going through PSS?

He was referring to a conversation going on in the comments of a blog of mine from over 4 years ago titled Is MSLU still supported?.

I was pointing out how in the specific case of MSLU at that time, if people asked a question of PSS it would make its way to me eventually, and if people asked me directly then it would also make its way to me.

I know that some people are more comfortable with one way, some with the other. They both work, so really I was slightly annoyed when the same request got to me via many different channels but I really did not judge one channel as better than the other.

I mean, I serve at the pleasure of the customer (except perhaps when they annoy me?), so why should I judge them for which way they like to talk unless their way is every way? :-)

Now this is going back half a decade ago, when the landscape in PSS was pretty different.

These days, when I send notes to specific folks in PSS about writing a KB article on a particular topic, they tell me that someone else does those now. It is no longer PSS writing them based on specific cases where they provided assistance (and KB articles became a way that the help could get to others, whether by another PSS engineer finding it or a customer finding it directly).

And I suddenly realized it had been a while since I had received email from a PSS engineer asking me about a customer question.

Over the past six months I had probably had more interaction with the VP I mentioned in Are you Mr. Kaplan? (and he is now in customer and partner advocacy) than I had with anyone in PSS.

I know product support still exists, thouh now the only trace I see of it is in PSS folk asking questions of some of the distribution lists I’m on.

They get answers and therefore customers still get answers.

So perhaps this change, this shift, this (dare I say it?) re-organization has not impacted Product Support Services in a negative way.

Though I know I am not really contributing a much as I used to.

So while I would have used to have said “ask any way you like!” about MSLU or topics I know about, maybe now I’d say “if you think it is something I know about and you want an answer from me, you should probably ask here, via the Suggestion Box.” Because otherwise I may never see the question, and I am probably less likely to be a significant contributor to the response.

if I don’t know the answer I’ll point you to PSS. And if you ask the question via multiple routes I am less likely to even know about it so perhaps the annoyance factor isn’t a factor for me anymore.

So I guess you can just ask whoever and how-many-whoevers you wish to, based on your own personal preferences. This may be the most efficient org structure yet built for customer satisfaction via support.

Well, at least until the next re-org….

Bytes and Characters and bugs and W’s

There are times that I am very happy for some of the eccentricities of the way I look at code.

And the way they keep me from certain kinds of bugs.

Like a few hours ago when I happened to spot Matthew Wilson’s memset() Considered Harmful – especially to those who (think they) know what they’re doing! blog.

Just the title at first.

And two things immediately came to mind.

The first thing?

I know the problem he ran into.

Did you see it too? Before you clicked on the link, I mean. :-)

The second thing that came to mind?

Too bad he didn’t use wmemset; it would have saved some time here!

The truth is that one of the biggest sources of bugs if one moves a lot between Unicode and non-Unicode programming is byte/character count problems. In fact that is one of the great things about wmemset, the way it (and its ilk) takes that particular variable out of the equation even if one doesn’t happen to have std::fill_n() at one’s disposal. :-)

My trial by fire for all of this was MSLU; the constant need on a per-function basis to be thinking about the Unicode and the non-Unicode kept me on my toes here and really drilled the issues into me to think very very carefully about buffer sizes. And also to feel smugly superior to all the Win9x code that tended to pop up with “bugs” occasionally related to non-Unicode buffers that were twice the size they needed to be except on the CJK versions where those were the expected buffers (and no they were not thinking ahead brilliantly, they were just messing up byte/character counts in WideCharToMultiByte calls!).

Now there are some flaws in the docs for wmemset and its ilk that I just noticed, like the security warning that really is two different problems between memset() and wmemset() and therefore deserves a bit of wordsmithing beyond a generic pointer to warnings about avoiding buffer overruns.

And the suggestion that the .Net Framework equivalent for memset() and wmemset() is System::Buffer::SetByte?

That’s a keeper, for sure. I mean what better way to introduce byte/character mismatches into the .Net world so elegantly than that method and a cast or two? :-)

Now of course the viewpoint doesn’t make me invulnerable to all bugs, it just makes a certain class a bug a lot less likely….

A blog about all the things that the old Blog was about!