Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In WinNT.h, why are STANDARD_RIGHTS_READ, ...WRITE and ...EXECUTE defined to be the same?

Tags:

c++

winapi

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?

like image 280
Xharlie Avatar asked Oct 31 '22 21:10

Xharlie


1 Answers

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.

like image 152
arx Avatar answered Nov 06 '22 19:11

arx