The Old New Thing
Practical development throughout the evolution of Windows.
Latest posts

The normal string manipulation functions stop on a null terminator, so be careful when manipulating double-null-terminated strings

One of the many gotchas of working with double-null-terminated strings is accidentally using functions on them which were designed to operate on single-null-terminated strings. Now, you do need to use those single-null-terminated strings, but you also need to know when they won't do what you want. One of the responses to my psychic detection that somebody passed a single-null-terminated string to is, "Oh, no, I double-null-terminated it. Look: See, I put an extra at the end." Well, yeah, you put an extra at the end, but all that does is terminate the format string. The function accepts its format st...

Don't forget to double-null-terminate those strings you pass to SHFileOperation

About once every two months for the past six months (I stopped checking further back), somebody reports a problem with the function. Often, they don't include very much information at all. They just say, "I call the function and it doesn't work." Here's an example: I'm hitting a problem with when using it to frob files in the gonzo directory when the user's SID ends in an odd number. The function returns file not found, but the file is definitely there. If you read the variable names carefully, you can see the problem. The and members of the structure are double-null-terminated strings. (There's...

Happy birthday, Windows 2000, and try not to get too hung over

On this date ten years ago, Windows 2000 launched in San Francisco. One of my colleagues was working as a staff member at the Windows 2000 Conference and Expo in San Francisco, an event which accompanied the Windows 2000 launch event. Also working at the event was his boss's boss, and the two shared a hotel room. Their flight back to Redmond wasn't until late in the afternoon, so they decided to spend their last day in San Francisco being tourists in their host city. Hopping on a cable car, walking down the crooked street, seeing the sights in Chinatown and Fisherman's Wharf, all the standard tou...

The fundamental rule of rocket science

Pretty straightforward.

It rather involved being on the other side of this airtight hatchway: Dubious escalation

Consider this type of dubious security vulnerability: There is a buffer overflow bug in kernel driver X. To exploit it, call this function with these strange parameters. The exploit works only if you are logged on as administrator, because non-administrators will get . Yes, this is a bug, and yes it needs to be fixed, but it's not a security bug because of that only if you are logged on as an administrator clause. It's another variation of the dubious elevation to administrator vulnerability. After all, if you're already an administrator, then why bother attacking kernel mode in this complicated way? Ju...

Advocating the overthrow of the government of the United States by force or subversion

It has been widely reported that South Carolina now requires "subversive groups" to register with the Secretary of State (and pay a $5 filing fee). Curiously, the list of organizations which must register include "an organization subject to foreign control." I wonder if this means that all consulates have to register, and that when any foreign dignitary visits South Carolina, they have to pay a $5 filing fee. (Not to mention all foreign-owned companies like Shell Oil.) Actually, it has been pointed out that a "subversive organization" includes one which advocates, teaches, or practices the propriety of contro...

Private classes, superclassing, and global subclassing

In the suggestion box, A. Skrobov asks why it's impossible to superclass , but the example that follows is not actually superclassing. When I register my own class under this atom, and leave NULL in WNDCLASS.hInstance, Windows fills it in for me. Then I have two distinct classes registered: (0,WC_DIALOG) and (hMyInstance,WC_DIALOG), and DialogBox functions all use the first one. This question is a bit confused, since it says that the goal is to superclass the dialog class, but registering is not superclassing. First, I'll refer everyone to this MSDN article which describes the various ways of manipulati...

A decidedly Canadian response to the shambles that was the running portion of the modern pentathlon in Beijing

Living so close to the United States-Canada border means that there's a lot of friendly teasing of the many Canadians in our midst. It's a good thing Canadians as a whole seem to have a pretty good sense of humor about it. (Well, except the Quebecers. Those humorless grumps.) The final stage of the modern pentathlon is supposed to be a cross-country course, run through grassy fields, with occasional obstacles like a brook that needs to be hurdled. At the 2008 Olympics in Beijing, however, the course didn't so much resemble a cross-country run as it did waiting in line at Disneyland. Instead of traversing an outd...

How do I get information about the target of a symbolic link?

Functions like and , when asked to provide information about a symbolic link, returns information about the link itself and not the link destination. If you use the function, you can tell that you have a symbolic link because the file attributes will have the flag set, and the member will contain the special value . Okay, great, so now I know I have a symbolic link, but what if I want information about the link target? For example, I want to know the size of the link target, its last-modified time, and its name. To do this, you open the symbolic link. The I/O manager dereferences the symbolic link and gives...