In the winbase.h
header, you can find the following line:
#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 )
STATUS_WAIT_0
is defined in the winnt.h
header as such:
#define STATUS_WAIT_0 ((DWORD)0x00000000L)
And DWORD
is typedef'd to unsigned long
.
My question is, why is 0
added to the STATUS_WAIT_0
value?
There are two possible reasons. The first is readability. If
there is a series of #define
s:
#define WAIT_OBJECT_0 ((STATUS_WAIT_0) + 0)
#define WAIT_OBJECT_1 ((STATUS_WAIT_0) + 1)
// ...
In this case, it makes sense to specify ((STATUS_WAIT_0) + 0)
for reasons of orthogonality: you are defining a series of
values based on STATUS_WAIT_0
, and it is just by accident that
this one happens to offset by 0
, rather than some other value.
The second possible reason involves integral promotion. The
author wanted WAIT_OBJECT_0
to have the promoted type of
STATUS_WAIT_0
, regardless of the type of STATUS_WAIT_0
. The
addition ensures integral promotion.
One important point that the other answers haven't addressed is that STATUS_WAIT_0
is one of the possible values of NTSTATUS
(NTSTATUS Values). NTSTATUS
is used primarily when writing device drivers.
When you perform a WaitFor...
on a thing, it's possible that execution will drop down into the kernel, and depending on what you're waiting for the result from the device driver will be an NTSTATUS
type (1)
For this reason it makes sense that the result of a Wait in user-mode is based on the result of a Wait in kernel mode, hence:
#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 )
Now, as to why we add the zero... as James Kanze states, it makes things much more readable in the cases where WAIT_OBJECT_1
were defined. Consistency is an important part of maintainability.
As for why STATUS_WAIT_0
is cast to a DWORD
... it's because the value of 0x0L
as a constant will vary depending on compiler, so the cast ensures you know exactly how big the type is.
(1) not being a writer of device drivers, I can make no assumptions that this statement is true 100% of the time, but it makes sense :)
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