Commit Graph
39 Commits
Author SHA1 Message Date
basil00 cd1bfff998 Bump copyright year. 2016-01-19 11:15:48 +08:00
basil00 f0be301f1d Expand tests & bug fixes.
Extend the number of tests to cover some of the new features.
Fix IPv6 address comparison which did not work correctly in some cases.
2015-07-25 23:16:48 +08:00
basil00 609ab63594 Add a NO_REPLACE for WinDivertHelperCalcChecksums
The WINDIVERT_HELPER_NO_REPLACE flag tells WinDivertHelperCalcChecksums not to
recalculate and replace non-zero checksum fields.  This is useful for
reconstructing the checksums for packets returned by WinDivertRecv(), where
all non-zero checksum fields are already valid.  This allows WinDivert1.2
to achieve similar efficiency as WinDivert1.1, where checksums were calculated
by the driver.

Note that for modified packets, the WINDIVERT_HELPER_NO_REPLACE flag should
not be used, as all checksums need to be recalculated from scratch anyway.
2015-07-25 13:24:28 +08:00
basil00 3bcf1ae7a0 Update samples & test programs to the new version. 2015-07-19 11:40:02 +08:00
basil00 54f8640b89 Build & bug fixes.
- Make WinDivert compile again under WDK/MSVC.
- Fix undiscovered bug where ip.TOS (8-bit field) was passed to ntohs.
2015-07-18 16:46:21 +08:00
basil00 130e25c05b Bump copyright year. 2015-07-17 19:13:55 +08:00
basil00 e247f01c43 Remove automatic checksum calculation & legacy API
- As discussed in #37, the WINDIVERT_FLAG_NO_CHECKSUM behavior has become the
  default.  This means that outbound packets returned by WinDivertRecv() are
  no longer guaranteed to have valid checksums, thanks to TCP checksum
  offloading by the Windows TCP/IP stack.  The checksums can still be
  recovered by calling WinDivertHelperCalcChecksums() manually.
- Remove the old WinDivert1.0 legacy API, as nobody should still be using it.
2015-07-02 21:19:27 +08:00
basil00 e1ea77f1d3 Implement a filter compiler with new features.
Replaces the old filter compiler with a new version that:
- Is a cleaner, more extensible, implementation.
- Can report specific error messages (e.g. bad token vs parse error).
- Supports the new C-style if-then-else expression "(A? B: C)" syntax.

Two new WinDivert helper API functions have been implemented:
- WinDivertHelperCheckFilter() can be used to check a filter string for
  errors.
- WinDivertHelperEvalFilter() evaluates a filter on a given packet.  Will be
  useful for testing.
2015-06-21 12:38:49 +08:00
basil00 b452e1ce29 - Fix failing test case caused by bad word ordering. 2014-11-17 23:57:49 +08:00
basil00 ecd9ae59d3 - Re-implement WinDivertHelperParseIPv6Address(). Previous version was just
too bug-prone, so re-try from scratch.  New version works for several tests.
- Fix broken WinDivertAToX().
- New test case: IPv6 TCP SYN.
2014-11-16 13:31:07 +08:00
basil00 48075e2e5f - Fix broken implementation of WinDivertHelperParseIPv6Address().
- Fix IPv6 address word/byte ordering between DLL and SYS.
2014-11-15 15:06:16 +08:00
basil00 7235b687b3 - WinDivertHelperParsePacket() now skips IPv6 extension headers. 2014-11-10 19:16:33 +08:00
basil00 7952724127 - Driver now calculates checksums for IPv6 packets (fix issue #28).
- Bump version to 1.1.7
2014-11-09 12:44:21 +08:00
basil00 d46a902c90 - Fix issue #29 found by MarlosChida: the IPv6 pseudo-header definition was
incorrect leading to invalid checksums.
2014-11-08 15:15:54 +08:00
basil00 6b3fd714c0 - Fix silly bug in last commit, remove the .exe name from the path. 2014-09-05 12:27:25 +08:00
basil00 7bd52aed76 - Use GetModuleFileName instead of GetCurrentDirectory as discussed in issue #24. 2014-08-15 18:15:25 +08:00
basil00 874d147b9b - Update copyright year.
- Use exact version number in driver binary.
2014-03-24 18:15:05 +08:00
basil00 57934712c6 - Refactor the WFP interface:
* WinDivert sublayers are created and inserted when the driver is loaded.
  * All WinDivert callouts are installed at the same sublayer.
- Clean-up the implementation of priorities.
- Re-introduce deep copying for SNIFF mode.  This avoids referencing the
  sniffed packets.
- Fix-up the netfilter example:
  * Don't send RSTs to RST/FINs, this can start a RST war.
  * Don't inject ICMP outbound - this may not be a problem despite 1233 errors.
2013-12-23 11:03:02 +08:00
basil00 6ac77a644b - Fix some bugs introduced by recent commits. 2013-12-13 17:09:37 +08:00
basil00 f21217fdb1 - Slim down the MINGW version of WinDivert.dll (>60KB -> ~15KB)
- Remove some WinDivert.dll dependencies.
2013-12-12 17:45:48 +08:00
basil00 8c2bb01565 - Several changes to simplify the WinDivert Driver installation:
1) Remove the dependency on the WdfCoInstaller*.dll file.  This file appears
     to be unnecessary for Windows 7 and up, and for patched Vista+2008.
  2) Remove the WinDivert.inf file (only used by the co-installer).
  3) 32/64-bit versions of the driver are now explicitly named, meaning that
     the two can co-exist in the same directory.
  4) The 32-bit WinDivert.dll can now automatically load the 64-bit driver on
     64-bit Windows.  This means it is possible to write 32-bit WinDivert
     applications that automatically work on 64-bit windows.
  5) WinDivert.dll now schedules the WinDivert service to be deleted right
     away.  This should fix some cases where the service is never deleted,
     even during reboot.
  6) Updated build scripts to reflect the changes.
2013-12-10 22:48:11 +08:00
basil00 dce8ebd459 - If driver installation fails, then also attempt to delete the service. This
should fix some confusing errors caused by a zombie WinDivert service.
2013-10-06 15:15:59 +08:00
basil00 09b7cd45a2 - Add support for the legacy WinDivert API. 2013-07-26 18:01:49 +08:00
basil00 38f1f3a16d - Towards WinDivert 1.1:
* Re-brand "DIVERT" to "WINDIVERT" throughout the code-base.
* New flags:
  > WINDIVERT_FLAG_PASSTHRU: Do not drop nor capture packets.  Useful
    for injection-only handles.
  > WINDIVERT_FLAG_NO_CHECKSUM: Do not guarantee that diverted packets
    have a correct checksum.
  NOTE: Not yet tested!
* New default values and limits for various WinDivert parameters,
  including WINDIVERT_PARAM_QUEUE_LEN, WINDIVERT_PARAM_QUEUE_TIME, and
  the maximum filter length.
* New extended WinDivert functions that support asynchronous I/O:
  > WinDivertRecvEx(..)
  > WinDivertSendEx(..)
  NOTE: Not yet tested!
* The WinDivert driver now services reads (receives) out-of-band.
  The motivation is because WFP callouts are run at DISPATCH_LEVEL, so
  we should not be doing expensive work in the ClassifyFn.  This is also
  the same reason why the filter length has been restricted.
2013-06-30 15:58:21 +08:00
basil00 e0e1feabad - Update support to Visual Studio 2012. 2013-06-25 23:22:41 +08:00
basil00 7636b0acc2 - Fix MinGW wcscpy_s() workaround. 2013-04-13 14:46:45 +08:00
basil00 3d881423d6 - Replace (110) errors with more meaningful error codes.
- Add two new helper API functions: DivertHelperParseIPv?Addr(..)
- Document these new features.
2013-04-06 23:41:00 +08:00
basil00 8cc8299f26 - Fix mis-placed decli bug. [credit GliderPro] 2013-04-02 12:14:45 +08:00
basil00 d9e1d687cc - Fix the implementation of DivertParseIPv6Address() 2013-01-31 23:48:19 +08:00
basil00 3a59af9f25 - Ignore ERROR_INVALID_PARAMETER from pfnWdfPostDeviceInstall() as these
errors appear to be benign.
2012-10-24 22:46:13 +08:00
basil00 53b45c4e8c - Complete build-system revamp.
* Updated sources files to target install\WDDK
  * Remove wdfinstaller.h dependency from dll/divert.dll
  * Fix passthru error in newer compilers.
2012-03-27 17:39:46 +08:00
basil00 6dfed99c28 Build system revamp:
- VS2010 support added via msvc-build.bat and *.vcxproj files
- MinGW now also builds example programs
- Documentation and examples are now included in the binary packages
2012-03-26 21:55:55 +08:00
basil00 13b2ab4418 ***MAJOR UPDATE***
Name and version:

* Now officially called 'WinDivert'
* Now officially working towards a version 1.0 release

New features:

* WinDivert now supports a packet-sniffing mode.  This mode merely
  copies packets, and does not drop the original.
* WinDivert now also supports a packet-dropping mode.
* WinDivert now supports filter priorities.
* WinDivert now supports a forwarded packet layer (WARNING: untested).
* WinDivert now supports get/set parameters such as packet queue length and
  time.
* WinDivert now supports larger filters (but use at own risk).
* WinDivert now uninstalls the driver on program exit/library unload
* Different versions of WinDivert can co-exist on the same machine
  (WARNING: untested, as there is currently only one version).

New License:

* WinDivert is now LGPL.  This is less restrictive than the GPL so WinDivert
  can be linked to by commercial software (under the terms of the LGPL
  license).

Technical:

* Cleaner IOCTL interface.
* Cleaner driver implementation.
* Thread local events in WinDivert.dll
* Many minor tweaks and fixes.
2012-02-21 23:18:45 +08:00
basil00 1d2b3a4649 - Fix a bug caused by missing FILE_FLAG_OVERLAPPED flag. 2012-02-08 23:46:22 +08:00
basil00 a205259bec - Divert driver and library now fully support multi-threaded code. This
includes making the driver handle I/O requests in parallel, and changing
  the library such that it uses overlapped I/O.  Overall the package is
  now significantly faster.
- The divert driver now only adds WFP callouts when a filter is set,
  instead of when a handle is created.
- The divert driver now attempts to avoid adding WFP callouts that are
  superfluous with respect to the filter.
- The divert driver now explicitly deletes filters and callouts during
  cleanup.  This appears to resolve a bug where network connectivity is
  sometimes lost.
- Added a new sample program: passthru.exe.  This example doesn't do anything
  interesting but is useful for speed testing.
- Rename build.sh to mingw-build.sh to avoid confusion.
2011-11-08 23:54:01 +08:00
basil00 f1b7ead828 The divert.dll library can now be build with MinGW Linux cross-compilation.
This is useful for projects that use MinGW instead of MSVC.  Otherwise, the
.dlls are incompatible.
2011-10-15 17:40:18 +08:00
basil00 0ff63cda99 - Make the package compile for i386
- Make the pAddr arg for DivertRecv() optional
- Make the i386 user binaries compatible with an amd64 driver.
  (useful for projects not yet ported to amd64)
2011-08-23 22:18:02 +08:00
basil00 ee386df032 Figured out a way to split the "address" part of the buffer from the packet
data itself.  This makes for a much cleaner interface.

sys/divert.c
dll/divert.c
include/*.h
	DivertRecv and DivertSend now use IOCTLs instead of reads/writes.
	The 'address' parameter is passed by pointer to the driver, which
	writes directly to it (after sanity checks).
	This means that the data buffer now only contains the packet, which
	help to avoid some messy code.

examples/*/*.c
	Update the examples to reflect the new API.

doc/divert.html
	Update the documentation to reflect the new API.
2011-08-21 17:59:13 +08:00
basil00 019f9d509b First commit of the Windows Divert project 2011-08-19 20:11:17 +08:00