Skip to content

Commit 971fb4a

Browse files
unlimitedsolasirhcel
authored andcommitted
Replace winapi with windows-sys crate
1 parent 0bc2aa6 commit 971fb4a

File tree

5 files changed

+306
-126
lines changed

5 files changed

+306
-126
lines changed

Cargo.toml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,19 @@ core-foundation-sys = "0.8.4"
2828
io-kit-sys = "0.4.0"
2929
mach2 = "0.4.1"
3030

31-
[target."cfg(windows)".dependencies.winapi]
32-
version = "0.3.9"
31+
[target."cfg(windows)".dependencies.windows-sys]
32+
version = "0.60.2"
3333
features = [
34-
"cguid", "commapi", "errhandlingapi", "fileapi", "guiddef", "handleapi", "minwinbase",
35-
"minwindef", "ntdef", "setupapi", "winbase", "winerror", "winnt",
34+
"Win32_Devices_Communication",
35+
"Win32_Foundation",
36+
"Win32_Storage_FileSystem",
37+
"Win32_System_IO",
38+
"Win32_System_Registry",
39+
"Win32_System_Diagnostics_Debug",
40+
"Win32_Devices_DeviceAndDriverInstallation",
41+
"Win32_System_Threading",
42+
"Win32_Security",
43+
"Win32_System_SystemServices",
3644
]
3745

3846
[dependencies]

src/windows/com.rs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ use std::os::windows::prelude::*;
33
use std::time::Duration;
44
use std::{io, ptr};
55

6-
use winapi::shared::minwindef::*;
7-
use winapi::um::commapi::*;
8-
use winapi::um::fileapi::*;
9-
use winapi::um::handleapi::*;
10-
use winapi::um::processthreadsapi::GetCurrentProcess;
11-
use winapi::um::winbase::*;
12-
use winapi::um::winnt::{
13-
DUPLICATE_SAME_ACCESS, FILE_ATTRIBUTE_NORMAL, GENERIC_READ, GENERIC_WRITE, HANDLE, MAXDWORD,
6+
use windows_sys::Win32::Devices::Communication::*;
7+
use windows_sys::Win32::Foundation::{
8+
CloseHandle, DuplicateHandle, DUPLICATE_SAME_ACCESS, GENERIC_READ, GENERIC_WRITE, HANDLE,
9+
INVALID_HANDLE_VALUE, TRUE,
1410
};
11+
use windows_sys::Win32::Storage::FileSystem::{
12+
CreateFileW, FlushFileBuffers, ReadFile, WriteFile, FILE_ATTRIBUTE_NORMAL, OPEN_EXISTING,
13+
};
14+
use windows_sys::Win32::System::Threading::GetCurrentProcess;
1515

16-
use crate::windows::dcb;
16+
use crate::windows::dcb::{self, DCBBitField};
1717
use crate::{
1818
ClearBuffer, DataBits, Error, ErrorKind, FlowControl, Parity, Result, SerialPort,
1919
SerialPortBuilder, StopBits,
@@ -137,15 +137,15 @@ impl COMPort {
137137
}
138138
}
139139

140-
fn escape_comm_function(&mut self, function: DWORD) -> Result<()> {
140+
fn escape_comm_function(&mut self, function: u32) -> Result<()> {
141141
match unsafe { EscapeCommFunction(self.handle, function) } {
142142
0 => Err(super::error::last_os_error()),
143143
_ => Ok(()),
144144
}
145145
}
146146

147-
fn read_pin(&mut self, pin: DWORD) -> Result<bool> {
148-
let mut status: DWORD = 0;
147+
fn read_pin(&mut self, pin: u32) -> Result<bool> {
148+
let mut status: u32 = 0;
149149

150150
match unsafe { GetCommModemStatus(self.handle, &mut status) } {
151151
0 => Err(super::error::last_os_error()),
@@ -163,16 +163,16 @@ impl COMPort {
163163
}
164164
}
165165

166-
fn timeout_constant(duration: Duration) -> DWORD {
166+
fn timeout_constant(duration: Duration) -> u32 {
167167
let milliseconds = duration.as_millis();
168-
// In the way we are setting up COMMTIMEOUTS, a timeout_constant of MAXDWORD gets rejected.
169-
// Let's clamp the timeout constant for values of MAXDWORD and above. See remarks at
168+
// In the way we are setting up COMMTIMEOUTS, a timeout_constant of u32::MAX gets rejected.
169+
// Let's clamp the timeout constant for values of u32::MAX and above. See remarks at
170170
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-commtimeouts.
171171
//
172172
// This effectively throws away accuracy for really long timeouts but at least preserves a
173173
// long-ish timeout. But just casting to DWORD would result in presumably unexpected short
174174
// and non-monotonic timeouts from cutting off the higher bits.
175-
u128::min(milliseconds, MAXDWORD as u128 - 1) as DWORD
175+
u128::min(milliseconds, u32::MAX as u128 - 1) as u32
176176
}
177177
}
178178

@@ -206,13 +206,13 @@ impl IntoRawHandle for COMPort {
206206

207207
impl io::Read for COMPort {
208208
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
209-
let mut len: DWORD = 0;
209+
let mut len: u32 = 0;
210210

211211
match unsafe {
212212
ReadFile(
213213
self.handle,
214-
buf.as_mut_ptr() as LPVOID,
215-
buf.len() as DWORD,
214+
buf.as_mut_ptr(),
215+
buf.len() as u32,
216216
&mut len,
217217
ptr::null_mut(),
218218
)
@@ -234,13 +234,13 @@ impl io::Read for COMPort {
234234

235235
impl io::Write for COMPort {
236236
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
237-
let mut len: DWORD = 0;
237+
let mut len: u32 = 0;
238238

239239
match unsafe {
240240
WriteFile(
241241
self.handle,
242-
buf.as_ptr() as LPVOID,
243-
buf.len() as DWORD,
242+
buf.as_ptr(),
243+
buf.len() as u32,
244244
&mut len,
245245
ptr::null_mut(),
246246
)
@@ -270,15 +270,15 @@ impl SerialPort for COMPort {
270270
fn set_timeout(&mut self, timeout: Duration) -> Result<()> {
271271
let timeout_constant = Self::timeout_constant(timeout);
272272

273-
let mut timeouts = COMMTIMEOUTS {
274-
ReadIntervalTimeout: MAXDWORD,
275-
ReadTotalTimeoutMultiplier: MAXDWORD,
273+
let timeouts = COMMTIMEOUTS {
274+
ReadIntervalTimeout: u32::MAX,
275+
ReadTotalTimeoutMultiplier: u32::MAX,
276276
ReadTotalTimeoutConstant: timeout_constant,
277277
WriteTotalTimeoutMultiplier: 0,
278278
WriteTotalTimeoutConstant: timeout_constant,
279279
};
280280

281-
if unsafe { SetCommTimeouts(self.handle, &mut timeouts) } == 0 {
281+
if unsafe { SetCommTimeouts(self.handle, &timeouts) } == 0 {
282282
return Err(super::error::last_os_error());
283283
}
284284

@@ -320,7 +320,7 @@ impl SerialPort for COMPort {
320320

321321
fn baud_rate(&self) -> Result<u32> {
322322
let dcb = dcb::get_dcb(self.handle)?;
323-
Ok(dcb.BaudRate as u32)
323+
Ok(dcb.BaudRate)
324324
}
325325

326326
fn data_bits(&self) -> Result<DataBits> {
@@ -364,9 +364,9 @@ impl SerialPort for COMPort {
364364

365365
fn flow_control(&self) -> Result<FlowControl> {
366366
let dcb = dcb::get_dcb(self.handle)?;
367-
if dcb.fOutxCtsFlow() != 0 || dcb.fRtsControl() != 0 {
367+
if dcb.fOutxCtsFlow() || dcb.fRtsControl() != dcb::RtsControl::Disable {
368368
Ok(FlowControl::Hardware)
369-
} else if dcb.fOutX() != 0 || dcb.fInX() != 0 {
369+
} else if dcb.fOutX() || dcb.fInX() {
370370
Ok(FlowControl::Software)
371371
} else {
372372
Ok(FlowControl::None)
@@ -404,7 +404,7 @@ impl SerialPort for COMPort {
404404
}
405405

406406
fn bytes_to_read(&self) -> Result<u32> {
407-
let mut errors: DWORD = 0;
407+
let mut errors: u32 = 0;
408408
let mut comstat = MaybeUninit::uninit();
409409

410410
if unsafe { ClearCommError(self.handle, &mut errors, comstat.as_mut_ptr()) != 0 } {
@@ -415,7 +415,7 @@ impl SerialPort for COMPort {
415415
}
416416

417417
fn bytes_to_write(&self) -> Result<u32> {
418-
let mut errors: DWORD = 0;
418+
let mut errors: u32 = 0;
419419
let mut comstat = MaybeUninit::uninit();
420420

421421
if unsafe { ClearCommError(self.handle, &mut errors, comstat.as_mut_ptr()) != 0 } {

0 commit comments

Comments
 (0)