Rather than have the Interactive Service return a custom 0x20000004
(ERROR_REGISTER_RING_BUFFERS) error, return the true GetLastError() code
that the TUN_IOCTL_REGISTER_RINGS provides.
Signed-off-by: Simon Rozman <simon@rozman.si>
Acked-by: Lev Stipakov <lstipakov@gmail.com>
Message-Id: <
20200205183841.1118-1-simon@rozman.si>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg19367.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
* that data is available for reading in send ring
* @param receive_tail_moved event set by openvpn to signal wintun
* that data has been written to receive ring
- * @return true if registration is successful, false otherwise
+ * @return true if registration is successful, false otherwise - use GetLastError()
*/
bool register_ring_buffers(HANDLE device,
struct tun_ring *send_ring,
}
static bool
-wintun_register_ring_buffer(struct tuntap *tt)
+wintun_register_ring_buffer(struct tuntap *tt, const char *device_guid)
{
bool ret = true;
tt->rw_handle.read,
tt->rw_handle.write))
{
- msg(M_NONFATAL, "Failed to register ring buffers: %lu", GetLastError());
+ switch (GetLastError())
+ {
+ case ERROR_ACCESS_DENIED:
+ msg(M_FATAL, "Access denied registering ring buffers. Is this process run as SYSTEM?");
+ break;
+
+ case ERROR_ALREADY_INITIALIZED:
+ msg(M_NONFATAL, "Adapter %s is already in use", device_guid);
+ break;
+
+ default:
+ msg(M_NONFATAL | M_ERRNO, "Failed to register ring buffers");
+ }
ret = false;
}
if (!RevertToSelf())
if (tt->windows_driver == WINDOWS_DRIVER_WINTUN)
{
/* Wintun adapter may be considered "open" after ring buffers are successfuly registered. */
- if (!wintun_register_ring_buffer(tt))
+ if (!wintun_register_ring_buffer(tt, device_guid))
{
msg(D_TUNTAP_INFO, "Failed to register %s adapter ring buffers", device_guid);
CloseHandle(tt->hand);
#define ERROR_STARTUP_DATA 0x20000001
#define ERROR_MESSAGE_DATA 0x20000002
#define ERROR_MESSAGE_TYPE 0x20000003
-#define ERROR_REGISTER_RING_BUFFERS 0x20000004
static SERVICE_STATUS_HANDLE service;
static SERVICE_STATUS status = { .dwServiceType = SERVICE_WIN32_SHARE_PROCESS };
if (!register_ring_buffers(ring_buffer_handles->device, send_ring, receive_ring,
ring_buffer_handles->send_tail_moved, ring_buffer_handles->receive_tail_moved))
{
+ err = GetLastError();
MsgToEventLog(M_SYSERR, TEXT("Could not register ring buffers"));
- err = ERROR_REGISTER_RING_BUFFERS;
}
return err;