¿Por qué fracasar Reemplazar archivo con ERROR_SHARING_VIOLATION?

Si bien la documentación es vaga, basada enesta pregunta y comentarios yesta respuesta, Yo esperaba queReplaceFile llamado con el tercer argumento (nombre de archivo de respaldo) debería tener éxito incluso si hay identificadores para los archivos de origen y destino abiertos en otros procesos sinFILE_SHARE_DELETE bandera. Se supone que se debe superar el bloqueo cambiando solo los metadatos del archivo (= entrada de directorio), que no está controlado por el bloqueo. (Los tres archivos están en la misma unidad de disco, por lo que cambiar los metadatos es suficiente para cambiarles el nombre).

Sin embargo, el siguiente código falla conERROR_SHARING_VIOLATION. Esto esno mi caso de uso, pero solo una demostración del fracaso. El caso de uso es que estoy tratando de cambiar el nombre de los archivos que ocasionalmente (e impredeciblemente) se abren en otros procesos en el sistema, como antivirus o programas de respaldo, que no se molestaron en usarFILE_SHARE_DELETE bandera.

# python 3
import os
import ctypes

fname1 = 'test1.txt'
fname2 = 'test2.txt'
f1 = open(fname1, 'w')
f1.write(fname1)
f2 = open(fname2, 'w')
f2.write(fname2)

# tmp123 does not exist when the program is started
ctypes.windll.kernel32.ReplaceFileW(fname2, fname1, 'tmp123', 0, None, None) # 0
ctypes.GetLastError() # ERROR_SHARING_VIOLATION

# if we close file handles, it works as expected
f1.close()
f2.close()
ctypes.windll.kernel32.ReplaceFileW(fname2, fname1, 'tmp123', 0, None, None) # 1

¿Por qué?