Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с DeviceIoControl  (Прочитано 19808 раз)
0 Пользователей и 1 Гость смотрят эту тему.
iilisav
Участник

ru
Offline Offline

« : 05-11-2008 18:11 » 

Пытаюсь из юзер мода передать 0xFF. Использую DeviceIoControl.
Код:
DeviceIoControl(hDevice, IOCTL_TEST_SMTH,[b] &test[/b], 0, NULL, 4, &ReturetLength, NULL);
#define IOCTL_TEST_SMTH   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x703, METHOD_BUFFERED, FILE_ANY_ACCESS)

Дальше "ловлю" это в драйвере через ioBuffer
Код:
PULONG ioBuffer;
char *Mem;
ioBuffer = Irp->AssociatedIrp.SystemBuffer;
...
switch (ioControlCode)
  {
  case TEST_SMTH:                 
        *Mem = (char)ioBuffer;
        break;
но значение явно не то, которое я отправляю. Пытался ввывести через DbgPrint каракули какие-то пишет-)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 05-11-2008 21:05 » 

 *Mem = (char)ioBuffer;
не правильно. вообще. по смыслу.
книжка по Си. указатели и разыменование указателей.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #2 : 06-11-2008 10:59 » 

все пробовал, не помогает по чему-то. пробовал
Код:
char SomeSymbol;
SomeSymbol = *((PCHAR)ioBuffer);
*Mem = SomeSymbol;
[code]
не выходит и все, приходят данные но не те, которые я отправляю-(((
Не могу понять в чем проблема, может я использую ioBuffer как-то не правильно, ему нужно указывать длину входных данных? Если нужно, то как? Заранее спасибо!
[/code]
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #3 : 06-11-2008 11:00 » 

Забыл поправить-)
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #4 : 06-11-2008 15:57 » 

Пытаюсь передать в драйвер 0xFF, сделал так вот

Код:
  char BufferValue [512];

  hDevice = CreateFile ("\\\\.\\MyDevice", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  memset(BufferValue, 0, 512);
  strcpy( BufferValue, Edit1->Text.c_str());
  DeviceIoControl(hDevice, IOCTL_TEST_SMTH, NULL, 0, &BufferValue, sizeof(BufferValue), &ReturetLength, NULL);
  free BufferValue;

в Edit1->Text пишу 0xFF, все вроде отправляется правильно по крайней мере в BufferValue лежит 0xFF.
потом в драйвере я делаю

Код:
VOID *Mem;
char *Byt;
MEMORY_CACHING_TYPE cache = 0;
PHYSICAL_ADDRESS  Padd;  
PCHAR ioBuffer;
NTSTATUS
DriverDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP Irp)
{
  NTSTATUS ntStatus;
  PIO_STACK_LOCATION irpStack;
  PDEVICE_EXTENSION extension;
  ULONG ioControlCode;
 
  Irp->IoStatus.Status = STATUS_SUCCESS;
  Irp->IoStatus.Information = 0;
  irpStack = IoGetCurrentIrpStackLocation(Irp);
  extension = DeviceObject->DeviceExtension;
  ioBuffer = Irp->AssociatedIrp.SystemBuffer;
  ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
  switch (ioControlCode)
  {
  case TEST_SMTH:                 

Padd.HighPart = 0;
Padd.LowPart = 0xC8000;
ioBuffer = Irp->AssociatedIrp.SystemBuffer;
Mem = MmMapIoSpace( Padd, 512, cache );
        Byt = (char*)Mem;
*Byt = (char)ioBuffer;
        DbgPrint((char*)ioBuffer);
MmUnmapIoSpace( Mem, 512 );       
break;


то есть пытаюсь получить из приложения 0xFF и записать его по адресу 0xC8000, после чего на моём устройстве должны загореться 6 лампочек. Но загорается одна, причем устройство прошито так что одна загорается когда там 0x04. Получается что я записываю туда на не то что послал. Теперь вот вопрос я криво посылаю или сообщение вообще не приходит, а записывается туда вообще что-то не мое! Если поменять
*Byt = (char)ioBuffer;
на
*Byt = 0xFF;
то все работает замечательно.
Когда вывожу DbgPrint((char*)ioBuffer) там вообще нечитаемое сообщение-((( Помогите пожалуйста, очень нужно!!!! Заранее спасибо!

« Последнее редактирование: 06-11-2008 18:37 от Ochkarik » Записан
iilisav
Участник

ru
Offline Offline

« Ответ #5 : 06-11-2008 16:00 » 

поправьте пожалуйста теги, туплю что-то-)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 06-11-2008 18:58 » 

Код:
BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,
  LPDWORD lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);
у вас неправильные входные параметры. подсказывать не стану - посмотрите внимательнее описание DeviceIoControl() в MSDN) это будет полезнее)

строка
Код:
*Byt = (char)ioBuffer;
по прежнему - НЕВЕРНА!
я понимаю, что вы ХОТИТЕ ей сделать. но вы делаете это неверно) подумайте про разницу между
(DWORD)ioBuffer  и *(DWORD*)ioBuffer.

в обоих случаях на выходе переменная типа DWORD, а теперь внимание вопрос:
1 в первом случае она равна: .....?
2 во втором случае она равна: .....?
...а в два часа дня у вас был правильный вариант)

PS strcpy( BufferValue, Edit1->Text.c_str());
не уверен что вы сделали то что хотели получить...)))) тоже подумайте)))) но это вопрос по классам или чем вы там пользуетесь)
« Последнее редактирование: 06-11-2008 19:05 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #7 : 06-11-2008 19:26 » 

А кроме этого все в порядке?-)))))
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #8 : 06-11-2008 19:48 » 

Не понимаю
 BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,//
  LPDWORD lpBytesReturned, здесь ошибка?
  LPOVERLAPPED lpOverlapped
);
msdn открыл, но честно не понял где ошибся-) Может все таки можно подсказку?-)))
вот описание
Код:
BOOL WINAPI DeviceIoControl(
  __in         HANDLE hDevice,
  __in         DWORD dwIoControlCode,
  __in_opt     LPVOID lpInBuffer,
  __in         DWORD nInBufferSize,
  __out_opt    LPVOID lpOutBuffer,
  __in         DWORD nOutBufferSize,
  __out_opt    LPDWORD lpBytesReturned,
  __inout_opt  LPOVERLAPPED lpOverlapped
);

Parameters

hDevice [in]

    A handle to the device on which the operation is to be performed. The device is typically a volume, directory, file, or stream. To retrieve a device handle, use the CreateFile function. For more information, see Remarks.
dwIoControlCode [in]

    The control code for the operation. This value identifies the specific operation to be performed and the type of device on which to perform it.

    For a list of the control codes, see Remarks. The documentation for each control code provides usage details for the lpInBuffer, nInBufferSize, lpOutBuffer, and nOutBufferSize parameters.
lpInBuffer [in, optional]

    A pointer to the input buffer that contains the data required to perform the operation. The format of this data depends on the value of the dwIoControlCode parameter.

    This parameter can be NULL if dwIoControlCode specifies an operation that does not require input data.
nInBufferSize [in]

    The size of the input buffer, in bytes.
lpOutBuffer [out, optional]

    A pointer to the output buffer that is to receive the data returned by the operation. The format of this data depends on the value of the dwIoControlCode parameter.

    This parameter can be NULL if dwIoControlCode specifies an operation that does not return data.
nOutBufferSize [in]

    The size of the output buffer, in bytes.
lpBytesReturned [out, optional]

    A pointer to a variable that receives the size of the data stored in the output buffer, in bytes.
[\code]
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #9 : 06-11-2008 19:48 » 

Пожалуйста-))))
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #10 : 06-11-2008 19:49 » 

Я английский плохо понимаю... Стыдно, но не понимаю часть слов, а со словарем неохота сидеть-)))
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 06-11-2008 19:52 » 

ну и найдите где тут указатель на входной буфер, а где - на выходной)

PS даже когда не понимаете - старайтесь хотя бы прочитать. в DDK очень простой язык - половину слов по смыслу понять можно)
« Последнее редактирование: 06-11-2008 20:09 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #12 : 06-11-2008 20:07 » 

Извиняюсь. Это я перепутал, когда сюда переносил. На самом деле там наоборот, но все равно не передаётся-)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 06-11-2008 20:10 » 

тогда посмотрите где указывается длинна входного/выходного буфера) потому что в первом посте тоже не верно))))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #14 : 06-11-2008 20:13 » 

Я сделал вот так
Код:
DeviceIoControl(hDevice, IOCTL_TEST_SMTH, &BufferValue, sizeof(BufferValue), NULL, 0, &ReturetLength, NULL);
Правильно?
А может это быть из-за того что я не указываю размер длины буфера в mmMapIoSpace?
MmMapIoSpace( Padd, 512, cache ) может 512 многовато-)
Даже не знаю, кстати пробовал вывести значение ioBuffer через DbgPrint, вообще перезагрузка происходит-(

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 06-11-2008 20:17 » 

верно
https://forum.shelek.ru/index.php/topic,7559.0.html
и поиском по форуму на DeviceIoControl.
про  вывести значение ioBuffer через DbgPrint  -скорее всего неправильно отформатировали строку.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #16 : 06-11-2008 20:27 » 

Спасибо большое Юра! Подопытный остался на работе так что буду воевать с ним уже с утра-) Надеюсь заработает...
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #17 : 07-11-2008 14:03 » 

Не получается все равно-(((( А как правильно отформатировать строку в DbgPrint чтобы посмотреть что приходит в буфер?
Делал так:
PCHAR ioBuffer;
DbgPrint((char*)ioBuffer);
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #18 : 07-11-2008 15:15 » 

все разобрался-)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines