Alocação de recursos de memória compartilhada

Para alocar recursos de memória compartilhada para uma fila de VM, um driver de miniporto chama a função NdisAllocateSharedMemory . Por exemplo, o driver de miniporta aloca memória compartilhada quando recebe o OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID. Além disso, um driver de miniporto pode alocar memória compartilhada para a fila padrão durante a inicialização do adaptador de rede. Para obter mais informações sobre como alocar filas, consulte Alocando uma fila de VM.

O driver de miniporta pode alocar mais memória para a fila até que a fila seja liberada. Para obter mais informações sobre como liberar uma fila, consulte Liberando uma fila de VM.

A estrutura NDIS_SHARED_MEMORY_PARAMETERS especifica os parâmetros de memória compartilhada para uma solicitação de alocação de memória compartilhada. Os drivers de miniport passam essa estrutura para a função NdisAllocateSharedMemory . O NDIS passa essa estrutura para a função NetAllocateSharedMemory (ou seja, o ponto de entrada ALLOCATE_SHARED_MEMORY_HANDLER).

Quando um driver de miniporta aloca memória compartilhada, ele especifica o seguinte:

  • Identificador de fila.

  • Comprimento da memória compartilhada.

  • Como a memória compartilhada é usada. Por exemplo, o driver de miniporto especifica NdisSharedMemoryUsageReceive se a memória compartilhada deve ser usada para buffers de recebimento.

Se o sinalizador NDIS_SHARED_MEM_PARAMETERS_CONTIGOUS não estiver definido no membro Flags , a memória compartilhada poderá ser especificada em uma lista de coleta de dispersão contida na memória não contígua.

A enumeração NDIS_SHARED_MEMORY_USAGE especifica como a memória compartilhada é usada. A enumeração NDIS_SHARED_MEMORY_USAGE é usada nas estruturas NDIS_SHARED_MEMORY_PARAMETERS e NDIS_SCATTER_GATHER_LIST_PARAMETERS . Para obter informações sobre parâmetros de memória compartilhada no VMQ receber buffers de dados, consulte Memória compartilhada em buffers de recebimento.

A função NdisAllocateSharedMemory fornece o seguinte ao chamador:

  • Endereço virtual da memória alocada.

  • Lista de coleta de dispersão.

  • Identificador de memória compartilhada – para indicações de recebimento.

  • Identificador de alocação – usado para identificar a memória posteriormente.

Os drivers de miniport chamam a função NdisFreeSharedMemory para liberar memória compartilhada para uma fila. Se o driver de miniporta alocou a memória compartilhada para uma fila não padrão, ele libera a memória compartilhada no contexto do OID_RECEIVE_FILTER_FREE_QUEUE OID enquanto ele está liberando a fila. Miniportar drivers liberam memória compartilhada que eles alocaram para a fila padrão no contexto da função MiniportHaltEx .