You are on page 1of 18

Del sistema de ARCHIVOS FILTRO DRIVERS

Este tema an no ha sido calificado - Valorar este tema En esta seccin se incluyen los temas siguientes, que describen los controladores de filtro del sistema de archivos: Fundamentos del sistema de archivos Introduccin a los controladores del sistema de archivos Filtro IRP filtrado y Fast I / O Escribir IRP Dispatch Rutinas Usando rutinas de finalizacin del PIR Seguimiento de Per-Stream Contexto en un controlador de sistema de archivos heredado filtro El seguimiento de cada fichero, en el contexto de un controlador de filtro del sistema de archivo heredado

http://msdn.microsoft.com/en-us/library/ff540382.aspx

LA SEGUNDA PARTE ES UNA PGINA COMPLETA: DESARROLLO DE CONTROLADORES DE WINDOWS


http://www.osronline.com/section.cfm?section=20

EL TERCERO ES UN LIBRO
http://www.amazon.com/Windows-System-Internals-Classic-Reprints/dp/0976717514

Archivo Tutorial System Filter Driver


Por Sergey Podobry , Apriorit Inc , 03 de septiembre 2010

Contenido
1. 2. 3. 4. 5. 6. 7.

4.93 ( 64 votos ) Descargar FsFilter.zip - 16.31 KB Introduccin Creacin de un controlador de sistema de archivos simple filtro Cmo instalar un controlador Ejecucin de una muestra Mejoras Conclusin Referencias tiles

Introduccin

Este tutorial te mostrar cmo desarrollar un controlador de filtro del sistema de archivos simple. El piloto de demostracin se imprimirn los nombres de la apertura de los archivos a la salida de depuracin. El artculo requiere el desarrollo bsico de controladores de Windows y C / C + + conocimiento. Sin embargo, tambin puede ser interesante para personas que no tienen experiencia de desarrollo de Windows driver.

Qu es un sistema de archivo de controlador de filtro?


Un controlador de filtro del sistema de archivos se llama en cada sistema de archivos de operacin I / O (crear, leer, escribir, cambiar de nombre, etc), por lo que puede modificar el comportamiento del sistema de archivos. Del sistema de archivos controladores de filtro son casi similares a los conductores de legado, pero requieren algunos pasos especiales para hacerlo. Estos conductores son utilizados por los antivirus, seguridad, copia de seguridad y software de instantneas.

Creacin de un controlador de sistema de archivos simple filtro


Antes de comenzar
Para crear un controlador, debe WDK o el Kit de IFS. Usted puede obtener de la pgina web de Microsoft . Adems, hay que establecer una variable de entorno %% WinDDK a la ruta donde ha instalado el kit de WDK / IFS. Tener cuidado: incluso un pequeo error en el controlador puede provocar un BSOD o inestabilidad del sistema.

Main.c
Conductor entrada

Este es el punto de partida de cualquier piloto. Lo primero que hacemos es almacenar DriverObject a una variable global (que lo necesitaremos ms adelante).
Collapse | Copiar cdigo
//////////////////////////////////////////////////////// / / Los datos globales PDRIVER_OBJECT g_fsFilterDriverObject = NULL; //////////////////////////////////////////////////////// / / DriverEntry - punto de entrada del controlador NTSTATUS DriverEntry ( __inout PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath ) { Estado NTSTATUS = STATUS_SUCCESS; ULONG i = 0 ; / / ASSERT (FALSE); / / Esto romper al depurador // / / . Guarde nuestro objeto conductor // g_fsFilterDriverObject = DriverObject; ... }

Establecer IRP mesa despacho


El siguiente paso consiste en rellenar la tabla envo IRP con punteros a funciones a los controladores IRP. En nuestro controlador de filtro, hay un genrico de paso a travs controlador IRP (que enva la nueva peticin). Y, vamos a necesitar un controlador para IRP_MJ_CREATE para recuperar los nombres de los archivos de apertura. La aplicacin de los controladores IRP se describir ms adelante.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / DriverEntry - punto de entrada del controlador NTSTATUS DriverEntry ( __inout PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath ) { ... // / / Inicializar el objeto conductor mesa de despacho. // para (i = 0 ; i <= IRP_MJ_MAXIMUM_FUNCTION; + + i) { DriverObject-> MajorFunction [i] = FsFilterDispatchPassThrough; } DriverObject-> MajorFunction [IRP_MJ_CREATE] = FsFilterDispatchCreate; ... }

Set Fast-IO despacho mesa


Un sistema de archivo de controlador de filtro debe tener la mesa de despacho rpido-IO. Si te has olvidado de configurar el ayuno-IO mesa despacho, que dar lugar a la cada del sistema. Fast-IO es una forma alternativa de iniciar las operaciones de E / S (y es ms rpido que el IRP). Fast-IO operaciones son siempre sncrono. Si el controlador Fast-IO devuelve FALSO , significa que el modo Fast-IO es imposible y un IRP ser creada.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / datos globales FAST_IO_DISPATCH g_fastIoDispatch = { sizeof (FAST_IO_DISPATCH), FsFilterFastIoCheckIfPossible, ... }; ////////////////////////////////////////////////////////////////////////// / / DriverEntry - punto de entrada del controlador NTSTATUS DriverEntry ( __inout PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath ) { ... // / / Fast Set-io mesa de despacho. // DriverObject-> FastIoDispatch = & g_fastIoDispatch; ... }

Registre una notificacin con los cambios del sistema de archivos


Debemos seguir el sistema de archivos que se activa / desactiva a realizar un montaje / desmontaje de nuestro controlador de sistema de filtro de archivos. Cmo iniciar el seguimiento de los cambios del sistema de archivos se muestra a continuacin.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / DriverEntry - punto de entrada del controlador NTSTATUS DriverEntry ( __inout PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath ) { ... // / / rutina de devolucin de llamada registrada por los cambios del sistema de archivos. // estado = IoRegisterFsRegistrationChange (DriverObject, FsFilterNotificationCallback); si (! NT_SUCCESS (status)) {

devolver el estado; } ... }

Establecer descargar controlador rutina


La ltima parte de la inicializacin del controlador establece una rutina de descarga. Configuracin del controlador de descarga de rutina hace que el controlador descargable, y usted puede cargar / descargar ella varias veces sin reiniciar el sistema. Sin embargo, este controlador se hace descargable slo para la depuracin de propsito, porque los filtros del sistema de archivos no se puede descargar de forma segura. Nunca haga esto en el cdigo de produccin.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / DriverEntry - punto de entrada del controlador NTSTATUS DriverEntry ( __inout PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath ) { ... // / / Set conductor descargar rutinario (slo propsito de depuracin). // DriverObject-> DriverUnload = FsFilterUnload; volver STATUS_SUCCESS; }

Controlador de descarga de la aplicacin


Controlador de descarga de rutina es responsable de la limpieza y liberacin de los recursos. En primer lugar, anular el registro de la notificacin de cambios del sistema de archivos.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / Unload rutina VOID FsFilterUnload ( __in PDRIVER_OBJECT DriverObject ) { ... // / / rutina de devolucin de llamada para no registrado cambios en el sistema de archivos. // IoUnregisterFsRegistrationChange (DriverObject, FsFilterNotificationCallback); ... }

A continuacin, recorrer los dispositivos que hemos creado, separe y eliminarlos. Espere 5 segundos para que todos los IRP pendientes de ser completados. Como se mencion antes, esta es una nica solucin de depuracin. Funciona en la mayora de los casos, pero no hay garanta para todos.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / Unload rutina VOID FsFilterUnload ( __in PDRIVER_OBJECT DriverObject ) { ... para (; ;) { IoEnumerateDeviceObjectList ( DriverObject, devlist, sizeof (devlist), Y numDevices); si ( 0 == numDevices) { romper ; } numDevices = min (numDevices, RTL_NUMBER_OF (devlist)); para (i = 0 ; i <numDevices; + + i) { FsFilterDetachFromDevice (devlist [i]); ObDereferenceObject (devlist [i]); } KeDelayExecutionThread (KernelMode, FALSE, y por intervalos); } }

IrpDispatch.c
El envo de paso a travs
Este controlador de IRP no hace nada excepto pasando peticiones al conductor ms prximo. Contamos con el objeto siguiente conductor almacenadas en nuestro dispositivo de extensin.
Collapse | Copiar cdigo
///////////////////////////////////////////////////////////////// / / PassThrough IRP controlador NTSTATUS FsFilterDispatchPassThrough ( __in PDEVICE_OBJECT DeviceObject, __in PIRP Irp ) { PFSFILTER_DEVICE_EXTENSION pDevExt = (PFSFILTER_DEVICE_EXTENSION) DeviceObject-> DeviceExtension;

IoSkipCurrentIrpStackLocation (IRP); volver IoCallDriver (pDevExt-> AttachedToDeviceObject, IRP); }

Despacho crear
Este controlador de IRP se invoca en cada operacin de archivo a crear. Vamos a tomar un nombre de archivo dePFILE_OBJECT e imprimirlo en la salida de depuracin. A continuacin, hacemos un llamado al controlador de paso descrito anteriormente. Prestar atencin al hecho de que un nombre de archivo vlido existe en PFILE_OBJECT slo mientras la operacin de archivo create se est realizando! Tambin hay abrir relativos, y se abre por ID.Recuperando nombres de archivo en los casos est ms all del alcance de este artculo.
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////////// / / IRP_MJ_CREATE IRP controlador NTSTATUS FsFilterDispatchCreate ( __in PDEVICE_OBJECT DeviceObject, __in PIRP Irp ) { PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation (IRP) -> FileObject; DbgPrint ( " % wZ \ n " , & pFileObject-> filename); volver FsFilterDispatchPassThrough (DeviceObject, IRP); }

FastIo.c
Para probar la validez Fast-IO despacho mesa para el conductor prximo, vamos a utilizar la macro siguiente ayudante (no todo el Fast-IO rutinas deben ser implementadas por el sistema de archivos subyacente, as que tenemos que estar seguros de ello):
Collapse | Copiar cdigo
/ / Macro para probar si la rutina FAST_IO_DISPATCH manejo es vlido # define VALID_FAST_IO_DISPATCH_HANDLER (_FastIoDispatchPtr, _FieldName) \ (((_FastIoDispatchPtr)! = Null) && \ (((_FastIoDispatchPtr) -> SizeOfFastIoDispatch)> = \ (Field_offset (FAST_IO_DISPATCH, _FieldName) + sizeof ( void *))) && \ ((_FastIoDispatchPtr) - _FieldName> = NULL))

Fast-IO pass-through
Pasando a travs de Fast-IO peticiones requiere escribir un montn de cdigo (en contraste a pasar a travs de solicitudes IRP) porque cada funcin Fast-IO tiene su propio conjunto de parmetros. Un paso a travs de la funcin tpica se muestra a continuacin:
Collapse | Copiar cdigo

BOOLEAN FsFilterFastIoQueryBasicInfo ( __in PFILE_OBJECT FileObject, __in BOOLEAN Espera, __out PFILE_BASIC_INFORMATION Buffer, __out PIO_STATUS_BLOCK IoStatus, __in PDEVICE_OBJECT DeviceObject ) { // / / Pasar a travs de la lgica de este tipo de Fast I / O // PDEVICE_OBJECT nextDeviceObject = ((PFSFILTER_DEVICE_EXTENSION) DeviceObject-> DeviceExtension) -> AttachedToDeviceObject; PFAST_IO_DISPATCH fastIoDispatch = nextDeviceObject-> DriverObject-> FastIoDispatch; si (VALID_FAST_IO_DISPATCH_HANDLER (fastIoDispatch, FastIoQueryBasicInfo)) { retorno (fastIoDispatch-> FastIoQueryBasicInfo) ( FileObject, Espera, Buffer, IoStatus, nextDeviceObject); } volver FALSO; }

Fast-IO dispositivo de desconexin


Este es un especial de Fast-IO solicitud que tenemos que manejar y no llamar al siguiente conductor. Tenemos que separar nuestro dispositivo de filtro de la pila fichero de dispositivo del sistema y borrar nuestro dispositivo. Eso se puede hacer fcilmente por el siguiente cdigo:
Collapse | Copiar cdigo
VOID FsFilterFastIoDetachDevice ( __in PDEVICE_OBJECT SourceDevice, __in PDEVICE_OBJECT TargetDevice ) { // / / Separar del objeto del sistema de archivos del volumen del dispositivo. // IoDetachDevice (TargetDevice); IoDeleteDevice (SourceDevice); }

Notification.c
Un sistema de archivos tpico consiste en un dispositivo de control y dispositivos de volumen. Un dispositivo de volumen est conectado a la pila de dispositivos de almacenamiento. El dispositivo de control est registrada como un sistema de archivos.

Figura 1 - Los dispositivos del sistema de archivos tpico

Tenemos una devolucin de llamada que se invoca para todos los sistemas de archivos activos y cada vez que un sistema de archivos se ha registrado o no registrado a s mismo como un activo. Este es un buen lugar para conectar / desconectar nuestro dispositivo de filtro. Cuando un sistema de archivos activa, que atribuimos a su dispositivo de control (slo si no est ya conectado), enumerar sus dispositivos de volumen, y se unen a ellos tambin. En la desactivacin del sistema de archivos, se analiza el sistema de archivos de control de pila de dispositivos, busque nuestro dispositivo y retrela. Extraccin de los dispositivos de volumen del sistema de archivos se lleva a cabo en elFsFilterFastIoDetachDevice rutina descrita anteriormente.
Collapse | Copiar cdigo
//////////////////////////////////////////////////////////////////////////// / / Esta rutina se invoca siempre que un sistema de archivos ha registrado o / / no registrado en s como un sistema de archivo activo. VOID FsFilterNotificationCallback ( __in PDEVICE_OBJECT DeviceObject, __in BOOLEAN FsActive ) { // / / Manejar un montaje / desmontaje del sistema de archivos determinado. //

si (FsActive) { FsFilterAttachToFileSystemDevice (DeviceObject); } ms { FsFilterDetachFromFileSystemDevice (DeviceObject); } }

AttachDetach.c
Este archivo contiene rutinas auxiliares para conectar, desconectar, y comprobar si nuestro filtro ya ha sido fijada.

Colocacin
Para realizar la unin, se crea un objeto nuevo dispositivo con la extensin de dispositivo (llamado IoCreateDevice ) y las banderas de dispositivos se propagan de objetos del objeto de dispositivo que est intentando adjuntar a (DO_BUFFERED_IO , DO_DIRECT_IO , FILE_DEVICE_SECURE_OPEN ). Entonces, llamamosIoAttachDeviceToDeviceStackSafe en un bucle con un retraso en el caso de fallo. Es posible que esta solicitud de incorporacin al fracaso porque el objeto de dispositivo no ha terminado la inicializacin. Esta situacin se puede producir si intenta montar el filtro que se ha cargado como el nico volumen. Cuando coloque ha terminado, nos ahorramos el "adjunto al" objeto dispositivo para la extensin de dispositivo y borrar la DO_DEVICE_INITIALIZINGbandera. La extensin del dispositivo que se muestra a continuacin:
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// // Structures typedef struct _FSFILTER_DEVICE_EXTENSION { PDEVICE_OBJECT AttachedToDeviceObject; } FSFILTER_DEVICE_EXTENSION, * PFSFILTER_DEVICE_EXTENSION;

Desmontaje
Extraccin es bastante simple. Obtener el "unido a" objeto de dispositivo de la ampliacin del mismo y llameIoDetachDevice y IoDeleteDevice .
Collapse | Copiar cdigo
vaco FsFilterDetachFromDevice ( __in PDEVICE_OBJECT DeviceObject ) { PFSFILTER_DEVICE_EXTENSION pDevExt = (PFSFILTER_DEVICE_EXTENSION) DeviceObject-> DeviceExtension; IoDetachDevice (pDevExt-> AttachedToDeviceObject); IoDeleteDevice (DeviceObject); }

Comprobar si nuestro dispositivo est conectado


Para comprobar si estamos apegados a un dispositivo, tenemos que iterar a travs de la pila de dispositivos (utilizando IoGetAttachedDeviceReference y IoGetLowerDeviceObject ) y buscar nuestro dispositivo all. Se distinguen nuestros dispositivos comparando el objeto controlador de dispositivo con nuestro objeto conductor (g_fsFilterDriverObject ).
Collapse | Copiar cdigo
////////////////////////////////////////////////////////////////////////// / / Misc BOOLEAN FsFilterIsMyDeviceObject ( __in PDEVICE_OBJECT DeviceObject ) { volver DeviceObject-> DriverObject == g_fsFilterDriverObject; }

Fuentes y makefile
Fuentes y archivos makefile son utilizados por la utilidad de generacin para construir el conductor. Contiene la configuracin del proyecto y los nombres de archivo de origen. Fuentes Contenido del archivo:
Collapse | Copiar cdigo
TargetName = FsFilter TargetPath obj = TargetType = CONDUCTOR DriverType = FS FUENTES = \ Main.c \ IrpDispatch.c \ AttachDetach.c \ Notification.c \ FastIo.c

El makefile es estndar:
Collapse | Copiar cdigo
! Include $ (NTMAKEENV) \ makefile.def

El MSVC makefile proyecto de lnea de comandos de compilacin es:


Collapse | Copiar cdigo
llame $ (WinDDK) \ bin \ setenv.bat $ (WinDDK) chk wxp cd / d $ (ProjectDir) build.exe-I

Cmo instalar un controlador


Sc.exe visin general

Usaremos sc.exe (sc - Servicio de control) para manejar nuestro conductor. Es una utilidad de lnea de comandos que se puede utilizar para consultar o modificar la base de datos de servicios instalados. Se suministra con Windows XP y superiores, o se puede encontrar en el SDK de Windows / DDK.

Instalar
Para instalar el controlador, llame a:
Collapse | Copiar cdigo
sc create type = FsFilter filesys BinPath = c: \ FSFilter.sys

Una entrada del nuevo servicio se crea con el nombre FsFilter , el tipo de servicio ser el sistema de archivo y la ruta del binario, c: \ FsFilter.sys .

Iniciar
Para iniciar el controlador, llamar a:
Collapse | Copiar cdigo
sc start FsFilter

As se inicia un servicio llamado FsFilter .

Detngase
Para detener al conductor, llame al:
Collapse | Copiar cdigo
sc stop FsFilter

Esto detiene el servicio denominado FsFilter .

Desinstalar
Y para desinstalar, llame al:
Collapse | Copiar cdigo
sc delete FsFilter

Esto indica al gestor de servicios para eliminar la entrada de servicio con el nombre FsFilter .

Resultando guin
Todos los comandos se ponen en un archivo por lotes solo para hacer pruebas piloto ms fcil. Aqu est la lista de losINSTALL.CMD archivo de comandos:

Collapse | Copiar cdigo


sc create type = FsFilter filesys BinPath = c: \ FsFilter.sys sc start FsFilter pausa sc stop FsFilter sc delete FsFilter pausa

Ejecucin de una muestra


Esta es la parte ms interesante. Para demostrar el funcionamiento del sistema de filtro de archivos, vamos a utilizarpara Windows Sysinternals DebugView para monitorizar la salida de depuracin, y OSR rbol de dispositivos para ver los dispositivos y controladores. Por lo tanto, construir el conductor. A continuacin, copie los resultados de la compilacin de archivos FsFilter.sys y el instalar el script INSTALL.CMD a la raz del disco C .

Figura 2 - El conductor y el script de instalacin en el disco.

Ejecutar INSTALL.CMD . Ser instalar e iniciar el controlador y luego esperar a que la entrada del usuario.

Figura 3 - El controlador se ha instalado e iniciado.

Ahora inicie la utilidad DebugView.

Figura 4 - Control de la salida de depuracin.

Podemos ver qu archivos se estn abriendo! Nuestras obras de filtro. Ahora, ejecute la utilidad de rbol de dispositivos y localizar nuestro conductor all.

Figura 5 - El controlador de filtro en el rbol de dispositivos.

Podemos ver numerosos dispositivos creados por nuestro conductor. Ahora vamos a abrir el controlador de NTFS y mirar el rbol de dispositivos:

Figura 6 - Nuestro filtro est unido a NTFS.

Estamos apegados. Echemos un vistazo a los sistemas de archivos.

Figura 7 - El filtro est unido a los otros sistemas de archivos tambin.

Y por ltimo, presione cualquier tecla para mover nuestro script de instalacin hacia adelante. Se detendr y desinstalar el controlador.

Figura 8 - El conductor se detuvo y se desinstala.

Actualizar la lista de rbol dispositivo pulsando F5:

Figura 9 - Nuestro isnot dispositivo de filtro en el rbol de dispositivos.

Nuestro filtro se ha ido. El sistema est funcionando como antes.

Mejoras
El conductor de la muestra carece de una funcionalidad general, son necesarios para unir a los volmenes recin llegados. Se hace as para que el conductor tan fcil de entender como sea posible. Usted puede escribir unIRP_MJ_FILE_SYSTEM_CONTROL manejador de su preferencia para realizar un seguimiento de los volmenes recin llegados.

Conclusin
En este tutorial se muestra cmo crear un controlador de sistema de archivos de filtro simple, y cmo instalar, iniciar, detener, desinstalar y desde una lnea de comandos. Adems, algunos aspectos del sistema de filtro de archivos del controlador se discutieron. Vimos el sistema de archivos pila de dispositivos con los filtros conectados, y aprendi a controlar la salida de depuracin del controlador. Usted puede utilizar los recursos proporcionados como un esqueleto para su propio controlador de filtro del sistema de archivos o modificar su comportamiento.

1. 2.

Del sistema de archivos Filtro Drivers Contenido para sistema de archivos o del sistema de archivos Filtro Desarrolladores 3. Windows NT interna de sistema de archivos (OSR Reimpresiones Classic) (Paperback) 4. sFilter DDK muestra Lea ms consejos de Desarrollo del conductor en el caso Apriorit seccin de Estudios .

Referencias tiles

Licencia
Este artculo, junto con el cdigo fuente y los archivos asociados, est licenciado bajo la Licencia del Proyecto Cdigo Abierto (CPOL)

You might also like