If you want to disable 64-bit file system redirection, you call the Wow64DisableWow64FsRedirection function. This function gives you a cookie. When you are finished, you call Wow64RevertWow64FsRedirection, passing the cookie you received from the previous call. Like this:
void* cookie;
if (Wow64DisableWow64FsRedirection(&cookie)) {
... do stuff ...
Wow64RevertWow64FsRedirection(cookie);
}
The unfortunate thing is that the data type for the cookie is an untyped pointer: void*. This means that the following mistake goes undetected:
// Remember: Code in italics is wrong.
void* cookie;
if (Wow64DisableWow64FsRedirection(&cookie)) {
... do stuff ...
Wow64RevertWow64FsRedirection(&cookie);
}
The erroneous parameter to Wow64RevertWow64FsRedirection goes undetected because void** is implicitly convertible to void*. Because any pointer is implicitly convertible to void*, because void* is a generic pointer.
In retrospect, the type of the cookie used by the file system redirection functions should have been something other than void*. It could have used DECLARE_HANDLE, which declares a pointer to a dummy structure with a unique name. Or it could have been a pointer to a uniquely-named incomplete type.
0 comments