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

 WASM Phorum —› WASM.WIN32 —› Про синхронизацию

Посл.отвђт Сообщен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