文章作者:grayfox
作者主页:http://nokyo.blogbus.com
原始出处:http://www.blogbus.com/nokyo-logs/34018521.html

在我昨日发布的《驱动学习笔记系列文章汇总(PDF)》第11.2节中,我没有给出使用DeviceIoControl通信的演示源码,附录中附带的程序是我尚未调试好的,因此没有达到通信的目的。

今天又认真阅读了下张帆的《Windows驱动开发技术详解》第7章的内容,并对它给出的示例程序多次调试,总算把这个通信过程给理解了,下面我们先来看看应用层程序的代码:

#include <windows.h>

#include <stdio.h>

#include <winioctl.h>

#include "..\Ioctls.h"

#define SYMBOL_LINK "\\\\.\\Test"

int main()

{

HANDLE hDevice = ::CreateFile(SYMBOL_LINK,

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL );

if (hDevice == INVALID_HANDLE_VALUE)

{

printf("Failed to Open Device : %d\n", ::GetLastError());

return -1;

}

UCHAR InputBuffer[10];

UCHAR OutputBuffer[10];

DWORD dwOutput;

memset(InputBuffer, 0xAA, 10);

BOOL bRet = ::DeviceIoControl(hDevice, IOCTL_TEST, InputBuffer, 10, &OutputBuffer, 10, &dwOutput, NULL);

if (bRet)

{

printf("Output buffer:%d bytes\n",dwOutput);

for (int i=0;i<(int)dwOutput;i++)

{

printf("%02X ",OutputBuffer[i]);

}

printf("\n");

}

CloseHandle(hDevice);

return 0;

}

其中Ioctls.h这个头文件没有实质作用,它是为了在驱动程序和应用层程序之间共享IOCTL定义而设立的,内容很简单,如下所示:

#ifndef IOCTLS_H

#define IOCTLS_H

#ifndef CTL_CODE

#pragma message("CTL_CODE undefined. Include winioctl.h or wdm.h")

#endif

#define IOCTL_TEST \

CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)

#endif

我们再来看驱动程序,这里的xxxxDispatchDeviceControl函数需要作适当修改,如下所示:

NTSTATUS

TestDispatchDeviceControl(

IN PDEVICE_OBJECT        DeviceObject,

IN PIRP                    Irp

)

{

NTSTATUS            Status = STATUS_SUCCESS;

PIO_STACK_LOCATION    irpStack;

ULONG                inBufLength, outBufLength;

ULONG                i = 0;

ULONG                ioControlCode;

UCHAR                *InputBuffer, *OutputBuffer;

irpStack = IoGetCurrentIrpStackLocation(Irp);

inBufLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;

outBufLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

if (ioControlCode == IOCTL_TEST)

{

KdPrint(("[Test] IOCTL_TEST : 0x%X", ioControlCode));

// 读取数据

InputBuffer = (UCHAR *)Irp->AssociatedIrp.SystemBuffer;

for (i = 0; i < inBufLength; i++)

{

KdPrint(("[Test] %X\n", InputBuffer[i]));

}

// 写入数据

OutputBuffer = (UCHAR *)Irp->AssociatedIrp.SystemBuffer;

memset(OutputBuffer, 0xBB, outBufLength);

Irp->IoStatus.Information = outBufLength;

}

else

{

KdPrint(("[Test] Unknown IOCTL: 0x%X (%04X,%04X)", \

ioControlCode, DEVICE_TYPE_FROM_CTL_CODE(ioControlCode), IoGetFunctionCodeFromCtlCode(ioControlCode)));

Status = STATUS_INVALID_PARAMETER;

Irp->IoStatus.Information = 0;

}

// 完成IRP

Irp->IoStatus.Status = Status;

IoCompleteRequest(Irp, IO_NO_INCREMENT);

return Status;

}

最后的演示结果如下图所示:

【驱动笔记11】使用DeviceIoControl通信的更多相关文章

  1. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  2. linux 2.6 驱动笔记(一)

    本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...

  3. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  4. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  5. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  6. JAVA自学笔记11

    JAVA自学笔记11 1:Eclipse的安装 2:用Eclipse写一个HelloWorld案例,最终在控制台输出你的名字 A:创建项目 B:在src目录下创建包.cn.itcast C:在cn.i ...

  7. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  8. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  9. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

随机推荐

  1. 有关于腾讯地图服务端IP定位接口的获取当前城市的处理

    接口说明:http://apis.map.qq.com/ws/location/v1/ip 说明里面写了ip可以缺省,然并卵,经过测试的到结果并不能获取到当前城市,理由是腾讯ip库的对应ip精度没有定 ...

  2. vue当前路由跳转初步研究

    一样闲话少说,直接上问题,如图: 也是消息面板,没想到一个小小的消息面板,碰到这么多坑,惆怅. 就是如果当前路由和跳转路由不一样时,正常跳转没有任何问题.但是如果一样时,就不会跳转了,用了很多方法,比 ...

  3. scala 学习笔记五 foreach, map, reduce

    例子 val v = Vector(,,,) ) println(s) //输出:Vector(2, 4, 6, 8) val v2 = Vector(,,,) var v3 = v2.reduce( ...

  4. (转)ngui3.5.7 版本Scroll View实现方法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xyo123.blog.51cto.com/6369437/1405861 现在网 ...

  5. [Javascipt] Immediately-Invoker 2

    Now the people at Poplar Puzzles would like you to treat an array of functions like a Queue, passing ...

  6. PCL系列——怎样逐渐地配准一对点云

    欢迎訪问 博客新址 PCL系列 PCL系列--读入PCD格式文件操作 PCL系列--将点云数据写入PCD格式文件 PCL系列--拼接两个点云 PCL系列--从深度图像(RangeImage)中提取NA ...

  7. Python 的时间格式化

    对于像'Wed, 11 Apr 2012 09:37:05 +0800'的时间格式化可如下解: >>> date='Wed, 11 Apr 2012 09:37:05 +0800'& ...

  8. nexus 离线更新索引

    1.到http://repo.maven.apache.org/maven2/.index/页面下载下面这两个文件: nexus-maven-repository-index.gz nexus-mav ...

  9. win10 关闭自动维护计划任务

    重命名 C:\Windows\System32\Tasks\Microsoft\Windows 下的Defrag

  10. redis_session_store.py

    # -*- coding: utf-8 -*- """ Created on 09/11/2011 @author: Carlo Pires <carlopires ...