Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los filtros que requieren asignadores para la memoria a bordo u otros métodos de almacenamiento dependientes del dispositivo pueden proporcionar un asignador específico admitiendo las propiedades y métodos del asignador. Para obtener más información, consulte KSPROPERTY_STREAM_ALLOCATOR.
Un filtro recibe un IRP_MJ_CREATE de tipo KSCREATE_REQUEST_ALLOCATOR especificando las opciones de marco para el asignador. La rutina de creación del asignador del minidriver valida la solicitud de creación llamando a KsValidateAllocatorCreateRequest. Si la llamada se realiza correctamente, esta rutina devuelve un puntero a la estructura de KSALLOCATOR_FRAMING pertinente.
Si el filtro no puede satisfacer los requisitos de marco, devuelve un código de error en respuesta al IRP. De lo contrario, el filtro adjunta un puntero a una estructura al miembro FsContext del objeto de archivo y gestiona las solicitudes resultantes de asignación.
Si el filtro debe modificar los búferes pasados a la interfaz de streaming en el lugar, el cliente en modo de usuario establece la marca KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER en la estructura KSALLOCATOR_FRAMING pertinente.
Hay dos interfaces disponibles para el asignador. En primer lugar, los asignadores deben admitir el KSMETHODSETID_StreamAllocator basado en IRP. Los asignadores que utilizan este mecanismo están limitados a un número máximo de marcos asignados. Las solicitudes para asignar frames más allá de este límite se marcarán como pendientes.
En segundo lugar, el minidriver puede soportar el acceso a la tabla de funciones si el tipo de grupo de asignación puede ser atendido en DISPATCH_LEVEL. Proporcionar acceso a la tabla de funciones es opcional. Para ello, admita las propiedades de KSPROPSETID_StreamAllocator.
La interfaz DISPATCH_LEVEL funciona de la siguiente manera:
Cuando se envía una solicitud de asignación al asignador, el asignador devuelve un puntero a un marco si hay uno disponible. Si no es así, devuelve inmediatamente NULL.
Cuando se envía una solicitud de liberación al asignador, este señaliza el evento de "liberación de fotograma" del asignador de secuencia, notificando al cliente que hay un fotograma libre disponible. Además, si hay IRP de solicitud de asignación a la espera de completarse, el asignador debe programar un elemento de trabajo (si el IRQL actual no es PASSIVE_LEVEL) y completar la solicitud con el marco libre.
Es posible que tanto la interfaz DISPATCH_LEVEL como la interfaz basada en IRP compitan por marcos libres. KS sincroniza esta cola utilizando el spin lock de cancelación.