File system filter - cancel safe queues
От: Igor Kolesnik  
Дата: 25.09.06 14:13
Оценка:
Здравствуйте.

Пишу фильтр файловой системы, использую cancel safe queues.
Идея в том, чтобы все irp_mj_create запросы ставить в очередь с целью их
последующей обработки и не блокировать функцию-диспатчер.
Все остальные запросы передаются вниз по стеку сразу же, без задержки.

При постановке запроса в очередь я делаю следующее:

IoCsqInsertIrp(&Pdx->CancelSafeQueue,
Irp,
NULL);

KeReleaseSemaphore(&Pdx->IrpQueueSemaphore,
0,
1,
FALSE);

return STATUS_PENDING;

Далее в отдельном потоке ядра делаю:

KeWaitForSingleObject(&Pdx->IrpQueueSemaphore,
Executive,
KernelMode,
FALSE,
NULL);

Irp = IoCsqRemoveNextIrp(&Pdx->CancelSafeQueue, NULL);
if (!Irp)
{
continue;
}

IoSkipCurrentIrpStackLocation(Irp);

IoCallDriver(Pdx->AttachedToDeviceObject, Irp);

Проблемма в том, что при работе, как только како-либо процесс пытается открыть файл
(мой фильтр получает запрос create), он блокируется. То есть процесс вроде как не получает
результата обработки запроса и впадает в бесконечное ожидание.


Я только начал заниматься разработкой драйверов, может не достаточно ясно изложил ситуацию.
Надеюсь на вашу помощь, совет, наводящие вопросы и пр.

Спасибо за внимание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.