Форум: "Прочее";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
ВнизКак передать данные из драйвера Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c