Actualmente enfrentamos el problema de una llamada a WriteFile
(o, mejor dicho, CFile :: Write - pero eso solo llama a WriteFile internamente) que causa el error de Win32 5
ERROR_ACCESS_DENIED
.¿Qué causa que WriteFile devuelva ERROR_ACCESS_DENIED?
(EDIT:.! Tenga en cuenta que no podemos repro el comportamiento Todo lo que tenemos en este momento es un archivo de registro que indica la línea fuente donde estaba el CFile :: Write y que contiene como un error ERROR_ACCESS_DENIED)
(EDIT : El archivo está en una unidad localy es, de hecho, un archivo y no un directorio)
Ahora, WriteFiles's documentation realmente no ayuda, y experimentando con un simple análisis de la aplicación arroja los siguientes resultados:.
- WriteFile causa ERROR_ACCESS_DENIED si se llama para un identificador de archivo que no está abierto para escritura (es decir está abierto solo para lectura).
- Se se no causa ERROR_ACCESS_DENIED si
- El mango no es válido o el archivo no está abierto en todo
- El acceso derechos, o la bandera protegida de escritura para el archivo se modifican después de el archivo ha sido abierto por el proceso. (Si éstos se modifican antes se abre el archivo, a continuación, nunca llegamos a WriteFile porque abrir el archivo fallará.)
- El archivo es de alguna manera bloqueado por otro proceso/mango (esto en el mejor resultado en el error
32
ERROR_SHARING_VIOLATION)
Eso nos deja con la situación, que al parecer la única posibilidad de que esta llamada a fallar si el archivo se abrió en realidad con la bandera de lectura en lugar de la bandera de escritura. Sin embargo, al mirar nuestro código, esto parece extremadamente improbable. (Debido a nuestra localización,
que
podemos estar seguros de que WriteFile falló y
que puede estar seguro de que el error es ERROR_ACCESS_DENIED, no podemos estar 100.1% seguro de las banderas de apertura, ya que estos no están trazadas.)
¿Hay alguna otra circunstancia conocida en la que WriteFile (CFile :: Write) cause un ERROR_ACCESS_DENIED?
Nota: Para aclarar, además, el contexto de esta pregunta:
- El archivo se abierta, por lo tanto, no puede ser un directorio o algo por el estilo
- Todas las pruebas que realicé indican que mientras el archivo está abierto, no se puede eliminar, por lo que el archivo debería haber estado allí en la llamada a WriteFile
- El archivo está ubicado en una unidad local y no en una unidad de red.
debo añadir que estamos corriendo en Windows XP SP3 y la aplicación se compila con Visual Studio 2005.
por qué no se puede rastrear las banderas de apertura? Si no desea editar el código, simplemente use el monitor de proceso para inspeccionarlos. –
Claro que podemos agregar rastreo. Esto solo ocurre de vez en cuando en el sitio de un cliente. No hay manera de que podamos agregar un depurador allí. –
Los controladores de filtro del sistema de archivos también pueden causar esto, el ejemplo más obvio son los escáneres antivirus (aunque hay otros como el cifrado, etc.). – Luke