Вопрос по IoAttachDeviceToDeviceStack

Тема в разделе "WASM.ELECTRONICS", создана пользователем ubil, 13 дек 2004.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Здорово всем!

    Можете поподробнее мне разъяснить, почему вызов функции

    IoAttachDeviceToDeviceStack( pfdo, pdo);

    не всегда возвращает значение pdo? Что именно возвращает эта функция?



    P.S. Ну почему DDK и The Windows 2000 Device Driver Book на английском написаны?...:)
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Эта функция аттачит девайс к самому верхнему девайсу в стеке где находится pdo. Архитектурно так задумано, что подключиться можно только на верхушку стека.

    Внутренне она вызывает IoGetAttachedDevice, которая делает вот это и аттач идет к этому девайсу.


    Код (Text):
    1. while (DeviceObject->AttachedDevice) {
    2.     DeviceObject = DeviceObject->AttachedDevice;
    3. }




    Кое-что есть тут http://www.wasm.ru/article.php?article=drvw2k15

    В следующей части подробнее именно с этой функцией разберемся.
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Да, я смотрел вашу статью, правда довольно бегло. И мне еще надо до конца разобраться со стеком устройств...



    Но все же по поводу возвращаемого значения. В DDK написано:

    PDEVICE_OBJECT

    IoAttachDeviceToDeviceStack(

    IN PDEVICE_OBJECT SourceDevice,

    IN PDEVICE_OBJECT TargetDevice

    );

    *********************************************************

    Return Value

    IoAttachDeviceToDeviceStack returns a pointer to the device object to which the SourceDevice was attached. The returned device object pointer can differ from TargetDevice if TargetDevice had additional drivers layered on top of it.

    *********************************************************

    Насколько я понимаю, когда в следующий раз будет вызвана AddDevice routine из другого драйвера для нового функционального устройства, в ней будет вызвана та же IoAttachDeviceToDeviceStack( pfdo, pdo);, pfdo будет содержать указатель уже на новое функциональное устройство, которое нужно прицепить к стеку, а pdo - все тот же pdo, что и в первом вызове; И тогда уже IoAttachDeviceToDeviceStack выдаст

    SourceDevice из предыдущего вызова функции. Я правильно понял?
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если быть точным, то в стеке не может быть более одного fdo. Поэтому правильнее будет говорить о вызове AddDevice для ещё одного устройства-фильтра. В остальном всё правильно. В DDK тоже всё верно. Не имеет принципиального значения будет ли передан в IoAttachDeviceToDeviceStack в качестве второго параметра указатель на pdo или нет. Это может быть указатель на любой девайс в стеке. IoAttachDeviceToDeviceStack всё равно поднимется до самого верха и приаттачит девайс, указатель на который передан в первом параметре к стеку на самую верхушку и вернет указатель на тот девайс, к которому произошёл аттач, т.е. на тот, который только что был на вершине. А приаттаченный девайс станет вершиной. Любые последующие вызовы IoAttachDeviceToDeviceStack делают то же самое: всегда аттачат девайс на вершину и возвращают указатель на девайс к которому они приаттачили только что новый девайс.
     
  5. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Four-F, OK, спасибо, скоро я вернусь с новыми вопросами:). Желаю вам поскорее справиться с написанием новой статьи. Будет очень интересно почитать про драйвер-фильтр для клавиатуры.