阅读:1339回复:10
wdm上层与驱动程序通讯
我编写了一测试程序(driverStdio wdm),目的通过上层应用程序DeviceIoControl(。。),将上层一缓冲区的内容传给下层,代码如下:但出现死机,望帮助解决。
char bufInput[512]; sprintf(bufInput,\"this is test of input\"); DeviceIoControl(hHello, 0x00077, bufInput, 22,bufOutput,sizeof(bufOutput),&nOutput, NULL); 驱动程序: NTSTATUS DACSHJ1Device::DeviceControl(KIrp I) { NTSTATUS status; char *inputChar=new (NonPagedPool)char[1500]; char *writeDate; const char* TEST=\"test ok\"; t << \"Entering DACSHJ1Device::Device Control, \" << I << EOL; switch (I.IoctlCode()) { case DACSHJ1_IOCTL_800: status = DACSHJ1_IOCTL_800_Handler(I); break; case 0x00033://测试语句 memcpy(inputChar,(PCHAR)I.IoctlBuffer(),22);//此条语句死机。 I.Information()=22; t << \"I/O test \"<<inputChar<< EOL; status=1; break; default://缺省情况下 // Unrecognized IOCTL request status = STATUS_INVALID_PARAMETER; break; } |
|
最新喜欢:Luckys... |
沙发#
发布于:2003-04-30 19:58
其它相关的代码如下:
#define DACSHJ1_IOCTL_800 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_BUFFERED , FILE_ANY_ACCESS) DACSHJ1Device * pDevice = new ( static_cast<PCWSTR>(KUnitizedName(L\"DACSHJ1Device\", m_Unit)), FILE_DEVICE_UNKNOWN, NULL, 0, DO_BUFFERED_IO | DO_POWER_PAGABLE ) |
|
板凳#
发布于:2003-04-30 20:25
DeviceIoControl(hHello, 0x00077, bufInput, 22,bufOutput,sizeof(bufOutput),&nOutput, NULL);
这个改成 DeviceIoControl(hHello, 0x00077, bufInput, 512/*or sizeof(bufInput)*/,bufOutput,sizeof(bufOutput),&nOutput, NULL); memcpy(inputChar,(PCHAR)I.IoctlBuffer(),22);//此条语句死机。 改成 memcpy(inputChar,(PCHAR)I.IoctlBuffer(),I.IoctlInputBufferSize(CURRENT));看看。 不过memcpy在这里用有点可疑。 CHAR *inputChar; inputChar = I.IoctlBuffer(); |
|
地板#
发布于:2003-04-30 21:50
DeviceIoControl(hHello, 0x00077, bufInput, 22,bufOutput,sizeof(bufOutput),&nOutput, NULL); :D |
|
|
地下室#
发布于:2003-04-30 23:26
你傻笑什么啊? |
|
5楼#
发布于:2003-05-01 08:56
按照您的修改后,还是死机,如果可能请给我一示例,用于通过上层应用程序DeviceIoControl(。。),将上层一缓冲区的内容传给下层。将不胜感激。
|
|
6楼#
发布于:2003-05-16 09:48
gz
帮忙up |
|
7楼#
发布于:2003-05-16 14:08
1、将memcpy换成RtlCopyMemory试试
2、困惑: DeviceIoControl里面的code到底是到底是0x33还是0x77?不是0x800以下的code都保留给微软用吗?? :( |
|
|
8楼#
发布于:2003-05-16 14:24
1、将memcpy换成RtlCopyMemory试试 就是io code的问题,楼主已经解决,但是没有在这说明。 |
|
9楼#
发布于:2003-05-16 14:28
[quote]1、将memcpy换成RtlCopyMemory试试 就是io code的问题,楼主已经解决,但是没有在这说明。 [/quote] 呵呵,知道了,我说怎么我运行了几遍都没有问题。最好io code还是仿照ds的命名方式,用DACSHJ1DEVICE_IOCTL_801、DACSHJ1DEVICE_IOCTL_800形式比较好,不容易出错 |
|
|
10楼#
发布于:2003-05-16 14:30
第一次用DS,好像是觉得不难啊,呵呵,几乎没有什么要自己修改的地方 :D :D
|
|
|