Winapi: Obtenga el proceso que tiene un controlador específico de un archivo
Actualmente tengo un software que tiene un controlador de filtro de archivos, durante la instalación del software, el controlador se inicia como servicio de esta manera:
CreateService(serviceManager, name, displayName,
SERVICE_START | DELETE | SERVICE_QUERY_STATUS | SERVICE_STOP,
SERVICE_FILE_SYSTEM_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
path, NULL, NULL, NULL, NULL, NULL);
Donde esta el caminoC:\Program Files(x86)\TSU\driver\TSUfsd.sys
.
El problema que tengo es durante la desinstalación del software. Me da acceso denegado cuando el software intenta eliminarTSUfsd.sys
archivo.
He comprobado cómo el software elimina el controlador y resulta que lo elimina conDeleteService
función, y espera a que el servicio cambie su estado deSERVICE_STOP_PENDING
aSERVICE_STOPPED
y si no sucede después de un tiempo, recibe el servicioPID
y lo mata conProcessTerminate
y luego intenta eliminar el archivo conrmdir /S /Q C:\Program Files(x86)\TSU\
.
Intenté encontrar el proceso que podría haber tenido el identificador del archivo (con Process Explorer) pero no pude encontrar ninguno. Entonces pensé que tal vez el servicio todavía está vivo, así que escribísc query TSUfsd
pero el servicio también se fue.
También intenté cambiar los permisos y otorgar permisos completos a mi usuario, pero aún se produjo el mismo error.
Entonces mis preguntas son:
¿Hay alguna otra forma de verificar qué proceso (o cualquier otra cosa) puede retener un archivo?
También he notado que, cada vez que intento eliminar el archivo con Cygwin (rm TSUfsd.sys
) elimina el archivo sin problemas. ¿Cuál es la diferencia entre eliminar un archivo con cmd (del /f <filename>
) y con cygwin?