Добрый день По какой схеме IO Manager создает список DriverObjects, которые создаются IoCreateDevice? Правильно ли я понимаю, что вызовы Код (Text): IoCreateDevice(...pDevice1...); IoCreateDevice(...pDevice2...); IoCreateDevice(...pDevice3...); в DriverUnload нужно освобождать как Код (Text): for(PDRIVER_OBJECT pDO=pDriverObject->DeviceObject; pDO!=NULL; pDO=pDO->NextDevice) { IoDeleteDevice(pDO) } ? Если так, то, удалив объект pDO IOManager не очищает структуру (а помечает ее, как удаленную, затем уничтожает ее, когда заканчивается DriverUnload), ведь я обращаюсь к полям несуществующей структуры? И собственно вопрос - когда прохожу по списку, в каком порядке следуют объекты устройств? В прямом (pDriver -> pDevice1 -> pDevice2 -> pDevice3), обратном или произвольном? Не нашел в документации ничего на эту тему. С отладчиком ядра не знаком на ты, к сожалению.. Спасибо
Нет, см. ниже. Девайсы уничтожаются тогда и только тогда, когда на них не остаётся больше ссылок и когда они помечены на удаление. Девайс, для которого была вызвана IoDeleteDevice(), будет удалён не после выхода из DriverUnload(), а когда ссылки кончатся. При этом есть вероятность, что объект девайса может быть уничтожен сразу же после выхода из IoDeleteDevice(), поэтому приведённый код некорректен (необходимо сохранять следующий девайс в локальной переменной). С объектом драйвера аналогично, - пока есть ссылки, он будет жив, но при этом он будет полудохлый такой, ибо уже помечен на удаление. В обратном порядке. Новый девайс вставляется в начало списка. Закладываться на это поведение не стоит однозначно, теоретически могут изменить в более новых версиях системы ибо нигде не регламентировано.