@@ -31,19 +31,57 @@ mod _winapi {
3131 LCMAP_TRADITIONAL_CHINESE , LCMAP_UPPERCASE ,
3232 } ,
3333 Storage :: FileSystem :: {
34- COPY_FILE_ALLOW_DECRYPTED_DESTINATION , COPY_FILE_COPY_SYMLINK ,
35- COPY_FILE_FAIL_IF_EXISTS , COPY_FILE_NO_BUFFERING , COPY_FILE_NO_OFFLOAD ,
36- COPY_FILE_OPEN_SOURCE_FOR_WRITE , COPY_FILE_REQUEST_COMPRESSED_TRAFFIC ,
37- COPY_FILE_REQUEST_SECURITY_PRIVILEGES , COPY_FILE_RESTARTABLE ,
38- COPY_FILE_RESUME_FROM_PAUSE , COPYFILE2_CALLBACK_CHUNK_FINISHED ,
39- COPYFILE2_CALLBACK_CHUNK_STARTED , COPYFILE2_CALLBACK_ERROR ,
40- COPYFILE2_CALLBACK_POLL_CONTINUE , COPYFILE2_CALLBACK_STREAM_FINISHED ,
41- COPYFILE2_CALLBACK_STREAM_STARTED , COPYFILE2_PROGRESS_CANCEL ,
42- COPYFILE2_PROGRESS_CONTINUE , COPYFILE2_PROGRESS_PAUSE , COPYFILE2_PROGRESS_QUIET ,
43- COPYFILE2_PROGRESS_STOP , FILE_FLAG_FIRST_PIPE_INSTANCE , FILE_FLAG_OVERLAPPED ,
44- FILE_GENERIC_READ , FILE_GENERIC_WRITE , FILE_TYPE_CHAR , FILE_TYPE_DISK , FILE_TYPE_PIPE ,
45- FILE_TYPE_REMOTE , FILE_TYPE_UNKNOWN , OPEN_EXISTING , PIPE_ACCESS_DUPLEX ,
46- PIPE_ACCESS_INBOUND , SYNCHRONIZE ,
34+ COPY_FILE_ALLOW_DECRYPTED_DESTINATION ,
35+ COPY_FILE_COPY_SYMLINK ,
36+ COPY_FILE_FAIL_IF_EXISTS ,
37+ COPY_FILE_NO_BUFFERING ,
38+ COPY_FILE_NO_OFFLOAD ,
39+ COPY_FILE_OPEN_SOURCE_FOR_WRITE ,
40+ COPY_FILE_REQUEST_COMPRESSED_TRAFFIC ,
41+ COPY_FILE_REQUEST_SECURITY_PRIVILEGES ,
42+ COPY_FILE_RESTARTABLE ,
43+ COPY_FILE_RESUME_FROM_PAUSE ,
44+ COPYFILE2_CALLBACK_CHUNK_FINISHED ,
45+ COPYFILE2_CALLBACK_CHUNK_STARTED ,
46+ COPYFILE2_CALLBACK_ERROR ,
47+ COPYFILE2_CALLBACK_POLL_CONTINUE ,
48+ COPYFILE2_CALLBACK_STREAM_FINISHED ,
49+ COPYFILE2_CALLBACK_STREAM_STARTED ,
50+ COPYFILE2_PROGRESS_CANCEL ,
51+ COPYFILE2_PROGRESS_CONTINUE ,
52+ COPYFILE2_PROGRESS_PAUSE ,
53+ COPYFILE2_PROGRESS_QUIET ,
54+ COPYFILE2_PROGRESS_STOP ,
55+ CREATE_ALWAYS ,
56+ // CreateFile constants
57+ CREATE_NEW ,
58+ FILE_ATTRIBUTE_NORMAL ,
59+ FILE_FLAG_BACKUP_SEMANTICS ,
60+ FILE_FLAG_DELETE_ON_CLOSE ,
61+ FILE_FLAG_FIRST_PIPE_INSTANCE ,
62+ FILE_FLAG_NO_BUFFERING ,
63+ FILE_FLAG_OPEN_REPARSE_POINT ,
64+ FILE_FLAG_OVERLAPPED ,
65+ FILE_FLAG_POSIX_SEMANTICS ,
66+ FILE_FLAG_RANDOM_ACCESS ,
67+ FILE_FLAG_SEQUENTIAL_SCAN ,
68+ FILE_FLAG_WRITE_THROUGH ,
69+ FILE_GENERIC_READ ,
70+ FILE_GENERIC_WRITE ,
71+ FILE_SHARE_DELETE ,
72+ FILE_SHARE_READ ,
73+ FILE_SHARE_WRITE ,
74+ FILE_TYPE_CHAR ,
75+ FILE_TYPE_DISK ,
76+ FILE_TYPE_PIPE ,
77+ FILE_TYPE_REMOTE ,
78+ FILE_TYPE_UNKNOWN ,
79+ OPEN_ALWAYS ,
80+ OPEN_EXISTING ,
81+ PIPE_ACCESS_DUPLEX ,
82+ PIPE_ACCESS_INBOUND ,
83+ SYNCHRONIZE ,
84+ TRUNCATE_EXISTING ,
4785 } ,
4886 System :: {
4987 Console :: { STD_ERROR_HANDLE , STD_INPUT_HANDLE , STD_OUTPUT_HANDLE } ,
@@ -78,6 +116,42 @@ mod _winapi {
78116 WindowsSysResult ( unsafe { windows_sys:: Win32 :: Foundation :: CloseHandle ( handle. 0 ) } )
79117 }
80118
119+ /// CreateFile - Create or open a file or I/O device.
120+ #[ pyfunction]
121+ #[ allow( clippy:: too_many_arguments) ]
122+ fn CreateFile (
123+ file_name : PyStrRef ,
124+ desired_access : u32 ,
125+ share_mode : u32 ,
126+ _security_attributes : PyObjectRef , // Always NULL (0)
127+ creation_disposition : u32 ,
128+ flags_and_attributes : u32 ,
129+ _template_file : PyObjectRef , // Always NULL (0)
130+ vm : & VirtualMachine ,
131+ ) -> PyResult < WinHandle > {
132+ use windows_sys:: Win32 :: Storage :: FileSystem :: CreateFileW ;
133+
134+ let file_name_wide = file_name. as_wtf8 ( ) . to_wide_with_nul ( ) ;
135+
136+ let handle = unsafe {
137+ CreateFileW (
138+ file_name_wide. as_ptr ( ) ,
139+ desired_access,
140+ share_mode,
141+ null ( ) ,
142+ creation_disposition,
143+ flags_and_attributes,
144+ null_mut ( ) ,
145+ )
146+ } ;
147+
148+ if handle == INVALID_HANDLE_VALUE {
149+ return Err ( vm. new_last_os_error ( ) ) ;
150+ }
151+
152+ Ok ( WinHandle ( handle) )
153+ }
154+
81155 #[ pyfunction]
82156 fn GetStdHandle (
83157 std_handle : windows_sys:: Win32 :: System :: Console :: STD_HANDLE ,
0 commit comments