iphlpapi: Store an IO_STATUS_BLOCK at the end of the reply buffer if there's enough space available.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Gabriel Ivăncescu 2020-11-23 15:47:45 +02:00 committed by Alexandre Julliard
parent fb18f9fc6e
commit 1bae6b12e5
1 changed files with 14 additions and 0 deletions

View File

@ -325,6 +325,20 @@ done:
if (ier->Options.OptionsData)
ier->Options.OptionsData -= gap_size;
}
/* According to MSDN, the reply buffer needs to hold space for a IO_STATUS_BLOCK,
found at the very end of the reply. This is confirmed on Windows XP, but Vista
and later do not store it anywhere and in fact don't even require it at all.
However, in case old apps analyze this IO_STATUS_BLOCK and expect it, we mimic
it and write it out if there's enough space available in the buffer. */
if (gap_size >= sizeof(IO_STATUS_BLOCK))
{
IO_STATUS_BLOCK *io = (IO_STATUS_BLOCK*)((char*)reply_buf + reply_size - sizeof(IO_STATUS_BLOCK));
io->Pointer = NULL; /* Always NULL or STATUS_SUCCESS */
io->Information = reply_size - gap_size;
}
}
}