2010-09-02 17 views
6

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!

+0

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

Respuesta

5

Creo que se puede llegar a alguna parte con la API NtQuerySystemInformation prohibida(). Un proyecto de muestra que ab/usa esta API es available here.

Muchos de los avisos de advertencia deben plantearse con esto, está simulando con estructuras de datos internas del kernel intencionalmente no documentadas. Definitivamente lo hace no desea hacer lo que propone el artículo, el cierre involuntario maneja archivos es una excelente manera de causar daños en el sistema de archivos aleatorios.

Y tendrá dificultades para mantener este tipo de código compatible con las versiones futuras de Windows. Una solución posiblemente mejor, pero no más elegante, es confiar en la utilidad de manejo de SysInternals. Es probable que se mantenga por un tiempo por venir. Ejecute este programa desde el suyo, redirigiendo la salida. El análisis del texto es factible.

+0

Me gusta a dónde va esto. Actualicé mi pregunta ¡Gracias! – mrduclaw

+1

No quiero sonar argumentativo, ya que probablemente estoy confundido y agradezco la ayuda, pero tenía la impresión de que del ejemplo que vinculó su archivo 'ListFileDrv.c' que contiene' DriverEntry' y maneja IRPs IRP_MJ_DEVICE_CONTROL era su código de controlador para copiar el nombre de archivo del 'FILE_OBJECT'. Además, para citar el ejemplo que ha vinculado: "El controlador acepta esta dirección y copia el nombre de archivo de FILE_OBJECT, configurándolo en el parámetro out de la función DeviceIoControl". En el siguiente párrafo, describe extraer el controlador de un recurso incrustado y cargarlo. – mrduclaw

+0

Oh, está bien, en realidad nunca estudié este código. Nunca lo usaré. Sospecho que fue ingeniería inversa de Handle.exe –

Cuestiones relacionadas