| 
			 
					阅读:1372回复: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 
 
							说的对就是那个原因.  | 
	|