Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 10.08.2019, 20:11   #1
Sam Gold
Участник клуба
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Адрес: Город Святого Петра
Сообщений: 520
Репутация: 263
По умолчанию Чтение и запись в драйвер через 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, 05:12   #2
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,432
Репутация: 984
По умолчанию

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

Итак, глянул 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, 18:16   #4
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,873
Репутация: 1915
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись с файла через разделитель 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


23:32.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru