Este es un complemento a otra pregunta que se encontró here.Listar todos los archivos abiertos
En resumen: Me gustaría enumerar todos los archivos abiertos en un sistema y recuperar sus nombres de archivo asociados. Si este es el enfoque equivocado, o si hay otra manera, por favor, denme un empujón en la dirección correcta. O, si me faltan detalles o algo no está claro, por favor, gríteme.
Al igual que la otra pregunta (vinculado anteriormente), no me importa sobre el lenguaje (una C o C++ solución no estaría de embargo), pero me gustaría que para que esto funcione en Windows XP. Además, necesito evitar un controlador en modo kernel.
El problema que tengo con la solución original a esta pregunta es que si un identificador de archivo se abrió de cierta manera, la llamada NtQueryObject
se puede bloquear. Esto se describe en los foros de SysInternals here.
De acuerdo con los foros SysInternals, utilizando CreateThread con un tiempo de espera ha sido la solución aceptada, pero haciendo eso no parece permitir que el proceso se cierra correctamente en todo momento. Incluso al depurar esto en Visual Studio, a veces me veo obligado a reiniciar la computadora. Tener que reiniciar mi computadora a veces cuando ejecuto esto no es la mejor opción.
Otra solución aceptada está saltando asas con una determinada GrantedAccess
. El problema que tengo con eso es que echo de menos demasiados mangos para ser útil dado el GrantedAccess
descrito en las publicaciones del foro anterior.
¿Hay alguien capaz de apuntar hacia una solución a mi problema?
Gracias!
Editar: Lo siento, debería haber sido más específico sobre mi problema. La llamada NtQuerySystemInformation
me llevará mangos, la llamada NtQueryObject
con ObjectNameInformation
colgarán en los mangos que son tubos síncronos (al menos eso es lo que la gente parecen decir). El ejemplo publicado here utiliza un controlador en modo kernel para leer el nombre de archivo de FILE_OBJECT, pero quiero evitar el uso de un controlador. Así que sí, al igual que la utilidad SysInternals Handle, pero creo que usan un controlador también, ¿no?
Editar 2: Esto es una especie de interés académico, por lo que el uso de la API nativa u otras técnicas no documentadas que pueden romperse en versiones futuras no es una preocupación. Además, un GrantedAccess
que simplemente evita objetos que se cuelgan sería perfecto.
Editar 3: Mi objetivo final es simplemente poder ver qué archivos están actualmente abiertos en el sistema. Si esto es totalmente el enfoque equivocado, sería muy apreciado otro punto en la dirección correcta.
Editar: Esto solo tiene que funcionar en Windows XP, ya que hay soluciones más elegantes para Vista +, por lo que el uso de funciones no documentadas realmente no es una preocupación.
¡Gracias nuevamente!
Muchas gracias por esto. En realidad, incluso en un sistema mayor que WinXP esto es una preocupación. * SI tiene la ruta completa a un archivo *, puede usar el Administrador de reinicio. Pero mi problema era que tengo el PID y ahora necesito saber todos los archivos que el PID está bloqueando, así que tuve que usar este método para enumerar los identificadores y luego obtener las rutas de los archivos. Gracias por preguntar esto! http://stackoverflow.com/q/39910608/1828637 – Noitidart