X64 Article Questions & Clarifications
Finally, a response to some comments and questions about my x64 article.
Registry Fun
Noah Harrison thinks I got it backwards when I said: "As you'd expect, the OS provides an escape hatch for 32-bit applications to read the actual 64-bit registry value by specifying new flag values when calling RegOpenKey and friends."
To be honest, I'm not 100% sure. Try as I might, I'm unable to find the original source where I came up with the bit about a flag to RegOpenKey. It may exist, I'm just not finding it at the moment. Meanwhile, I realized that I didn't mention the RegDisableReflectKey API, which allows doing what I originally claimed.
Handle Sizes
Despite many reviews by myself and others, this snippet slipped by: "That is, a 64-bit pointer is 8 bytes, while int, long, DWORD, and HANDLE are still 4 bytes."
Handles are in fact defined as pointer values:
typedef
void *HANDLE;
Thus, in a Win64 world, a handle is 8 bytes. No real excuse for my slipup on this one. Just an over-generalization on my part.
Debug Registers
Nilesh Padribi asked about Debug Register support on the X64 CPU. The short version of the story is that the x86 debug registers are widened to 64-bits, and that's pretty much it. The longer version comes from the AMD documentation:
Like the control registers, debug registers DR0
–DR7 are expanded to 64 bits. In 64-bit mode, the MOV DRn instructions read or write all 64 register bits. Operand-size prefixes are ignored.
In all 16-bit or 32-bit modes (legacy or compatibility modes), writes to a debug register fill the upper 32 bits with zeros and reads from a debug register return only the lower 32 bits.
In 64-bit mode, the upper 32 bits of DR6 and DR7 are reserved and must be written with zeros. Writing a 1 to any of the upper 32 bits results in a general-protection exception, #GP(0). All 64 bits of DR0
–DR3 are writable by software. However, the MOV DRn instructions do not check that addresses written to DR0–DR3 are within the virtual-address limits of the implementation.
Also, a related note in another section of the AMD doc states that encodings are available for another eight registers (DR8-DR15), but that the current CPUs don't implement those registers.
Comments
- Anonymous
April 27, 2006
Matt is this what you are talking about?
http://msdn.microsoft.com/library/en-us/winprog64/winprog64/accessing_an_alternate_registry_view.asp?frame=true - Anonymous
April 28, 2006
Dimkaz,
Yup. That would be the flag I was thinking of. See KEY_WOW64_64KEY and KEY_WOW64_32KEY in the MSDN doc.
I knew that once I posted, the answer would come at me from several directions. :-)
Matt