Поделиться через


Пример кода User-Mode для методов и событий

В коде в этом разделе показано, как использовать методы и события из подключаемого модуля KsProxy в пользовательском режиме.

Сведения о поддержке свойств, методов и событий в мини-driver в режиме ядра см. в статье Определение таблиц автоматизации.

После предоставления мини-драйвера, поддерживающего данный метод, можно вызвать этот метод, вызвав IKsControl::KsMethod из подключаемого модуля пользовательского режима, как показано в следующем примере кода.

PVOID MethodBuffer; // Your method arguments buffer
ULONG MethodBufferSize; // Your method buffer size

KSMETHOD Method;
ULONG BytesReturned;

Method.Set = KSMETHODSETID_MyMethodSet;
Method.Id = KSMETHOD_MyMethodId;
Method.Flags = KSMETHOD_TYPE_SEND;

HRESULT hr = 
pIKsControl -> KsMethod (
    &Method,
        sizeof (Method),
    MethodBuffer,
    &MethodBufferSize,
    &BytesReturned);

В таблицах автоматизации, предоставляемых в режиме ядра, можно использовать элемент FlagsKSMETHOD_ITEM , чтобы указать, является ли буфер чтением и записью, а также следует ли его сопоставлять или копировать.

Чтобы зарегистрироваться для получения события, поддерживаемого в мини-накопителе, используйте следующий пример кода в пользовательском режиме.

HANDLE EventHandle; // Your event handle.

KSEVENT Event;
KSEVENTDATA EventData;

Event.Set = KSEVENTSETID_MyEventSet;
Event.Id = KSEVENT_MyEventId;
Event.Flags = KSEVENT_TYPE_ENABLE;

EventData.NotificationType = KSEVENTF_EVENT_HANDLE;
EventData.EventHandle.Event = EventHandle;
EventData.EventHandle.Reserved [0] = 0;
EventData.EventHandle.Reserved [1] = 0;

ULONG BytesReturned;

HRESULT hr =
pIKsControl -> KsEvent (
    &Event,
        sizeof (Event),
    &EventData,
        sizeof (EventData),
    &BytesReturned);

В приведенном выше примере уведомление продолжается до тех пор, пока мини-driver не отключит событие. Отключение события. вызовите IKsControl::KsEvent. Если вы хотите получать уведомления только при первом возникновении этого события, задайте KSEVENT_TYPE_ONESHOT в Event.Flags.

Если вы поддерживаете события с единицами расширения класса ВИДЕО USB, см. раздел Поддержка событий автоматического обновления с помощью модулей расширения.