Здорово всем! Можете поподробнее мне разъяснить, почему вызов функции IoAttachDeviceToDeviceStack( pfdo, pdo); не всегда возвращает значение pdo? Что именно возвращает эта функция? P.S. Ну почему DDK и The Windows 2000 Device Driver Book на английском написаны?...
Эта функция аттачит девайс к самому верхнему девайсу в стеке где находится pdo. Архитектурно так задумано, что подключиться можно только на верхушку стека. Внутренне она вызывает IoGetAttachedDevice, которая делает вот это и аттач идет к этому девайсу. Код (Text): while (DeviceObject->AttachedDevice) { DeviceObject = DeviceObject->AttachedDevice; } Кое-что есть тут http://www.wasm.ru/article.php?article=drvw2k15 В следующей части подробнее именно с этой функцией разберемся.
Да, я смотрел вашу статью, правда довольно бегло. И мне еще надо до конца разобраться со стеком устройств... Но все же по поводу возвращаемого значения. В 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 из предыдущего вызова функции. Я правильно понял?
Если быть точным, то в стеке не может быть более одного fdo. Поэтому правильнее будет говорить о вызове AddDevice для ещё одного устройства-фильтра. В остальном всё правильно. В DDK тоже всё верно. Не имеет принципиального значения будет ли передан в IoAttachDeviceToDeviceStack в качестве второго параметра указатель на pdo или нет. Это может быть указатель на любой девайс в стеке. IoAttachDeviceToDeviceStack всё равно поднимется до самого верха и приаттачит девайс, указатель на который передан в первом параметре к стеку на самую верхушку и вернет указатель на тот девайс, к которому произошёл аттач, т.е. на тот, который только что был на вершине. А приаттаченный девайс станет вершиной. Любые последующие вызовы IoAttachDeviceToDeviceStack делают то же самое: всегда аттачат девайс на вершину и возвращают указатель на девайс к которому они приаттачили только что новый девайс.
Four-F, OK, спасибо, скоро я вернусь с новыми вопросами. Желаю вам поскорее справиться с написанием новой статьи. Будет очень интересно почитать про драйвер-фильтр для клавиатуры.