Проблемы с передачей параметров в драйвер!
От: iilisav  
Дата: 06.11.08 17:44
Оценка:
Пытаюсь передать из юзер мода 0xFF драйверу, чтобы потом записать в память, использую DeviceIoControl. Но ничего не доходит почему то. Посылаю вот так:


  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);


пытаюсь ловить вот так:




VOID *Mem;
char *Byt = 0;
MEMORY_CACHING_TYPE cache = 0;    
PHYSICAL_ADDRESS  Padd;      
PCHAR ioBuffer = 0;

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;//записываю
        mmUnmapIoSpace( Mem, 512 );//анмаппим память       
    
     break; 
   
   break;
 
   default:
      Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
   break;
  }
  ntStatus = Irp->IoStatus.Status;
  IoCompleteRequest(Irp, IO_NO_INCREMENT); 
  return ntStatus;
}


извиняюсь за кучу кода, но не могу понять почему не работает-) Заранее спасибо!!!
Re: Проблемы с передачей параметров в драйвер!
От: MShura  
Дата: 06.11.08 18:00
Оценка:
Как описан IOCTL_TEST_SMTH?

I>

I>    ioBuffer = Irp->AssociatedIrp.SystemBuffer;//как бы ловлю
    
I>        Mem = MmMapIoSpace( Padd, 512, cache );//маппим память
I>        Byt = (char*)Mem;//передаю
 Вы таким образом хотели записать в Byt 512 байт из ioBuffer?
I>    *Byt = (char)ioBuffer;//записываю
I>        mmUnmapIoSpace( Mem, 512 );//анмаппим память       

I>
Re[2]: Проблемы с передачей параметров в драйвер!
От: iilisav  
Дата: 06.11.08 18:05
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Как описан IOCTL_TEST_SMTH?


#define IOCTL_TEST_SMTH CTL_CODE(FILE_DEVICE_UNKNOWN, 0x703, METHOD_BUFFERED, FILE_ANY_ACCESS)

я просто не знаю какая длинна у ioBuffer и как её можно узнать-) Но думаю наверно это не из-за этого или я не прав? Тогда как получить длину? Заранее спасибо!
Re[3]: Проблемы с передачей параметров в драйвер!
От: De-Bugger  
Дата: 06.11.08 18:18
Оценка:
Здравствуйте, iilisav, Вы писали:

I>я просто не знаю какая длинна у ioBuffer и как её можно узнать-)

ULONG uLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
Re[4]: Проблемы с передачей параметров в драйвер!
От: iilisav  
Дата: 06.11.08 19:24
Оценка:
Здравствуйте, De-Bugger, Вы писали:

А не передается поэтому?
Re[3]: Проблемы с передачей параметров в драйвер!
От: MShura  
Дата: 06.11.08 20:26
Оценка:
MS>>Как описан IOCTL_TEST_SMTH?

I>#define IOCTL_TEST_SMTH CTL_CODE(FILE_DEVICE_UNKNOWN, 0x703, METHOD_BUFFERED, FILE_ANY_ACCESS)


METHOD_BUFFERED
For this transfer type, IRPs supply a pointer to a buffer at Irp->AssociatedIrp.SystemBuffer. This buffer represents both the input buffer and the output buffer that are specified in calls to DeviceIoControl and IoBuildDeviceIoControlRequest. The driver transfers data out of, and then into, this buffer.
For input data, the buffer size is specified by Parameters.DeviceIoControl.InputBufferLength in the driver's IO_STACK_LOCATION structure. For output data, the buffer size is specified by Parameters.DeviceIoControl.OutputBufferLength in the driver's IO_STACK_LOCATION structure.

The size of the space that the system allocates for the single input/output buffer is the larger of the two length values.


Сначало читаем из Irp->AssociatedIrp.SystemBuffer. Это входные данные. В твоем случае их размер 0.
Затем пишем в Irp->AssociatedIrp.SystemBuffer. Это выходные данные. В твоем случае их размер 512.

I>я просто не знаю какая длинна у ioBuffer и как её можно узнать-) Но думаю наверно это не из-за этого или я не прав? Тогда как получить длину? Заранее спасибо!


В приведенном коде длина вообще не учитывается. В ячейку 0xC8000 записывается младшее значение указателя Irp->AssociatedIrp.SystemBuffer.
Догадываюсь, что это не то, что задумывалось. А что задумывалось не пойму.
Re[4]: Проблемы с передачей параметров в драйвер!
От: iilisav  
Дата: 06.11.08 21:19
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Сначало читаем из Irp->AssociatedIrp.SystemBuffer. Это входные данные. В твоем случае их размер 0.

MS>Затем пишем в Irp->AssociatedIrp.SystemBuffer. Это выходные данные. В твоем случае их размер 512.

Не правильно переписал сюда. Сделал вот так

DeviceIoControl(hDevice, IOCTL_TEST_SMTH, &BufferValue, sizeof(BufferValue), NULL, 0, &ReturetLength, NULL);

То есть хочу передать в буфер 0xFF. Потом записать его по адресу 0xc8000. Но ничего не получается то ли не приходит вообще то ли не записывается в память. Кстати пробовал вывести значение буфера через DbgPrint вообще перезагрузка-)
Re[5]: Проблемы с передачей параметров в драйвер!
От: MShura  
Дата: 06.11.08 21:32
Оценка:
I>То есть хочу передать в буфер 0xFF. Потом записать его по адресу 0xc8000. Но ничего не получается то ли не приходит вообще то ли не записывается в память. Кстати пробовал вывести значение буфера через DbgPrint вообще перезагрузка-)

Ну если я правильно понял, то вкратце так:

memset( BufferValue, -1, 512 );
DeviceIoControl(hDevice, IOCTL_TEST_SMTH, &BufferValue, sizeof(BufferValue), NULL, 0, &ReturetLength, NULL)

....

RtlCopyMemory( Mem, Irp->AssociatedIrp.SystemBuffer, min( 512, irpStack->Parameters.DeviceIoControl.InputBufferLength ) );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.