Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

Как передать данные из драйвера   Найти похожие ветки 

 
Born Loser   (2011-10-08 22:12) [0]

Здравствуйте

Подскажите как передать данные из драйвера, вот такую структуру

type
 TSomeInfo = record
   Count: ULONG;
   ProcessId: array [0 .. 250] of THandle;
   String: PWCHAR;
 end;


 
Eraser ©   (2011-10-08 22:21) [1]

> [0] Born Loser   (08.10.11 22:12)

ровно так же, как и другие данные.


 
Игорь Шевченко ©   (2011-10-08 22:37) [2]

Из сферического драйвера в вакууме никак не передать.
Обычно в DeviceIoControl указывается адрес буфера, куда драйвер записывает информацию, и размер этого буфера.


 
Германн ©   (2011-10-09 00:56) [3]

Удалено модератором


 
Born Loser   (2011-10-09 08:26) [4]

Передаю так, но в Delphi в String получаются крякозябы какие то

METHOD_BUFFERED
     
case IOCTL_GET_DATA:
{
 PSomeInfo  SomeInfo = NULL;            
 SomeInfo = (PSomeInfo)Irp->AssociatedIrp.SystemBuffer;          
 SomeInfo->Count = 666;
 for (i=0; i <= 250; i++)
 {
   SomeInfo->ProcessId[i] = 45;
 }
 SomeInfo->String = L"Some Text";
     
 Irp->IoStatus.Status = STATUS_SUCCESS;                                                                                
 Irp->IoStatus.Information = sizeof(SomeInfo) * sizeof(WCHAR);      
 IoCompleteRequest(Irp, IO_NO_INCREMENT);      
 return STATUS_SUCCESS;      
}


 
MBo ©   (2011-10-09 09:27) [5]

1. Убедиться, что формат строк одинаковый
2. Узнать, в одном ли адресном пространстве располагается тело строки


 
sniknik ©   (2011-10-09 09:48) [6]

3. убедится что "драйвер" написан на дельфе одной версии программой (? не уверен, но возможно), и/или одними настройками (выравнивание. это точно).
т.к. требуется "вот такую структуру", т.е. не другую, типа упакованной или в соответствии с правилами "драйверов" (dll), а именно такую, то нужно подстраивать окружение.


 
Игорь Шевченко ©   (2011-10-09 11:39) [7]

sniknik ©   (09.10.11 09:48) [6]

Куда тебя несет ? Не позорься


 
Игорь Шевченко ©   (2011-10-09 11:44) [8]


>  SomeInfo->String = L"Some Text";


Это выброси.

Обычно для передачи строк из/в драйвер предусматривают место в буфере, который передается в DeviceIoControl, включая длину, например, строки.

то есть, либо

type
TSomeInfo = record
  Count: ULONG;
  ProcessId: array [0 .. 250] of THandle;
  StringLength: Integer;
  StringData: array[0..0] of WideChar;
end;


либо

type
TSomeInfo = record
  Count: ULONG;
  ProcessId: array [0 .. 250] of THandle;
  StringData: array[0..0] of WideChar;
end;


с завершением строки 0.

Драйверу передается максимально возможный размер строки в буфере, а он уже устанавливает нужную длину, либо передается нулевой размер, а драйвер возвращает потребный размер.
Как-то так.


 
Бездомный   (2011-10-10 12:29) [9]


> SomeInfo->String = L"Some Text";

тут передастся указатель на строку, а не строка.



Страницы: 1 вся ветка

Текущий архив: 2012.01.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
15-1318105802
Юрий
2011-10-09 00:30
2012.01.29
С днем рождения ! 9 октября 2011 воскресенье


15-1318144980
clocker
2011-10-09 11:23
2012.01.29
Определить измененое поле


15-1318019402
Юрий
2011-10-08 00:30
2012.01.29
С днем рождения ! 8 октября 2011 суббота


2-1318595246
Handle
2011-10-14 16:27
2012.01.29
список процедур


2-1318575654
Laguna
2011-10-14 11:00
2012.01.29
Добавление в БД и извлечение картинки JPG