Here's a good interview question...
Find a bug in RtlRetrieveUshort/Ulong macros in ntddk.h
(DDK 3790.1830 / wnet)
For x86 RtlRetrieveUshort, RtlRetrieveUlong are defined as:
#define RtlRetrieveUshort(DEST_ADDRESS,SRC_ADDRESS) \
if ((ULONG_PTR)SRC_ADDRESS & SHORT_MASK) { \
((PUCHAR) DEST_ADDRESS)[0] = ((PUCHAR) SRC_ADDRESS)[0]; \
((PUCHAR) DEST_ADDRESS)[1] = ((PUCHAR) SRC_ADDRESS)[1]; \
} \
else { \
*((PUSHORT) DEST_ADDRESS) = *((PUSHORT) SRC_ADDRESS); \
} \
Answer: SRC_ADDRESS must be enclosed in braces,
or evil will happen. How to repro:
#include <ntddk.h>
void foo( void ) {
UCHAR x[] = { 1,2,3,4,5,6,7,8,9,0 };
PUCHAR p = &x[1];
USHORT y;
RtlRetrieveUshort( &y, p + 6 ); // fails
RtlRetrieveUshort( &y, p + 1 ); // works
}
Same with RtlRetrieveUlong.
Regards,
--PA