Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [DPC]-[USER] синхронизация  (Прочитано 13322 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maaaaaad
Гость
« : 10-10-2003 16:38 » 

"на троечку с минусом"
спинлок через общую память KRN-USR (любыми методами) и атомарный доступ....
ну, или засыпающий спинлок (в зависимости от задачи) (держим микроскоп удобней, чтоб забивалось лучше)

вот. "почти идеал"
синхронизация через асинхронный ввод вывод.
прикольна...но не ново...и не отлично...повисшие ирп на неопределенное время (и подвешенная память)....брррр

"отлично"
глобальный KRN-USER мьютекс (к примеру)
где то видел что можно создать мьютекс, который будет виден
и всем юзер процессам и из драйвера будет виден ....
черт! немогу найти где.......
или мне это приснилось?


-------------------------------------------------------------------------
We eat rhythm....
DREAM, DEVELOP, DELIVER, short down -h now, format c:, ntinstall.exe.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 13-10-2003 09:55 » 

А как вобще понимать DPC-User синхронизацию. Это как-то злобно. Ждать на DPC глупо-поток не вытесняем и в случае однопроцессорной машины все подвиснет.
Записан
CrashMaker_
Гость
« Ответ #2 : 13-10-2003 10:46 » 

злобно=)) А кто сказал, что мы добрые?=))

нет, ждать на dpc это глупо, а оповещать user поток (типа данные изменились, гребуется перерисовка окна, графика и т.п) совсем не глупо.

нужна только синхроницация "в одну сторону". DPC поток должен оповещать USER поток. Обратного не требуется =)
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 13-10-2003 11:21 » 

Цитата

DPC поток должен оповещать USER поток


так это обыкновенное взаимодействие драйвера и юзерского приложения. Лучший способ через событие- это уже не раз тут обсуждалось, я уже устал объяснять и кидать ссылку, поищи сам.
Записан
maaaaaad
Гость
« Ответ #4 : 13-10-2003 22:43 » 

а можно последний раз кинуть, чет я никак не могу найти......искал (чесно)
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 14-10-2003 05:19 » 

Последний раз на четыре темы ниже было. Ну да ладно.

http://www.osronline.com/article.cfm?id=108
Записан
maaaaaad
Гость
« Ответ #6 : 14-10-2003 10:48 » 

огромное спасибо, вот странно неделю назад просматривал копию сайта оср ничего такого не заметил =))) савэм аслэп =))

сеньск агейн.=)
Записан
maaaaaad
Гость
« Ответ #7 : 17-10-2003 11:52 » 

Нннндааа.....статейка....
Самые классые идеи здесь названы "Страшными". А остальные не надежны...
Кстати, нужно ли делать Дерефренсе(кивэнт) при использовании метода, когда указатель на хэндл ивента петедается по цтл? Я делаю!

события сосут=)))
тока что перезагружался 2 раза из за того, что в юзер закрыл событие, а в потоке происходило его преключение...(__try __except  стояло)
вот и примерчик драйвера вешаюшего систему из любого экаунта=))))
Осталось только дать доступ к драйверу юзерам.

Вот сценарий:
Юзер поток закрывается (необработанное исключение) и закрываются почти все дескриптеры (в т.ч. и события)......система виснет при работе с закрытым событием

и кто то после этого будет громко и радостно кричать "Yeeeeeeees!!! I do it! I fuck this sucking os!!whores!! Im hacker!!!"=))))

попробую тем же макаром с мьютексами......

Кстати!!!!!
Кто тот сказал что оповещение DPC потока из юзер потока не возможно? %)))
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 17-10-2003 12:17 » 

Цитата

Кто тот сказал что оповещение DPC потока из юзер потока не возможно?


Я сказал. И тот кто будет утверждать обратное чего-то не понимает. Технически оповещение возможно на машине с числом процессоров более одного, но один процессор будет стоять в DPC процедуре. На однопроцессорной машине это невозможно ни при каких условиях.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 17-10-2003 12:20 » 

Цитата

система виснет при работе с закрытым событием


Ты сначала разберись с тем, как удаляются объекты, в статье и дискусси после статьи тебе все подробно объяснили, а потом кричи и матерись.
Объект глобален для всей системы и если увеличить его счетчик, то его не удалят, даже после закрытия всех юзер модовских хендлов.
Записан
maaaaaad
Гость
« Ответ #10 : 17-10-2003 15:58 » 

> Я сказал.

надпись маркером на стене:
       NO THREAD SWITHING OCCURS AT OR ABOVE DISPATCH_LEVEL
я с этим не спорю, однако..........
переключение может произойти на более низкий уровень, если все DPC находятся в состоянии ожидания.Или переключение на другой дпс поток, если выполняемый входит в спячку.

Если я не прав, почему тогда
0. Почему так не логично? При переключении на более низкие irql с dpc требуется ЗАВЕРШЕНИЕ всех дпс потоков.?

1. Про KeWaitForSingleObject написанно, что она может работать при IRQL<=DISPATCH_LEVEL??? Нафиг тогда нужен этот вейт фор?Не понял

2. Почему у меня ничего не зависает? (Я пробовал ожидать в отдельном потоке (потоки в драйвере вроде пашут на дпс) таймера.)


>Объект глобален для всей системы и если увеличить его счетчик, то его не >удалят, даже после закрытия всех юзер модовских хендлов.
А как его инкрементировать?
У меня он что то не инкрементируется=)))



Открытие события:

NTSTATUS OpenSyncEvent(PXWDM_DEVICE_EXT pdx) {
   UNICODE_STRING   EventName;
   NTSTATUS      Status;

#if DBG      
  DbgPrint("EventSysDeviceControl: Received IOCTL_OPEN_EVENT\n");
#endif

RtlInitUnicodeString(&EventName, L"\\BaseNamedObjects\\SharedEvent");
pdx->kSyncEvent = IoCreateNotificationEvent(
   &EventName, &pdx->hSyncEvent);//&SharedEventHandle);

if (pdx->kSyncEvent != NULL) {
   Status = STATUS_SUCCESS;
   // Start the timer that signals the event
   IoStartTimer(pdx->DeviceObject); // DeviceObject);
} else {
   Status = STATUS_UNSUCCESSFUL;
}
   return Status;
}

Причина зависания после закрытия приложением и драйвером хендла (просто так вышло я специально ничего не делал, вероятно если бы не закрыл хэндл в драйвере ничего и не произошло бы........счетчики, однако=)))...... ):

#if DBG
    DbgPrint(DRIVER_NAME "EventSysTimerCallback: Entered...\n");
#endif
__try{
  KeSetEvent(pdx->kSyncEvent,0,FALSE);
} __except(EXCEPTION_CONTINUE_EXECUTION) {
  DbgPrint(DRIVER_NAME "EventSysTimerCallback() cause exception!\n");
}

#if DBG
    DbgPrint(DRIVER_NAME "EventSysTimerCallback: Exited...\n");
#endif


Типа при CreateEvent должен автоматически инкрементироваться счетчик?
А при zwClose декрементироваться?

>>Ты сначала разберись с тем, как удаляются объекты, в статье и дискусси >>после статьи
А где дискуссия? На том же оср (блин, надо было качать не фор принт, а целиковцю статью...)? Или на этом сайте? Посмотрю. Сорри, у сетевое состояние - на 3/4 оффлайн - поэтому и глупые вопросы....лишний раз в сеть лезть ох как не хочется....


Спасибо.


---------------------------------------------------------------------------------
Вечер настал, на черном небе луна.....
---------------------------------------------------------------------------------------
Рекламное место - сдается
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 19-10-2003 14:36 » 

Цитата

переключение может произойти на более низкий уровень, если все DPC находятся в состоянии ожидания.Или переключение на другой дпс поток, если выполняемый входит в спячку.


Что за фразу ты употребляешь- DPC поток. НЕТ БЛИН ТАКИХ ПОТОКОВ!
Если поток сам поднял IRQL процессора на котором работает до DISPATCH, то он будет на этом процессоре сидеть до посинения, пока сам не изменит уровень до APC_LEVEL или PASSIVE_LEVEL.
Если поток обрабатывает DPC, в результате понижения уровня с DISPATCH или выше, до более низкого, то эти DPC всегда обрабатываются на DISPATCH и самостоятельное понижение IRQL это ошибка, то есть опять перепланировка невозможно.
Спор о возможности перепланировки на DISPATCH уровне прекращаю- либо ты сам понимаешь, что это невозможно, либо изобретай дальше.

Цитата

У меня он что то не инкрементируется=)))


ObReferenceObjectByHandle пробовал? На крайняк можно самому счетчик увеличить- структуры загодовков объектов не меняются со времен царя Гороха.

Цитата

Типа при CreateEvent должен автоматически инкрементироваться счетчик?
А при zwClose декрементироваться?


Должен. Я так думаю, уверен даже.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines