@@ -6,123 +6,57 @@ mod _winapi {
66use 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 ,
1213PyObjectRef , PyResult , TryFromObject , VirtualMachine ,
1314} ;
1415use std:: ptr:: { null, null_mut} ;
15- use winapi:: um:: winbase;
1616use windows:: {
1717 core:: PCWSTR ,
1818Win32 :: Foundation :: { HANDLE , HINSTANCE , MAX_PATH } ,
1919} ;
2020use 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 :: {
3750ABOVE_NORMAL_PRIORITY_CLASS , BELOW_NORMAL_PRIORITY_CLASS ,
3851CREATE_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 ( handleas 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]
12761fn CloseHandle ( handle : HANDLE ) ->WindowsSysResult < BOOL > {
12862WindowsSysResult ( unsafe { windows_sys:: Win32 :: Foundation :: CloseHandle ( handle. 0 ) } )
@@ -193,7 +127,7 @@ mod _winapi {
193127vm : & VirtualMachine ,
194128) ->PyResult < windows_sys:: Win32 :: Storage :: FileSystem :: FILE_TYPE > {
195129let 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 {
197131Err ( errno_err ( vm) )
198132} else {
199133Ok ( file_type)
@@ -227,7 +161,8 @@ mod _winapi {
227161args : CreateProcessArgs ,
228162vm : & 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
233168macro_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 envas _ ,
298233 current_dir,
299- & mut sias * mut winbase :: STARTUPINFOEXW as _ ,
234+ & mut sias * 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} ;
392327if !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{
395331return Err ( errno_err ( vm) ) ;
396332}