iilisav
Участник
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
|
|
« Ответ #1 : 05-11-2008 21:05 » |
|
*Mem = (char)ioBuffer; не правильно. вообще. по смыслу. книжка по Си. указатели и разыменование указателей.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #2 : 06-11-2008 10:59 » |
|
все пробовал, не помогает по чему-то. пробовал char SomeSymbol; SomeSymbol = *((PCHAR)ioBuffer); *Mem = SomeSymbol; [code] не выходит и все, приходят данные но не те, которые я отправляю-((( Не могу понять в чем проблема, может я использую ioBuffer как-то не правильно, ему нужно указывать длину входных данных? Если нужно, то как? Заранее спасибо! [/code]
|
|
|
Записан
|
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #3 : 06-11-2008 11:00 » |
|
Забыл поправить-)
|
|
|
Записан
|
|
|
|
iilisav
Участник
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
Участник
Offline
|
|
« Ответ #5 : 06-11-2008 16:00 » |
|
поправьте пожалуйста теги, туплю что-то-)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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) это будет полезнее) строка по прежнему - НЕВЕРНА! я понимаю, что вы ХОТИТЕ ей сделать. но вы делаете это неверно) подумайте про разницу между (DWORD)ioBuffer и *(DWORD*)ioBuffer. в обоих случаях на выходе переменная типа DWORD, а теперь внимание вопрос: 1 в первом случае она равна: .....? 2 во втором случае она равна: .....? ...а в два часа дня у вас был правильный вариант) PS strcpy( BufferValue, Edit1->Text.c_str()); не уверен что вы сделали то что хотели получить...)))) тоже подумайте)))) но это вопрос по классам или чем вы там пользуетесь)
|
|
« Последнее редактирование: 06-11-2008 19:05 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #7 : 06-11-2008 19:26 » |
|
А кроме этого все в порядке?-)))))
|
|
|
Записан
|
|
|
|
iilisav
Участник
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
Участник
Offline
|
|
« Ответ #9 : 06-11-2008 19:48 » |
|
Пожалуйста-))))
|
|
|
Записан
|
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #10 : 06-11-2008 19:49 » |
|
Я английский плохо понимаю... Стыдно, но не понимаю часть слов, а со словарем неохота сидеть-)))
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 06-11-2008 19:52 » |
|
ну и найдите где тут указатель на входной буфер, а где - на выходной)
PS даже когда не понимаете - старайтесь хотя бы прочитать. в DDK очень простой язык - половину слов по смыслу понять можно)
|
|
« Последнее редактирование: 06-11-2008 20:09 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #12 : 06-11-2008 20:07 » |
|
Извиняюсь. Это я перепутал, когда сюда переносил. На самом деле там наоборот, но все равно не передаётся-)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 06-11-2008 20:10 » |
|
тогда посмотрите где указывается длинна входного/выходного буфера) потому что в первом посте тоже не верно))))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
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, вообще перезагрузка происходит-(
|
|
|
Записан
|
|
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #16 : 06-11-2008 20:27 » |
|
Спасибо большое Юра! Подопытный остался на работе так что буду воевать с ним уже с утра-) Надеюсь заработает...
|
|
|
Записан
|
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #17 : 07-11-2008 14:03 » |
|
Не получается все равно-(((( А как правильно отформатировать строку в DbgPrint чтобы посмотреть что приходит в буфер? Делал так: PCHAR ioBuffer; DbgPrint((char*)ioBuffer);
|
|
|
Записан
|
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #18 : 07-11-2008 15:15 » |
|
все разобрался-)
|
|
|
Записан
|
|
|
|
|