@@ -6,123 +6,57 @@ mod _winapi {
6
6
use crate :: {
7
7
builtins:: PyStrRef ,
8
8
common:: windows:: ToWideString ,
9
- convert:: { ToPyException , ToPyObject , ToPyResult } ,
9
+ convert:: { ToPyException , ToPyResult } ,
10
10
function:: { ArgMapping , ArgSequence , OptionalArg } ,
11
11
stdlib:: os:: errno_err,
12
+ windows:: WindowsSysResult ,
12
13
PyObjectRef , PyResult , TryFromObject , VirtualMachine ,
13
14
} ;
14
15
use std:: ptr:: { null, null_mut} ;
15
- use winapi:: um:: winbase;
16
16
use windows:: {
17
17
core:: PCWSTR ,
18
18
Win32 :: Foundation :: { HANDLE , HINSTANCE , MAX_PATH } ,
19
19
} ;
20
20
use windows_sys:: Win32 :: Foundation :: { BOOL , HANDLE as RAW_HANDLE } ;
21
21
22
22
#[ 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 ,
29
30
} ,
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 ,
34
47
} ,
35
- minwinbase :: STILL_ACTIVE ,
36
- winbase :: {
48
+ SystemServices :: LOCALE_NAME_MAX_LENGTH ,
49
+ Threading :: {
37
50
ABOVE_NORMAL_PRIORITY_CLASS , BELOW_NORMAL_PRIORITY_CLASS ,
38
51
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 ,
47
55
} ,
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 ,
58
56
} ,
57
+ UI :: WindowsAndMessaging :: SW_HIDE ,
59
58
} ;
60
59
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
-
126
60
#[ pyfunction]
127
61
fn CloseHandle ( handle : HANDLE ) -> WindowsSysResult < BOOL > {
128
62
WindowsSysResult ( unsafe { windows_sys:: Win32 :: Foundation :: CloseHandle ( handle. 0 ) } )
@@ -193,7 +127,7 @@ mod _winapi {
193
127
vm : & VirtualMachine ,
194
128
) -> PyResult < windows_sys:: Win32 :: Storage :: FileSystem :: FILE_TYPE > {
195
129
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 {
197
131
Err ( errno_err ( vm) )
198
132
} else {
199
133
Ok ( file_type)
@@ -227,7 +161,8 @@ mod _winapi {
227
161
args : CreateProcessArgs ,
228
162
vm : & VirtualMachine ,
229
163
) -> 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 ( ) } ;
231
166
si. StartupInfo . cb = std:: mem:: size_of_val ( & si) as _ ;
232
167
233
168
macro_rules! si_attr {
@@ -292,11 +227,11 @@ mod _winapi {
292
227
std:: ptr:: null ( ) ,
293
228
args. inherit_handles ,
294
229
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 ,
297
232
env as _ ,
298
233
current_dir,
299
- & mut si as * mut winbase :: STARTUPINFOEXW as _ ,
234
+ & mut si as * mut _ as * mut _ ,
300
235
procinfo. as_mut_ptr ( ) ,
301
236
) )
302
237
. into_pyresult ( vm) ?;
@@ -390,7 +325,8 @@ mod _winapi {
390
325
( result, size. assume_init ( ) )
391
326
} ;
392
327
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
394
330
{
395
331
return Err ( errno_err ( vm) ) ;
396
332
}
0 commit comments