@@ -1947,6 +1947,7 @@ _winapi_GetFileType_impl(PyObject *module, HANDLE handle)
1947
1947
return result ;
1948
1948
}
1949
1949
1950
+
1950
1951
/*[clinic input]
1951
1952
_winapi._mimetypes_read_windows_registry
1952
1953
@@ -2075,6 +2076,59 @@ _winapi_NeedCurrentDirectoryForExePath_impl(PyObject *module,
2075
2076
return result ;
2076
2077
}
2077
2078
2079
+
2080
+ /*[clinic input]
2081
+ _winapi.CopyFile2
2082
+
2083
+ ExistingFileName: LPCWSTR
2084
+ NewFileName: LPCWSTR
2085
+ Flags: DWORD
2086
+ ProgressRoutine: object = None
2087
+
2088
+ Copies a file from one name to a new name.
2089
+
2090
+ This is implemented using the CopyFile2 API, which preserves all stat
2091
+ and metadata information apart from security attributes.
2092
+
2093
+ ProgressRoutine is reserved for future use, but is currently not
2094
+ implemented. Its value is ignored.
2095
+ [clinic start generated code]*/
2096
+
2097
+ static PyObject *
2098
+ _winapi_CopyFile2_impl (PyObject * module , LPCWSTR ExistingFileName ,
2099
+ LPCWSTR NewFileName , DWORD Flags ,
2100
+ PyObject * ProgressRoutine )
2101
+ /*[clinic end generated code: output=f3f588380da0000a input=13cf59b6e1a70fe6]*/
2102
+ {
2103
+ HRESULT hr ;
2104
+ COPYFILE2_EXTENDED_PARAMETERS params = { sizeof (COPYFILE2_EXTENDED_PARAMETERS ) };
2105
+ params .dwCopyFlags = Flags ;
2106
+ /* For future implementation. We ignore the value for now so that
2107
+ users only have to test for 'CopyFile2' existing and not whether
2108
+ the additional parameter exists.
2109
+ if (ProgressRoutine != Py_None) {
2110
+ params.pProgressRoutine = _winapi_CopyFile2ProgressRoutine;
2111
+ params.pvCallbackContext = Py_NewRef(ProgressRoutine);
2112
+ }
2113
+ */
2114
+ Py_BEGIN_ALLOW_THREADS ;
2115
+ hr = CopyFile2 (ExistingFileName , NewFileName , & params );
2116
+ Py_END_ALLOW_THREADS ;
2117
+ /* For future implementation.
2118
+ Py_XDECREF(ProgressRoutine);
2119
+ */
2120
+ if (FAILED (hr )) {
2121
+ if ((hr & 0xFFFF0000 ) == 0x80070000 ) {
2122
+ PyErr_SetFromWindowsErr (hr & 0xFFFF );
2123
+ } else {
2124
+ PyErr_SetFromWindowsErr (hr );
2125
+ }
2126
+ return NULL ;
2127
+ }
2128
+ Py_RETURN_NONE ;
2129
+ }
2130
+
2131
+
2078
2132
static PyMethodDef winapi_functions [] = {
2079
2133
_WINAPI_CLOSEHANDLE_METHODDEF
2080
2134
_WINAPI_CONNECTNAMEDPIPE_METHODDEF
@@ -2110,6 +2164,7 @@ static PyMethodDef winapi_functions[] = {
2110
2164
_WINAPI_GETFILETYPE_METHODDEF
2111
2165
_WINAPI__MIMETYPES_READ_WINDOWS_REGISTRY_METHODDEF
2112
2166
_WINAPI_NEEDCURRENTDIRECTORYFOREXEPATH_METHODDEF
2167
+ _WINAPI_COPYFILE2_METHODDEF
2113
2168
{NULL , NULL }
2114
2169
};
2115
2170
@@ -2146,6 +2201,7 @@ static int winapi_exec(PyObject *m)
2146
2201
WINAPI_CONSTANT (F_DWORD , CREATE_NEW_PROCESS_GROUP );
2147
2202
WINAPI_CONSTANT (F_DWORD , DUPLICATE_SAME_ACCESS );
2148
2203
WINAPI_CONSTANT (F_DWORD , DUPLICATE_CLOSE_SOURCE );
2204
+ WINAPI_CONSTANT (F_DWORD , ERROR_ACCESS_DENIED );
2149
2205
WINAPI_CONSTANT (F_DWORD , ERROR_ALREADY_EXISTS );
2150
2206
WINAPI_CONSTANT (F_DWORD , ERROR_BROKEN_PIPE );
2151
2207
WINAPI_CONSTANT (F_DWORD , ERROR_IO_PENDING );
@@ -2159,6 +2215,7 @@ static int winapi_exec(PyObject *m)
2159
2215
WINAPI_CONSTANT (F_DWORD , ERROR_OPERATION_ABORTED );
2160
2216
WINAPI_CONSTANT (F_DWORD , ERROR_PIPE_BUSY );
2161
2217
WINAPI_CONSTANT (F_DWORD , ERROR_PIPE_CONNECTED );
2218
+ WINAPI_CONSTANT (F_DWORD , ERROR_PRIVILEGE_NOT_HELD );
2162
2219
WINAPI_CONSTANT (F_DWORD , ERROR_SEM_TIMEOUT );
2163
2220
WINAPI_CONSTANT (F_DWORD , FILE_FLAG_FIRST_PIPE_INSTANCE );
2164
2221
WINAPI_CONSTANT (F_DWORD , FILE_FLAG_OVERLAPPED );
@@ -2252,6 +2309,34 @@ static int winapi_exec(PyObject *m)
2252
2309
WINAPI_CONSTANT (F_DWORD , LCMAP_TRADITIONAL_CHINESE );
2253
2310
WINAPI_CONSTANT (F_DWORD , LCMAP_UPPERCASE );
2254
2311
2312
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_ALLOW_DECRYPTED_DESTINATION );
2313
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_COPY_SYMLINK );
2314
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_FAIL_IF_EXISTS );
2315
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_NO_BUFFERING );
2316
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_NO_OFFLOAD );
2317
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_OPEN_SOURCE_FOR_WRITE );
2318
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_RESTARTABLE );
2319
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_REQUEST_SECURITY_PRIVILEGES );
2320
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_RESUME_FROM_PAUSE );
2321
+ #ifndef COPY_FILE_REQUEST_COMPRESSED_TRAFFIC
2322
+ // Only defined in newer WinSDKs
2323
+ #define COPY_FILE_REQUEST_COMPRESSED_TRAFFIC 0x10000000
2324
+ #endif
2325
+ WINAPI_CONSTANT (F_DWORD , COPY_FILE_REQUEST_COMPRESSED_TRAFFIC );
2326
+
2327
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_CALLBACK_CHUNK_STARTED );
2328
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_CALLBACK_CHUNK_FINISHED );
2329
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_CALLBACK_STREAM_STARTED );
2330
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_CALLBACK_STREAM_FINISHED );
2331
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_CALLBACK_POLL_CONTINUE );
2332
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_CALLBACK_ERROR );
2333
+
2334
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_PROGRESS_CONTINUE );
2335
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_PROGRESS_CANCEL );
2336
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_PROGRESS_STOP );
2337
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_PROGRESS_QUIET );
2338
+ WINAPI_CONSTANT (F_DWORD , COPYFILE2_PROGRESS_PAUSE );
2339
+
2255
2340
WINAPI_CONSTANT ("i" , NULL );
2256
2341
2257
2342
return 0 ;
0 commit comments