Создание объектов аудиодрайвов
В пользовательском режиме COM-объекты создаются с помощью функции CoCreateInstance (описанной в документации по Microsoft Windows SDK), где клиент не знает, как выделяется память, необходимая для объекта. Однако в режиме ядра, где выделение памяти, как правило, жестко контролируется, требуется другой метод создания объекта.
Модель аудиодрайдера использует концепцию COM-интерфейса, определенную интерфейсом IUnknown . Однако звуковые драйверы не требуются для доступа к реестру или использования таких механизмов, как внутрипроцессные серверы. Драйверы минипорта не требуются для поддержки агрегирования.
По соглашению функция, используемая для создания определенного класса объектов, всегда имеет одну и ту же форму:
NTSTATUS CreateMyObject(
OUT PUNKNOWN *Unknown,
IN REFGUID ClassId,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType
);
Параметры
Неизвестный
Указатель на указатель на интерфейс IUnknown . Функция выводит ссылку на вновь созданный объект через Неизвестно.
Classid
Указывает GUID класса, который передается по ссылке. Этот параметр используется только в том случае, если функция создает объекты нескольких классов. В противном случае ему присваивается значение NULL.
OuterUnknown
Указывает интерфейс IUnknown для агрегирования нового объекта. Этот параметр может иметь значение NULL , чтобы указать, что агрегирование не требуется.
Тип пула
Указывает тип пула памяти, из которого будет выделен объект (см . POOL_TYPE).
Первые три параметра идентичны параметрам функции COM CoCreateInstance . Пример функции создания этого типа см. в разделе Функция CreateMiniportMidiFM в примере аудиодрайвера Fmsynth в комплекте драйверов Microsoft Windows (WDK).
Другим соглашением является предоставление функции NewXxx для класса. Такие функции предоставляют простой способ создания (создания и инициализации) объекта, как показано в следующем примере:
NTSTATUS NewMyObject(
OUT PMYINTERFACE *InterfacePointer,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
// ...more parameters
);
Функция NewMyObject создает и инициализирует объект , а затем передает указатель обратно в интерфейс . Так как параметры инициализации зависят от класса, это прототип функции NewXxx . Функция NewXxx обеспечивает удобный доступ к конструктору для объекта .
Пример функции NewXxx этого типа см. в разделе PcNewDmaChannel.