I have an application that pings a bunch of servers. It runs great for days, but suddenly will have many failures of one of two types:
WSA_QOS_ADMISSION_FAILURE (11
It turns out that the error code 11010
is actually not WSA_QOS_ADMISSION_FAILURE
from WinSock (which is not involved here), but a completely different value from the IP stack's ICMP_ECHO_REPLY structure with much more meaningful meaning:
IP_REQ_TIMED_OUT (11010) The request timed out
You are supposed to call GetIpErrorString() first and only "if the function fails, use FormatMessage to obtain the message string for the returned error".
Unfortunately, that does not help with that other value, 998
.
One clue might be the page "Mapping NT Status Error Codes to Win32 Error Codes", which says that the NT status conditions which map (or mapped when it was last updated, in 2005) to the Win32 code 998 (ERROR_NOACCESS
) are more broad:
STATUS_DATATYPE_MISALIGNMENT ERROR_NOACCESS
STATUS_ACCESS_VIOLATION ERROR_NOACCESS
STATUS_DATATYPE_MISALIGNMENT_ERROR ERROR_NOACCESS
It seems likely that whenever something fails during the IOCTL call (which sends the ICMP echo request to the kernel to be really handled), the underlying exception is swallowed if possible and only this generic Win32 code is sent back.
Therefore it might be that you are really passing some not entirely correct data to the function (like unaligned buffer on the stack, that might explain why it happens sporadically), or even hint at some bug inside the ICMP stack. I'm afraid that only some hardcore kernel debugging could reveal the real cause.