Larry Osterman mentioned this almost in passing quite a while
ago, that the parameters to PostQueuedCompletionStatus are not
interpreted by the operating system. Well, obviously the first
parameter, the handle to the completion port, is interpreted as
the handle to the completion port. But the other parameters,
dwNumberOfBytesTransferred, dwCompletionKey, and lpOverlapped
are not interpreted at all. Even though they have names, the
names don't mean anything. Whatever values you pass for those
three parameters merely pop out of GetQueuedCompletionStatus
when the notification packet makes it to the head of the queue.
Why do the parameters have names if the names don't mean
anything?  Because the operating system itself will post
notifications to the completion port if you ask it to, and in
that case, the values returned by the GetQueuedCompletionStatus
function really mean something related to their names. For
example, if you issued an asynchronous read to a file that is
associated with a completion port, then