Professional Documents
Culture Documents
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
EL TERCERO ES UN LIBRO
http://www.amazon.com/Windows-System-Internals-Classic-Reprints/dp/0976717514
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.
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; ... }
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;
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; }
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.
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. //
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); }
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
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
Detngase
Para detener al conductor, llame al:
Collapse | Copiar cdigo
sc stop 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:
Ejecutar INSTALL.CMD . Ser instalar e iniciar el controlador y luego esperar a que la entrada del usuario.
Podemos ver qu archivos se estn abriendo! Nuestras obras de filtro. Ahora, ejecute la utilidad de rbol de dispositivos y localizar nuestro conductor all.
Podemos ver numerosos dispositivos creados por nuestro conductor. Ahora vamos a abrir el controlador de NTFS y mirar el rbol de dispositivos:
Y por ltimo, presione cualquier tecla para mover nuestro script de instalacin hacia adelante. Se detendr y desinstalar el controlador.
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)