windows驱动开发DeviceIoControl传结构体

windows驱动开发DeviceIoControl传结构体

 

再驱动开发中,书上写DeviceIoControl传过去一个数组指针,在驱动中取数组的地址指针,然后++取各值,如:

 

win32应用程序:

DWORD pk[3]={0,1,2};

 //输出
 DWORD dwOutput;

 //产生周期是200ms的周期信号
 for(;;)
 {
  DeviceIoControl(hDevice,WRITE_PORT,pk,sizeof(pk),NULL,0,&dwOutput,NULL);
  pk[2]^=3;
  Sleep(100);
  printf("%d",pk[2]);
 }

 

驱动程序:

PULONG InputBuffer=(PULONG)pIrp->AssociatedIrp.SystemBuffer;

   ULONG port=(ULONG)*InputBuffer;
   InputBuffer++;
   ULONG method=(ULONG)*InputBuffer;
   InputBuffer++;
   ULONG values=(ULONG)*InputBuffer;

这样就可以取到数据了,

但是这样做的缺点就是数组中的值不相同,第一类型必须一样,不灵活,第二不好约定,容易出错

而改为结构体则可以解决这两个缺点。

 

win32应用程序:

 struct packet pk;
 pk.method=1;
 pk.port=0x378;
 pk.values=2;

 

 //输出
 DWORD dwOutput;

 //产生周期是200ms的周期信号
 for(;;)
 {
  DeviceIoControl(hDevice,WRITE_PORT,&pk,sizeof(pk),NULL,0,&dwOutput,NULL);
  pk.values=pk.method^3;//输出方形波所以求反
  
  Sleep(100);
  printf("%d",pk.values);
  
 }

 

驱动程序:

PULONG InputBuffer=(PULONG)pIrp->AssociatedIrp.SystemBuffer;
   packet *pk=0;
   pk=(packet *)InputBuffer;

KdPrint(("port=0x%xh\n",pk->port));

   KdPrint(("methon=%x\n",pk->method));

   KdPrint(("values=%x\n",pk->values));

 

注意结构体指针的初始化,让*pk=0,不然得不出结果

 

这样就可以取得结构体在内存中的指针,然后取得变量

 

另外,在应用程序和驱动程序中都应当定义好结构体,如:

typedef struct
{
 UCHAR port;//端口
 UCHAR method;//操作位数
 UCHAR values; //值

}packet;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值