Referencia a contextos
El Administrador de filtros usa el recuento de referencias para administrar la duración de un contexto de minifiltro. Un recuento de referencias es un número que indica el estado de un contexto.
Cada vez que se crea correctamente un contexto, FltMgr inicializa el recuento de referencias del contexto en uno. Esto se denomina referencia inicial al contexto.
Cada vez que se hace referencia a un contexto, por ejemplo, mediante un conjunto de contexto correcto u obtener, FltMgr incrementa el recuento de referencias del contexto en uno.
Cuando ya no se necesita un contexto, se debe reducir su recuento de referencias. Un recuento de referencias positiva significa que se puede usar el contexto. Cuando el recuento de referencias se convierte en cero, el contexto es inutilizable y FltMgr finalmente lo libera.
FltMgr libera la referencia inicial al contexto (disminuye el recuento de referencias en cero) cuando el objeto se está derribando y, a continuación, llama a la devolución de llamada de limpieza de contexto opcional del filtro. Aunque esto rara vez ocurre, si un minifiltro debe quitar un contexto de un objeto antes de la desmontaje, el minifiltro debe liberar de forma segura esa referencia inicial al contexto llamando a FltDeleteContext.
Un minifiltro puede agregar su propia referencia a un contexto llamando a FltReferenceContext para incrementar el recuento de referencias del contexto. El minifiltro debe eliminar finalmente esta referencia agregada llamando a FltReleaseContext.
A continuación se muestra un breve ejemplo del historial de recuento de referencias para un objeto típico. Supongamos que todas las llamadas API flt se realizan correctamente.
Devolución de llamada de filtro | Flt API llamada | Recuento de referencias de contexto | Descripción |
---|---|---|---|
Crear previamente | FltAllocateContext | 1 | El filtro está procesando una creación previa y decide que podría querer realizar un seguimiento del archivo. Asigna un contexto de flujo, lo que hace que FltMgr inicialice el recuento de referencias en 1. El filtro pasa el contexto a su devolución de llamada PostCreate a través del parámetro CompletionContext . |
PostCreate | FltSetStreamContext | 2 | El filtro pasó el contexto que asignó durante preCreate a su devolución de llamada PostCreate . La creación se realizó correctamente, por lo que el filtro adjunta el contexto, lo que hace que FltMgr incremente el recuento de referencias. |
PostCreate | FltReleaseContext | 1 | Dado que FltSetStreamContext incrementó el recuento de referencias, el filtro debe quitar el recuento adicional. El recuento de referencias es 1 después de que el filtro libere el contexto, por lo que el contexto permanece activo. Si el filtro hubiera decidido que no le importaba este archivo después de todo, podría haber omitido llamar a FltSetStreamContext y simplemente llamar a FltReleaseContext. En ese caso, el recuento habría pasado a 0 y el contexto se habría desasignado. |
PreRead | FltGetStreamContext | 2 | El filtro ve una E/S de lectura y quiere saber si está realizando el seguimiento de este archivo. Solicita su contexto de secuencia y lo obtiene, por lo que sabe que desea realizar un seguimiento de este archivo. FltMgr incrementa el recuento de referencias. |
PreRead | FltReleaseContext | 1 | El filtro se realiza con su contexto, por lo que lo libera, lo que hace que el recuento de referencias se reduzca. Cada FltGet*Context debe equilibrarse con fltReleaseContext. |
PreCleanup | FltGetStreamContext | 2 | El filtro solicita y obtiene su contexto, lo que incrementa el recuento de referencias. |
PreCleanup | FltReleaseContext | 1 | El filtro se realiza mediante el contexto para liberarlo, lo que disminuye el recuento de referencias. |
Devolución de llamada de limpieza de contexto | 0 | El sistema de archivos está desmontando el objeto de secuencia subyacente. (En el caso específico de un objeto de secuencia, el desmontaje se desencadena mediante IRP_MJ_CLOSE). FltMgr disminuye el recuento de referencias en 0 y, a continuación, llama a la devolución de llamada de limpieza de contexto del filtro. El filtro ahora tiene la oportunidad de limpiar su contexto. |