#ifndef CTL_CODE_H_89749_9961731
#define CTL_CODE_H_89749_9961731#define CTL_BUFFERED CTL_CODE(FILE_DEVICE_UNKNOWN,0x850,METHOD_BUFFERED,FILE_ANY_ACCESS)//METHOD_OUT_DIRECT 该方式既可以使用输入缓冲区.也可以使用输出缓冲区
#define CTL_DIRECT   CTL_CODE(FILE_DEVICE_UNKNOWN,0x851,METHOD_OUT_DIRECT,FILE_ANY_ACCESS)
#endif

此驱动为支持PNP的驱动
采用METHOD_BUFFERED方式通信时,获取的输入缓冲区可以当成输出缓冲区使用,直接写入值就可以返回给3环
而METHOD_OUT_DIRECT通信方式,输入缓冲区和输出缓冲区是不一样的,需要单独获取,才能给3环返回值

#include "Queue.h"
#include "IOCTL.h"
#include "Device.h"
#include <ntstatus.h>
//I/O内部设备控制
VOID EvtIoDeviceControl(_In_ WDFQUEUE Queue,_In_ WDFREQUEST Request,_In_ size_t OutputBufferLength,_In_ size_t InputBufferLength,_In_  ULONG IoControlCode)
{KdPrint(("有io请求\n"));PULONG Buffer = NULL;size_t Length = 0;switch (IoControlCode){case CTL_BUFFERED:KdPrint(("进入CTL_BUFFERED方式处理请求\n"));//获取缓冲区WdfRequestRetrieveInputBuffer(Request, 1,&Buffer,&Length );if (*Buffer==0x13){WdfRequestRetrieveOutputBuffer(Request, 1, &Buffer, &Length);*Buffer = 5;WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 4);return;}else{*Buffer = 0x500;WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 4);}break;case CTL_DIRECT://获取缓冲区KdPrint(("进入CTL_DIRECT方式处理请求\n"));//获取缓冲区WdfRequestRetrieveInputBuffer(Request, 1, &Buffer, &Length);if (*Buffer == 0x13){WdfRequestRetrieveOutputBuffer(Request, 1, &Buffer, &Length);*Buffer = 5;WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 4);return;}else{WdfRequestRetrieveOutputBuffer(Request, 1, &Buffer, &Length);*Buffer = 0x500;WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 4);}break;default:WdfRequestCompleteWithInformation(Request, STATUS_INVALID_PARAMETER, 0);}}
// WDFuser.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<windows.h>
#include <stdio.h>
#include <InitGuid.h>
#include <SetupAPI.h>
#include "IOCTL.h"
#pragma comment(lib,"SetupAPI.lib")DEFINE_GUID(WDF_GUID, 0xb184f9a, 0xe875, 0x49c2, 0xb0, 0xdc, 0xcf, 0x58, 0xa8, 0x56, 0x1f, 0x8e);//使用VS的生成GUID工具,选择第二种方式生成。PWCHAR GetDeviceViaInterface(const GUID* pGuid)
{//SetupDiGetClassDevs 通过GUID找到对应的设备接口HDEVINFO info = SetupDiGetClassDevs(pGuid,NULL,  //总线类型 虚拟设备不用管这个值NULL,  //父窗口DIGCF_PRESENT |  //设备在系统中DIGCF_INTERFACEDEVICE); //查找的是接口if (info == INVALID_HANDLE_VALUE){printf("No HDEVINFO available for this GUID\n");return NULL;}// Get interface data for the requested instanceSP_INTERFACE_DEVICE_DATA IfData;IfData.cbSize = sizeof(IfData);//枚举设备接口  一个驱动设备可以创建多个接口 插入一个相同设备就会创建一个设备接口.// i 指定了多个设备中的其中一个设备序号 如果没有这个序号就会枚举失败if (!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, 0, &IfData)){SetupDiDestroyDeviceInfoList(info);return NULL;}DWORD ReqLen;//获取指定接口的详细信息 主要是获得ReqLenSetupDiGetDeviceInterfaceDetail(info, &IfData, NULL, 0, &ReqLen, NULL);//分配符号链接名长度的内存PSP_INTERFACE_DEVICE_DETAIL_DATA IfDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);if (IfDetail == NULL){SetupDiDestroyDeviceInfoList(info);return NULL;}// Get symbolic link nameIfDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);if (!SetupDiGetDeviceInterfaceDetail(info, &IfData, IfDetail, ReqLen, NULL, NULL)){SetupDiDestroyDeviceInfoList(info);delete IfDetail;return NULL;}printf("Symbolic link is %S\n", IfDetail->DevicePath);return IfDetail->DevicePath;
}int _tmain(int argc, _TCHAR* argv[])
{PWCHAR pInterfaceLink = GetDeviceViaInterface(&WDF_GUID);// Open fileHANDLE hDevice = CreateFile(pInterfaceLink,GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hDevice == INVALID_HANDLE_VALUE){printf("设备接口打开失败,ErrorCode=%x", GetLastError());return false;}/*delete ifDetail;SetupDiDestroyDeviceInfoList(info);*/DWORD dwRet = 0;CHAR InBuffer[10] = { '5','3' };DWORD InBufferSize = 10;UCHAR OutBuffer[10] = { 0 };DWORD OutBufferSize = 10;DeviceIoControl(hDevice, CTL_CONVERT, InBuffer, InBufferSize,OutBuffer ,OutBufferSize, &dwRet, 0);CloseHandle(hDevice);if(dwRet>0){printf("OutBuffer=%x\n  返回的字节数=%x", *(PUCHAR)OutBuffer,dwRet);}getchar();return 0;
}

WDF驱动和3环通信相关推荐

  1. WDF驱动中KMDF与UMDF区别

    众所周知, 早期的Windows 95/98的设备驱动是VxD(Virtual Device Driver),其中x表示某一类设备.从Windows 2000开始,开发驱动程序必以WDM(Window ...

  2. win7构建成功helloworld驱动、WDF驱动中KMDF与UMDF区别

    做一个myhello.c, #include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("goodb ...

  3. STM32驱动W5100实现udp通信

    STM32驱动W5100实现udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 MCU:STM ...

  4. NT、WDM、WDF驱动概念

    一.概念介绍   NT是驱动模型:NT式驱动程序模型是一种比较老式的驱动程序模型,但适用于现有的Windows系统.NT式驱动模型没有固定的形式,最简单的NT式驱动程序模型这一特点,程序开发者可以编写 ...

  5. IP过滤-驱动和应用程序通信

    前段时间写一个IP过滤的驱动,以前没有接触过驱动,Google一把,网上有很多例子,不过都不能满足自己的需求,所以就参考大家的资料自己研究一下.呵呵.程序用了三层:第一层就是驱动来负责过滤数据包并把拦 ...

  6. 移远ec20驱动_移远通信Cat 1产品天团迎来新成员,引爆中速连接市场

    随着2G.3G退网的逐步推进,中低速率应用场景急需合适的网络来保障通信能力.作为LTE网络的"低配版",Cat 1成熟的网络覆盖.良好的速率支撑.丰富的功能支持以及出众的性价比优势 ...

  7. STM32 TM1637驱动数码管 IIC通信

    最近在做iic实验的过程中发现手边刚好有一个数码管他的驱动正好是使用iic,话不多说直接上代码了 这里就不赘述iic通信的原理和时序图了,网上相关资源也很多这里就附一篇iic的文章,这篇文章相当详细. ...

  8. 驱动 与应用层DeviceIoContro() 通信

    驱动代码 .h文件 #pragma once #include<wdm.h> // 引入内核文件#ifdef __cplusplus extern "C" {#endi ...

  9. 【字符设备驱动】 -- NEC红外通信原理|红外协议|红外驱动|红外编解码|红外遥控器...

    目录 1. 红外基本介绍: 红外线的特点 红外线发射和接收 2.NEC协议介绍: NEC的数据格式: NEC协议中数据(DATA)段编码: NEC协议典型脉冲链: NEC载波调制: NEC载波解调: ...

最新文章

  1. Coursera课程Python for everyone:Quiz: Single-Table SQL
  2. MSICE界面和功能分析
  3. 文件没有图标,无法打开(以pdf为例)
  4. WinLaucher启动
  5. scala学习笔记-Map与Tuple(10)
  6. java B2B2C springmvc mybatis电子商务平台源码-消息队列之RocketMQ
  7. 哈希表的大小为何最好是素数
  8. 【STM32】HAL库 STM32CubeMX教程十四---SPI
  9. 加载八叉树索引文件_mysql innodb索引原理
  10. mysql 分区表合并_MySQL 合并表、分区表
  11. 治疗口腔溃疡的穴位按摩方法
  12. CAD梦想画图中的“绘图工具——圆”
  13. 计算机无法进入增值税认证平台,增值税发票综合服务平台热点问题解答 (第三期)...
  14. 请查阅和请查收的区别_拯救尾款人!这份宠粉攻略请查收
  15. 【第54篇】一种用于视觉识别的快速知识蒸馏框架
  16. python vue admin_vue-admin和后端(flask)分离结合的例子
  17. 怎么推广引流?利用B站引流客源不断
  18. 五、三层交换机配置服务器
  19. 双屏的情况下,VBA中窗体跟随Excel所在显示器显示
  20. 日本计算机专业就业方向 薪酬高吗?

热门文章

  1. 无光驱安装xp,非Ghost
  2. python编程软件下载-Python3.9下载
  3. 自己动手编写一个VS插件 一
  4. google svn 服务器使用(免费SVN服务器)_陕南赤子_新浪博客
  5. 如何培训中学生计算机能力,谈信息技术教学中学生能力的培养
  6. Java实现数据大小转换(B-KB-MB-GB)
  7. 凡是过去,皆为序章,
  8. 企业微信文件分享到微信的坑
  9. zigbee CC2530 系列教程 2 软件开发平台的搭建
  10. javafx-显卡有关的jvm加速