0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 10
|
||||||||||||||||
1 | ||||||||||||||||
Некорректное использование мьютекса02.05.2015, 18:18. Показов 847. Ответов 1
Метки нет (Все метки)
Здравствуйте.
Пишу небольшой драйвер-фильтр, одной из задач которого является запись в файл определенной информации. Проблема в том, что запросы на запись могут приходить довольно часто, а интервал между запросами довольно маленький, поэтому функция записи в файл не успевает отрабатываться. Для этого решил использовать мьютекс, который объявлен как глобальная переменная, инициализированная в DriverEntry(насколько я понимаю, так она будет видна всем). При поступлении запроса вызывается функция
1) При работе с функцией WorkWithFile использовал глобальный мьютекс при помощи ф-и KeWaitForMutexObject, освобождал мьютекс при помощи функции KeReleaseMutex. Появлялся BSOD, ругался на некорректный мьютекс. 2) Ф-ю KeWaitForMutexObject использовал в функции DriverFilter, ф-ю KeReleaseMutex использовал в CompleteRequest. Функция KeWaitForMutexObject отрабатывалась отлично, но при освобождении мьютекса появлялась та же самая ошибка. В чем я не прав?
0
|
02.05.2015, 18:18 | |
Ответы с готовыми решениями:
1
Некорректное использование переменной PHP в запросе к базе данных MySQL Освобождение объекта мьютекса Таски и захват мьютекса Guard для мьютекса |
Ушел с форума
|
|
02.05.2015, 18:52 | 2 |
Не обижайтесь, но этот код - ужас-ужас-ужас.
Здесь неправильно почти все. Из того, что сразу бросается в глаза: 1. Перед установкой completion routine нужно вызвать функцию IoCopyCurrentStackLocationToNext,сдвигая IO_STACK_LOCATION на нужную позицию. Это более четкий вариант, чем то, что творится в строках 11-14. 2. Completion Routine может вызываться на IRQL <= DISPATCH_LEVEL, поэтому ни PsCreateSystemThread, ни ZwClose там вызывать нельзя. 3. Вместо того, чтобы на каждое нажатие создавать отдельный поток (или work item), лучше сразу сделать его где-нибудь в DriverEntry и пускай крутится в ожидании. 4. В Completion Routine нужно проверять IoStatus.Status. 5. В Completion Routine структура _Context локальная, она может перестать существовать на тот момент, когда поток дойдет до ее чтения (возможно, из-за этого и BSOD). 6. PsTerminateSystemThread не нужен, достаточно просто выйти из функции потока. Как бы я сделал: 1) В DriverEntry создал бы отдельный фоновый поток и какую-нибудь очередь, защищенную спин-локом. 2) Когда срабатывает completion routine, захватываем спин-лок, добавляем скан-коды в очередь, освобождаем спин-лок, сигнализируем потоку, что есть новые данные. 3) Поток не спеша выгребает данные из очереди и скидывает их в файл.
1
|
02.05.2015, 18:52 | |
02.05.2015, 18:52 | |
Помогаю со студенческими работами здесь
2
Странное поведение мьютекса Sleep внутри мьютекса Реализовать обработку сообщений с помощью мьютекса Организовать синхронизацию процессов с поддержкой семафора и мьютекса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |