I was doing some Win32 interop. stuff and, while searching headers and perusing the MSDN and defining constants and dll-imports in a happy bubble, I spotted some odd lines in WinNT.h (lines 6486-6488 in my version... er... 7.1a, I think)
#define STANDARD_RIGHTS_READ (READ_CONTROL)
#define STANDARD_RIGHTS_WRITE (READ_CONTROL)
#define STANDARD_RIGHTS_EXECUTE (READ_CONTROL)
I stared at this for a while, sipping my tea, wondering why these three constants are all defined to be the same value.
It's intriguing. Does anyone know?
Different types of kernel object have different pre-defined access masks for reading, writing, and executing.
For example, tokens use TOKEN_READ
, TOKEN_WRITE
and TOKEN_EXECUTE
. Files use FILE_GENERIC_READ
, FILE_GENERIC_WRITE
and FILE_GENERIC_EXECUTE
:
Compare the definitions of TOKEN_READ
and FILE_GENERIC_READ
:
#define TOKEN_READ (STANDARD_RIGHTS_READ |\
TOKEN_QUERY)
#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
FILE_READ_DATA |\
FILE_READ_ATTRIBUTES |\
FILE_READ_EA |\
SYNCHRONIZE)
STANDARD_RIGHTS_READ
is the set of standard access rights that need to appear in an object-type-specific access mask for reading. Similarly for STANDARD_RIGHTS_WRITE
and STANDARD_RIGHTS_EXECUTE
.
It happens to be the case that the standard access right you need for reading, writing and executing is READ_CONTROL
, so STANDARD_RIGHTS_READ
, STANDARD_RIGHTS_WRITE
and STANDARD_RIGHTS_EXECUTE
are all defined as that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With