1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5pub mod address;
6pub mod header;
7pub mod ioctl;
8
9mod bitfield;
10use std::ffi::c_void;
11
12pub(crate) use bitfield::BitfieldUnit;
13mod error;
14pub use error::*;
15mod newtypes;
16pub use newtypes::*;
17
18use windows::Win32::{
19 Foundation::{BOOL, HANDLE},
20 System::IO::OVERLAPPED,
21};
22pub const WINDIVERT_PARAM_QUEUE_LENGTH_DEFAULT: u64 = 4096;
24pub const WINDIVERT_PARAM_QUEUE_LENGTH_MIN: u64 = 32;
26pub const WINDIVERT_PARAM_QUEUE_LENGTH_MAX: u64 = 16384;
28pub const WINDIVERT_PARAM_QUEUE_TIME_DEFAULT: u64 = 2000; pub const WINDIVERT_PARAM_QUEUE_TIME_MIN: u64 = 100; pub const WINDIVERT_PARAM_QUEUE_TIME_MAX: u64 = 16000; pub const WINDIVERT_PARAM_QUEUE_SIZE_DEFAULT: u64 = 4194304; pub const WINDIVERT_PARAM_QUEUE_SIZE_MIN: u64 = 65535; pub const WINDIVERT_PARAM_QUEUE_SIZE_MAX: u64 = 33554432; pub const WINDIVERT_PRIORITY_MAX: u32 = 30000;
42pub const WINDIVERT_PRIORITY_MIN: i32 = -30000;
44pub const WINDIVERT_BATCH_MAX: u32 = 255;
46pub const WINDIVERT_MTU_MAX: u32 = 65575;
48
49extern "C" {
50 pub fn WinDivertOpen(
52 filter: *const ::std::os::raw::c_char,
53 layer: WinDivertLayer,
54 priority: i16,
55 flags: WinDivertFlags,
56 ) -> HANDLE;
57
58 pub fn WinDivertRecv(
60 handle: HANDLE,
61 pPacket: *mut ::std::os::raw::c_void,
62 packetLen: u32,
63 pRecvLen: *mut u32,
64 pAddr: *mut address::WINDIVERT_ADDRESS,
65 ) -> BOOL;
66
67 pub fn WinDivertRecvEx(
69 handle: HANDLE,
70 pPacket: *mut ::std::os::raw::c_void,
71 packetLen: u32,
72 pRecvLen: *mut u32,
73 flags: u64,
74 pAddr: *mut address::WINDIVERT_ADDRESS,
75 pAddrLen: *mut u32,
76 lpOverlapped: *mut OVERLAPPED,
77 ) -> BOOL;
78
79 pub fn WinDivertSend(
81 handle: HANDLE,
82 pPacket: *const ::std::os::raw::c_void,
83 packetLen: u32,
84 pSendLen: *mut u32,
85 pAddr: *const address::WINDIVERT_ADDRESS,
86 ) -> BOOL;
87
88 pub fn WinDivertSendEx(
90 handle: HANDLE,
91 pPacket: *const ::std::os::raw::c_void,
92 packetLen: u32,
93 pSendLen: *mut u32,
94 flags: u64,
95 pAddr: *const address::WINDIVERT_ADDRESS,
96 addrLen: u32,
97 lpOverlapped: *mut OVERLAPPED,
98 ) -> BOOL;
99
100 pub fn WinDivertShutdown(handle: HANDLE, how: WinDivertShutdownMode) -> BOOL;
102
103 pub fn WinDivertClose(handle: HANDLE) -> BOOL;
105
106 pub fn WinDivertSetParam(handle: HANDLE, param: WinDivertParam, value: u64) -> BOOL;
108
109 pub fn WinDivertGetParam(handle: HANDLE, param: WinDivertParam, pValue: *mut u64) -> BOOL;
111}
112
113extern "C" {
114 pub fn WinDivertHelperParsePacket(
116 pPacket: *const ::std::os::raw::c_void,
117 packetLen: u32,
118 ppIpHdr: *mut header::PWINDIVERT_IPHDR,
119 ppIpv6Hdr: *mut header::PWINDIVERT_IPV6HDR,
120 pProtocol: *mut u8,
121 ppIcmpHdr: *mut header::PWINDIVERT_ICMPHDR,
122 ppIcmpv6Hdr: *mut header::PWINDIVERT_ICMPV6HDR,
123 ppTcpHdr: *mut header::PWINDIVERT_TCPHDR,
124 ppUdpHdr: *mut header::PWINDIVERT_UDPHDR,
125 ppData: *mut c_void,
126 pDataLen: *mut u32,
127 ppNext: *mut c_void,
128 pNextLen: *mut u32,
129 ) -> BOOL;
130
131 pub fn WinDivertHelperHashPacket(
133 pPacket: *const ::std::os::raw::c_void,
134 packetLen: u32,
135 seed: u64,
136 ) -> u64;
137
138 pub fn WinDivertHelperParseIPv4Address(
140 addrStr: *const ::std::os::raw::c_char,
141 pAddr: *mut u32,
142 ) -> BOOL;
143
144 pub fn WinDivertHelperParseIPv6Address(
146 addrStr: *const ::std::os::raw::c_char,
147 pAddr: *mut u32,
148 ) -> BOOL;
149
150 pub fn WinDivertHelperFormatIPv4Address(
152 addr: u32,
153 buffer: *mut ::std::os::raw::c_char,
154 bufLen: u32,
155 ) -> BOOL;
156
157 pub fn WinDivertHelperFormatIPv6Address(
159 pAddr: *const u32,
160 buffer: *mut ::std::os::raw::c_char,
161 bufLen: u32,
162 ) -> BOOL;
163
164 pub fn WinDivertHelperCalcChecksums(
166 pPacket: *mut ::std::os::raw::c_void,
167 packetLen: u32,
168 pAddr: *mut address::WINDIVERT_ADDRESS,
169 flags: ChecksumFlags,
170 ) -> BOOL;
171
172 pub fn WinDivertHelperDecrementTTL(
174 pPacket: *mut ::std::os::raw::c_void,
175 packetLen: u32,
176 ) -> BOOL;
177
178 pub fn WinDivertHelperCompileFilter(
180 filter: *const ::std::os::raw::c_char,
181 layer: WinDivertLayer,
182 object: *mut ::std::os::raw::c_char,
183 objLen: u32,
184 errorStr: *mut *const ::std::os::raw::c_char,
185 errorPos: *mut u32,
186 ) -> BOOL;
187
188 pub fn WinDivertHelperEvalFilter(
190 filter: *const ::std::os::raw::c_char,
191 pPacket: *const ::std::os::raw::c_void,
192 packetLen: u32,
193 pAddr: *const address::WINDIVERT_ADDRESS,
194 ) -> BOOL;
195
196 pub fn WinDivertHelperFormatFilter(
198 filter: *const ::std::os::raw::c_char,
199 layer: WinDivertLayer,
200 buffer: *mut ::std::os::raw::c_char,
201 bufLen: u32,
202 ) -> BOOL;
203
204 pub fn WinDivertHelperNtohs(x: u16) -> u16;
206
207 pub fn WinDivertHelperHtons(x: u16) -> u16;
209
210 pub fn WinDivertHelperNtohl(x: u32) -> u32;
212
213 pub fn WinDivertHelperHtonl(x: u32) -> u32;
215
216 pub fn WinDivertHelperNtohll(x: u64) -> u64;
218
219 pub fn WinDivertHelperHtonll(x: u64) -> u64;
221
222 pub fn WinDivertHelperNtohIPv6Address(inAddr: *const u32, outAddr: *mut u32);
224
225 pub fn WinDivertHelperHtonIPv6Address(inAddr: *const u32, outAddr: *mut u32);
227
228 pub fn WinDivertHelperNtohIpv6Address(inAddr: *const u32, outAddr: *mut u32);
230
231 pub fn WinDivertHelperHtonIpv6Address(inAddr: *const u32, outAddr: *mut u32);
233}