Создание объектов звукового драйвера

В пользовательском режиме COM-объекты создаются с помощью функции, такой как CoCreateInstance (описанная в документации по пакету SDK для Microsoft Windows), где клиент не знает, как выделена память, необходимая для объекта. Однако в режиме ядра, где выделение памяти, как правило, жестко контролируется, требуется другой метод создания объекта.

Модель звукового драйвера использует концепцию COM-интерфейса, как определено интерфейсом IUnknown . Однако звуковые драйверы не требуются для доступа к реестру или использования таких механизмов, как серверы внутрипроцессной обработки. Драйверы минипортов не обязаны поддерживать агрегирование.

По соглашению функция, используемая для создания определенного класса объектов, всегда принимает одну и ту же форму:

NTSTATUS CreateMyObject(
   OUT PUNKNOWN  *Unknown,
   IN REFGUID ClassId,
   IN PUNKNOWN OuterUnknown OPTIONAL,
   IN POOL_TYPE PoolType
 );

Параметры

Неизвестный
Указатель на указатель на интерфейс IUnknown. Функция выводит ссылку на только что созданный объект через Unknown.

ClassId
Указывает GUID класса, который передается по ссылке. Этот параметр используется только в том случае, если функция создает объекты нескольких классов. В противном случае для него задано значение NULL.

OuterUnknown
Указывает интерфейс IUnknown для агрегирования нового объекта. Этот параметр может иметь значение NULL , чтобы указать, что агрегирование не требуется.

PoolType
Указывает тип пула памяти, из которого должен быть выделен объект (см. 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.