Asignación de recursos de memoria compartida
Para asignar recursos de memoria compartidos para una cola de máquina virtual, un controlador de minipuerto llama a la función NdisAllocateSharedMemory . Por ejemplo, el controlador de minipuerto asigna memoria compartida cuando recibe el OID de OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE . Además, un controlador de minipuerto puede asignar memoria compartida para la cola predeterminada durante la inicialización del adaptador de red. Para más información sobre la asignación de colas, consulte Asignación de una cola de máquinas virtuales.
El controlador de minipuerto puede asignar más memoria para la cola hasta que se libere la cola. Para más información sobre cómo liberar una cola, consulte Liberar una cola de máquinas virtuales.
La estructura NDIS_SHARED_MEMORY_PARAMETERS especifica los parámetros de memoria compartida para una solicitud de asignación de memoria compartida. Los controladores de minipuerto pasan esta estructura a la función NdisAllocateSharedMemory . NDIS pasa esta estructura a la función NetAllocateSharedMemory (es decir, el punto de entrada ALLOCATE_SHARED_MEMORY_HANDLER).
Cuando un controlador de minipuerto asigna memoria compartida, especifica lo siguiente:
Identificador de cola.
Longitud de memoria compartida.
Cómo se usa la memoria compartida. Por ejemplo, el controlador de minipuerto especifica NdisSharedMemoryUsageReceive si la memoria compartida se va a usar para los búferes de recepción.
Si la marca NDIS_SHARED_MEM_PARAMETERS_CONTIGOUS no está establecida en el miembro Flags , la memoria compartida se puede especificar en una lista de recopilación de dispersión contenida en memoria no contigua.
La enumeración NDIS_SHARED_MEMORY_USAGE especifica cómo se usa la memoria compartida. La enumeración NDIS_SHARED_MEMORY_USAGE se usa en las estructuras NDIS_SHARED_MEMORY_PARAMETERS y NDIS_SCATTER_GATHER_LIST_PARAMETERS . Para obtener información sobre los parámetros de memoria compartida en VMQ reciben búferes de datos, consulte Memoria compartida en búferes de recepción.
La función NdisAllocateSharedMemory proporciona lo siguiente al autor de la llamada:
Dirección virtual de la memoria asignada.
Lista de recopilación de dispersión.
Identificador de memoria compartida: para indicaciones de recepción.
Identificador de asignación: se usa para identificar la memoria más adelante.
Los controladores de minipuerto llaman a la función NdisFreeSharedMemory para liberar memoria compartida para una cola. Si el controlador de minipuerto asignó la memoria compartida para una cola no predeterminada, libera la memoria compartida en el contexto del OID_RECEIVE_FILTER_FREE_QUEUE OID mientras libera la cola. Los controladores de minipuerto liberan memoria compartida que asignaron para la cola predeterminada en el contexto de la función MiniportHaltEx .