Здравствуйте,
существует проблема описанная в теме. Что я делаю, в кратце:
перехватваю IRP_MJ_DIRECTORY_CONTROL, IRP_MN_QUERY_DIRECTORY. Там устанавлюваю IoSetCompletionRoutine
Что-то вроде:
IoCopyCurrentIrpStackLocationToNext(Irp);
if ((irpSp->MajorFunction == IRP_MJ_DIRECTORY_CONTROL) &&
(irpSp->MinorFunction == IRP_MN_QUERY_DIRECTORY))
{
IoSetCompletionRoutine(Irp, Directory_SampleCompletionRoutine, NULL, TRUE, FALSE, FALSE);
}
return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
До этого момента все ок.
Далее, в функции Directory_SampleCompletionRoutine я проверяю статус на STATUS_SUCCESS, irpSp->Parameters.QueryDirectory.FileInformationClass == FileBothDirectoryInformation, (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer на количество файлов в нем, кстати почему у меня ВСЕГДА один файл в буфере !!!! В статьях, которы я смотрел, говорится, что это скорее исключение.
Вопрос, чтоб отменить весь буфер, в функции Directory_SampleCompletionRoutine я делаю следующее:
Irp->IoStatus.Status = STATUS_NO_MORE_FILES;
Irp->IoStatus.Information = 0;
return STATUS_NO_MORE_FILES;
Но файл попрежнему отображается в проводнике (пробовал и с STATUS_NO_SUCH_FILE). Что я делаю не так? Как информация с отмененного IRP может попасть на верх?
Может фильтровать запросы с FileInformationClass отличным от FileBothDirectoryInformation значением?
Что будет если я изменю имя файла в буфере на ".." допустим (хотя мне такой вариант очень не нравится)?
Заранее спасибо, за любые подсказки. Просто человека с C# кинули на разработку драйвера, а времени на изучения, как водится не дали