Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
1

Передача данных из драйвера в c# приложение

15.09.2013, 14:13. Показов 2725. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, подскажите пожалуйста где я могу ошибаться в этом вопросе.

Тестовый кусок кода драйвера имеет вид:
C++
1
2
3
4
5
6
7
8
9
10
...
unsigned char TestStr[10] = "TestString";
...
Irp->AssociatedIrp.SystemBuffer = (char *)ExAllocatePool(NonPagedPool, 10);
RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer, TestStr, 10);
Irp->IoStatus.Information = 10;
Irp->IoStatus.Status = STATUS_SUCCESS;
 
IoCompleteRequest(Irp, IO_NO_INCREMENT);
...
C# приложение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
IntPtr userBuffer = Marshal.AllocHGlobal(sizeof(char));
 
result = DeviceIoControl(drvHandle,
                                 controlCode,
                                 IntPtr.Zero,
                                 0,
                                 userBuffer,
                                 sizeof(char),
                                 ref returnedBytes,
                                 IntPtr.Zero);
 
string outBuffer = Marshal.PtrToStringAnsi(userBuffer);
...
В результате, в переменной outBuffer нужной строки я к сожалению не вижу...

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2013, 14:13
Ответы с готовыми решениями:

При открытии базы данных FoxPro в приложение Delphi возникает ошибка драйвера внешней базы данных (8961)
При открытии базы данных FoxPro в приложение Delphi возникает ошибка драйвера внешней базы данных...

Разработать приложение на Java, взаимодействующие с базой данных при помощи JDBC-драйвера
Создать три таблицы в MS Access, связанные между собой двумя связями: один – к - одному, один – ко...

Передача данных из JS в десктопное приложение на C#
Здравствуйте, подскажите пожалуйста: каким образом можно установить связь между скриптом на JS и...

Передача данных из плагина в приложение
Здравствуйте Уважаемые! Есть программа и плагин к ней. Взаимодействие через Reflection. Плагины...

6
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.09.2013, 14:37 2
В DeviceIoControl размер выходного буфера установлен равным "sizeof (char)", т.е. 1 байт.
И еще желательно показать, как определен controlCode.
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
15.09.2013, 14:44  [ТС] 3
1. Исправил на 10, но результат остался прежним.
2. ControlCode определен как uint число и имеет значение 1001.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.09.2013, 15:14 4
Цитата Сообщение от shtuceron Посмотреть сообщение
ControlCode определен как uint число и имеет значение 1001.
Значения управляющих кодов (I/O Control Code, IOCTL) должны подчиняться
определенным правилам. В Windows SDK для упрощения этого процесса есть
специальный макрос CTL_CODE. Например:
C
1
#define MY_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_WRITE_ACCESS)
Здесь определяется тип устройства (unknown), числовое значение (0x800),
способ передачи данных в драйвер (буферизированный ввод-вывод) и
необходимые для данного кода права доступа (write access).

Разные определения IOCTL требуют разной стратегии обработки I/O-запросов в драйвере.
1
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
15.09.2013, 17:38  [ТС] 5
Спасибо!

Скажите, правильно ли я понимаю, в c# нет макросов, следовательно нужно определить их в c++ и, вычисленные, подставить в c#?

Еще остался один вопрос, обязательно ли указывать длину возвращаемого буфера, что если я не знаю количество возвращаемых значений? Память она же не разбивается, параметр returnedBytes вернет эту длину...
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.09.2013, 10:36 6
Цитата Сообщение от shtuceron Посмотреть сообщение
Скажите, правильно ли я понимаю, в c# нет макросов, следовательно нужно определить их в c++ и, вычисленные, подставить в c#?
Да, можно и так.

Цитата Сообщение от shtuceron Посмотреть сообщение
обязательно ли указывать длину возвращаемого буфера, что если я не знаю количество возвращаемых значений?
Драйвер должен знать, сколько максимум данных ему позволяется вернуть приложению.
Хотя никто не запрещает сделать это не за один подход, а за два или больше.
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
17.09.2013, 11:47  [ТС] 7
Спасибо, буду дергать драйвер дважды...
0
17.09.2013, 11:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2013, 11:47
Помогаю со студенческими работами здесь

Передача данных из FastReport .Net в приложение
Такая ситуация, в отчете есть итог который считаестя для нескольких групп данных...

Передача данных в консольное приложение. TPJPipe и TByteStream
Общая постановка задачи - передать в стороннее консольное приложение некоторые данные через stdin....

Передача данных из 1С в приложение Java (android studio)
Здравствуйте, подскажите как передать данные объекта справочник из 1с в приложение java созданное в...

Клиент-серверное приложение. Передача строки без потери данных
Помогите реализовать передачу данных между клиентом и сервером. Сейчас использую данный код. Но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru