Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.150.59] |
|
Сообщ.
#1
,
|
|
|
Для синхронизации доступа к списку используется вот такое:
VOID FooLock() { NTSTATUS Status = STATUS_SUCCESS; PAGED_CODE(); do { Status = KeWaitForSingleObject(&FooMutex, Executive, KernelMode, FALSE, NULL); } while (Status == STATUS_ALERTED); } VOID FooUnlock() { PAGED_CODE(); KeReleaseMutex(&FooMutex, FALSE); } И работало всё это уже 12 лет, но вот начались сыпаться BSODы у кастомера о том, что список испорчен. Пока есть только минидамп, в нём нельзя понять захвачен ли мьютекс. Может ли KeWaitForSingleObject() вернуть какой-то статус типа STATUS_KERNEL_APC или иной и не захватить мьютекс? |
Сообщ.
#2
,
|
|
|
Теоретически нет, судя по параметрам. Другое дело, что я бы проверил IRQL. На уровнях вне DISPATCH_LEVEL объекты синхронизации не работают.
|
Сообщ.
#3
,
|
|
|
Спасибо за ответ. Нет, IRQL <= APC_LEVEL
|
Сообщ.
#4
,
|
|
|
Если точно не IRQL, тогда остаётся только отлаживаться. Можно завести std::atomic_bool, который выставлять после захвата/освобождения и чекать его перед.
P.S. Теоретически в программе может быть баг, связанный с неверной синхронизацией. Часто встречающаяся ошибка – захват объекта только при изменении общего ресурса и неиспользование захвата при только чтении. |
Сообщ.
#5
,
|
|
|
atomic_bool не надо, в дампе памяти ядра будет видно захвачен мьютекс или нет, но дампа пока тоже нет)
Неверную синхронизацию перепроверил - там всё гут. Если бы не было гут, то за 12 лет эта проблема бы очень часто давала бы о себе знать. Вобщем упростил работу со списком, там она вроде и верная была, но странная. И захват мьютекса сделал так: VOID FooLock() { NTSTATUS Status = STATUS_SUCCESS; PAGED_CODE(); do { Status = KeWaitForSingleObject(&FooMutex, Executive, KernelMode, FALSE, NULL); } while (Status != STATUS_SUCCESS); } Так или иначе ответ на исходный вопрос получен, спасибо. |
Сообщ.
#6
,
|
|
|
В такой редакции можно попасть на дидлук. Если – из-за кривых поинтеров, например, или неверной последовательности деинициализации – мьютекс перестанет существовать.
|