Skip to content

Commit 91c0c8b

Browse files
authored
Merge pull request RustPython#5085 from youknowone/windows
port winapi to windows-sys
2 parents 987d50c + 4a61eba commit 91c0c8b

File tree

4 files changed

+111
-103
lines changed

4 files changed

+111
-103
lines changed

vm/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ features = [
130130
"Win32_System_Console",
131131
"Win32_System_LibraryLoader",
132132
"Win32_System_Pipes",
133+
"Win32_System_SystemServices",
133134
"Win32_System_Threading",
134135
"Win32_UI_Shell",
136+
"Win32_UI_WindowsAndMessaging",
135137
]
136138

137139
[target.'cfg(windows)'.dependencies.winapi]

vm/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ pub mod utils;
7979
pub mod version;
8080
pub mod vm;
8181
pub mod warn;
82+
#[cfg(windows)]
83+
pub mod windows;
8284

8385
pub use self::compiler::parser::source_code;
8486
pub use self::convert::{TryFromBorrowedObject, TryFromObject};

vm/src/stdlib/winapi.rs

Lines changed: 39 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -6,123 +6,57 @@ mod _winapi {
66
use crate::{
77
builtins::PyStrRef,
88
common::windows::ToWideString,
9-
convert::{ToPyException, ToPyObject, ToPyResult},
9+
convert::{ToPyException, ToPyResult},
1010
function::{ArgMapping, ArgSequence, OptionalArg},
1111
stdlib::os::errno_err,
12+
windows::WindowsSysResult,
1213
PyObjectRef, PyResult, TryFromObject, VirtualMachine,
1314
};
1415
use std::ptr::{null, null_mut};
15-
use winapi::um::winbase;
1616
use windows::{
1717
core::PCWSTR,
1818
Win32::Foundation::{HANDLE, HINSTANCE, MAX_PATH},
1919
};
2020
use windows_sys::Win32::Foundation::{BOOL, HANDLE as RAW_HANDLE};
2121

2222
#[pyattr]
23-
use winapi::{
24-
shared::winerror::{
25-
ERROR_ALREADY_EXISTS, ERROR_BROKEN_PIPE, ERROR_IO_PENDING, ERROR_MORE_DATA,
26-
ERROR_NETNAME_DELETED, ERROR_NO_DATA, ERROR_NO_SYSTEM_RESOURCES,
27-
ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY, ERROR_PIPE_CONNECTED, ERROR_SEM_TIMEOUT,
28-
WAIT_TIMEOUT,
23+
use windows_sys::Win32::{
24+
Foundation::{
25+
DUPLICATE_CLOSE_SOURCE, DUPLICATE_SAME_ACCESS, ERROR_ALREADY_EXISTS, ERROR_BROKEN_PIPE,
26+
ERROR_IO_PENDING, ERROR_MORE_DATA, ERROR_NETNAME_DELETED, ERROR_NO_DATA,
27+
ERROR_NO_SYSTEM_RESOURCES, ERROR_OPERATION_ABORTED, ERROR_PIPE_BUSY,
28+
ERROR_PIPE_CONNECTED, ERROR_SEM_TIMEOUT, GENERIC_READ, GENERIC_WRITE, STILL_ACTIVE,
29+
WAIT_ABANDONED, WAIT_ABANDONED_0, WAIT_OBJECT_0, WAIT_TIMEOUT,
2930
},
30-
um::{
31-
fileapi::OPEN_EXISTING,
32-
memoryapi::{
33-
FILE_MAP_ALL_ACCESS, FILE_MAP_COPY, FILE_MAP_EXECUTE, FILE_MAP_READ, FILE_MAP_WRITE,
31+
Storage::FileSystem::{
32+
FILE_FLAG_FIRST_PIPE_INSTANCE, FILE_FLAG_OVERLAPPED, FILE_GENERIC_READ,
33+
FILE_GENERIC_WRITE, FILE_TYPE_CHAR, FILE_TYPE_DISK, FILE_TYPE_PIPE, FILE_TYPE_REMOTE,
34+
FILE_TYPE_UNKNOWN, OPEN_EXISTING, PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, SYNCHRONIZE,
35+
},
36+
System::{
37+
Console::{STD_ERROR_HANDLE, STD_INPUT_HANDLE, STD_OUTPUT_HANDLE},
38+
Memory::{
39+
FILE_MAP_ALL_ACCESS, MEM_COMMIT, MEM_FREE, MEM_IMAGE, MEM_MAPPED, MEM_PRIVATE,
40+
MEM_RESERVE, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE,
41+
PAGE_EXECUTE_WRITECOPY, PAGE_GUARD, PAGE_NOACCESS, PAGE_NOCACHE, PAGE_READONLY,
42+
PAGE_READWRITE, PAGE_WRITECOMBINE, PAGE_WRITECOPY, SEC_COMMIT, SEC_IMAGE,
43+
SEC_LARGE_PAGES, SEC_NOCACHE, SEC_RESERVE, SEC_WRITECOMBINE,
44+
},
45+
Pipes::{
46+
PIPE_READMODE_MESSAGE, PIPE_TYPE_MESSAGE, PIPE_UNLIMITED_INSTANCES, PIPE_WAIT,
3447
},
35-
minwinbase::STILL_ACTIVE,
36-
winbase::{
48+
SystemServices::LOCALE_NAME_MAX_LENGTH,
49+
Threading::{
3750
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
3851
CREATE_BREAKAWAY_FROM_JOB, CREATE_DEFAULT_ERROR_MODE, CREATE_NEW_CONSOLE,
39-
CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW, DETACHED_PROCESS,
40-
FILE_FLAG_FIRST_PIPE_INSTANCE, FILE_FLAG_OVERLAPPED, FILE_TYPE_CHAR,
41-
FILE_TYPE_DISK, FILE_TYPE_PIPE, FILE_TYPE_REMOTE, FILE_TYPE_UNKNOWN,
42-
HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, INFINITE, NORMAL_PRIORITY_CLASS,
43-
PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_READMODE_MESSAGE, PIPE_TYPE_MESSAGE,
44-
PIPE_UNLIMITED_INSTANCES, PIPE_WAIT, REALTIME_PRIORITY_CLASS, STARTF_USESHOWWINDOW,
45-
STARTF_USESTDHANDLES, STD_ERROR_HANDLE, STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
46-
WAIT_ABANDONED, WAIT_ABANDONED_0, WAIT_OBJECT_0,
52+
CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW, DETACHED_PROCESS, HIGH_PRIORITY_CLASS,
53+
IDLE_PRIORITY_CLASS, INFINITE, NORMAL_PRIORITY_CLASS, PROCESS_DUP_HANDLE,
54+
REALTIME_PRIORITY_CLASS, STARTF_USESHOWWINDOW, STARTF_USESTDHANDLES,
4755
},
48-
winnt::{
49-
DUPLICATE_CLOSE_SOURCE, DUPLICATE_SAME_ACCESS, FILE_GENERIC_READ,
50-
FILE_GENERIC_WRITE, GENERIC_READ, GENERIC_WRITE, LOCALE_NAME_MAX_LENGTH,
51-
MEM_COMMIT, MEM_FREE, MEM_IMAGE, MEM_MAPPED, MEM_PRIVATE, MEM_RESERVE,
52-
PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY,
53-
PAGE_GUARD, PAGE_NOACCESS, PAGE_NOCACHE, PAGE_READONLY, PAGE_READWRITE,
54-
PAGE_WRITECOMBINE, PAGE_WRITECOPY, PROCESS_DUP_HANDLE, SEC_COMMIT, SEC_IMAGE,
55-
SEC_LARGE_PAGES, SEC_NOCACHE, SEC_RESERVE, SEC_WRITECOMBINE, SYNCHRONIZE,
56-
},
57-
winuser::SW_HIDE,
5856
},
57+
UI::WindowsAndMessaging::SW_HIDE,
5958
};
6059

61-
fn GetLastError() -> u32 {
62-
unsafe { winapi::um::errhandlingapi::GetLastError() }
63-
}
64-
65-
trait WindowsSysResultValue {
66-
type Ok: ToPyObject;
67-
fn is_err(&self) -> bool;
68-
fn into_ok(self) -> Self::Ok;
69-
}
70-
71-
impl WindowsSysResultValue for RAW_HANDLE {
72-
type Ok = HANDLE;
73-
fn is_err(&self) -> bool {
74-
*self == windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE
75-
}
76-
fn into_ok(self) -> Self::Ok {
77-
HANDLE(self)
78-
}
79-
}
80-
81-
impl WindowsSysResultValue for BOOL {
82-
type Ok = ();
83-
fn is_err(&self) -> bool {
84-
*self == 0
85-
}
86-
fn into_ok(self) -> Self::Ok {}
87-
}
88-
89-
struct WindowsSysResult<T>(T);
90-
91-
impl<T: WindowsSysResultValue> WindowsSysResult<T> {
92-
fn is_err(&self) -> bool {
93-
self.0.is_err()
94-
}
95-
fn into_pyresult(self, vm: &VirtualMachine) -> PyResult<T::Ok> {
96-
if self.is_err() {
97-
Err(errno_err(vm))
98-
} else {
99-
Ok(self.0.into_ok())
100-
}
101-
}
102-
}
103-
104-
impl<T: WindowsSysResultValue> ToPyResult for WindowsSysResult<T> {
105-
fn to_pyresult(self, vm: &VirtualMachine) -> PyResult {
106-
let ok = self.into_pyresult(vm)?;
107-
Ok(ok.to_pyobject(vm))
108-
}
109-
}
110-
111-
type HandleInt = usize; // TODO: change to isize when fully ported to windows-rs
112-
113-
impl TryFromObject for HANDLE {
114-
fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
115-
let handle = HandleInt::try_from_object(vm, obj)?;
116-
Ok(HANDLE(handle as isize))
117-
}
118-
}
119-
120-
impl ToPyObject for HANDLE {
121-
fn to_pyobject(self, vm: &VirtualMachine) -> PyObjectRef {
122-
(self.0 as HandleInt).to_pyobject(vm)
123-
}
124-
}
125-
12660
#[pyfunction]
12761
fn CloseHandle(handle: HANDLE) -> WindowsSysResult<BOOL> {
12862
WindowsSysResult(unsafe { windows_sys::Win32::Foundation::CloseHandle(handle.0) })
@@ -193,7 +127,7 @@ mod _winapi {
193127
vm: &VirtualMachine,
194128
) -> PyResult<windows_sys::Win32::Storage::FileSystem::FILE_TYPE> {
195129
let file_type = unsafe { windows_sys::Win32::Storage::FileSystem::GetFileType(h.0) };
196-
if file_type == 0 && GetLastError() != 0 {
130+
if file_type == 0 && unsafe { windows_sys::Win32::Foundation::GetLastError() } != 0 {
197131
Err(errno_err(vm))
198132
} else {
199133
Ok(file_type)
@@ -227,7 +161,8 @@ mod _winapi {
227161
args: CreateProcessArgs,
228162
vm: &VirtualMachine,
229163
) -> PyResult<(HANDLE, HANDLE, u32, u32)> {
230-
let mut si = winbase::STARTUPINFOEXW::default();
164+
let mut si: windows_sys::Win32::System::Threading::STARTUPINFOEXW =
165+
unsafe { std::mem::zeroed() };
231166
si.StartupInfo.cb = std::mem::size_of_val(&si) as _;
232167

233168
macro_rules! si_attr {
@@ -292,11 +227,11 @@ mod _winapi {
292227
std::ptr::null(),
293228
args.inherit_handles,
294229
args.creation_flags
295-
| winbase::EXTENDED_STARTUPINFO_PRESENT
296-
| winbase::CREATE_UNICODE_ENVIRONMENT,
230+
| windows_sys::Win32::System::Threading::EXTENDED_STARTUPINFO_PRESENT
231+
| windows_sys::Win32::System::Threading::CREATE_UNICODE_ENVIRONMENT,
297232
env as _,
298233
current_dir,
299-
&mut si as *mut winbase::STARTUPINFOEXW as _,
234+
&mut si as *mut _ as *mut _,
300235
procinfo.as_mut_ptr(),
301236
))
302237
.into_pyresult(vm)?;
@@ -390,7 +325,8 @@ mod _winapi {
390325
(result, size.assume_init())
391326
};
392327
if !result.is_err()
393-
|| GetLastError() != winapi::shared::winerror::ERROR_INSUFFICIENT_BUFFER
328+
|| unsafe { windows_sys::Win32::Foundation::GetLastError() }
329+
!= windows_sys::Win32::Foundation::ERROR_INSUFFICIENT_BUFFER
394330
{
395331
return Err(errno_err(vm));
396332
}

vm/src/windows.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use crate::{
2+
convert::{ToPyObject, ToPyResult},
3+
stdlib::os::errno_err,
4+
PyObjectRef, PyResult, TryFromObject, VirtualMachine,
5+
};
6+
use windows::Win32::Foundation::HANDLE;
7+
use windows_sys::Win32::Foundation::{BOOL, HANDLE as RAW_HANDLE};
8+
9+
pub(crate) trait WindowsSysResultValue {
10+
type Ok: ToPyObject;
11+
fn is_err(&self) -> bool;
12+
fn into_ok(self) -> Self::Ok;
13+
}
14+
15+
impl WindowsSysResultValue for RAW_HANDLE {
16+
type Ok = HANDLE;
17+
fn is_err(&self) -> bool {
18+
*self == windows_sys::Win32::Foundation::INVALID_HANDLE_VALUE
19+
}
20+
fn into_ok(self) -> Self::Ok {
21+
HANDLE(self)
22+
}
23+
}
24+
25+
impl WindowsSysResultValue for BOOL {
26+
type Ok = ();
27+
fn is_err(&self) -> bool {
28+
*self == 0
29+
}
30+
fn into_ok(self) -> Self::Ok {}
31+
}
32+
33+
pub(crate) struct WindowsSysResult<T>(pub T);
34+
35+
impl<T: WindowsSysResultValue> WindowsSysResult<T> {
36+
pub fn is_err(&self) -> bool {
37+
self.0.is_err()
38+
}
39+
pub fn into_pyresult(self, vm: &VirtualMachine) -> PyResult<T::Ok> {
40+
if self.is_err() {
41+
Err(errno_err(vm))
42+
} else {
43+
Ok(self.0.into_ok())
44+
}
45+
}
46+
}
47+
48+
impl<T: WindowsSysResultValue> ToPyResult for WindowsSysResult<T> {
49+
fn to_pyresult(self, vm: &VirtualMachine) -> PyResult {
50+
let ok = self.into_pyresult(vm)?;
51+
Ok(ok.to_pyobject(vm))
52+
}
53+
}
54+
55+
type HandleInt = usize; // TODO: change to isize when fully ported to windows-rs
56+
57+
impl TryFromObject for HANDLE {
58+
fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<Self> {
59+
let handle = HandleInt::try_from_object(vm, obj)?;
60+
Ok(HANDLE(handle as isize))
61+
}
62+
}
63+
64+
impl ToPyObject for HANDLE {
65+
fn to_pyobject(self, vm: &VirtualMachine) -> PyObjectRef {
66+
(self.0 as HandleInt).to_pyobject(vm)
67+
}
68+
}

0 commit comments

Comments
 (0)