|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Фев 25, 2004 17:17:53 Помогите разобраться!!! If учесть, что верхние 2-гб проецируются на все контексты одинаково, и что в коде ядра Win наверняка используются переменные (не стековые), то при обращении к определенной процедуре ядра требуется синхронизация. Вопрос касается таблицы сервисов NT. На каком этапе происходит синхронизация потоков: до вызова сервиса или после, сомой "сервисной" ф-ей или для каждой по-разному??? И где бы по-подробнее об этом узнать!? |
|
|
Дата: Фев 26, 2004 00:35:49 [ PavPS: На каком этапе происходит синхронизация потоков: до вызова сервиса или после... ] Конечно после. Синхронизация при необходимости осуществляется самим ядерным сервисом. Подробнее можно узнать в дизассемблере, а лучше прямо в исходниках. |
|
|
Дата: Фев 26, 2004 00:38:23 Мне почему-то кажется что что-то есть у Рихтера, возможно я ошибаюсь.. |
|
|
Дата: Фев 26, 2004 01:22:06 Благодарю. Исходники это конечно же хорошо, но где бы их надыбать. Может ссылочку каую нибудь подкините? Буду очень благодарен. И еще по поводу синхронизации. Коль уж делать самому значить... Пусть у драйвера "n" потоков. Каждый должен завершить себя Ф-ей PsTerminateSystemThread@4 или уйти на ret. При выполнении DriverUnLoad стоит задача их убить. Я так понял, пока читал MSDN, что вроде так просто, как в usermode их не завершишь каким-нибудь TerminateThread@?, а if без них выгрузить драйвер, то светит "голубой друг"#PF or #GP. Суть вопроса: как завершить потоки по определенному запросу (DriverUnLoad), а потом дальше в этой routine продолжить работу (например, по дальнейшему unload-у)??? Заранее благодарен. |
|
|
Дата: Фев 26, 2004 03:26:13 Посмотрел. -У Рихтера не обнаружил... |
|
|
Дата: Фев 26, 2004 14:59:19 [ PavPS: Может ссылочку каую нибудь подкините? ] Там где я сливал всё давно уже умерло, естественно. [ PavPS: Каждый должен завершить себя Ф-ей PsTerminateSystemThread@4 или уйти на ret. ] Насчет просто ret не уверен. Лучше всё-таки по правилам. [ PavPS: Суть вопроса: как завершить потоки по определенному запросу... ] Никак. Можно толька ждать их завершения, а потом выгружать драйвер. Что-то вроде этого: .while <нужен ещё поток>
invoke PsCreateSystemThread, addr hThread,....
invoke ObReferenceObjectByHandle, hThread, THREAD_ALL_ACCESS, NULL, KernelMode, \
<адрес массива указателей>[смещение], NULL
invoke ZwClose, hThread
.endw
. . .
DriverUnload ...
local pWaitBlock:PKWAIT_BLOCK
invoke ExAllocatePool, NonPagedPool, sizeof KWAIT_BLOCK * XXX
mov pWaitBlock, eax
invoke KeWaitForMultipleObjects, XXX, <адрес массива указателей>, WaitAll, \
Executive, KernelMode, FALSE, NULL, pWaitBlock
.while <есть еще потоки>
invoke ObDereferenceObject, <адрес массива указателей>[смещение]
.endw
invoke ExFreePool, pWaitBlock
Чтобы ускорить процесс, можно в DriverUnload выставлять глобальный флаг, а в потоках все время его проверять. Можно обойтись готовыми системными потоками см. IoAllocateWorkItem, IoQueueWorkItem, IoFreeWorkItem - они сами блокируют драйвер пока работа не сделана. [ PavPS: Я так понял, пока читал MSDN,... ] Это был DDK ;-) У Рихтера очень хорошо описана синхронизация в юзере. Про ядро там ничего нет, хотя принципиальной разницы практиески никакой. О синхронизации в ядре вообще, надо смотреть книги по дровам и исходники дров... и ещё исходники сами знаете чего :-) а про синхронизацию каких-то конкретных сервисов только в этих самых исходниках и пишут ;-))) |
|
|
Дата: Фев 26, 2004 19:17:22 Оgroмное спасибо! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.082 |