Compartir a través de


Administración de objetos

En esta sección se describe el uso correcto de los tipos de objetos de LA API de Windows Filtering Platform (PMA).

Sesiones

La API del PMA está orientada a la sesión y la mayoría de las llamadas de función se realizan en el contexto de una sesión. Se crea una nueva sesión de cliente llamando a FwpmEngineOpen0. La sesión finaliza cuando el cliente llama a fwpmEngineClose0 o el proceso de cliente finaliza. Cuando se destruye una sesión, ya sea a propósito o mediante la detención rpc, el motor de filtrado base (BFE) anula primero cualquier transacción existente.

Al crear una nueva sesión, el autor de la llamada puede crear una sesión dinámica pasando la marca de FWPM_SESSION_FLAG_DYNAMIC a FwpmEngineOpen0. Los objetos agregados durante una sesión dinámica se eliminan automáticamente cuando finaliza la sesión.

Transacciones

La API del PMA es transaccional y la mayoría de las llamadas de función se realizan dentro del contexto de una transacción. Los autores de llamadas pueden usar FwpmTransactionBegin0, FwpmTransactionCommit0y FwpmTransactionAbort0 para controlar explícitamente las transacciones. Sin embargo, si una llamada de función se realiza fuera de una transacción explícita, se ejecutará dentro de una transacción implícita. Si una transacción está en curso, cuando finaliza una sesión, se anula automáticamente. Las transacciones implícitas nunca se anulan forzosamente.

Las transacciones son de solo lectura o de lectura y escritura y aplican rigurosas semánticas de Durable aislado coherente atómica (ACID).

Cada sesión de cliente solo puede tener una transacción en curso a la vez. Si el autor de la llamada intenta iniciar una segunda transacción antes de confirmar o anular la primera, BFE devuelve un error.

Si se produce un error en una operación durante el transcurso de una transacción, no afecta al estado general de la transacción. Por ejemplo, supongamos que el cliente inicia una transacción y llama correctamente a FwpmFilterAdd0 tres veces antes de que se produzca un error en una cuarta llamada. El cliente ahora tiene la opción de:

  • Anular la transacción, en cuyo caso no se agregará ninguno de los filtros.
  • Confirmar la transacción, en cuyo caso se agregarán los tres primeros filtros.
  • Continuando con más operaciones, incluida la posibilidad de volver a intentar el error FwpmFilterAdd0.

Al iniciar una transacción, BFE esperará hasta que el de la sesión txnWaitTimeoutInMSec expire para adquirir el bloqueo. Si el bloqueo no se adquiere en este momento, se producirá un error en la adquisición del bloqueo (y la llamada de FwpmTransactionBegin0). Esto impide que los clientes no respondan indefinidamente. Si el cliente no especificó un tiempo de espera de bloqueo, el valor predeterminado es de 15 segundos.

Cada transacción también tiene un tiempo de espera de bloqueo. Esta es la cantidad máxima de tiempo que puede poseer el bloqueo. Si el propietario no libera el bloqueo dentro de este tiempo, la transacción se anula forzosamente, lo que hace que se libere el bloqueo. El tiempo de espera de bloqueo no es configurable. Es infinito para los autores de llamadas en modo kernel y una hora para los autores de llamadas en modo de usuario. Si se anula forzadamente una transacción, se producirá un error en la siguiente llamada realizada dentro de esa transacción con FWP_E_TXN_ABORTED.

Duración del objeto

Los objetos pueden tener una de cuatro duraciones posibles:

  • Dinámico: un objeto solo es dinámico si se agrega mediante un identificador de sesión dinámico. Los objetos dinámicos residen hasta que se eliminan o finaliza la sesión propietaria.
  • Estático: los objetos son estáticos de forma predeterminada. Los objetos estáticos residen hasta que se eliminan, BFE se detiene o el sistema está apagado.
  • Persistente: los objetos persistentes se crean pasando la marca FWPM_*_FLAG_PERSISTENT adecuada a una función Fwpm*Add0. Los objetos persistentes residen hasta que se eliminan.
  • Integrado: los objetos integrados están predefinidos por BFE y no se pueden agregar ni eliminar. Viven para siempre.

Los filtros en capas en modo kernel se pueden marcar como filtros en tiempo de arranque pasando la marca adecuada a FwpmFilterAdd0. Los filtros en tiempo de arranque se agregan al sistema cuando se inicia el controlador TCP/IP y se quitan cuando BFE finaliza la inicialización. Los objetos persistentes se agregan cuando se inicia BFE.

En muchos casos, es posible que un proveedor de directivas no desee que se aplique su directiva persistente si el proveedor se ha deshabilitado. Al agregar un proveedor, el autor de la llamada puede especificar un nombre de servicio de Windows opcional. Al agregar objetos persistentes, el autor de la llamada puede especificar opcionalmente el proveedor que "posee" ese objeto. Al iniciar el servicio, BFE solo agrega objetos persistentes al sistema si no están asociados a un proveedor, o el proveedor asociado no tiene ningún nombre de servicio de Windows o el servicio de Windows asociado se establece en inicio automático.

Asociaciones de objetos

Algunos objetos tienen referencias a otros objetos. Por ejemplo, un filtro siempre hace referencia a una capa y puede hacer referencia a una llamada y un contexto de proveedor. Los objetos no pueden hacer referencia a objetos que pueden tener una duración más corta. Por lo tanto, un objeto dinámico no puede hacer referencia a un objeto dinámico desde una sesión diferente. Un objeto estático no puede hacer referencia a un objeto dinámico. Un objeto persistente no puede hacer referencia a un objeto dinámico, a un objeto estático o a un objeto persistente propiedad de un proveedor diferente.

Un objeto no se puede eliminar hasta que todos los objetos que hacen referencia a él se han eliminado por primera vez.

LUID y GUID

Todos los objetos de API DE PMA (FWPM) del modo de usuario se identifican mediante un identificador único global (GUID) y hacen referencia a otros objetos por sus GUIDs. El GUID solo debe ser único dentro del tipo de objeto. Por ejemplo, un filtro y un contexto de proveedor pueden tener el mismo GUID de , pero dos filtros no. Al agregar un nuevo objeto, los llamadores pueden asignar el GUID de del objeto o dejar que BFE asigne el GUID de .

Todos los objetos de API DE PMA (FWPS) del modo kernel se identifican mediante un identificador único local (LUID) y hacen referencia a otros objetos por su LUID. El cambio de GUID a LUID permite que EL PMA conserve el grupo no paginado y optimice el procesamiento en tiempo de ejecución. El ancho del LUID de depende del tipo de objeto y de los intervalos de un UINT16 a un UINT64. BFE siempre asigna LUIDs.