zgc7622
驱动小牛
驱动小牛
  • 注册日期2003-02-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望15点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
阅读:1244回复:7

一个WIN32和驱动通信的奇怪问题!!

楼主#
更多 发布于:2004-08-31 22:39
我的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]
zgc7622
驱动小牛
驱动小牛
  • 注册日期2003-02-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望15点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-31 22:48
我的消息定义是:
#define IOCTL_EVENT_MSG   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x870, METHOD_BUFFERED , FILE_ANY_ACCESS)
zhiyuan19840428
驱动小牛
驱动小牛
  • 注册日期2004-05-11
  • 最后登录2005-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-01 08:49
关注中。。。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于: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了
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-09-01 11:19
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了

问题是句柄为什么变化呢??难道句柄也放在缓冲区中吗???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-01 11:52
句柄为什么会变化?
驱动不会去改应用程序的句柄吧
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-09-01 14:22
应该是在从SystemBuffer拷回到outbuffer即m_dwOptions的时候,覆盖掉hcomm的内容了,0x646e6573不就是"dnes"吗?倒过来看看。

没有其他古怪问题算幸运的了
zgc7622
驱动小牛
驱动小牛
  • 注册日期2003-02-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分136分
  • 威望15点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-09-01 16:08
arthurtu
说的对就是那个原因.
游客

返回顶部