The Old New Thing
Practical development throughout the evolution of Windows.
Latest posts
How do you add or remove a handle from an active WaitForMultipleObjects?, part 2
Waiting for the waiting thread to acknowledge the change.
How do you add or remove a handle from an active WaitForMultipleObjects?
You can't, but you can cooperate with the other thread.
How do you add or remove a handle from an active MsgWaitForMultipleObjects?
You can't, but you can arrange for the waiter to do it for you.
Were there any Windows 3.1 programs that were so incompatible with Windows 95 that there was no point trying to patch them?
The permanently ineligible list.
Learning to read C++ compiler errors: Illegal use of -> when there is no -> in sight
If the compiler is complaining about things you didn't write, find out who wrote them.
How can I use ReadDirectoryChangesW to know when someone is copying a file out of the directory?
File copying is not a fundamental operation, nor is it even detectable at the file system layer.
Why doesn’t the system let you declare your own messages to have the same semantics as WM_COPYDATA ?
Tempting but misleading.
The cover of C++: The Programming Language raises questions not answered by the cover
What are we reading about here?
Before you check if an update caused your problem, check that it wasn’t a problem before the update
It was going to be like that when I got here.
A question about the maximimum number of values in a registry key raises questions about the question
Why is this even a question?
What if a dialog wants to intercept its own message loop?
You can steal them from your owner.
Why doesn’t WM_ENTERIDLE work if the dialog box is a MessageBox?
Because it opted out.
How can I change a dialog box’s message loop to do a MsgWaitForMultipleObjects instead of GetMessage?
The dialog box lets you change how it waits.
Windows 95 defenses against installers that overwrite a file with an older version
A very primitive version of recovery.
How can I make sure the anti-malware software doesn’t terminate my custom service?
You'll have to ask nicely.
Windows stack limit checking retrospective: arm64, also known as AArch64
Wrapping things up.
Windows stack limit checking retrospective: amd64, also known as x86-64
Reaching the modern day.
Windows stack limit checking retrospective: Alpha AXP
Double the size, double the fun.
Windows stack limit checking retrospective: x86-32 also known as i386, second try
Appeasing the invisible return address predictor.
Windows stack limit checking retrospective: PowerPC
Doing the math backwards.
Windows stack limit checking retrospective: MIPS
Optimizing out the unnecessary probes comes with its own complexity.
Windows stack limit checking retrospective: x86-32, also known as i386
One of the weirdest calling conventions you'll see.
How do compilers ensure that large stack allocations do not skip over the guard page?
Don't take steps that are too large.
A snappy answer when asked about dressing casually at IBM
Oh, this old thing?
The fine print giveth and the bold print taketh away: The countdown timer
Think fast, no pressure.
Learning to read C++ compiler errors: Ambiguous overloaded operator
Look for the conflicting definitions to see where they are coming from.
When ReadDirectoryChangesW reports that a deletion occurred, how can I learn more about the deleted thing?
It's already gone. If you need more information, you should have been remembering it.