(vm: &VirtualMachine)
| 56 | static TRANSMIT_FILE: std::sync::OnceLock<usize> = std::sync::OnceLock::new(); |
| 57 | |
| 58 | fn initialize_winsock_extensions(vm: &VirtualMachine) -> PyResult<()> { |
| 59 | use windows_sys::Win32::Networking::WinSock::{ |
| 60 | INVALID_SOCKET, IPPROTO_TCP, SIO_GET_EXTENSION_FUNCTION_POINTER, SOCK_STREAM, |
| 61 | SOCKET_ERROR, WSAGetLastError, WSAIoctl, closesocket, socket, |
| 62 | }; |
| 63 | |
| 64 | // GUIDs for extension functions |
| 65 | const WSAID_ACCEPTEX: windows_sys::core::GUID = windows_sys::core::GUID { |
| 66 | data1: 0xb5367df1, |
| 67 | data2: 0xcbac, |
| 68 | data3: 0x11cf, |
| 69 | data4: [0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92], |
| 70 | }; |
| 71 | const WSAID_CONNECTEX: windows_sys::core::GUID = windows_sys::core::GUID { |
| 72 | data1: 0x25a207b9, |
| 73 | data2: 0xddf3, |
| 74 | data3: 0x4660, |
| 75 | data4: [0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e], |
| 76 | }; |
| 77 | const WSAID_DISCONNECTEX: windows_sys::core::GUID = windows_sys::core::GUID { |
| 78 | data1: 0x7fda2e11, |
| 79 | data2: 0x8630, |
| 80 | data3: 0x436f, |
| 81 | data4: [0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57], |
| 82 | }; |
| 83 | const WSAID_TRANSMITFILE: windows_sys::core::GUID = windows_sys::core::GUID { |
| 84 | data1: 0xb5367df0, |
| 85 | data2: 0xcbac, |
| 86 | data3: 0x11cf, |
| 87 | data4: [0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92], |
| 88 | }; |
| 89 | |
| 90 | // Check all four locks to prevent partial initialization |
| 91 | if ACCEPT_EX.get().is_some() |
| 92 | && CONNECT_EX.get().is_some() |
| 93 | && DISCONNECT_EX.get().is_some() |
| 94 | && TRANSMIT_FILE.get().is_some() |
| 95 | { |
| 96 | return Ok(()); |
| 97 | } |
| 98 | |
| 99 | let s = unsafe { socket(AF_INET as i32, SOCK_STREAM, IPPROTO_TCP) }; |
| 100 | if s == INVALID_SOCKET { |
| 101 | let err = unsafe { WSAGetLastError() } as u32; |
| 102 | return Err(set_from_windows_err(err, vm)); |
| 103 | } |
| 104 | |
| 105 | let mut dw_bytes: u32 = 0; |
| 106 | |
| 107 | macro_rules! get_extension { |
| 108 | ($guid:expr, $lock:expr) => {{ |
| 109 | let mut func_ptr: usize = 0; |
| 110 | let ret = unsafe { |
| 111 | WSAIoctl( |
| 112 | s, |
| 113 | SIO_GET_EXTENSION_FUNCTION_POINTER, |
| 114 | &$guid as *const _ as *const _, |
| 115 | core::mem::size_of_val(&$guid) as u32, |
no test coverage detected