· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Вопрос к господину Four-F

Посл.отвђт Сообщенiе


Дата: Июн 20, 2004 17:14:00

Уважаемый господин Four-F/ Молю вас о помощи.
Дело вот в чём. Вопрос касается создания системного ядерного потока в дравере. Всё делаю как надо, оформляю процедуру, которая станет потоком, вызываю PsCreateSystemThread. Всё превосходно, нить создаётся , работает прекрасно... Выгружаю драйвер, вызов DriverUnload. В ней я передаю флаг завершения нити, нашему подопытному потоку. Жду, пока он проглотит этот флаг и явно вижу , что он вызывает PsTerminateSystemThread и.... ушёл в систему.Между тем встаёт вопрос, как определить, что нить завершена ?? Конечно, в принципе мне достаточно того, что управление получила вышеуказанная функция, после чего я продолжаю выполнять DrverUnload до конца.. Всё превосходно, но... тут меня прибил истерический смех, гляжу в консоль отладочного вывода,и вижу, что нить моя всё ещё выполняется, в то время, как драйвер уже выгружен!!!!! Что это ???

Сэр, объясните мне пожалуста разумно, что происходит, и почему поток так долго продолжает своё существование после вызова функции собственного уничтожения (более 10 секунд) , и почему после выгрузки драйвера не были отобраны ресурсы, которые драйвер - родитель выделил нашей нити ??? (Приоритет созданному потоку я назначил равным 8, как это делает XP по умолчанию)


Дата: Июн 21, 2004 16:19:22

[ CARDINAL: Между тем встаёт вопрос, как определить, что нить завершена ?? ]

Часть 12 : Базовая техника. Синхронизация. Таймер и системный поток.
Часть 13 : Базовая техника. Синхронизация. Взаимоисключающий доступ.

Эти статьи, наверное, читал... Если делаешь также, то во-первых, проверь, не возвращает ли PsTerminateSystemThread ошибку. Если поток грохнется, то она вообще не вернется. Во-вторых, возвращает ли KeWaitForSingleObject STATUS_SUCCESS. Если да, то поток умер.

Явно проверить выполняется ли ещё поток можно с помощью PsIsThreadTerminating.

Если PsTerminateSystemThread не возвращается, а KeWaitForSingleObject возвращает STATUS_SUCCESS, то хотелось бы посмотреть на код.

Можешь ещё поставить бряк на изменение поля HasTerminated структуры потока. Когда там появится 1, поток будет мертв.


[ CARDINAL: почему после выгрузки драйвера не были отобраны ресурсы, которые драйвер - родитель выделил нашей нити ??? ]

Какие такие ресурсы? Если драйвер сам что-то выделил, то сам и должен освобождать. Десять раз об этом говорил.


Дата: Июн 21, 2004 17:09:46

Огромное спасиба !!!! :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083