Здравствуйте, уважаемые участники Форума! На вас - последняя надежда=) Предыстрория. По SST перехватывается NtCreateFile/NtOpenFile, в обработчике идет проверка имени (только имени, путь не имеет значения) файла, далее, если файл тот, который нужен, необходимо заблокировать доступ к нему, но - только если он находится на сьемном диске. Тип диска узнаю примерно по тому же алгоритму, что реализован в GetDriveType - открываю директорию, в которой лежит файл, и вызываю NtQueryVolumeInformationFile. Суть проблемы банальна - NtQueryVolumeInformationFile возвращает STATUS_ACCESS_VIOLATION... Код (Text): HANDLE Directory; InitializeObjectAttributes( &DirectoryAttributes, &DirectoryName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); Status = IoCreateFile( &Directory, GENERIC_READ, &DirectoryAttributes, &IoStatusBlock, 0, 0, FILE_SHARE_READ, FILE_OPEN, FILE_DIRECTORY_FILE, NULL, 0, CreateFileTypeNone, NULL, IO_FORCE_ACCESS_CHECK); if (NT_SUCCESS(Status)) { // сюда мы доходим, но вот Status дальше получаем равным STATUS_ACCESS_VIOLATION Status = NtQueryVolumeInformationFile( RootDirectoryHandle, &IoStatusBlock, &FileFsDevice, sizeof(FILE_FS_DEVICE_INFORMATION), FileFsDeviceInformation); if (NT_SUCCESS(Status)) { ... } else // это, своего рода, "грубая отладка":), т.к. нет возможности воспользоваться // отладчиком ExRaiseStatus(Status); } Может, кто-нибудь подскажет, что не так? Или, может быть, есть другой способ определения типа диска в ring0? P.S. Заранее благодарю и прошу прощения за возможную глупость ошибки или вопроса
Поищи по форуму. В похожей теме я и писал, что нужно чтобы IoStatusBlock и FileFsDevice лежали в usermode. Хотя там вроде для дургой функции это надо было, но думаю, что и для NtQueryVolumeInformationFile должно выполнятся такое условие.
n0name Проблема решена: была она, оказывается, в том, что указан неверный запрашиваемый доступ в IoCreateFile (директории нельзя открывать с FILE_READ_DATA). Правда, IoCreateFile работать так и не захотел, в отличие от ZwCreateFile... Еще бы понять, почему... По поводу user-mode IoStatusBlock и FileFsDevice - а зачем, я же из kernel-mode вызываю ее? Если мапить (через mdl и т.п.) в user-mode, то привет BSOD'у KERNEL_MODE_EXCEPTION_NOT_HANDLED(STATUS_ACCESS_VIOLATION,...,...,...) при вызове NtQueryVolumeInformationFile Код про mdl брал отсюда. Код (Text): // это работает Status = ZwCreateFile ( &Directory, FILE_GENERIC_READ, &DirectoryAttributes, &IoStatusBlock, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, NULL, 0); // А вот это нет... Status = IoCreateFile( &Directory, FILE_GENERIC_READ, &DirectoryAttributes, &IoStatusBlock, 0, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_DIRECTORY_FILE, NULL, 0, CreateFileTypeNone, NULL, IO_FORCE_ACCESS_CHECK); // если IO_NO_PARAMETER_CHECKING, то STATUS_INVALID_PARAMETER, иначе STATUS_ACCESS_VIOLATION