From e33cc74527aa815e6137dae570573004495381c3 Mon Sep 17 00:00:00 2001 From: basil00 Date: Thu, 21 Feb 2019 09:13:31 +0800 Subject: [PATCH] Remove overlapped I/O from streamdump. This just complicated the sample. Furthermore, it was unclear if the implementation was correct anyway. --- examples/streamdump/streamdump.c | 78 ++------------------------------ 1 file changed, 5 insertions(+), 73 deletions(-) diff --git a/examples/streamdump/streamdump.c b/examples/streamdump/streamdump.c index 09c8424..ff466ca 100644 --- a/examples/streamdump/streamdump.c +++ b/examples/streamdump/streamdump.c @@ -1,6 +1,6 @@ /* * streamdump.c - * (C) 2018, all rights reserved, + * (C) 2019, all rights reserved, * * This file is part of WinDivert. * @@ -40,8 +40,6 @@ * The program works by "reflecting" outbound TCP connections into inbound * TCP connections that are handled by a simple proxy server. * - * This program also demonstrates WinDivert asynchronous I/O. - * * usage: streamdump.exe port */ @@ -114,24 +112,6 @@ static void message(const char *msg, ...) #define warning(msg, ...) \ message("warning: " msg, ## __VA_ARGS__) -/* - * Cleanup completed I/O requests. - */ -static void cleanup(HANDLE ioport, OVERLAPPED *ignore) -{ - OVERLAPPED *overlapped; - DWORD iolen; - ULONG_PTR iokey = 0; - - while (GetQueuedCompletionStatus(ioport, &iolen, &iokey, &overlapped, 0)) - { - if (overlapped != ignore) - { - free(overlapped); - } - } -} - /* * Entry. */ @@ -148,9 +128,6 @@ int __cdecl main(int argc, char **argv) WINDIVERT_ADDRESS addr; PWINDIVERT_IPHDR ip_header; PWINDIVERT_TCPHDR tcp_header; - OVERLAPPED *poverlapped; - OVERLAPPED overlapped; - HANDLE ioport, event; DWORD len; // Init. @@ -174,16 +151,6 @@ int __cdecl main(int argc, char **argv) GetLastError()); exit(EXIT_FAILURE); } - ioport = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); - if (ioport == NULL) - { - error("failed to create I/O completion port (%d)", GetLastError()); - } - event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (event == NULL) - { - error("failed to create event (%d)", GetLastError()); - } // Divert all traffic to/from `port', `proxy_port' and `alt_port'. r = snprintf(filter, sizeof(filter), @@ -200,10 +167,6 @@ int __cdecl main(int argc, char **argv) { error("failed to open the WinDivert device (%d)", GetLastError()); } - if (CreateIoCompletionPort(handle, ioport, 0, 0) == NULL) - { - error("failed to associate I/O completion port (%d)", GetLastError()); - } // Spawn proxy thread, config = (PPROXY_CONFIG)malloc(sizeof(PROXY_CONFIG)); @@ -224,31 +187,11 @@ int __cdecl main(int argc, char **argv) // Main loop: while (TRUE) { - memset(&overlapped, 0, sizeof(overlapped)); - ResetEvent(event); - overlapped.hEvent = event; - if (!WinDivertRecvEx(handle, packet, sizeof(packet), &packet_len, 0, - &addr, NULL, &overlapped)) + if (WinDivertRecv(handle, packet, sizeof(packet), &addr, &packet_len)) { - if (GetLastError() != ERROR_IO_PENDING) - { -read_failed: - warning("failed to read packet (%d)", GetLastError()); - continue; - } - - // Timeout = 1s - while (WaitForSingleObject(event, 1000) == WAIT_TIMEOUT) - { - cleanup(ioport, &overlapped); - } - if (!GetOverlappedResult(handle, &overlapped, &len, FALSE)) - { - goto read_failed; - } - packet_len = len; + warning("failed to read packet (%d)", GetLastError()); + continue; } - cleanup(ioport, &overlapped); WinDivertHelperParsePacket(packet, packet_len, NULL, &ip_header, NULL, NULL, NULL, &tcp_header, NULL, NULL, NULL, NULL, NULL); @@ -294,18 +237,7 @@ read_failed: } WinDivertHelperCalcChecksums(packet, packet_len, &addr, 0); - poverlapped = (OVERLAPPED *)malloc(sizeof(OVERLAPPED)); - if (poverlapped == NULL) - { - error("failed to allocate memory"); - } - memset(poverlapped, 0, sizeof(OVERLAPPED)); - if (WinDivertSendEx(handle, packet, packet_len, NULL, 0, &addr, - sizeof(WINDIVERT_ADDRESS), poverlapped)) - { - continue; - } - if (GetLastError() != ERROR_IO_PENDING) + if (!WinDivertSend(handle, packet, packet_len, &addr, NULL)) { warning("failed to send packet (%d)", GetLastError()); continue;