mirror of https://github.com/bol-van/zapret/
44 changed files with 1624 additions and 127 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,9 @@ |
|||
Standalone version in zapret-winws folder !! |
|||
From this folder winws can be started only from cygwin shell. |
|||
|
|||
Cygwin refuses to start winws if a copy of cygwin1.dll is present ! |
|||
|
|||
How to get win7 and winws compatible version of cygwin : |
|||
|
|||
curl -O https://www.cygwin.com/setup-x86_64.exe |
|||
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@ |
|||
set WINWS1=--wf-l3=ipv4,ipv6 --wf-tcp=80,443 --dpi-desync=fake,split --dpi-desync-ttl=7 --dpi-desync-fooling=md5sig |
|||
schtasks /Create /F /TN winws1 /NP /RU "" /SC onstart /TR "\"%~dp0winws.exe\" %WINWS1%" |
@ -0,0 +1,2 @@ |
|||
schtasks /End /TN winws1 |
|||
schtasks /Delete /TN winws1 /F |
@ -0,0 +1 @@ |
|||
schtasks /Run /TN winws1 |
@ -0,0 +1 @@ |
|||
schtasks /End /TN winws1 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,95 @@ |
|||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt. |
|||
|
|||
Как обычно, компьютерная грамотность ложится полностью на вас. |
|||
Вы должны уметь работать с консолью windows и иметь минимальные навыки обращения с командными файлами bat,cmd. |
|||
Если грамотность отсутствует и возникает куча "как" на базовых вещах - проходите мимо или ищите помощь в другом месте. |
|||
|
|||
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда, |
|||
которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах, |
|||
требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем, |
|||
и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации. |
|||
Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать. |
|||
Могут и сломаться отдельные незаблокированные ресурсы. |
|||
Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию. |
|||
Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает. |
|||
|
|||
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы. |
|||
|
|||
1) Если у вас windows 7, обновляйте систему. Годами не обновляемая 7-ка может не запускать драйвер windivert. |
|||
Поддержка 32-битных x86 windows возможна, но в готовом виде отсутствует. |
|||
Поддержка arm64 систем возможна при определенных условиях, но в готовом виде отсутствует. |
|||
Читайте docs/windows.txt |
|||
|
|||
Имейте в виду, что антивирусы могут плохо реагировать на windivert. Если это имеет место , используйте исключения. |
|||
|
|||
2) Скачайте zip архив проекта с github, распакуйте его куда-нибудь. |
|||
|
|||
3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret. |
|||
|
|||
4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит |
|||
|
|||
5) Выполните установку cygwin. Желательно устанавливать windows 7 совместимую версию, под которой и был собран проект. |
|||
Скачайте https://www.cygwin.com/setup-x86_64.exe |
|||
Выполните его с параметрами : setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215 |
|||
Установите cygwin, выбрав в списке пакетов curl. |
|||
|
|||
cygwin нужен только для поиска стратегии обхода блокировки. После этого он не нужен. |
|||
|
|||
6) Запустите cygwin.bat из директории установки cygwin от имени администратора. |
|||
В нем нужно пройти в директорию с zapret. Буква диска windows X: отображается как /cygdrive/x. |
|||
Используейте команды как в *nix |
|||
|
|||
7) Однократно выполните ./install_bin.sh |
|||
|
|||
8) Запустите blockcheck.sh. blockcheck.sh в начале проверяет DNS. Если выводятся сообщения о подмене адресов, то |
|||
первым делом нужно решить эту проблему, иначе ничего не будет работать. |
|||
Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов |
|||
от провайдера на публичные (1.1.1.1, 8.8.8.8), либо в случае перехвата провайдером обращений |
|||
к сторонним серверам - через специальные средства шифрования DNS запросов, такие как dnscrypt, DoT, DoH. |
|||
В современных броузерах чаще всего DoH включен по умолчанию, но curl будет использовать обычный DNS. |
|||
|
|||
9) blockcheck позволяет выявить рабочую стратегию обхода блокировок. |
|||
Запомните найденные стратегии. |
|||
|
|||
Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале. |
|||
Вероятно, все остальные домены блокированы подобным образом, но не факт. |
|||
В большинстве случаев можно обьединить несколько стратегий в одну универсальную, но для этого необходимо понимать |
|||
"что там за буковки". Если вы в сетях слабо разбираетесь, это не для вас. В противном случае читайте readme.txt. |
|||
zapret не может пробить блокировку по IP адресу |
|||
Для проверки нескольких доменов вводите их через пробел. |
|||
|
|||
Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов |
|||
с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI, |
|||
которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера). |
|||
blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки. |
|||
В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях. |
|||
Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель |
|||
--dpi-desync-fooling, чтобы не сломать сайты на более коротких дистанциях. |
|||
md5sig наиболее совместим, но работатет только на linux серверах. |
|||
badseq может работать только на https и не работать на http. |
|||
Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL |
|||
с каждым из этих ограничителей. |
|||
|
|||
При использовании autottl следует протестировать как можно больше разных доменов. Эта техника |
|||
может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах |
|||
она стабильна, на третьих полный хаос, и проще отказаться. |
|||
|
|||
10) Протестируйте найденные стратегии на winws. winws следует брать из binaries/win64/zapret-winws. |
|||
|
|||
11) Обеспечьте удобную загрузку обхода блокировок. |
|||
В binaries/win64/zapret-winws есть командные файлы task_*, предназначенные для управления задачами планировщика. |
|||
Там следует поменять содержимое переменной WINWS1 на свою стратегию. |
|||
Если вы не можете обьединить несколько стратегий для разных протоколов в одну, дублируйте код в каждом из cmd |
|||
для поддержки нескольких задач : winws1,winws2,winws3. |
|||
После создания задач запустите их. Проверьте, что обход встает после перезагрузки windows. |
|||
|
|||
12) Если ломаются отдельные незаблокированные ресурсы, используйте хост-листы. |
|||
Где они будут находиться - решайте сами. Пути прописываются не в формате windows, а формате cygwin. |
|||
Например, /cygdrive/c/Users/vasya/zapret. |
|||
Если в путях присутствуют национальные символы, кодировку нужно использовать OEM. Для русского языка это 866. |
|||
Пути с пробелами нужно брать в кавычки. |
|||
Параметры управления хост-листами точно такие же, как в *nix. |
|||
|
|||
Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея. |
|||
В некоторых случаях вы не обойдетесь без знаний и основного "толмуда". |
|||
Подробности и полное техническое описание расписаны в readme.txt |
@ -0,0 +1,95 @@ |
|||
### tpws |
|||
|
|||
Using `WSL` (Windows subsystem for Linux) it's possible to run `tpws` in socks mode under rather new builds of |
|||
windows 10 and windows server. |
|||
Its not required to install any linux distributions as suggested in most articles. |
|||
tpws is static binary. It doesn't need a distribution. |
|||
|
|||
Install `WSL` : `dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all` |
|||
|
|||
Copy `binaries/x86_64/tpws_wsl.tgz` to the target system. |
|||
Run : `wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz` |
|||
|
|||
Run tpws : `wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <fooling_options>` |
|||
|
|||
Configure socks as `127.0.0.1:1080` in a browser or another program. |
|||
|
|||
Cleanup : `wsl --unregister tpws` |
|||
|
|||
Tested in windows 10 build 19041 (20.04). |
|||
|
|||
`--oob` , `--mss` and `--disorder` do not work. |
|||
RST detection in autohostlist scheme may not work. |
|||
WSL may glitch with splice. `--nosplice` may be required. |
|||
|
|||
|
|||
### winws |
|||
|
|||
`winws` is `nfqws` version for windows. It's based on `windivert`. Most functions are working. |
|||
Large ip filters (ipsets) are not possible. Forwarded traffic and connection sharing are not supported. |
|||
Administrator rights are required. |
|||
|
|||
Working with packet filter consists of two parts |
|||
|
|||
1. In-kernel packet selection and passing selected packets to a packet filter in user mode. |
|||
In *nix it's done by `iptables`, `nftables`, `pf`, `ipfw`. |
|||
2. User mode packet filter processes packets and does DPI bypass magic. |
|||
|
|||
Windows does not have part 1. No `iptables` exist. That's why 3rd party packet redirector is used. |
|||
It's called `windivert`. It works starting from `windows 7`. Kernel driver is signed but it may require to disable secure boot |
|||
or update windows 7. |
|||
|
|||
Task of `iptables` is done inside `winws` through `windivert` filters. `Windivert` has it's own [filter language](https://reqrypt.org/windivert-doc.html#filter_language). |
|||
`winws` can automate filter construction using simple ip version and port filter. Raw filters are also supported. |
|||
|
|||
``` |
|||
--wf-l3=ipv4|ipv6 ; L3 protocol filter. multiple comma separated values allowed. |
|||
--wf-tcp=[~]port1[-port2] ; TCP port filter. ~ means negation. multiple comma separated values allowed. |
|||
--wf-udp=[~]port1[-port2] ; UDP port filter. ~ means negation. multiple comma separated values allowed. |
|||
--wf-raw=<filter>|@<filename> ; raw windivert filter string or filename |
|||
--wf-save=<filename> ; save windivert filter string to a file and exit |
|||
``` |
|||
|
|||
`--wf-l3`, `--wf-tcp`, `--wf-udp` can take multiple comma separated arguments. |
|||
|
|||
Multiple `winws` processes are allowed. However, it's discouraged to intersect their filters. |
|||
|
|||
Paths are passed in `cygwin` format. Windows drives are mapped to `/cygdrive/x`. For example : `/cygdrive/c/Users/vasya/zapret`. |
|||
|
|||
`Cygwin` shell does not run binaries if their directory has it's own copy of `cygwin1.dll`. |
|||
That's why exists separate standalone version in `binaries/win64/zapret-tpws`. |
|||
`Cygwin` is required for `blockcheck.sh` support but `winws` itself can be run standalone without cygwin. |
|||
|
|||
How to get `windows 7` and `winws` compatible `cygwin` : |
|||
``` |
|||
curl -O https://www.cygwin.com/setup-x86_64.exe |
|||
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215 |
|||
``` |
|||
You must choose to install `curl`. To compile from sources install `gcc-core`,`make`,`zlib-devel`. |
|||
|
|||
`winws` requires `cygwin1.dll`, `windivert.dll`, `windivert64.sys`. You can take them from `binaries/win64/zapret-winws`. |
|||
|
|||
It's possible to build x86 32-bit version but this version is not shipped. You have to build it yourself. |
|||
32-bit `windivert` can be downloaded from it's developer github. Required version is 2.2.2. |
|||
There's no `arm64` signed `windivert` driver. You can compile it yourself but it will run only with disabled driver signature checks. |
|||
|
|||
|
|||
### blockcheck |
|||
|
|||
`blockcheck.sh` is written in posix shell and uses some standard posix utilites. |
|||
Windows does not have them. To execute `blockcheck.sh` use `cygwin` command prompt run as administrator. |
|||
It's not possible to use `WSL`. It's not the same as `cygwin`. |
|||
First run once `install_bin.sh` then `blockcheck.sh`. |
|||
|
|||
`Cygwin` is required only for `blockcheck.sh`. Standalone `winws` can be run without it. |
|||
|
|||
|
|||
### auto start |
|||
|
|||
To start `winws` with windows use windows task scheduler. There are `task_*.cmd` batch files in `binaries/win64/zapret-winws`. |
|||
They create, remove, start and stop scheduled task `winws1`. They must be run as administrator. |
|||
|
|||
Edit `task_create.cmd` and write your `winws` parameters to `%WINWS1%` variable. If you need multiple `winws` instances |
|||
clone the code in all cmd files to support multiple tasks `winws1,winws2,winws3,...`. |
|||
|
|||
Tasks can also be controlled from GUI `taskschd.msc`. |
@ -0,0 +1,117 @@ |
|||
tpws |
|||
---- |
|||
|
|||
Запуск tpws возможен только в Linux варианте под WSL. |
|||
Нативного варианта под Windows нет, поскольку он использует epoll, которого под windows не существует. |
|||
|
|||
tpws в режиме socks можно запускать под более-менее современными билдами windows 10 и windows server |
|||
с установленным WSL. Совсем не обязательно устанавливать дистрибутив убунту, как вам напишут почти в каждой |
|||
статье про WSL, которую вы найдете в сети. tpws - статический бинарик, ему дистрибутив не нужен. |
|||
|
|||
Установить WSL : dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all |
|||
Скопировать на целевую систему binaries/x86_64/tpws_wsl.tgz. |
|||
Выполнить : wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz |
|||
Запустить : wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <параметры_дурения> |
|||
Прописать socks 127.0.0.1:1080 в броузер или другую программу. |
|||
|
|||
Удаление : wsl --unregister tpws |
|||
|
|||
Проверено на windows 10 build 19041 (20.04). |
|||
|
|||
Не работают функции --oob и --mss из-за ограничений реализации WSL. |
|||
--disorder не работает из-за особенностей tcp/ip стека windows. |
|||
Может не срабатывать детект RST в autohostlist. |
|||
WSL может глючить со splice, приводя к зацикливанию процесса. Может потребоваться --nosplice. |
|||
|
|||
|
|||
winws |
|||
----- |
|||
|
|||
Это вариант пакетного фильтра nfqws для Windows, построенный на базе windivert. |
|||
Все функции работоспособны, однако функционал ipset отсутствует. Фильтры по большому количеству IP адресов невозможны. |
|||
Работа с проходящим трафиком, например в случае "расшаривания" соединения, не проверялась и не гарантируется. |
|||
Для работы с windivert требуются права администратора. |
|||
Специфические для unix параметры, такие как --uid, --user и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws. |
|||
|
|||
Работа с пакетным фильтром основана на двух действиях. |
|||
Первое - выделение перенаправляемого трафика в режиме ядра и передача его пакетному фильтру в user mode. |
|||
Второе - собственно обработка перенаправленных пакетов в пакетном фильтре. |
|||
|
|||
В windows отсутствуют встроенные средства для перенаправления трафика, такие как iptables, nftables, pf или ipfw. |
|||
Поэтому используется сторонний драйвер ядра windivert. Он работает, начиная с windows 7. На системах с включенным |
|||
secure boot могут быть проблемы из-за подписи драйвера. В этом случае отключите secureboot или включите режим testsigning. |
|||
На windows 7 требуются обновления. На старых необновленных системах может быть ошибка проверки подписи драйвера. |
|||
Требования к патчам точно такие же, как и у GoodbyDPI. |
|||
|
|||
Задача iptables в winws решается внутренними средствами через фильтры windivert. |
|||
У windivert существует собственный язык фильтров, похожий на язык фильтров wireshark. |
|||
Документация по фильтрам windivert : https://reqrypt.org/windivert-doc.html#filter_language |
|||
Чтобы не писать сложные фильтры вручную, предусмотрены различные упрощенные варианты автоматического построения фильтров. |
|||
|
|||
--wf-l3=ipv4|ipv6 ; фильтр L3 протоколов. по умолчанию включены ipv4 и ipv6. |
|||
--wf-tcp=[~]port1[-port2] ; фильтр портов для tcp. ~ означает отрицание |
|||
--wf-udp=[~]port1[-port2] ; фильтр портов для udp. ~ означает отрицание |
|||
--wf-raw=<filter>|@<filename> ; задать напрямую фильтр windivert из параметра или из файла. имени файла предшествует символ @. |
|||
--wf-save=<filename> ; сохранить сконструированный фильтр windivert в файл для последующей правки вручную |
|||
|
|||
Параметры --wf-l3, --wf-tcp, --wf-udp могут брать несколько значений через запятую. |
|||
|
|||
Конструктор фильтров автоматически включает входящие tcp пакеты с tcp synack и tcp rst для корректной работы функций |
|||
autottl и autohostlist. При включении autohostlist так же перенаправляются пакеты данных с http redirect с кодами 302 и 307. |
|||
Всегда добавляется фильтр на исключение не-интернет адресов ipv4 и ipv6. |
|||
Для сложных нестандартных сценариев могут потребоваться свои фильтры. Логично будет начать со стандартного шаблона, |
|||
сохраненного через --wf-save. Нужно править файл и подсовывать его в параметре --wf-raw. Максимальный размер фильтра - 8 Kb. |
|||
|
|||
Можно запускать несколько процессов winws с разными стратегиями. Однако, не следует делать пересекающиеся фильтры. |
|||
|
|||
В параметрах, берущих пути к файлам, они прописываются не в формате windows, а формате cygwin. |
|||
Например, /cygdrive/c/Users/vasya/zapret. |
|||
Если в путях присутствуют национальные символы, то при вызове winws из cmd или bat кодировку нужно использовать OEM. |
|||
Для русского языка это 866. Пути с пробелами нужно брать в кавычки. |
|||
|
|||
Существует неочевидный момент, каcаемый запуска winws из cygwin шелла. Если в директории, где находится nfqws, находится |
|||
копия cygwin1.dll, winws не запустится. Поэтому в binaries/win64 существует директория zapret-winws, содержащая полный |
|||
комплект для запуска без cygwin. Его вы и берете для повседневного использования. |
|||
Если нужен запуск под cygwin, то следует запускать из binaries/win64. Это нужно для работы blockcheck. |
|||
Из cygwin шелла можно посылать winws сигналы через kill точно так же, как в *nix. |
|||
|
|||
Как получить совместимый с windows 7 и winws cygwin : |
|||
curl -O https://www.cygwin.com/setup-x86_64.exe |
|||
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215 |
|||
Следует выбрать установку curl. |
|||
|
|||
Для сборки из исходников требуется gcc-core,make,zlib-devel. |
|||
winws требует cygwin1.dll, windivert.dll, windivert64.sys. Их можно взять из binaries/win64/zapret-winws. |
|||
Версию для 32-битных x86 windows собрать можно, но такие системы уже уходят в прошлое, поэтому если надо - собирайте сами. |
|||
32-битный windivert можно взять с сайта разработчика. Требуется версия 2.2.2. |
|||
Для arm64 систем нет подписанного драйвера windivert. Можно самому собрать windivert, но работать он будет только |
|||
с отключенной подписью драйверов. |
|||
|
|||
|
|||
blockcheck |
|||
---------- |
|||
|
|||
blockcheck.sh написан на posix shell и требует некоторых стандартных утилит posix. В windows, естественно, этого нет. |
|||
Потому просто так запустить blockcheck.sh невозможно. |
|||
Для этого требуется скачать и установить cygwin так , как описано в предыдущем разделе. |
|||
Следует запустить от имени администратора cygwin shell через cygwin.bat. |
|||
В нем нужно пройти в директорию с zapret. Буква диска windows X: отображается как /cygdrive/x. |
|||
Далее все как в *nix : 1 раз ./install_bin.sh , затем ./blockcheck.sh. |
|||
WSL использовать нельзя, это не то же самое. |
|||
|
|||
cygwin для обычной работы winws не нужен. Разве что вы хотите посылать winws SIGHUP для перечитки листов без перезапуска. |
|||
|
|||
|
|||
автозапуск winws |
|||
---------------- |
|||
|
|||
Для запуска winws вместе с windows воспользуйтесь планировщиком задач windows. |
|||
Удобнее всего создавать задачи и управлять ими через консольную программу schtasks. |
|||
В директории binaries/win64/winws подготовлены файлы task_*.cmd . |
|||
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной %WINWS1%. |
|||
Исправьте параметры на нужную вам стратегию. Если для разных фильтров применяется разная стратегия, размножьте код |
|||
для задач winws1,winws2,winws3,... |
|||
|
|||
Все батники требуется запускать от имени администратора. |
|||
|
|||
Управлять задачами можно так же из графической программы управления планировщиком taskschd.msc |
Binary file not shown.
@ -0,0 +1,635 @@ |
|||
// WinDivert 2.2.2. MODDED
|
|||
|
|||
/*
|
|||
* windivert.h |
|||
* (C) 2019, all rights reserved, |
|||
* |
|||
* This file is part of WinDivert. |
|||
* |
|||
* WinDivert is free software: you can redistribute it and/or modify it under |
|||
* the terms of the GNU Lesser General Public License as published by the |
|||
* Free Software Foundation, either version 3 of the License, or (at your |
|||
* option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, but |
|||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
|||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
|||
* License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Lesser General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
* |
|||
* WinDivert is free software; you can redistribute it and/or modify it under |
|||
* the terms of the GNU General Public License as published by the Free |
|||
* Software Foundation; either version 2 of the License, or (at your option) |
|||
* any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, but |
|||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
|||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|||
* for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License along |
|||
* with this program; if not, write to the Free Software Foundation, Inc., 51 |
|||
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|||
*/ |
|||
|
|||
#ifndef __WINDIVERT_H |
|||
#define __WINDIVERT_H |
|||
|
|||
#ifndef WINDIVERT_KERNEL |
|||
#include <windows.h> |
|||
#endif /* WINDIVERT_KERNEL */ |
|||
|
|||
#ifndef WINDIVERTEXPORT |
|||
#define WINDIVERTEXPORT extern __declspec(dllimport) |
|||
#endif /* WINDIVERTEXPORT */ |
|||
|
|||
#ifdef __MINGW32__ |
|||
#define __in |
|||
#define __in_opt |
|||
#define __out |
|||
#define __out_opt |
|||
#define __inout |
|||
#define __inout_opt |
|||
#include <stdint.h> |
|||
#define INT8 int8_t |
|||
#define UINT8 uint8_t |
|||
#define INT16 int16_t |
|||
#define UINT16 uint16_t |
|||
#define INT32 int32_t |
|||
#define UINT32 uint32_t |
|||
#define INT64 int64_t |
|||
#define UINT64 uint64_t |
|||
#endif /* __MINGW32__ */ |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
/****************************************************************************/ |
|||
/* WINDIVERT API */ |
|||
/****************************************************************************/ |
|||
|
|||
/*
|
|||
* WinDivert layers. |
|||
*/ |
|||
typedef enum |
|||
{ |
|||
WINDIVERT_LAYER_NETWORK = 0, /* Network layer. */ |
|||
WINDIVERT_LAYER_NETWORK_FORWARD = 1,/* Network layer (forwarded packets) */ |
|||
WINDIVERT_LAYER_FLOW = 2, /* Flow layer. */ |
|||
WINDIVERT_LAYER_SOCKET = 3, /* Socket layer. */ |
|||
WINDIVERT_LAYER_REFLECT = 4, /* Reflect layer. */ |
|||
} WINDIVERT_LAYER, *PWINDIVERT_LAYER; |
|||
|
|||
/*
|
|||
* WinDivert NETWORK and NETWORK_FORWARD layer data. |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
UINT32 IfIdx; /* Packet's interface index. */ |
|||
UINT32 SubIfIdx; /* Packet's sub-interface index. */ |
|||
} WINDIVERT_DATA_NETWORK, *PWINDIVERT_DATA_NETWORK; |
|||
|
|||
/*
|
|||
* WinDivert FLOW layer data. |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
UINT64 EndpointId; /* Endpoint ID. */ |
|||
UINT64 ParentEndpointId; /* Parent endpoint ID. */ |
|||
UINT32 ProcessId; /* Process ID. */ |
|||
UINT32 LocalAddr[4]; /* Local address. */ |
|||
UINT32 RemoteAddr[4]; /* Remote address. */ |
|||
UINT16 LocalPort; /* Local port. */ |
|||
UINT16 RemotePort; /* Remote port. */ |
|||
UINT8 Protocol; /* Protocol. */ |
|||
} WINDIVERT_DATA_FLOW, *PWINDIVERT_DATA_FLOW; |
|||
|
|||
/*
|
|||
* WinDivert SOCKET layer data. |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
UINT64 EndpointId; /* Endpoint ID. */ |
|||
UINT64 ParentEndpointId; /* Parent Endpoint ID. */ |
|||
UINT32 ProcessId; /* Process ID. */ |
|||
UINT32 LocalAddr[4]; /* Local address. */ |
|||
UINT32 RemoteAddr[4]; /* Remote address. */ |
|||
UINT16 LocalPort; /* Local port. */ |
|||
UINT16 RemotePort; /* Remote port. */ |
|||
UINT8 Protocol; /* Protocol. */ |
|||
} WINDIVERT_DATA_SOCKET, *PWINDIVERT_DATA_SOCKET; |
|||
|
|||
/*
|
|||
* WinDivert REFLECTION layer data. |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
INT64 Timestamp; /* Handle open time. */ |
|||
UINT32 ProcessId; /* Handle process ID. */ |
|||
WINDIVERT_LAYER Layer; /* Handle layer. */ |
|||
UINT64 Flags; /* Handle flags. */ |
|||
INT16 Priority; /* Handle priority. */ |
|||
} WINDIVERT_DATA_REFLECT, *PWINDIVERT_DATA_REFLECT; |
|||
|
|||
/*
|
|||
* WinDivert address. |
|||
*/ |
|||
#ifdef _MSC_VER |
|||
#pragma warning(push) |
|||
#pragma warning(disable: 4201) |
|||
#endif |
|||
typedef struct |
|||
{ |
|||
INT64 Timestamp; /* Packet's timestamp. */ |
|||
UINT32 Layer:8; /* Packet's layer. */ |
|||
UINT32 Event:8; /* Packet event. */ |
|||
UINT32 Sniffed:1; /* Packet was sniffed? */ |
|||
UINT32 Outbound:1; /* Packet is outound? */ |
|||
UINT32 Loopback:1; /* Packet is loopback? */ |
|||
UINT32 Impostor:1; /* Packet is impostor? */ |
|||
UINT32 IPv6:1; /* Packet is IPv6? */ |
|||
UINT32 IPChecksum:1; /* Packet has valid IPv4 checksum? */ |
|||
|
|||
// MODDED : UDPChecksum and TCPChecksum in original version are exchanged
|
|||
UINT32 UDPChecksum:1; /* Packet has valid UDP checksum? */ |
|||
UINT32 TCPChecksum:1; /* Packet has valid TCP checksum? */ |
|||
|
|||
UINT32 Reserved1:8; |
|||
UINT32 Reserved2; |
|||
union |
|||
{ |
|||
WINDIVERT_DATA_NETWORK Network; /* Network layer data. */ |
|||
WINDIVERT_DATA_FLOW Flow; /* Flow layer data. */ |
|||
WINDIVERT_DATA_SOCKET Socket; /* Socket layer data. */ |
|||
WINDIVERT_DATA_REFLECT Reflect; /* Reflect layer data. */ |
|||
UINT8 Reserved3[64]; |
|||
}; |
|||
} WINDIVERT_ADDRESS, *PWINDIVERT_ADDRESS; |
|||
#ifdef _MSC_VER |
|||
#pragma warning(pop) |
|||
#endif |
|||
|
|||
/*
|
|||
* WinDivert events. |
|||
*/ |
|||
typedef enum |
|||
{ |
|||
WINDIVERT_EVENT_NETWORK_PACKET = 0, /* Network packet. */ |
|||
WINDIVERT_EVENT_FLOW_ESTABLISHED = 1, |
|||
/* Flow established. */ |
|||
WINDIVERT_EVENT_FLOW_DELETED = 2, /* Flow deleted. */ |
|||
WINDIVERT_EVENT_SOCKET_BIND = 3, /* Socket bind. */ |
|||
WINDIVERT_EVENT_SOCKET_CONNECT = 4, /* Socket connect. */ |
|||
WINDIVERT_EVENT_SOCKET_LISTEN = 5, /* Socket listen. */ |
|||
WINDIVERT_EVENT_SOCKET_ACCEPT = 6, /* Socket accept. */ |
|||
WINDIVERT_EVENT_SOCKET_CLOSE = 7, /* Socket close. */ |
|||
WINDIVERT_EVENT_REFLECT_OPEN = 8, /* WinDivert handle opened. */ |
|||
WINDIVERT_EVENT_REFLECT_CLOSE = 9, /* WinDivert handle closed. */ |
|||
} WINDIVERT_EVENT, *PWINDIVERT_EVENT; |
|||
|
|||
/*
|
|||
* WinDivert flags. |
|||
*/ |
|||
#define WINDIVERT_FLAG_SNIFF 0x0001 |
|||
#define WINDIVERT_FLAG_DROP 0x0002 |
|||
#define WINDIVERT_FLAG_RECV_ONLY 0x0004 |
|||
#define WINDIVERT_FLAG_READ_ONLY WINDIVERT_FLAG_RECV_ONLY |
|||
#define WINDIVERT_FLAG_SEND_ONLY 0x0008 |
|||
#define WINDIVERT_FLAG_WRITE_ONLY WINDIVERT_FLAG_SEND_ONLY |
|||
#define WINDIVERT_FLAG_NO_INSTALL 0x0010 |
|||
#define WINDIVERT_FLAG_FRAGMENTS 0x0020 |
|||
|
|||
/*
|
|||
* WinDivert parameters. |
|||
*/ |
|||
typedef enum |
|||
{ |
|||
WINDIVERT_PARAM_QUEUE_LENGTH = 0, /* Packet queue length. */ |
|||
WINDIVERT_PARAM_QUEUE_TIME = 1, /* Packet queue time. */ |
|||
WINDIVERT_PARAM_QUEUE_SIZE = 2, /* Packet queue size. */ |
|||
WINDIVERT_PARAM_VERSION_MAJOR = 3, /* Driver version (major). */ |
|||
WINDIVERT_PARAM_VERSION_MINOR = 4, /* Driver version (minor). */ |
|||
} WINDIVERT_PARAM, *PWINDIVERT_PARAM; |
|||
#define WINDIVERT_PARAM_MAX WINDIVERT_PARAM_VERSION_MINOR |
|||
|
|||
/*
|
|||
* WinDivert shutdown parameter. |
|||
*/ |
|||
typedef enum |
|||
{ |
|||
WINDIVERT_SHUTDOWN_RECV = 0x1, /* Shutdown recv. */ |
|||
WINDIVERT_SHUTDOWN_SEND = 0x2, /* Shutdown send. */ |
|||
WINDIVERT_SHUTDOWN_BOTH = 0x3, /* Shutdown recv and send. */ |
|||
} WINDIVERT_SHUTDOWN, *PWINDIVERT_SHUTDOWN; |
|||
#define WINDIVERT_SHUTDOWN_MAX WINDIVERT_SHUTDOWN_BOTH |
|||
|
|||
#ifndef WINDIVERT_KERNEL |
|||
|
|||
/*
|
|||
* Open a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT HANDLE WinDivertOpen( |
|||
__in const char *filter, |
|||
__in WINDIVERT_LAYER layer, |
|||
__in INT16 priority, |
|||
__in UINT64 flags); |
|||
|
|||
/*
|
|||
* Receive (read) a packet from a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertRecv( |
|||
__in HANDLE handle, |
|||
__out_opt VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__out_opt UINT *pRecvLen, |
|||
__out_opt WINDIVERT_ADDRESS *pAddr); |
|||
|
|||
/*
|
|||
* Receive (read) a packet from a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertRecvEx( |
|||
__in HANDLE handle, |
|||
__out_opt VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__out_opt UINT *pRecvLen, |
|||
__in UINT64 flags, |
|||
__out WINDIVERT_ADDRESS *pAddr, |
|||
__inout_opt UINT *pAddrLen, |
|||
__inout_opt LPOVERLAPPED lpOverlapped); |
|||
|
|||
/*
|
|||
* Send (write/inject) a packet to a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertSend( |
|||
__in HANDLE handle, |
|||
__in const VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__out_opt UINT *pSendLen, |
|||
__in const WINDIVERT_ADDRESS *pAddr); |
|||
|
|||
/*
|
|||
* Send (write/inject) a packet to a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertSendEx( |
|||
__in HANDLE handle, |
|||
__in const VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__out_opt UINT *pSendLen, |
|||
__in UINT64 flags, |
|||
__in const WINDIVERT_ADDRESS *pAddr, |
|||
__in UINT addrLen, |
|||
__inout_opt LPOVERLAPPED lpOverlapped); |
|||
|
|||
/*
|
|||
* Shutdown a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertShutdown( |
|||
__in HANDLE handle, |
|||
__in WINDIVERT_SHUTDOWN how); |
|||
|
|||
/*
|
|||
* Close a WinDivert handle. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertClose( |
|||
__in HANDLE handle); |
|||
|
|||
/*
|
|||
* Set a WinDivert handle parameter. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertSetParam( |
|||
__in HANDLE handle, |
|||
__in WINDIVERT_PARAM param, |
|||
__in UINT64 value); |
|||
|
|||
/*
|
|||
* Get a WinDivert handle parameter. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertGetParam( |
|||
__in HANDLE handle, |
|||
__in WINDIVERT_PARAM param, |
|||
__out UINT64 *pValue); |
|||
|
|||
#endif /* WINDIVERT_KERNEL */ |
|||
|
|||
/*
|
|||
* WinDivert constants. |
|||
*/ |
|||
#define WINDIVERT_PRIORITY_HIGHEST 30000 |
|||
#define WINDIVERT_PRIORITY_LOWEST (-WINDIVERT_PRIORITY_HIGHEST) |
|||
#define WINDIVERT_PARAM_QUEUE_LENGTH_DEFAULT 4096 |
|||
#define WINDIVERT_PARAM_QUEUE_LENGTH_MIN 32 |
|||
#define WINDIVERT_PARAM_QUEUE_LENGTH_MAX 16384 |
|||
#define WINDIVERT_PARAM_QUEUE_TIME_DEFAULT 2000 /* 2s */ |
|||
#define WINDIVERT_PARAM_QUEUE_TIME_MIN 100 /* 100ms */ |
|||
#define WINDIVERT_PARAM_QUEUE_TIME_MAX 16000 /* 16s */ |
|||
#define WINDIVERT_PARAM_QUEUE_SIZE_DEFAULT 4194304 /* 4MB */ |
|||
#define WINDIVERT_PARAM_QUEUE_SIZE_MIN 65535 /* 64KB */ |
|||
#define WINDIVERT_PARAM_QUEUE_SIZE_MAX 33554432 /* 32MB */ |
|||
#define WINDIVERT_BATCH_MAX 0xFF /* 255 */ |
|||
#define WINDIVERT_MTU_MAX (40 + 0xFFFF) |
|||
|
|||
/****************************************************************************/ |
|||
/* WINDIVERT HELPER API */ |
|||
/****************************************************************************/ |
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma warning(push) |
|||
#pragma warning(disable: 4214) |
|||
#endif |
|||
|
|||
/*
|
|||
* IPv4/IPv6/ICMP/ICMPv6/TCP/UDP header definitions. |
|||
*/ |
|||
typedef struct |
|||
{ |
|||
UINT8 HdrLength:4; |
|||
UINT8 Version:4; |
|||
UINT8 TOS; |
|||
UINT16 Length; |
|||
UINT16 Id; |
|||
UINT16 FragOff0; |
|||
UINT8 TTL; |
|||
UINT8 Protocol; |
|||
UINT16 Checksum; |
|||
UINT32 SrcAddr; |
|||
UINT32 DstAddr; |
|||
} WINDIVERT_IPHDR, *PWINDIVERT_IPHDR; |
|||
|
|||
#define WINDIVERT_IPHDR_GET_FRAGOFF(hdr) \ |
|||
(((hdr)->FragOff0) & 0xFF1F) |
|||
#define WINDIVERT_IPHDR_GET_MF(hdr) \ |
|||
((((hdr)->FragOff0) & 0x0020) != 0) |
|||
#define WINDIVERT_IPHDR_GET_DF(hdr) \ |
|||
((((hdr)->FragOff0) & 0x0040) != 0) |
|||
#define WINDIVERT_IPHDR_GET_RESERVED(hdr) \ |
|||
((((hdr)->FragOff0) & 0x0080) != 0) |
|||
|
|||
#define WINDIVERT_IPHDR_SET_FRAGOFF(hdr, val) \ |
|||
do \ |
|||
{ \ |
|||
(hdr)->FragOff0 = (((hdr)->FragOff0) & 0x00E0) | \ |
|||
((val) & 0xFF1F); \ |
|||
} \ |
|||
while (FALSE) |
|||
#define WINDIVERT_IPHDR_SET_MF(hdr, val) \ |
|||
do \ |
|||
{ \ |
|||
(hdr)->FragOff0 = (((hdr)->FragOff0) & 0xFFDF) | \ |
|||
(((val) & 0x0001) << 5); \ |
|||
} \ |
|||
while (FALSE) |
|||
#define WINDIVERT_IPHDR_SET_DF(hdr, val) \ |
|||
do \ |
|||
{ \ |
|||
(hdr)->FragOff0 = (((hdr)->FragOff0) & 0xFFBF) | \ |
|||
(((val) & 0x0001) << 6); \ |
|||
} \ |
|||
while (FALSE) |
|||
#define WINDIVERT_IPHDR_SET_RESERVED(hdr, val) \ |
|||
do \ |
|||
{ \ |
|||
(hdr)->FragOff0 = (((hdr)->FragOff0) & 0xFF7F) | \ |
|||
(((val) & 0x0001) << 7); \ |
|||
} \ |
|||
while (FALSE) |
|||
|
|||
typedef struct |
|||
{ |
|||
UINT8 TrafficClass0:4; |
|||
UINT8 Version:4; |
|||
UINT8 FlowLabel0:4; |
|||
UINT8 TrafficClass1:4; |
|||
UINT16 FlowLabel1; |
|||
UINT16 Length; |
|||
UINT8 NextHdr; |
|||
UINT8 HopLimit; |
|||
UINT32 SrcAddr[4]; |
|||
UINT32 DstAddr[4]; |
|||
} WINDIVERT_IPV6HDR, *PWINDIVERT_IPV6HDR; |
|||
|
|||
#define WINDIVERT_IPV6HDR_GET_TRAFFICCLASS(hdr) \ |
|||
((((hdr)->TrafficClass0) << 4) | ((hdr)->TrafficClass1)) |
|||
#define WINDIVERT_IPV6HDR_GET_FLOWLABEL(hdr) \ |
|||
((((UINT32)(hdr)->FlowLabel0) << 16) | ((UINT32)(hdr)->FlowLabel1)) |
|||
|
|||
#define WINDIVERT_IPV6HDR_SET_TRAFFICCLASS(hdr, val) \ |
|||
do \ |
|||
{ \ |
|||
(hdr)->TrafficClass0 = ((UINT8)(val) >> 4); \ |
|||
(hdr)->TrafficClass1 = (UINT8)(val); \ |
|||
} \ |
|||
while (FALSE) |
|||
#define WINDIVERT_IPV6HDR_SET_FLOWLABEL(hdr, val) \ |
|||
do \ |
|||
{ \ |
|||
(hdr)->FlowLabel0 = (UINT8)((val) >> 16); \ |
|||
(hdr)->FlowLabel1 = (UINT16)(val); \ |
|||
} \ |
|||
while (FALSE) |
|||
|
|||
typedef struct |
|||
{ |
|||
UINT8 Type; |
|||
UINT8 Code; |
|||
UINT16 Checksum; |
|||
UINT32 Body; |
|||
} WINDIVERT_ICMPHDR, *PWINDIVERT_ICMPHDR; |
|||
|
|||
typedef struct |
|||
{ |
|||
UINT8 Type; |
|||
UINT8 Code; |
|||
UINT16 Checksum; |
|||
UINT32 Body; |
|||
} WINDIVERT_ICMPV6HDR, *PWINDIVERT_ICMPV6HDR; |
|||
|
|||
typedef struct |
|||
{ |
|||
UINT16 SrcPort; |
|||
UINT16 DstPort; |
|||
UINT32 SeqNum; |
|||
UINT32 AckNum; |
|||
UINT16 Reserved1:4; |
|||
UINT16 HdrLength:4; |
|||
UINT16 Fin:1; |
|||
UINT16 Syn:1; |
|||
UINT16 Rst:1; |
|||
UINT16 Psh:1; |
|||
UINT16 Ack:1; |
|||
UINT16 Urg:1; |
|||
UINT16 Reserved2:2; |
|||
UINT16 Window; |
|||
UINT16 Checksum; |
|||
UINT16 UrgPtr; |
|||
} WINDIVERT_TCPHDR, *PWINDIVERT_TCPHDR; |
|||
|
|||
typedef struct |
|||
{ |
|||
UINT16 SrcPort; |
|||
UINT16 DstPort; |
|||
UINT16 Length; |
|||
UINT16 Checksum; |
|||
} WINDIVERT_UDPHDR, *PWINDIVERT_UDPHDR; |
|||
|
|||
#ifdef _MSC_VER |
|||
#pragma warning(pop) |
|||
#endif |
|||
|
|||
/*
|
|||
* Flags for WinDivertHelperCalcChecksums() |
|||
*/ |
|||
#define WINDIVERT_HELPER_NO_IP_CHECKSUM 1 |
|||
#define WINDIVERT_HELPER_NO_ICMP_CHECKSUM 2 |
|||
#define WINDIVERT_HELPER_NO_ICMPV6_CHECKSUM 4 |
|||
#define WINDIVERT_HELPER_NO_TCP_CHECKSUM 8 |
|||
#define WINDIVERT_HELPER_NO_UDP_CHECKSUM 16 |
|||
|
|||
#ifndef WINDIVERT_KERNEL |
|||
|
|||
/*
|
|||
* Hash a packet. |
|||
*/ |
|||
WINDIVERTEXPORT UINT64 WinDivertHelperHashPacket( |
|||
__in const VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__in UINT64 seed |
|||
#ifdef __cplusplus |
|||
= 0 |
|||
#endif |
|||
); |
|||
|
|||
/*
|
|||
* Parse IPv4/IPv6/ICMP/ICMPv6/TCP/UDP headers from a raw packet. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperParsePacket( |
|||
__in const VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__out_opt PWINDIVERT_IPHDR *ppIpHdr, |
|||
__out_opt PWINDIVERT_IPV6HDR *ppIpv6Hdr, |
|||
__out_opt UINT8 *pProtocol, |
|||
__out_opt PWINDIVERT_ICMPHDR *ppIcmpHdr, |
|||
__out_opt PWINDIVERT_ICMPV6HDR *ppIcmpv6Hdr, |
|||
__out_opt PWINDIVERT_TCPHDR *ppTcpHdr, |
|||
__out_opt PWINDIVERT_UDPHDR *ppUdpHdr, |
|||
__out_opt PVOID *ppData, |
|||
__out_opt UINT *pDataLen, |
|||
__out_opt PVOID *ppNext, |
|||
__out_opt UINT *pNextLen); |
|||
|
|||
/*
|
|||
* Parse an IPv4 address. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperParseIPv4Address( |
|||
__in const char *addrStr, |
|||
__out_opt UINT32 *pAddr); |
|||
|
|||
/*
|
|||
* Parse an IPv6 address. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperParseIPv6Address( |
|||
__in const char *addrStr, |
|||
__out_opt UINT32 *pAddr); |
|||
|
|||
/*
|
|||
* Format an IPv4 address. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv4Address( |
|||
__in UINT32 addr, |
|||
__out char *buffer, |
|||
__in UINT bufLen); |
|||
|
|||
/*
|
|||
* Format an IPv6 address. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv6Address( |
|||
__in const UINT32 *pAddr, |
|||
__out char *buffer, |
|||
__in UINT bufLen); |
|||
|
|||
/*
|
|||
* Calculate IPv4/IPv6/ICMP/ICMPv6/TCP/UDP checksums. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperCalcChecksums( |
|||
__inout VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__out_opt WINDIVERT_ADDRESS *pAddr, |
|||
__in UINT64 flags); |
|||
|
|||
/*
|
|||
* Decrement the TTL/HopLimit. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperDecrementTTL( |
|||
__inout VOID *pPacket, |
|||
__in UINT packetLen); |
|||
|
|||
/*
|
|||
* Compile the given filter string. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperCompileFilter( |
|||
__in const char *filter, |
|||
__in WINDIVERT_LAYER layer, |
|||
__out_opt char *object, |
|||
__in UINT objLen, |
|||
__out_opt const char **errorStr, |
|||
__out_opt UINT *errorPos); |
|||
|
|||
/*
|
|||
* Evaluate the given filter string. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperEvalFilter( |
|||
__in const char *filter, |
|||
__in const VOID *pPacket, |
|||
__in UINT packetLen, |
|||
__in const WINDIVERT_ADDRESS *pAddr); |
|||
|
|||
/*
|
|||
* Format the given filter string. |
|||
*/ |
|||
WINDIVERTEXPORT BOOL WinDivertHelperFormatFilter( |
|||
__in const char *filter, |
|||
__in WINDIVERT_LAYER layer, |
|||
__out char *buffer, |
|||
__in UINT bufLen); |
|||
|
|||
/*
|
|||
* Byte ordering. |
|||
*/ |
|||
WINDIVERTEXPORT UINT16 WinDivertHelperNtohs( |
|||
__in UINT16 x); |
|||
WINDIVERTEXPORT UINT16 WinDivertHelperHtons( |
|||
__in UINT16 x); |
|||
WINDIVERTEXPORT UINT32 WinDivertHelperNtohl( |
|||
__in UINT32 x); |
|||
WINDIVERTEXPORT UINT32 WinDivertHelperHtonl( |
|||
__in UINT32 x); |
|||
WINDIVERTEXPORT UINT64 WinDivertHelperNtohll( |
|||
__in UINT64 x); |
|||
WINDIVERTEXPORT UINT64 WinDivertHelperHtonll( |
|||
__in UINT64 x); |
|||
WINDIVERTEXPORT void WinDivertHelperNtohIPv6Address( |
|||
__in const UINT *inAddr, |
|||
__out UINT *outAddr); |
|||
WINDIVERTEXPORT void WinDivertHelperHtonIPv6Address( |
|||
__in const UINT *inAddr, |
|||
__out UINT *outAddr); |
|||
|
|||
/*
|
|||
* Old names to be removed in the next version. |
|||
*/ |
|||
WINDIVERTEXPORT void WinDivertHelperNtohIpv6Address( |
|||
__in const UINT *inAddr, |
|||
__out UINT *outAddr); |
|||
WINDIVERTEXPORT void WinDivertHelperHtonIpv6Address( |
|||
__in const UINT *inAddr, |
|||
__out UINT *outAddr); |
|||
|
|||
#endif /* WINDIVERT_KERNEL */ |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#endif /* __WINDIVERT_H */ |
Loading…
Reference in new issue