The Old New Thing

Practical development throughout the evolution of Windows.

Latest posts

May 7, 2026
Post comments count 0
Post likes count 2

When you upgrade your resource strings to Unicode, don’t forget to specify the L prefix

Raymond Chen

Otherwise, it'll get mapped back down to the 8-bit code page.

May 6, 2026
Post comments count 8
Post likes count 1

Why not have changes in API behavior depend on the SDK you link against?

Raymond Chen

Static libraries don't stand a chance.

May 5, 2026
Post comments count 10
Post likes count 6

A dispute over the TAB key highlights a mismatch between Microsoft and IBM organizational structures

Raymond Chen

I want to speak to your manager.

May 4, 2026
Post comments count 1
Post likes count 2

How do I inform Windows that I’m writing a binary file?

Raymond Chen

You don't. All files are binary at the file system level.

May 1, 2026
Post comments count 1
Post likes count 1

Developing a cross-process reader/writer lock with limited readers, part 4: Abandonment

Raymond Chen

Recovering from death of the owner.

Apr 30, 2026
Post comments count 3
Post likes count 2

Developing a cross-process reader/writer lock with limited readers, part 3: Fairness

Raymond Chen

Let the exclusive acquisition have a fair chance against shared acquisitions.

Apr 29, 2026
Post comments count 1
Post likes count 2

Developing a cross-process reader/writer lock with limited readers, part 2: Taking turns when being grabby

Raymond Chen

Please, not everybody, everything all at once.

Apr 28, 2026
Post comments count 11
Post likes count 2

Developing a cross-process reader/writer lock with limited readers, part 1: A semaphore

Raymond Chen

A pot of tokens.

Apr 27, 2026
Post comments count 9
Post likes count 2

Looking at consequences of passing too few register parameters to a C function on various architectures

Raymond Chen

It's bad news no matter how you slice it, but Itanium makes it even worse.

Apr 24, 2026
Post comments count 3
Post likes count 2

Defending against exceptions in a scope_exit RAII type

Raymond Chen

But maybe it's not worth it.

Apr 23, 2026
Post comments count 12
Post likes count 2

Another crash caused by uninstaller code injection into Explorer

Raymond Chen

Inadvertently destroying a staircase while standing on it.

Apr 22, 2026
Post comments count 2
Post likes count 3

Mapping the page tables into memory via the page tables

Raymond Chen

So-called "fractal page mapping".

Apr 21, 2026
Post comments count 32
Post likes count 3

Sure, xor’ing a register with itself is the idiom for zeroing it out, but why not sub?

Raymond Chen

Somehow xor became the most popular version.

Apr 20, 2026
Post comments count 1
Post likes count 3

How did code handle 24-bit-per-pixel formats when using video cards with bank-switched memory?

Raymond Chen

You still have to use aligned accesses, even though the pixels might not be aligned.

Apr 17, 2026
Post comments count 1
Post likes count 4

Forgotten message from the past: LB_INIT­STORAGE

Raymond Chen

Preallocating memory to avoid quadratic behavior.

Apr 16, 2026
Post comments count 9
Post likes count 2

What’s up with window message 0x0091? We’re getting it with unexpected parameters

Raymond Chen

Trespassing on system messages.

Apr 15, 2026
Post comments count 0
Post likes count 2

Why is there a long delay between a thread exiting and the Wait­For­Single­Object returning?

Raymond Chen

Maybe it didn't really exit.

Apr 14, 2026
Post comments count 2
Post likes count 3

Why was there a red telephone at every receptionist desk?

Raymond Chen

Not a direct line to Bill Gates's office.

Apr 13, 2026
Post comments count 8
Post likes count 1

Finding a duplicated item in an array of N integers in the range 1 to N − 1

Raymond Chen

Taking advantage of special characteristics of the array.

Apr 10, 2026
Post comments count 3
Post likes count 2

How do you add or remove a handle from an active Wait­For­Multiple­Objects?, part 2

Raymond Chen

Waiting for the waiting thread to acknowledge the change.

Apr 9, 2026
Post comments count 4
Post likes count 2

How do you add or remove a handle from an active Wait­For­Multiple­Objects?

Raymond Chen

You can't, but you can cooperate with the other thread.

Apr 8, 2026
Post comments count 4
Post likes count 2

How do you add or remove a handle from an active Msg­Wait­For­Multiple­Objects?

Raymond Chen

You can't, but you can arrange for the waiter to do it for you.

Apr 7, 2026
Post comments count 9
Post likes count 6

Were there any Windows 3.1 programs that were so incompatible with Windows 95 that there was no point trying to patch them?

Raymond Chen

The permanently ineligible list.

Apr 6, 2026
Post comments count 3
Post likes count 2

Learning to read C++ compiler errors: Illegal use of -> when there is no -> in sight

Raymond Chen

If the compiler is complaining about things you didn't write, find out who wrote them.

Apr 3, 2026
Post comments count 3
Post likes count 2

How can I use Read­Directory­ChangesW to know when someone is copying a file out of the directory?

Raymond Chen

File copying is not a fundamental operation, nor is it even detectable at the file system layer.

Apr 2, 2026
Post comments count 0
Post likes count 4

Why doesn’t the system let you declare your own messages to have the same semantics as WM_COPY­DATA?

Raymond Chen

Tempting but misleading.

Apr 1, 2026
Post comments count 17
Post likes count 14

The cover of C++: The Programming Language raises questions not answered by the cover

Raymond Chen

What are we reading about here?

Mar 31, 2026
Post comments count 21
Post likes count 4

Before you check if an update caused your problem, check that it wasn’t a problem before the update

Raymond Chen

It was going to be like that when I got here.

Mar 30, 2026
Post comments count 4
Post likes count 3

A question about the maximimum number of values in a registry key raises questions about the question

Raymond Chen

Why is this even a question?

Mar 27, 2026
Post comments count 1
Post likes count 4

What if a dialog wants to intercept its own message loop?

Raymond Chen

You can steal them from your owner.

Mar 26, 2026
Post comments count 3
Post likes count 3

Why doesn’t WM_ENTER­IDLE work if the dialog box is a Message­Box?

Raymond Chen

Because it opted out.

Mar 25, 2026
Post comments count 2
Post likes count 4

How can I change a dialog box’s message loop to do a Msg­Wait­For­Multiple­Objects instead of Get­Message?

Raymond Chen

The dialog box lets you change how it waits.

Mar 24, 2026
Post comments count 6
Post likes count 6

Windows 95 defenses against installers that overwrite a file with an older version

Raymond Chen

A very primitive version of recovery.

Mar 23, 2026
Post comments count 14
Post likes count 4

How can I make sure the anti-malware software doesn’t terminate my custom service?

Raymond Chen

You'll have to ask nicely.

Mar 20, 2026
Post comments count 6
Post likes count 2

Windows stack limit checking retrospective: arm64, also known as AArch64

Raymond Chen

Wrapping things up.

Mar 19, 2026
Post comments count 8
Post likes count 3

Windows stack limit checking retrospective: amd64, also known as x86-64

Raymond Chen

Reaching the modern day.

Mar 18, 2026
Post comments count 1
Post likes count 1

Windows stack limit checking retrospective: Alpha AXP

Raymond Chen

Double the size, double the fun.

Mar 17, 2026
Post comments count 2
Post likes count 4

Windows stack limit checking retrospective: x86-32 also known as i386, second try

Raymond Chen

Appeasing the invisible return address predictor.

Mar 16, 2026
Post comments count 0
Post likes count 3

Windows stack limit checking retrospective: PowerPC

Raymond Chen

Doing the math backwards.

Mar 13, 2026
Post comments count 4
Post likes count 3

Windows stack limit checking retrospective: MIPS

Raymond Chen

Optimizing out the unnecessary probes comes with its own complexity.

Mar 12, 2026
Post comments count 9
Post likes count 3

Windows stack limit checking retrospective: x86-32, also known as i386

Raymond Chen

One of the weirdest calling conventions you'll see.

Mar 11, 2026
Post comments count 6
Post likes count 6

How do compilers ensure that large stack allocations do not skip over the guard page?

Raymond Chen

Don't take steps that are too large.

Mar 10, 2026
Post comments count 3
Post likes count 5

A snappy answer when asked about dressing casually at IBM

Raymond Chen

Oh, this old thing?

Mar 9, 2026
Post comments count 8
Post likes count 2

The fine print giveth and the bold print taketh away: The countdown timer

Raymond Chen

Think fast, no pressure.

Mar 9, 2026
Post comments count 2
Post likes count 2

Learning to read C++ compiler errors: Ambiguous overloaded operator

Raymond Chen

Look for the conflicting definitions to see where they are coming from.

Mar 6, 2026
Post comments count 11
Post likes count 2

When Read­Directory­ChangesW reports that a deletion occurred, how can I learn more about the deleted thing?

Raymond Chen

It's already gone. If you need more information, you should have been remembering it.

Mar 5, 2026
Post comments count 2
Post likes count 2

The mystery of the posted message that was dispatched before reaching the main message loop

Raymond Chen

Perhaps it's because you dispatched it.

Mar 4, 2026
Post comments count 6
Post likes count 2

Aha, I found a counterexample to the documentation that says that Query­Performance­Counter never fails

Raymond Chen

Of course, anything can happen if you break the rules.

Mar 3, 2026
Post comments count 18
Post likes count 2

Just for fun: A survey of write protect notches on floppy disks and other media

Raymond Chen

Just some useless trivia.

Mar 2, 2026
Post comments count 3
Post likes count 1

What sort of horrible things happen if my dialog has a non-button with the control ID of IDCANCEL?

Raymond Chen

You get notifications that might not make sense.

Feb 27, 2026
Post comments count 3
Post likes count 2

Intercepting messages inside Is­Dialog­Message, fine-tuning the message filter

Raymond Chen

Making sure it triggers when you need it, and not when you don't.

Feb 26, 2026
Post comments count 1
Post likes count 2

Intercepting messages inside Is­Dialog­Message, installing the message filter

Raymond Chen

Using an <CODE>Is­Dialog­Message</CODE> extension point.

Feb 25, 2026
Post comments count 4
Post likes count 1

Intercepting messages before Is­Dialog­Message can process them

Raymond Chen

Process the message before you let <CODE>Is­Dialog­Message</CODE> see it.

Feb 24, 2026
Post comments count 2
Post likes count 2

Customizing the ways the dialog manager dismisses itself: Isolating the Close pathway

Raymond Chen

Intercepting the flow in your message loop.