En mi opinion necesita un poco mas de trabajo la funcion.
If FExist(NewPath) <> 0 Then
If GetFileAttributes(NewPath) = INVALID_HANDLE_VALUE Then Exit Function
If GetFileAttributes("C:\x.exe") = FILE_ATTRIBUTE_ARCHIVE Then DeleteFile NewPath
End If
Aca aparenetemente se te quedo algo del codigo de testeo.
hFile = CreateFile(OldPath, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0, 0)
If hFile > 0 Then
Filesize = GetFileSize(hFile, 0)
ReDim vBuffer(1 To Filesize)
res = ReadFile(hFile, vBuffer(1), UBound(vBuffer), vReadBytes, ByVal 0&)
sFile = CreateFile(NewPath, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CREATE_NEW, 0, 0)
WriteFile sFile, vBuffer(1), UBound(vBuffer), vReadBytes, ByVal 0&
Call CloseHandle(hFile)
Call CloseHandle(sFile)
End If
If FExist(NewPath) <> 0 Then CopyNew = 1
Esta necesita un poco de organizacion, el segundo handle por ejemplo (archivo de destino) nunca se verifica el valor de retorno y algunas cositas como en vez de verificar que el archivo de destino existe, podrias ver que writefile haya escrito la cantidad de bytes que se leyeron (en mi opinion tiene mas logica) y una cosa mas que podrias hacer es copiar los atributos.