Всем здравствуйте! Начал разбираться с написанием драйверов и вот вопросик появился. Поможите. Написал вот такую простенькую функцию-обработчик. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION io_stack; int n = 1; io_stack = IoGetCurrentIrpStackLocation(Irp); switch (io_stack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_MY_FYRST_ZAP: for(;n == 1; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest( Irp, (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT) ); break; case IOCTL_MY_SECOND_ZAP: n = 2; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest( Irp, (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT) ); break; default: break; } return STATUS_SUCCESS; } Произвожу обращение к устройству сначала вызовом IOCTL_MY_FYRST_ZAP. Он входит в бесконечный цикл проверки n. После чего вызываю IOCTL_MY_SECOND_ZAP. Ожидал, что закончится выполнение обоих запросов. Но вот нет! Первый так и продолжает думать что n = 1. Получается, что при вызове данных функций происходит сохранение всех переменных в каком-то контексте, а после возвращения, вновь извлечение. Тогда вопрос: зачем нужны спин-блокировки, если и так не получается затереть переменную? Или я чего-то не улавливаю? Заранее спасибо.
ну а при глобальной надо использовать volatile, и на dual core будет глючить. Используй системный spinlock.
ov4inka, локальная - просто маразм. У каждого потока свой стек, на котором и выделена переменная. Глобальная + volatile будет работать т.к. ты хочешь, но для нормальной синхронизации (более сложные случаи) надо использовать spinlock.
При чем тут вообще спинлоки? PS. так же можно сделать ее static внутри функции. Хотя, по сути, та же фигня, что глобальная. UPD: Понял, при чем тут спинлоки.))
кстати о птычках - если процесс вызвал ДевицеИоКонтрол которое внутри зависло - то процесс этот не убить вообще ничем, кроме ребута Видел такое на виртуал-боксе недавно ;')
"Девице" это мощно Тов-щ програмер, а транскрипцию в словарике посмотреть слабо? Ну или сразу произношение на http://www.merriam-webster.com
s0larian я учился в англ.спецшколе, жыл немного в юса и инглиш соответственно флюент это я балуюс :_)