Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Железо. Написание драйверов
Перезагрузить страницу Проблема с передачей буфера данных в драйвер
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_Cybernetic imported_Cybernetic вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.06.2005
По умолчанию Проблема с передачей буфера данных в драйвер - 01.06.2005, 13:01

Всем здравствуйте. Вопрос такой: имеется простейший драйвер-фильтр, работающий под nt из
книги Павла Агурова "Интерфейс USB".
Ниже привожу его текст:
Код:
#include <ntddk.h>
#include "testdrv.h"

// Имя нашего драйвера устройства 
#define DEVICE_NAME_STRING L"testdriver"


// Заголовки функций-обработчиков
VOID OnUnloadHandle(IN PDRIVER_OBJECT);
NTSTATUS IrpHandler(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS OnDeviceControlHandle(IN PDEVICE_OBJECT, IN PIRP);

NTSTATUS OnAddDeviceHandle(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject);

/* ============================================================
Точка входа в драйвер. Выполняется при загрузке.
============================================================ */
void TestDriver(void)
{
 DbgPrint("TestDriver");
}

/* ============================================================
Процедура входа драйвера. Эта процедура вызывается только раз 
после загрузки драйвера в память. 
============================================================ */
NTSTATUS DriverEntry(
 IN PDRIVER_OBJECT DriverObject,
 IN PUNICODE_STRING RegistryPath
)
{
 PDEVICE_OBJECT deviceObject;
 NTSTATUS status;
 int i;

 WCHAR NameBuffer[] = L"Device" DEVICE_NAME_STRING;
 WCHAR DOSNameBuffer[] = L"DosDevices" DEVICE_NAME_STRING;
 UNICODE_STRING uniNameString, uniDOSString;

 DbgPrint("DriverEntry");

 // Создание буферов для имен
 RtlInitUnicodeString(&uniNameString, NameBuffer);
 RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);

 // Инифиализация объекта драйвера
 status = IoCreateDevice(DriverObject, 0, &uniNameString,
   FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject);
 if(!NT_SUCCESS(status))
  return status;

 // Создание символьного имени драйвера
 status = IoCreateSymbolicLink (&uniDOSString, &uniNameString);
 if (!NT_SUCCESS(status))
  return status;

 // Инициализируем точки входа драйвера в объекте 
 // драйвера. 
 for (i=0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  DriverObject->MajorFunction[i]= IrpHandler;
 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = OnDeviceControlHandle;
 DriverObject->DriverUnload = OnUnloadHandle;
 DriverObject->DriverExtension->AddDevice = OnAddDeviceHandle;

 return(STATUS_SUCCESS);
}

/* ============================================================
Вызывается при вызове CreateProcess() из пользовательского
режима работы. Адрес этой процедуры был зарегистрирован в 
процедуре DriverEntry, как обработчик рабочей процедуры 
IRP_MJ_CREATE.
============================================================ */
NTSTATUS OnAddDeviceHandle(
 IN PDRIVER_OBJECT DriverObject,
 IN PDEVICE_OBJECT PhysicalDeviceObject 
)
{
 DbgPrint("OnAddDeviceHandle");
 return(STATUS_SUCCESS);
}

/* ============================================================
Вызывается при обработке любой рабочей процедуры, кроме
процедуры IRP_MJ_DEVICE_CONTROL, обрабатываемой отдельно
============================================================ */
NTSTATUS IrpHandler(
 IN PDEVICE_OBJECT DeviceObject,
 IN PIRP Irp
)
{
 DbgPrint("IrpHandle");

 // Завершение обработки
 Irp->IoStatus.Information = 0;
 Irp->IoStatus.Status = STATUS_SUCCESS;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}

/* ============================================================
Вызывается при выгрузке драйвера. Адрес этой процедуры
был зарегистрирован в процедуре DriverEntry, как обработчик
события DriverUnload.
============================================================ */
VOID OnUnloadHandle(IN PDRIVER_OBJECT DriverObject)
{
 // Символьное имя драйвера
 WCHAR DOSNameBuffer[] = L"DosDevices" DEVICE_NAME_STRING;
 UNICODE_STRING uniDOSString;

 DbgPrint("OnUnloadHandle");

 // Инициализация буфера для символьного имени
 RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);
 // Удаление символьного имени
 IoDeleteSymbolicLink (&uniDOSString);
 // Удаление объекта драйвера
 IoDeleteDevice(DriverObject->DeviceObject);
}


/* ============================================================
Вызывается при вызове DeviceIoControl из пользовательского
режима работы. Адрес этой процедуры был зарегистрирован в 
процедуре DriverEntry, как обработчик рабочей процедуры 
IRP_MJ_DEVICE_CONTROL.
============================================================ */
NTSTATUS OnDeviceControlHandle(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP pIrp
    )

{
 NTSTATUS            ntStatus = STATUS_SUCCESS;   
 PIO_STACK_LOCATION  irpSp;

 // Длина входного буфера      
 ULONG  inBufLength;   
 // Длина выходного буфера     
 ULONG  outBufLength;  
 // Указатель на входной и выходной буфер 
 PULONG ioBuffer;      

 DbgPrint("OnDeviceControlHandle");

 // Указатель на драйверный стек
 irpSp= IoGetCurrentIrpStackLocation(pIrp);

 // Входной и выходной буфкра и их длины
 inBufLength  = irpSp->Parameters.DeviceIoControl.InputBufferLength;
 outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength;
 ioBuffer     = (PULONG) pIrp->AssociatedIrp.SystemBuffer;

 switch ( irpSp->Parameters.DeviceIoControl.IoControlCode )
 {
  // обработка кода функции IOCTL_IOPM_FUNCTION1
  case IOCTL_IOPM_FUNCTION1:
  {
   if (inBufLength > 0) {
    DbgPrint(">IOCTL_IOPM_FUNCTION1");
    ioBuffer[0]++;
   }
   break;
  }
  // обработка кода функции IOCTL_IOPM_FUNCTION2
  case IOCTL_IOPM_FUNCTION2:
  {
   if (inBufLength > 0) {
    DbgPrint(">IOCTL_IOPM_FUNCTION2");
    ioBuffer[0]--;
   }
   break;
  }
 }

 // Завершение рабочей процедуры
 pIrp->IoStatus.Information = inBufLength; /* Размер выходного буфера */
 pIrp->IoStatus.Status = ntStatus;
 IoCompleteRequest( pIrp, IO_NO_INCREMENT );
 return ntStatus;
}
В качестве обработчика irp всех запросов исползуется 1-а и та же ф-я IrpHandler.
Драйвер "отфильтровывает" вызовы только 2-х функций: IOCTL_IOPM_FUNCTION1 и IOCTL_IOPM_FUNCTION2
DeviceioControl. Метод передачи данных буферизованный.
При вызове функции IOCTL_IOPM_FUNCTION1 драйвер увеличивает значение переданного элемента буфера на 1.
При вызове IOCTL_IOPM_FUNCTION2 - уменьшает на 1.
А теперь вопрос: В этом примере при передаче используется буфер размером в 1-н элемент. А мне нужно передать массив данных в котором бы было более 1-го элемента.
Вроде бы, ну что мне мешает. Взял и передал. И обращаюсь уже не к IoBuffer[0], а к примеру к IoBuffer[7]. Но в том то всё и загвоздка - он(драйвер) почему-то не хочет видеть все, отличные от 0-го элементы массива... Обращаешься к IoBuffer[не ноль],
а там записана какая-то произвольная чушь из памяти...
Пользовательское приложение для работы с этим драйвером у меня написано на delphi (вернее у Павла Агурова написано ). Но в форум
программирования на делфях обращаться не стал, так как думаю, что причина всё же в драйвере. В программе на delphi всё предельно ясно: вызвали DeviceIoControl и передали
ей входной буфер, какие там могут быть ошибки...
Ответить с цитированием
  (#2 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию Re: Проблема с передачей буфера данных в драйвер - 12.07.2005, 11:18

Цитата:
Originally posted by Cybernetic
[b]Всем здравствуйте. Вопрос такой: имеется простейший драйвер-фильтр
Непонятно, почему этот драйвер назван "фильтром", ну да ладно

Цитата:
Originally posted by Cybernetic
[b]В программе на delphi всё предельно ясно: вызвали DeviceIoControl и передали ей входной буфер, какие там могут быть ошибки...
А можно помотреь именно этот вызов? Чудес не бывает, значит ошибка именно в вызове.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с передачей строки посредством netbios (C/C++) ManUt Вопросы начинающих программистов 3 12.12.2011 11:39
Не удалось загрузить драйвер этого устройства. возможно драйвер поврежден или отсутс inze Драйвера 2 30.01.2011 23:48
Необходимо написать веб движок-совмещенный с передачей данных в word BACKSEET Задания за деньги 0 03.11.2010 16:07
Драйвер Realtek HDA-Проблема rwa12 Звук и акустические системы 1 06.09.2009 22:07
Реализация Z-буфера Daredevil Задания за деньги 3 08.06.2007 20:01
PCI драйвер проблема с DeviceIoControl mery WinAPI 0 26.01.2007 18:25
Взятие данных из буфера обмена yarmolchuk Visual C++ 1 13.12.2006 10:11
Написание программы с передачей пакетов через UDP Kylie WinAPI 2 11.12.2006 23:45
Программа-фильтр на языке shell с передачей параметров в виде ключей skuzma Вопросы начинающих программистов 1 21.05.2006 06:26
Печать содержимого буфера Митька_Димка Delphi 1 04.11.2005 14:29
Проблема с передачей данных babagun PHP 2 12.10.2005 18:58
Срасвнение данных буфера обмена Арам WinAPI 4 28.12.2003 19:08



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов