Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2019, 19:11   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию Чтение и запись в драйвер через std::fstream

Приветствую!
В драйвере имеются обработчики IRP
Код:
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DriverCleanup;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverClose;
DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverCreate;
DriverObject->MajorFunction[IRP_MJ_READ] = DriverRead;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DriverWrite;
Соответственно, с использованием WinAPI открываю драйвер, пишу и читаю туда. Все ок.
Код:
HANDLE driver = CreateFile(TEXT("\\\\.\\DriverTmp"), GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
...
ReadFile(driver, buffer, 16, &nBytes, NULL);
...
WriteFile(driver, buffer, 16, &nBytes, NULL);
...
CloseHandle(driver);
Соответственно, CreateFile вызывает DriverCreate, CloseHandle - DriverCleanup и DriverClose. ReadFile - DriverRead, WriteFile - DriverWrite.

Однако, если использовать плюсовый класс std::fstream, то начинается непонятное.
Код:
std::fstream driver("\\\\.\\DriverTmp", std::fstream::in | std::fstream::out);

if (!driver.is_open()) {...}
...
driver.write(buff, 16);
driver.read(buff, 16);

driver.close();
Конструктору соответствует вызов DriverCreate, методу close() - DriverCleanup и DriverClose. Но is_open возвращает false и выставляется флаг failbit. Поэтому запись в драйвер и чтение невозможны.

Почему фейлится открытие драйвера через std::fstream и как этого избежать (использовать WinAPI не предлагать)
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 11.08.2019, 04:12   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Так посмотрите исходники std::fstream
Black Fregat вне форума Ответить с цитированием
Старый 11.08.2019, 15:34   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Итак, глянул API-шпионом, какие функции вызываются и что возвращают.

Конструктор std::fstream а также метод open вызывают CreateFile, а затем GetFileType. Для своего драйвера, который не является драйвером устройства с предопределенным типом согласно рекомендации Microsoft выбрал FILE_DEVICE_TYPE в диапазоне от 32768 до 65535.
Код:
status = IoCreateDevice(DriverObject,
		0,
		&DeviceName,
		FILE_DEVICE_TYPE,
		FILE_DEVICE_SECURE_OPEN,
		FALSE,
		&DeviceObject
	);
Так вот, если FILE_DEVICE_TYPE из рекомендуемого диапазона или FILE_DEVICE_UNKNOWN, то GetFileType возвращает FILE_TYPE_UNKNOWN и операции ввода/вывода не проходят.

Если же заменить FILE_DEVICE_TYPE на что-нибудь из списка ТынцЪ, например на FILE_DEVICE_NULL, то все работает.

Вывод: плюсовые классы не дружественны для общения с драйверами.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 11.08.2019, 17:16   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
плюсовые классы не дружественны для общения с драйверами
Мы знаем, но нам же запретили предлагать WINAPI...
waleri вне форума Ответить с цитированием
Старый 11.08.2019, 17:20   #5
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Мы знаем, но нам же запретили предлагать WINAPI...

Тут идея была, чтобы коллеги плюсовики-кроссплатформщики могли использовать свой любимый std::fstream. А так придется им пилить на WinAPI, который они почему-то недолюбливают.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись с файла через разделитель Leks123 PHP 9 11.08.2013 16:35
Чтение/запись файла. fstream. asmars Общие вопросы C/C++ 14 30.03.2012 19:49
Чтение и запись fstream Armatus Общие вопросы C/C++ 15 07.10.2011 13:56
Чтение и запись данных в InterBase через Delphi Harikolo БД в Delphi 7 29.09.2010 22:46
fstream, чтение и запись .txt willfogg Помощь студентам 0 26.04.2009 18:26