From 5dc2ba2dcac42bc86363540ffab58309ae5ef89c Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Mon, 2 Mar 2026 23:31:08 +0300 Subject: [PATCH] Safe way to call WSACleanup --- network/windows/src/entry_point.rs | 56 +++++++++++++++++++++++++++ network/windows/src/lib.rs | 4 +- network/windows/src/winsocks_scope.rs | 21 ---------- 3 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 network/windows/src/entry_point.rs delete mode 100644 network/windows/src/winsocks_scope.rs diff --git a/network/windows/src/entry_point.rs b/network/windows/src/entry_point.rs new file mode 100644 index 0000000..43586a4 --- /dev/null +++ b/network/windows/src/entry_point.rs @@ -0,0 +1,56 @@ +use super::errors::throw_from_windows_err_code; +use std::mem::uninitialized; +use windows::Win32::Networking::WinSock::{ + SOCKET_ERROR, WSACleanup, WSADATA, WSAGetLastError, WSAStartup, +}; +use bgtu_networks_2_network_abstract::NetworkScope; + +struct WinSocksDefer {} + +impl WinSocksDefer { + fn startup(expected_version: (u8, u8)) -> Self { + unsafe { + let mut data = uninitialized::(); + let expected_version_packed = + ((expected_version.1 as u16) << 8) | (expected_version.0 as u16); + match WSAStartup(expected_version_packed, &mut data) { + 0 => {} + errcode => throw_from_windows_err_code(errcode), + } + + if data.wVersion != expected_version_packed { + panic!( + "WinSocks doesn't supports requested version {}.{}, maximum supported is {}.{}, current {}.{}", + expected_version.0, + expected_version.1, + data.wHighVersion & 0xFF, + data.wHighVersion >> 8, + data.wVersion & 0xFF, + data.wVersion >> 8 + ); + } + + return Self {}; + } + } +} + +impl Drop for WinSocksDefer { + fn drop(&mut self) { + unsafe { + match WSACleanup() { + 0 => {} + SOCKET_ERROR => throw_from_windows_err_code(WSAGetLastError()), + ret => panic!("Unexpected return value of `WSACleanup()`: {ret}"), + } + } + } +} + + + +pub fn winsocks_scope_2_2(scope: impl NetworkScope) -> R { + let ws = WinSocksDefer::startup((2,2)); + scope.run(todo!()); + let _ = ws; +} diff --git a/network/windows/src/lib.rs b/network/windows/src/lib.rs index 85195a2..0b70039 100644 --- a/network/windows/src/lib.rs +++ b/network/windows/src/lib.rs @@ -3,4 +3,6 @@ mod errors; mod task; mod eventloop; mod allocator; -mod winsocks_scope; \ No newline at end of file +mod entry_point; + +pub use entry_point::winsocks_scope_2_2; \ No newline at end of file diff --git a/network/windows/src/winsocks_scope.rs b/network/windows/src/winsocks_scope.rs deleted file mode 100644 index 7dc284a..0000000 --- a/network/windows/src/winsocks_scope.rs +++ /dev/null @@ -1,21 +0,0 @@ -use super::errors::throw_from_windows_err_code; -use std::mem::uninitialized; -use windows::Win32::Networking::WinSock::{WSACleanup, WSAStartup}; - -pub(in crate) fn winsocks_scope(scope: impl FnOnce() -> R) -> R { - unsafe { - match WSAStartup(0x0202, &mut uninitialized()) { - 0 => {} - errcode => throw_from_windows_err_code(errcode), - } - - let result = scope(); - - match WSACleanup() { - 0 => {} - errcode => throw_from_windows_err_code(errcode), - } - - return result; - } -}