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;