В момент вызова DriverUnload
больше нет созданных устройств.Следовательно - устарело пытаться использовать DeviceObject
и NextDevice
членов структуры DRIVER_OBJECT
.
Что удивительно, это то, что NextDevice
не установлен на NULL
, согласно вашим выводам отладки, но, тем не менее, это просто техническая заметка.
Если вы хотите выполнить очистку для каждого устройства, вам лучше сделать это в своей процедуре отправки в ответ на IRP_MJ_CLOSE
.
UPD
Автор вопроса, размещенный в комментариях о том, что перебор созданных устройств в процедуре выгрузки драйвера является обычной практикой, и предоставил справочную статью в проекте кода с соответствующим исходным кодом.
После прочтения статьи и исходного кода стало понятнее.
Обычно драйвер «создает устройство» (т.е. вызывает IoCreateDevice
) в ответ на запрос ОС, который исходит из вызовадо CreateFile
(или аналогичный).Когда дескриптор устройства закрыт - драйвер получает соответствующий запрос и «уничтожает» устройство (IoDeleteDevice
).ОС не будет выгружать драйвер, если на его устройствах имеются открытые дескрипторы, поэтому в процедуре деинициализации драйвера нет созданных устройств.
Однако драйвер в справочной статье не следует этой логике.Он создает устройство в начале, прямо в его процедуре инициализации DriverEntry
.Это не мешает ОС выгрузить драйвер, потому что нет открытых ссылок на это устройство, следовательно, драйвер действительно должен выполнить очистку устройства в его DriverUnload
.
Хорошо, теперь это имеет смысл,За исключением моего личного опыта, это не обычная практика для работы таким образом, но это, тем не менее, не запрещено.
Теперь, что касается вашей проблемы.Может быть, вы просто ошиблись в цикле?Я имею в виду:
while (pNextObj != NULL) {
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pNextObj->DeviceExtension;
// ...
pNextObj = pNextObj->NextDevice;
// then delete the device using the Extension
IoDeleteDevice( pDevExt->pDevice );
}
Вы уверены, что делаете все в том же порядке?Значит, вы сначала получаете указатель на следующий объект устройства, а затем вызываете IoDeleteDevice
?
Пожалуйста, опубликуйте весь код вашего DriverUnload
, если у вас все еще есть проблема.