[This structure](https://www.mail-archive.com/wine-devel@winehq.org/msg80571.html) will be useful for adding the callback functionality later, and leans towards implementing `CopyFile2`, while `CopyFileEx` passes a special callback that wraps the user callback to filter and transform emitted events.
The only problem with that approach, as discussed above, is error handling; CopyFileEx errors can be converted to CopyFile2 errors, but the reverse is not true.
The best idea that comes to mind is `CopyFile2_impl` with WIN32 errors codes and then convert into `HRESULT` for `CopyFile2`.