阅读:1244回复:7
一个WIN32和驱动通信的奇怪问题!!
我的WIN32应用程序是这样写的:
HANDLE hcomm; hcomm=CreateFile("\\\\\\\\.\\\\MyTest",GENERIC_READ ,0,NULL,OPEN_EXISTING,NULL,NULL); if(hcomm!=INVALID_HANDLE_VALUE) { char m_dwOptions[6]={''}; DWORD bytesWrite; m_dwOptions[0]='R'; m_dwOptions[1]='e'; m_dwOptions[2]='S'; m_dwOptions[3]='e'; m_dwOptions[4]='t'; if(DeviceIoControl(hcomm ,IOCTL_EVENT_MSG,( char * )m_dwOptions,6,( char * )m_dwOptions,6, &bytesWrite, NULL )) { //AfxMessageBox("设置完成,并使用","设置",MB_OK); } if(hcomm!=NULL) { CloseHandle(hcomm); } } 但是我发现当我的CreateFile创建的HANDLE是0x00000058 但是当运行完DeviceIoControl以后就变成了0x646e6573了。 我觉得我的驱动中写的有问题,才让这个句柄发生了变化了。 我的驱动代码是: static NTSTATUS MydrvDispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION IrpStack; NTSTATUS status,status1; ULONG ControlCode; ULONG InputLength,OutputLength; TCHAR wInputBuffer[6]; TCHAR OutMsg[] = "Message send by driver"; PVOID pvIOBuffer; char *Test; // 得到当前IRP (IO请求包) IrpStack = IoGetCurrentIrpStackLocation(Irp); // 得到DeviceIoControl传来的功能调用号 ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; // 得到DeviceIoControl传来的输入缓冲区长度 InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; // 得到DeviceIoControl的输出缓冲区长度 OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; /**********得到应用程序传来的参数***************/ //pIrp->AssociatedIrp.SystemBuffer;//得到应用程序输入的参数 Test=(char *)Irp->AssociatedIrp.SystemBuffer; if (strcmp(Test,"ReSet")==0) { //重新调用得到内容的函数 //我的处理 } switch (ControlCode) { case IOCTL_EVENT_MSG: //得到应用程序给的参数信息。 RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutMsg, sizeof(OutMsg)); Irp->IoStatus.Status = STATUS_SUCCESS; //设置返回的信息长度 OutputLength = sizeof(OutMsg); //设置返回的信息。 Irp->IoStatus.Information = OutputLength; break; } status = Irp->IoStatus.Status; IoCompleteRequest(Irp, 0); return status; } 可是我看来看去没有什么错误呀!!!请各位帮助!!!! (虽然hcomm的值会变但是WIN32发送的东西驱动程序是可以接受到的)。 [编辑 - 8/31/04 by zgc7622] |
|
沙发#
发布于:2004-08-31 22:48
我的消息定义是:
#define IOCTL_EVENT_MSG CTL_CODE(FILE_DEVICE_UNKNOWN, 0x870, METHOD_BUFFERED , FILE_ANY_ACCESS) |
|
板凳#
发布于:2004-09-01 08:49
关注中。。。
|
|
地板#
发布于:2004-09-01 09:30
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutMsg, sizeof(OutMsg));
Irp->IoStatus.Status = STATUS_SUCCESS; //设置返回的信息长度 OutputLength = sizeof(OutMsg); //设置返回的信息。 Irp->IoStatus.Information = OutputLength; 你的outbuffer(m_dwOptions)就6 byte,但是OutputLength是多少?大概数了下都过20了 |
|
地下室#
发布于:2004-09-01 11:19
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutMsg, sizeof(OutMsg)); 问题是句柄为什么变化呢??难道句柄也放在缓冲区中吗??? |
|
|
5楼#
发布于:2004-09-01 11:52
句柄为什么会变化?
驱动不会去改应用程序的句柄吧 |
|
|
6楼#
发布于:2004-09-01 14:22
应该是在从SystemBuffer拷回到outbuffer即m_dwOptions的时候,覆盖掉hcomm的内容了,0x646e6573不就是"dnes"吗?倒过来看看。
没有其他古怪问题算幸运的了 |
|
7楼#
发布于:2004-09-01 16:08
arthurtu
说的对就是那个原因. |
|