Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2012, 20:38   #1
alex4321
Пользователь
 
Регистрация: 23.07.2012
Сообщений: 77
По умолчанию DeiceIOControl в Delphi - передать массив

В общем, необходимо передать в драйвер массив байт.
Тип этого массива реализовал как :
Код:
TByteArray = array of Byte;
Передача идёт через вызов такой функции
Код:
function SendCodes(codes:TByteArray);
begin
//Код кроме DeviceIOControl маловажен
// h - хендл открытого файла, IOCTL_KB_PS2_WRITE - числовая константа
tmp := DeviceIoControl(h,
                           IOCTL_KB_PS2_WRITE,nil,0,
                           @codes,Length(codes) * sizeof(Byte),
                           ret, nil);
//Тоже неважно
end.
Так - происходил BSOD. Выяснил, что @codes - это указатель на указатель, а нужен указатель на первый элемент массива (если я верно понял ассемблерный пример).

p.s. ассемблерные коды в теме http://www.programmersforum.ru/showthread.php?t=208763, r0kedrv - драйвер, пример использования - r0ke (как я понял, то, что начинается с строки 35 - это и есть объявление массивва

upd. Даже не знаю, в этот раздел или в общие вопросы delphi. Скорее, блин, туда :-(

Последний раз редактировалось alex4321; 04.08.2012 в 20:42.
alex4321 вне форума Ответить с цитированием
Старый 04.08.2012, 20:43   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
@codes[0]
пробовали?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2012, 20:51   #3
alex4321
Пользователь
 
Регистрация: 23.07.2012
Сообщений: 77
По умолчанию

2Пепел феникса,
BSOD.

Блин, понять бы полностью что происходит при выполнении такого MASM-кода :
Код:
  local abyScanCodes[7]:BYTE
  local dwBytesReturned:DWORD

  lea esi, abyScanCodes
  assume esi:ptr BYTE
  mov [esi][0*(sizeof BYTE)], 6
  mov [esi][1*(sizeof BYTE)], 01eh
  mov [esi][2*(sizeof BYTE)], 09eh
  mov [esi][3*(sizeof BYTE)], 01eh
  mov [esi][4*(sizeof BYTE)], 09eh
  mov [esi][5*(sizeof BYTE)], 01eh
  mov [esi][6*(sizeof BYTE)], 09eh
  assume esi:nothing

  ; Driver will receive IRP of type IRP_MJ_DEVICE_CONTROL
  invoke DeviceIoControl, hDevice, IOCTL_KB_PS2_WRITE, \ 
     addr abyScanCodes, sizeof abyScanCodes, \
     NULL, 0, addr dwBytesReturned, NULL
Если я понял верно - начиная с какого-то адреса создаётся массив байт, а потом передаётся указатель на него, но вопрос в том, с первого элемента или там ещё какая служебная инфа добавится...
alex4321 вне форума Ответить с цитированием
Старый 04.08.2012, 20:56   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
var r:array of byte;
begin
 SetLength(r,7);
 r[0]:=6;
 r[1]:=$1e;
 r[2]:=$9e;
 r[3]:=$1e;
 r[4]:=$9e;
 r[5]:=$1e;
 r[6]:=$9e;
передачу массива же показал.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2012, 21:13   #5
alex4321
Пользователь
 
Регистрация: 23.07.2012
Сообщений: 77
По умолчанию

Странно, но то же bsod.

Вообще неплохо бы пример (в указанной теме он есть) собрать, но как я понял он ругается на переопределения какой-то фигни сторонними модулями, что с моими знаниями асм-а равносильно несобираемости :-)

Последний раз редактировалось alex4321; 04.08.2012 в 21:24.
alex4321 вне форума Ответить с цитированием
Старый 05.08.2012, 01:18   #6
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

что за драйвер такой гавняный чуть невалид в данных и он все роняет в бсод. не юзайте такие
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 05.08.2012, 02:01   #7
alex4321
Пользователь
 
Регистрация: 23.07.2012
Сообщений: 77
По умолчанию

Были бы блин идеи, что юзать ещё. Что-тоя мало что нашёл при низкоуровневую имитацию клавиатуры сколь-либо понятными методами/

p.s. кстати скомпилял пример более старой версией masm32 - таки он пашет, т.е. дело в дельфи а не в драйвеер
alex4321 вне форума Ответить с цитированием
Старый 05.08.2012, 03:08   #8
alex4321
Пользователь
 
Регистрация: 23.07.2012
Сообщений: 77
По умолчанию

Выяснил что я ошибся в вызове из delphi (в общем указание на это массив и нулевой указатель для выходных данных перепутал). BSOD-ить перестало.
Впрочем при подаче динамического массива ничего не изменилось. Однако статический с тем же содержанием замечательно обрабатывается. Так что до нахождения лучшего решения придётся копировать в буфер.
alex4321 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передать массив через Socket.SendBuf(); raketa161 Работа с сетью в Delphi 14 19.05.2012 15:01
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Как массив передать в качестве аргумента функции Mixim C# (си шарп) 7 10.03.2011 09:53
Передать двумерный массив через сокет (Debian) Phaeleh Qt и кроссплатформенное программирование С/С++ 1 29.11.2010 07:08
Как передать весь результат запроса в массив? VladimirAleks Общие вопросы Delphi 5 22.10.2009 11:52