Allocazione delle risorse di memoria condivisa

Per allocare risorse di memoria condivise per una coda di macchine virtuali, un driver miniport chiama la funzione NdisAllocateSharedMemory . Ad esempio, il driver miniport alloca la memoria condivisa quando riceve l'OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE . Inoltre, un driver miniport può allocare memoria condivisa per la coda predefinita durante l'inizializzazione della scheda di rete. Per altre informazioni sull'allocazione delle code, vedere Allocazione di una coda di macchine virtuali.

Il driver miniport può allocare più memoria per la coda fino a quando la coda non viene liberata. Per altre informazioni sulla liberazione di una coda, vedere Liberare una coda di macchine virtuali.

La struttura NDIS_SHARED_MEMORY_PARAMETERS specifica i parametri di memoria condivisa per una richiesta di allocazione di memoria condivisa. I driver Miniport passano questa struttura alla funzione NdisAllocateSharedMemory . NDIS passa questa struttura alla funzione NetAllocateSharedMemory , ovvero il punto di ingresso ALLOCATE_SHARED_MEMORY_HANDLER.

Quando un driver miniport alloca memoria condivisa, specifica quanto segue:

  • Identificatore della coda.

  • Lunghezza di memoria condivisa.

  • Modalità di utilizzo della memoria condivisa. Ad esempio, il driver miniport specifica NdisSharedMemoryUsageReceive se la memoria condivisa deve essere usata per i buffer di ricezione.

Se il flag NDIS_SHARED_MEM_PARAMETERS_CONTIGOUS non è impostato nel membro Flags , la memoria condivisa può essere specificata in un elenco di raccolta a dispersione contenuto in memoria non contigua.

L'enumerazione NDIS_SHARED_MEMORY_USAGE specifica il modo in cui viene usata la memoria condivisa. L'enumerazione NDIS_SHARED_MEMORY_USAGE viene usata nelle strutture NDIS_SHARED_MEMORY_PARAMETERS e NDIS_SCATTER_GATHER_LIST_PARAMETERS . Per informazioni sui parametri di memoria condivisa in VMQ ricevono buffer di dati, vedere Memoria condivisa nei buffer di ricezione.

La funzione NdisAllocateSharedMemory fornisce quanto segue al chiamante:

  • Indirizzo virtuale della memoria allocata.

  • Elenco di raccolta a dispersione.

  • Handle di memoria condivisa: per ricevere indicazioni.

  • Handle di allocazione: usato per identificare la memoria in un secondo momento.

I driver Miniport chiamano la funzione NdisFreeSharedMemory per liberare memoria condivisa per una coda. Se il driver miniport ha allocato la memoria condivisa per una coda non definita, libera la memoria condivisa nel contesto dell'OID OID_RECEIVE_FILTER_FREE_QUEUE mentre libera la coda. I driver Miniport liberano memoria condivisa allocata per la coda predefinita nel contesto della funzione MiniportHaltEx .