13 unstable releases (4 breaking)
0.5.0 | Jul 22, 2024 |
---|---|
0.4.0 | Jan 12, 2024 |
0.3.2 | Sep 27, 2023 |
0.2.1 | Dec 3, 2021 |
0.1.3 | Jun 28, 2021 |
#280 in Network programming
9,364 downloads per month
Used in 13 crates
(4 directly)
1.5MB
1.5K
SLoC
Contains (Windows DLL, 550KB) wintun/bin/x86/wintun.dll, (Windows DLL, 430KB) wintun/bin/amd64/wintun.dll, (Windows DLL, 365KB) wintun/bin/arm/wintun.dll, (Windows DLL, 225KB) wintun/bin/arm64/wintun.dll
wintun
Safe rust idiomatic bindings for the Wintun C library: https://wintun.net
All features of the Wintun library are wrapped using pure rust types and functions to make usage feel ergonomic.
Usage
Inside your code load the wintun.dll signed driver file, downloaded from https://wintun.net,
using load
, load_from_path
or load_from_library
.
Then either call Adapter::create
or Adapter::open
to obtain a wintun
adapter. Start a session with Adapter::start_session
.
Example
use std::sync::Arc;
//Must be run as Administrator because we create network adapters
//Load the wintun dll file so that we can call the underlying C functions
//Unsafe because we are loading an arbitrary dll file
let wintun = unsafe { wintun::load_from_path("path/to/wintun.dll") }
.expect("Failed to load wintun dll");
//Try to open an adapter with the name "Demo"
let adapter = match wintun::Adapter::open(&wintun, "Demo") {
Ok(a) => a,
Err(_) => {
//If loading failed (most likely it didn't exist), create a new one
wintun::Adapter::create(&wintun, "Demo", "Example", None)
.expect("Failed to create wintun adapter!")
}
};
//Specify the size of the ring buffer the wintun driver should use.
let session = Arc::new(adapter.start_session(wintun::MAX_RING_CAPACITY).unwrap());
//Get a 20 byte packet from the ring buffer
let mut packet = session.allocate_send_packet(20).unwrap();
let bytes: &mut [u8] = packet.bytes_mut();
//Write IPV4 version and header length
bytes[0] = 0x40;
//Finish writing IP header
bytes[9] = 0x69;
bytes[10] = 0x04;
bytes[11] = 0x20;
//...
//Send the packet to wintun virtual adapter for processing by the system
session.send_packet(packet);
//Stop any readers blocking for data on other threads
//Only needed when a blocking reader is preventing shutdown Ie. it holds an Arc to the
//session, blocking it from being dropped
session.shutdown();
//the session is stopped on drop
//drop(session);
//drop(adapter)
//And the adapter closes its resources when dropped
See examples/wireshark.rs
for a more complete example that writes received packets to a pcap
file.
Features
panic_on_unsent_packets
: Panics if a send packet is dropped without being sent. Useful for debugging packet issues because unsent packets that are dropped without being sent hold up wintun's internal ring buffer.
TODO:
- Add async support Requires hooking into a windows specific reactor and registering read interest on wintun's read handle. Asyncify other slow operations via tokio::spawn_blocking. As always, PR's are welcome!
License: MIT
Dependencies
~13–20MB
~275K SLoC