Выделение ресурсов общей памяти
Чтобы выделить ресурсы общей памяти для очереди виртуальных машин, драйвер мини-порта вызывает функцию NdisAllocateSharedMemory . Например, драйвер мини-порта выделяет общую память при получении OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID. Кроме того, драйвер мини-порта может выделить общую память для очереди по умолчанию во время инициализации сетевого адаптера. Дополнительные сведения о выделении очередей см. в статье Выделение очереди виртуальной машины.
Драйвер мини-порта может выделить больше памяти для очереди, пока очередь не будет освобождена. Дополнительные сведения об освобождении очереди см. в статье Освобождение очереди виртуальных машин.
Структура NDIS_SHARED_MEMORY_PARAMETERS указывает параметры общей памяти для запроса на выделение общей памяти. Драйверы miniport передают эту структуру в функцию NdisAllocateSharedMemory . NDIS передает эту структуру в функцию NetAllocateSharedMemory (то есть точку входа ALLOCATE_SHARED_MEMORY_HANDLER).
Когда драйвер мини-порта выделяет общую память, он указывает следующее:
Идентификатор очереди.
Общая длина памяти.
Как используется общая память. Например, драйвер мини-порта указывает NdisSharedMemoryUsageReceive , если общая память будет использоваться для буферов получения.
Если флаг NDIS_SHARED_MEM_PARAMETERS_CONTIGOUS не задан в элементе Flags , общая память может быть указана в списке точечного сбора, который содержится в несмежной памяти.
Перечисление NDIS_SHARED_MEMORY_USAGE указывает, как используется общая память. Перечисление NDIS_SHARED_MEMORY_USAGE используется в структурах NDIS_SHARED_MEMORY_PARAMETERS и NDIS_SCATTER_GATHER_LIST_PARAMETERS . Сведения о параметрах общей памяти в буферах получения данных VMQ см. в разделе Общая память в буферах приема.
Функция NdisAllocateSharedMemory предоставляет вызывающей объекту следующие возможности:
Виртуальный адрес выделенной памяти.
Точечный собирающийся список.
Дескриптор общей памяти — для индикации получения.
Дескриптор выделения — используется для идентификации памяти позже.
Драйверы минипорта вызывают функцию NdisFreeSharedMemory , чтобы освободить общую память для очереди. Если драйвер мини-порта выделил общую память для очереди без определенной очереди, он освобождает общую память в контексте OID_RECEIVE_FILTER_FREE_QUEUE OID, пока освобождает очередь. Драйверы мини-портов освобождают общую память, выделенную для очереди по умолчанию в контексте функции MiniportHaltEx .