WDK框架驱动和应用程序的交互通信实现(附加代码)

WDK框架驱动和应用程序的交互通信实现(附加代码)学习各种高级外挂制作技术,马上去百度搜索"魔鬼作坊",点击第一个站进入,快速成为做挂达人。

在学习wdk驱动的时候,关于通讯这块介绍真的很少,加上《天书夜读》没有公开代码,所以实现起来真的很困难,所以在学习的过程中做了些小结,附上源码,希望对初学者有一些帮助。

目录如下,如果有用过虚拟机,第三章可以忽略。

时间比较宝贵的直接看第五章。

word文档里面有超链接,阅读也方便一点。

从某种程度上说,这个算是自己第一次发帖,所以大家多多指教。

附件如下:《天书夜读》Windows驱动编程基础教程.rarComm.rardioc.rarfhlj1.rarirpcl.rarList.rar总.rar总的word文件:WDK下驱动和应用层序通信.rar第一章VC6.0+WDK(7600.16385.1)开发驱动的环境配置1第二章设备和符号链接生成以及删除2第三章虚拟机运行3第四章应用程序向驱动程序发送消息7第五章驱动程序主动发消息给应用程序10第一章VC6.0+WDK(7600.16385.1)开发驱动的环境配置(1)第一步:打开VC建立一个Win32Application工程,然后选择An empty Project。

(2)第二步:随便找一个驱动程序,主要是.C,.h及rc资源文件,加入第一步建立的工程(3)第三步:设置VC编译驱动的环境,这才是重点。

打开VC的Tool->Options->Directories里设置Include,Lib,及Exectuable File。

设置Include路径:C:/WINDDK/7600.16385.1/INCC:/WinDDK/7600.16385.1/INC/wdfC:/WinDDK/7600.16385.1/INC/wdf/kmdf/1.9C:/WINDDK/7600.16385.1/INC/CRTC:/WINDDK/7600.16385.1/INC/DDKC:/WINDDK/7600.16385.1/INC/API(这里可能有些不需要,也可能少了,根据自己的情况在INC目录下继续添加就OK了)设置LIB路径:C:/WINDDK/7600.16385.1/LIBC:/WINDDK/7600.16385.1/LIB/WDF/KMDF/I386/1.9C:/WINDDK/7600.16385.1/LIB/CRT/I386C:/WINDDK/7600.16385.1//LIB/WNET/I386设置Executable Files:C:/WINDDK/7600.16385.1/BIN/X86/X86(这里要注意,一定要在bin/x86目录下,确切的找到Cl.exe文件,然后添加它所在的目录,DDK与WDK这个文件所在的路径并不是一样的,上面的是我所安装的WDK中cl.exe所在的路径,这里要根据不同情况选择正确的路径)(4)第四步:这里要设置工程的属性:打开VC->Project菜单,找到C/C++选项卡,在Preprocesser definitions里输入如下字符串:Release下输入:_X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,NDEBUGDebug下输入:_X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,_DEBUG在Code Generation里的Calling convention用_STDCALLDebug版有个特殊编译选项/GZ(注意是大写的,小写的不要删!)删掉,否则有链接错误,chkesp链接不上什么的。

(5)第五步:设置link选项卡,将输出文件名改为sys扩展名,在General的Objcet/Library modules,填写驱动调用的几个lib:Kernel32.lib ntoskrnl.lib hal.lib usbd.lib wmilib.lib wdfdriverentry.lib wdfldr.lib然后进入Output在Entry-point symbol:填DriverEntry下面就是往Project Options手动增加一些链接选项,复制如下进去:/machine:IX86/driver/subsystem:native/SECTION:INIT,d/IGNORE:4198,4010,4037,4039,4065,407 0,4078,4087,4089,4221删除如下选项:/subsystem:windows/machine代表目标机器类型,/driver代表驱动,/subsystem:native也是代表驱动。

(这里,我在配置的时候,只是将/subsystem:windows改为:/subsystem:native没有再进行其它设置,也可成功生成驱动文件,至于有没有问题,暂时不知道)/hell74111/blog/item/847374a9648fd8b8cb130c0a.html源文档</374966/265242>那么如果我们要编译64位驱动呢?这里大家注意一下,64位有两种,一个是AMD64,一个是IA64,要选定你的目标平台,目前AMD64平台最为流行.其实编译成64位也很简单,只要把32位的配置稍微改一下就行了,我们以编译AMD64位驱动为例(你会复制VC的工程Configurations吧,把32位的Relase,Debug各复制一份改名为ReleaseAMD64和DebugAMD64,然后在复制品的基础上修改):1.要修改两个lib路径:C:/2003DDK/LIB/CRT/I386改为:C:/2003DDK/LIB/CRT/amd64C:/2003DDK/LIB/WNET/I386改为:C:/2003DDK/lib/wnet/amd642.修改编译器路径:C:/2003DDK/BIN/X86改为:C:/2003DDK/bin/win64/x86/amd64C:/2003DDK/BIN/X86//这句也要存在3.修改C/C++里的Preprocesser definitions为:ReleaseAMD64下输入:_AMD64_,AMD64,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,NDEBUGDebugAMD64下输入:_AMD64_,AMD64,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,_DEBUG4.需要修改link页里的Project Options,手动改一下:将/machine:IX86改为:/machine:amd645.理论上到这里设置就OK了,不过还是有一个链接错误unresolved external symbol__security_cooki e,只要在链接的lib里加入bufferoverflowK.lib(为什么是bufferoverflowK.lib?看这里:http:/ //kb/894573)就可以了。

我修改的工程范例下载:下载地址。

以上的设置大部分都可以保存在VC工程文件(*.dsp)里,除了设置的include路径,lib路径和编译器路径,这些路径是全局的,在打开另一些工程也会留下了,就会给编译应用程序带来麻烦,还需要一个一个改回去,而目录切换器就是为了快速切换这些路径而开发的。

PS:你在建好一个工程文是,目录已经保存下来了,再创建一个新工程时,就不用再设置目录了,但工程的属性,还需要设置,这个时候可以用比较工具,把.dsp文件和以前创建工程的.dsp文件比较,把改动之间复制过去即可,不用再一项一项重新设置了。

第二章设备和符号链接生成以及删除代码:fhlj1.c本代码和hello world差不多,不过如果不写DriverUnload,会发现代码每次卸载之后,就不能再次安装,原因就是设备没有删除,所有DriverUnload的职责就是删掉符号链接和设备。

本文生成的设备文件DosDevices\\MyCDOSL可以被应用程序打开,这个是实现通信的基础。

当时上面的代码还没有具备这样的功能,应用程序通过CreateFile无法打开,原因是该驱动没有对自己创建的设备做出的irp做出处理。

代码:irpcl.c上面的代码黄色部分,就是我们的分发函数,对于自己创建的设备,要自己做出处理,如果写成//所有处理都直接通过NTSTATUS MyPassThrough(IN PDEVICE_OBJECT DeviceObject,IN PIRP irp){IoSkipCurrentIrpStackLocation(irp);if(device==DeviceObject){//return STATUS_SUCCESS;}return IoCallDriver(DeviceObject,irp);}系统马上会出现蓝屏,原因就是即使调用IoCallDriver,系统会重新调用MyPassThrough,irp仍然没人去处理它,这样可以说是出现了死递归,这说明自己创建的设备需要自己做出处理,。

第三章虚拟机运行这里突然出入虚拟机的共享目录的安装,是因为驱动确实不能在真是的系统中测试,反复的蓝屏和重启会让人吐血了,双机调试到不用,记得输出调试信息,然后虚拟机运行就行了,这个主要介绍vmware tool 的安装,方便文件交换。

本文以VMware Workstation7.1.4_385536汉化版为例,讲解在虚拟机中创建VMware共享文件夹(vmw are shared folders)的具体步骤与方法。

一、安装VMware Tools启动好Windows XP客户机,点击“虚拟机”菜单,选择“安装VMware Tools”项,如下图所示:客户机系统会自动安装,一直点击“下一步”,安装完成后点击“确定”按钮,重新启动客户机系统,V Mware Tools就安装好了。

二、在VMware虚拟机中设置共享文件夹当我们在VMware中创建好一台新的虚拟机,安装好虚拟操作系统后,比如安装好Windows XP以后,会出现一个“摘要”窗口。

具体请查看使用VMware Workstation创建虚拟机的详细方法〔图解〕中的最后一个示例图。

在示例图中,点击“命令”下面的“编辑虚拟机设置”项,出现“虚拟机设置”窗口,点击“选项”,如下图所示:按照上图中红色椭圆划定的位置,设置好后,点击“添加”按钮,点击“下一步”,点击“浏览”按钮,设置好文件夹,如下图所示:点击“下一步”,选择“启用该共享”项,然后点击“完成”按钮,就创建好了一个共享文件夹。

合集下载

Windows 驱动程序开发指导说明书

Windows 驱动程序开发指导说明书

课程内容驱动基本概念介绍驱动核心代码分析WDM和WDF介绍Windows 10通用驱动平台驱动程序是一个软件模块,可以使操作系统和硬件设备进行交互驱动程序是操作系统的一个扩展驱动程序一般是由硬件的设计者或厂商进行编写Microsoft已经为符合公共设计规范的硬件设备提供了内置的驱动程序可执行文件,扩展名是.exe入口函数是Main()Main()函数完成大部分工作应用程序完成工作后返回,并释放内存空间在用户态运行可执行文件,扩展名是.sys入口函数是DriverEntry()DriverEntry()不会做很多工作,只是初始化驱动驱动其他部分会注册很多回调函数,会被系统的不同模块调用驱动不会返回,会一直存在直至被显示的释放在内核态或用户态运行Driver StacksPDO位于驱动栈的最底层,和总线驱动相关联当总线驱动被加载时,它会枚举所有挂载在总线上面的设备并请求设备所需要的资源每个设备都有自己对应的PDOPnP管理器会确定每个设备的驱动并在设备的PDO 之上构建适当的设备栈设备栈的核心部分,FDO和设备功能驱动相关联设备功能驱动完成Windows和设备交互的核心功能对上向应用程序和服务提供上层接口对下为设备或其他驱动提供数据交换的接口一个设备栈可以包含多个FiDO,可以在FDO之上或之下每个FiDO和一个过滤驱动相关联,FiDO是可选的通常的目的是修改一些在设备栈中传输的I/O请求,例如可以加密和解密读写请求当一个新设备被插入到系统后,系统总线驱动会向PnP管理器报告这个新设备PnP管理器通过总线驱动查询这个设备的更多信息,比如设备ID和设备所需要的资源PnP管理器利用这个信息去查找是否有有对应的驱动在本地或WU(Windows Update)上面一旦查找到设备对应的驱动,Windows便会安装并加载这个驱动加载驱动到地址空间解析驱动中引入的函数-调用其他模块调用驱动的入口函数(DriverEntry()),因此驱动可以注册回调函数调用AddDevice(),驱动此时可以创建一个“设备对象”,并将这个对象加入到设备栈中所有的事物在驱动框架中都是用对象呈现的(驱动,设备,请求等等)对象拥有属性,方法和事件WDF 对象方法属性事件操作对象的函数被WDF 框架调用用于通知某些事件设置或获取单个属性值的方法Driver (WDFDRIVER)Device (WDFDEVICE)Device (WDFDEVICE)Queue (WDFQUEUE)Queue (WDFQUEUE)……ObjectOperation方法:Status = Wdf Device Create ();属性:Cannot failWdfInterrupt Get Device();WdfInterrupt Set Policy();Can fail:Status = WdfRegistry Assign Value();Status = WdfRegistry Query Value();Status = WdfRequest Retrieve InputBuffer();回调事件:PFN_WDF_INTERRUPT_ENABLE EvtInterruptEnable初始化宏:WDF_XXX_CONFIG_INITWDF_XXX_EVENT_CALLBACKS_INIT当驱动被加载时,DriverEntry是第一个被操作系统调用的函数WdfDriverCreate( RawDriverObject, […] , attributes, &driver )NTSTATUS DriverEntry(_In_PDRIVER_OBJECT DriverObject ,_In_PUNICODE_STRING RegistryPath ) {[…]// Create WDF Driver ObjectWDF_OBJECT_ATTRIBUTES_INIT(&attributes);attributes.EvtDriverUnload = OnDriverUnload;WDF_DRIVER_CONFIG_INIT(&config, OnDeviceAdd);status = WdfDriverCreate(DriverObject ,RegistryPath ,&attributes,&config,&driver );}WDF EventWDF MethodWDF ObjectDeclare vars这是一个过滤驱动程序吗?驱动程序是电源管理策略的所有者吗?为设备对象创建I/O队列创建辅助对象,例如计时器,工作者对象,锁等NTSTATUS OnDeviceAdd( WDFDRIVER Driver,PWDFDEVICE_INIT DeviceInit) {WDFDEVICE device;IWDFIoQueue* pDefaultQueue= NULL;DeviceInit->SetPowerPolicyOwnership(TRUE );status= WdfDeviceCreate(&DeviceInit,&deviceAttributes, &device);context = GetContext(device);context->WdfDevice= device;status = pIWDFDevice->CreateIoQueue(NULL, TRUE, WdfIoQueueDispatchParallel,TRUE, FALSE, &pDefaultQueue);return status;}Static Configuration Device CreateSetting ContextQueue Create进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)NTSTATUS OnPrepareHardware(WDFDEVICE Device ,WDFCMRESLIST ResourcesRaw ,WDFCMRESLIST ResourcesTranslated ) {int ResourceCount = WdfCmResourceListGetCount(ResourcesTranslated );for (i=0; i < ResourceCount; i++) {descriptor =WdfCmResourceListGetDescriptor(ResourcesTranslated , i);switch (descriptor->Type) {case CmResourceTypePort : […]case CmResourceTypeMemory : […]case CmResourceTypeInterrupt : […]default : break ;}}return STATUS_SUCCESS ;}进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)NTSTATUS OnD0Entry(IN WDFDEVICE Device ,IN WDF_POWER_DEVICE_STATE RecentPowerState ){PADXL345AccDevice pAccDevice = nullptr pAccDevice = GetContext(Device);WdfWaitLockAcquire(pAccDevice->m_WaitLock);I2CSensorWriteRegister(pAccDevice->m_I2CIoTarget, MY_REGISTER,MY_VALUE, sizeof (MY_VALUE) );pAccDevice->m_PoweredOn = true ;WdfWaitLockRelease(pAccDevice->m_WaitLock);return STATUS_SUCCESS ;}进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)NTSTATUS OnInterruptEnable(IN WDFINTERRUPT Interrupt,IN WDFDEVICE Device){PDEVICE_EXTENSION devExt;ULONG regUlong;PULONG intCsr;devContext = GetDeviceContext(WdfInterruptGetDevice(Interrupt) );intRegId = &devContext->IntRegisterId regVal = READ_REGISTER_ULONG( intRegId );regVal = ENABLE_INTERRUPT_BYTE( regVal );WRITE_REGISTER_ULONG( intRegId, regVal );return STATUS_SUCCESS;}进入电源状态管理(D0Entry)使能中断(InterruptEnable)…获取硬件资源,进行一些静态配置,(PrepareHardware)EvtIoResume EvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildren EvtDeviceRemoveAddedResourcesStart power-managed queuesEvtIoResume Disarm wake signal, if it was armed. (called onlyduring power up; not called during resource rebalance)EvtDeviceDisarmWakeFromSx EvtDeviceDisarmWakeFromS0Request information about child devicesEvtChildListScanForChildren Enable DMA, if driver supports it EvtDmaEnablerSelfManagedIoStartEvtDmaEnablerEnableEvtDmaEnablerFillConnect interruptsEvtDeviceD0EntryPostInterruptsEnabledEvtInterruptEnable Notify Driver of state change EvtDeviceD0EntryDevice OperationalRestart from here if device is in low power statePrepare hardware for power EvtDevicePrepareHardwareChange resources requirements EvtDeviceRemoveAddedResourcesEvtDeviceFilterAddResourceRequirementsEvtDeviceFilterRemoveResourcRequirementsRestart from here if rebalancing resourcesCreate Device object EvtDriverDeviceAddDevice arrivedEnable self-managed I/O, if driver supports it.EvtDeviceSelfManagedIoInit (implicit power up),EvtDeviceSelfManagedIoRestart (explicit power up)Stop power-managed queuesEvtIoStop Arm wake signal, if it was not armed. (calledonly during power up; not called duringresource rebalance)EvtDeviceArmWakeFromSx EvtDeviceArmWakeFromS0Disable DMA, if driver supports it EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerDisableEvtDmaEnablerFlushDisconnect interrupts EvtDeviceD0EntryPostInterruptsDisabledEvtInterruptDisableNotify Driver of state changeEvtDeviceD0Exit Device OperationalStop here if transitioning to low power stateRelease hardware EvtDeviceReleaseHardwarePurge power-managed queuesEvtIoStop Stop here if rebalancing resourcesFlush I/O if driver supports self-managedI/OEvtDeviceSelfManagedIoFlush Device removedSuspend self-managed I/O, if driver supports it.EvtDeviceSelfManagedIoSuspend Cleanup I/O buffers if driver supports self-managed i/o EvtDeviceSelfManagedIoCleanupDelete device object s context area.EvtDeviceContextCleanupEvtDeviceContextDestroyWDM和操作系统深度耦合,WDM驱动程序直接调用系统服务例程,直接操作系统数据结构WDM驱动程序全部为内核态程序,操作系统对驱动输入只做有限的检查WDF框架处理与操作系统的交互,驱动本身专注于和设备交互WDF基于对象模型和事件驱动WDF支持内核态程序和用户态程序将操作系统底层的复杂逻辑抽象化使驱动代码有可能<20行对不同的硬件设备使用相同的编程模型例如GPIO,UART,I2C,NFC,传感器驱动框架内置的日志系统为数据分析定制的工具支持上千种不同的硬件设备最初UMDF V1基于C++ COMUMDF V2使用和内核态驱动开发相同的模型和语法支持USB周边设备,传感器,NFC,智能卡,HID(包括触控)等等驱动崩溃只会影响宿主进程,不会影响整个操作系统系统重启策略可以自动恢复崩溃的UMDF驱动Windows 10提供了一系列API和DDI,对于所有的Windows平台都是通用的,被称为Universal Windows Platform(UWP) Windows通用驱动是指一个内核态或用户态的驱动并能运行在所有基于UWP的系统上面Windows通用驱动只能调用属于UWP部分的DDI,这部分DDI会在MSDN文档中标记为Universal确定你的驱动是否支持UWP,把你的驱动标记为通用驱动然后重新编译在Visual Studio中打开驱动项目工程在配置选项中把操作系统选择为Windows 10在工程属性中把目标平台改为“通用”,其他选项还有“桌面”和“手机”重新编译驱动,这时可以会出现一些链接器错误尝试修复这些错误,对于出现错误的API,请参考文档是否有通用平台的API可以替代,如果没有,您可能需要重新设计你的驱动KMDF version Release method Included in this versionof Windows Drivers using it run on1.19Windows 10, version1607 WDK Windows 10, version1607Windows 10 version1607 and later,Windows Server 20161.17Windows 10, version1511 WDK Windows 10, version1511Windows 10 version1511 and later,Windows 10 Mobile,Windows 10 IoT Core,Windows Server 20161.15Windows 10 WDK Windows 10Windows 10 for desktop editions, Windows 10 Mobile, IoT Core, Windows Server 2016UMDF version Release method Included in this version ofWindows Drivers using it can run on2.19Windows 10, version 1607WDK Windows 10, version 1607Windows 10, version 1607 (all SKUs), Windows Server 20162.17Windows 10, version 1511WDK Windows 10, version 1511Windows 10 for desktop editions (Home, Pro, Enterprise, and Education), Windows 10 Mobile, Windows 10 IoT Core (IoT Core), Windows Server 20162.15Windows 10 WDK Windows 10Windows 10 for desktop editions, Windows 10 Mobile, IoT Core, Windows Server 2016驱动程序运行在哪个版本的操作系统上驱动程序支持的硬件类型驱动程序使用的驱动模型确定驱动程序是否使用了只有KMDF支持的功能,如果驱动程序没有使用KMDF的功能,并且驱动运行在Windows 8.1或以后的系统上,则可以迁移到UMDF 2https:///en-us/windows/hardware/drivers/wdf/wdf-porting-guide Which Drivers Can Be Ported and WhereDifferences Between WDM and WDFPreparing for PortingSteps in PortingSummary of KMDF and WDM Equivalents。

WDK编译环境配置说明

WDK编译环境配置说明

客户端DDK编译环境配置说明概要文档主要说明DDK编译环境的部署,如何使用该环境进行客户端代码的编译,环境中一些主要命令、如何扩展一些命令。

以及在从VC环境下移植过来后,代码需要改进的一些描述。

文章将着重对相关模块下的sources makefile进行描述。

主要分以下五个部分,各个部分的详细叙述请参见各章节。

1.DDK build server的部署2.DDK环境目录的介绍3.DDK编译工具和操作介绍4.编译过程描述以及tang工程编译分析5.VC源代码移植一些常见编译错误6.一些遗留移植和完善工作DDK build server的部署DDK build server是指存在ddk build环境的服务器,可供每个开发人员下载到自己的开发机器,经过简单的配置就能成为本地ddk编译换进的一套机制。

DDK build server可供公司各个项目组使用,方便的下载,配置并执行编译功能。

目前没有ddk build server部署,大家可以从机器192.168.12.103的共享目录中进行下载。

DDK环境目录的介绍从上图中可以看到红圈标识的几个文件和文件夹,下面一一进行介绍:Bin目录:包含了对应系统平台下的整个环境的工具和编译命令,已经进行环境设置的bat 等。

例如:cl.exe,mc.exe,midl.exe,rc.exe包括编译命令build.exe等。

Inc目录:包含了整个环境中的头文件,其中包含的子目录crt,atl,wtl,ddk,api,mfc等包含了各种不同编程框架,crt以及系统sdk的头文件。

各个子目录都,对应与相应的环境变量一一对应:Crt $( CRT_INC_PATH) = ddk下载目录\inc\crtSdk $( SDK_INC_PA TH)= ddk下载目录\inc\apiWtl $( WTL_INC_PA TH)= = ddk下载目录\inc\wtl80…Lib目录:包含了整个编译环境下的所有lib文件(除用户lib),其中包含的子目录atl,crt,mfc,以及不同操作系统对应的库目录。

如何通过 WinUSB 功能访问 USB 设备 (Windows Drivers)

如何通过 WinUSB 功能访问 USB 设备 (Windows Drivers)
如何通过 WinUSB 功能访问 USB 设备
本主题包括如何使用 WinUSB 功能与使用 Winusb.sys 作为函数驱动程序的 USB 设备进行通信的详细演练。 如果使用 Microsoft Visual Studio 2013,则可使用 WinUSB 模板创建你的框架应用。在该情况下,跳过本主题中的 第 1 步到第 3 步,从第 4 步继续操作。该模板打开设备的一个文件句柄,获取后续操作所需的 WinUSB 句柄。该句柄 存储在 device.h 中应用定义的 DEVICE_DATA 结构中。 有关该模板的详细信息,请参阅“编写基于 WinUSB 模板的 Windows 桌面应用”。 注意 WinUSB 功能需要 Windows XP 或更高版本。可在 C/C++ 应用程序中使用这些功能与 USB 设备通信。 Microsoft 未为 WinUSB 提供托管的 API。
以下示例代码获取由 WinUSB 接口句柄指定的设备的速度。
C++
BOOL GetUSBDeviceSpeed(WINUSB_INTERFACE_HANDLE hDeviceHandle, UCHAR* pDeviceSpeed) { if (!pDeviceSpeed || hDeviceHandle==INVALID_HANDLE_VALUE) { return FALSE; } BOOL bResult = TRUE; ULONG length = sizeof(UCHAR); bResult = WinUsb_QueryDeviceInformation(hDeviceHandle, DEVICE_SPEED, &length, pDeviceSpeed); if(!bResult) { printf("Error getting device speed: %d.\n", GetLastError()); goto done; } if(*pDeviceSpeed == LowSpeed) { printf("Device speed: %d (Low speed).\n", *pDeviceSpeed); goto done; } if(*pDeviceSpeed == FullSpeed) { printf("Device speed: %d (Full speed).\n", *pDeviceSpeed); goto done; } if(*pDeviceSpeed == HighSpeed) { printf("Device speed: %d (High speed).\n", *pDeviceSpeed); goto done; } done: return bResult; }

WDK驱动开发点滴

WDK驱动开发点滴

WDK驱动开发点滴⽼程序员做新⽅向,⽼树发新芽,作为菜鸟的我,写点⼼得,⽤以记录并与同⾏交流1对⼀些概念的理解:KMDF与UMDF。

两者的框架,及使⽤VS⽣成的初始代码基本相同,只有所包含的头⽂件不同,链接的系统库不同,最终⽣成的⽂件分别为.sys和.dll。

因为框架完全相同,相互移植应该⽐较容易。

UMDF驱动运⾏在⽤户空间,调试相对容易,程序崩溃时也不⾄于对系统影响太⼤。

所以只要能实现,应该⾸选使⽤UMDF框架。

虽说UMDF框架运⾏在⽤户空间,但也不是说所有WIN32应⽤程序可以使⽤的API都能正常⼯作。

本⼈遇到过调⽤WMI组件在UMDF驱动中编译失败的问题,⽐较有趣的是使⽤C++调⽤时编译失败,但使⽤C⽂件调⽤时就正常。

上⼿⽆论什么时候,微软提供的例⼦都是最好的学习材料,⽽且某些例⼦本⾝就已经能够⼯作的⾮常出⾊。

本⼈曾经使⽤其中提供的键盘过滤驱动,只修改了安装⽂件中的设备路径,就可以正常安装,稳定⼯作。

所以当要开发⼀个驱动时,最快捷的⽅法是找到最接近其功能的例⼦,拿它来修改。

以下所记录的内容都基于⼀个例⼦,或者使⽤WDK的模板创建的驱动框架。

INF⽂件及安装INF⽂件中最重要的是硬件编号,即[Standard.NT$ARCH$]所指定的内容。

这⾥设定的硬件编号与实际安装时使⽤的硬件编号⼀定要相同。

否则安装会失败。

如果是设备管理器能直接看到的设备,如果⼀个ACPI设备,在设备管理器中安装就可以。

如果我们开发的设备驱动没有对应的硬件设备结点,就需要使⽤devcon来安装,该程序会创建硬件设备结点,并安装驱动。

devcon可以在WDK的安装⽬录中找到。

使⽤⽅法:devcon.exe inf⽂件名称硬件设备结点(即inf⽂件中设置的结点)例如,如果设备驱动的INF⽂件中有如下⽚段:[Standard.NT$ARCH$]%mydriver.DeviceDesc%=mydriver_Device, Root\MyDriver则devcon的⽤法为:devcon.exe install xxx.inf Root\MyDriver在测试阶段,因为我们的驱动没有获得微软提供的签名,需要在系统中开启测试签名才能正常安装,某些驱动甚⾄需要将驱动⽂件中的测试签名证书安装到系统信任的证书⽬录中。

windows wfp编程

windows wfp编程

windows wfp编程Windows Filtering Platform(WFP)是一种用于在Windows操作系统上实现网络数据包处理和过滤的框架。

WFP提供了一种灵活且高效的机制,允许开发人员在数据包传输过程中进行深度检查和处理。

WFP可以用于实现防火墙、入侵检测系统(IDS)、流量控制和网络安全监控等功能。

在进行WFP编程时,开发人员通常会使用C++编程语言和Windows Driver Kit(WDK)提供的API来与WFP框架进行交互。

下面我将从几个方面介绍WFP编程:1. WFP基本概念,WFP基于网络层的过滤引擎,它允许开发人员通过在网络数据包传输路径上注册的过滤条件和操作来实现对数据包的检查和处理。

WFP过滤条件包括了网络层、传输层和应用层的信息,开发人员可以基于这些信息来决定是否允许、拒绝或修改数据包。

2. WFP过滤条件,WFP提供了丰富的过滤条件,包括了IP地址、端口号、协议类型、应用程序标识等。

开发人员可以根据具体需求定义过滤条件,以实现精确的数据包过滤和处理。

3. WFP操作流程,在WFP编程中,开发人员通常需要注册自己的网络过滤条件和处理函数,这些函数将在数据包经过网络堆栈时被调用,开发人员可以在这些函数中实现自定义的数据包处理逻辑。

4. WFP应用场景,WFP可以被广泛应用于网络安全领域,包括防火墙、入侵检测系统、网络流量监控等。

开发人员可以利用WFP框架实现自定义的网络安全解决方案,满足特定的安全需求。

总的来说,WFP编程是一项复杂而且强大的任务,它需要开发人员具备深入的网络和操作系统知识。

通过充分理解WFP框架的原理和API,开发人员可以实现高效、灵活的网络数据包处理和过滤功能。

希望以上信息能够帮助你对WFP编程有一个初步的了解。

vs2012ddk驱动设置

vs2012ddk驱动设置

vs2012ddk驱动设置vs2012与wdk驱动编程中编译环境设置(此例驱动在win7下要重启系统)1、新建项⽬向导中选择“空项⽬”如下图,然后点击完成。

2、在菜单“视图”⾥⾯选择“属性管理器”如下图:3、点击“配置管理器”(此⼯具在“⼯具箱”中“标准”)如下图:4、在弹出的的对话框中点击“活动解决⽅案配置”下拉菜单点“新建”,名字随便为了有意义在这取个名字“WdkDriver”如下图:5、设置“WdkDriver”为当前活动状态,如下图:6、设置“解决⽅案属性”,点击菜单“项⽬”“属性”设置如下图:A、选项“常规”设置如下图:B、“VC++⽬录”设置如下图:(inc⽂件夹下⾯有3个⽂件夹“api”“ddk”“crt”,lib下⾯“win7”“i386”(我⽤的是win7系统32位)C、“C++”设置如下图:1、“常规”设置:2、“优化”选择“禁⽤/od”3、“预处理器”选择“预处理器定义”输⼊如下内容“WIN32=100;_X86_=1;DBG=1;%(PreprocessorDefinitions)”4、“代码⽣成”选5、“⾼级”选择“调⽤约定”中选择“_stdcall/Gz”D、“链接器”设置如下图:1、“常规”设置2、“输⼊”选择“附加依赖项”输⼊如下内容“ntoskrnl.lib Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB“忽略所有默认库”中选择“是(/NODEFAULTLIB)”其他选项为空3、“清单⽂件”选择“⽣成清单”中选择“否(/MANIFEST:NO)”;“启⽤帐户控制(UAC)”中选择“否(/MANIFESTUAC:NO)”4、“系统”选择“⼦系统”中选择“本机(/SUBSYSTEM:NATIVE)”;“堆栈保留⼤⼩”“4194304”;“堆栈提交⼤⼩”“4096”;“驱动程序”中选择“驱动程序(/Driver)”5、“所有选项”参考WINDOWS 7 配置驱动开发环境vs2012+WDK7.6__脚本百事通设置以上属性后可以加⼊源⽂件编译事例:WdkDriver.h#pragma once#ifdef _cplusplusextern"c"{#endif#include#ifdef _cplusplus}#endif#define PAGEDCODE code_seg("PAGE")#define LOCKEDCODE code_seg()#define INITCODE code_seg("INIT")#define PAGEDDATA data_seg("PAGE")#define LOCKEDDATA data_seg()#define INITDATA data_seg("INIT")//#define arraysize(p) (sizeof(p)/sizeof((p)[0]))typedef struct_DEVICE_EXTENSION{PDEVICE_OBJECT pDevice;UNICODE_STRING ustrDeviceName; //设备名称UNICODE_STRING ustrSymLinkName; //符号链接名}DEVICE_EXTENSION,*PDEVICE_EXTENSION;//函数声明NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);void WdkUnload(IN PDRIVER_OBJECT pDriverObject);NTSTATUS WdkDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);事例 WdkDriver.cpp#include"WdkDriver.h"#pragma INITCODE //指出下⾯函数加载到INIT内存区,加载完成后退出NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING RegistryPath) { NTSTATUS status;KdPrint(("Enter DriverEntry\n"));//注册其他⼊⼝程序pDriverObject->DriverUnload = WdkUnload;pDriverObject->MajorFunction[IRP_MJ_CREATE] = WdkDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_CLOSE] = WdkDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_WRITE] = WdkDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_READ] = WdkDispatchRoutine;//创建驱动设备对象status = CreateDevice(pDriverObject);KdPrint(("DriverEntry end\n")); //宏,调试版(Checked版)⽤DbgPrint()代替,发⾏版(Free版)不执⾏任何操作. //类似MFC中的TRACE()return status;}//创建设备#pragma INITCODENTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject){NTSTATUS status;PDEVICE_OBJECT pDevObj;PDEVICE_EXTENSION pDevExt;//创建设备名称UNICODE_STRING devName;RtlInitUnicodeString(&devName,L"\\Device\\MyWdkDevice");//创建设备status = IoCreateDevice(pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)devName,FILE_DEVICE_UNKNOWN, //设备为独占设备,只能被⼀个应⽤程序使⽤0,TRUE,&pDevObj);if(!NT_SUCCESS(status))return status;//填充PDEVICE_EXTENSION结构,得到设备⾃定义信息pDevObj->Flags |= DO_BUFFERED_IO;pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;pDevExt->pDevice = pDevObj;pDevExt->ustrDeviceName = devName;//创建符号链接,此符号指向真正的设备名称UNICODE_STRING symLinkName;RtlInitUnicodeString(&symLinkName,L"\\??\\WdkApp");pDevExt->ustrSymLinkName = symLinkName;status = IoCreateSymbolicLink(&symLinkName,&devName);if(!NT_SUCCESS(status)){IoDeleteDevice(pDevObj);return status;}return STATUS_SUCCESS;}//卸载设备#pragma PAGEDCODEvoid WdkUnload(IN PDRIVER_OBJECT pDriverObject){PDEVICE_OBJECT pNextObj;KdPrint(("Enter DriverUnload\n"));pNextObj = pDriverObject->DeviceObject;while(pNextObj != NULL){PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension; //删除符号链接UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName; IoDeleteSymbolicLink(&pLinkName);IoDeleteDevice(pDevExt->pDevice);}}//事务函数,对设备的具体操作#pragma PAGEDCODENTSTATUS WdkDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp){KdPrint(("Enter WdkDispatchRoutine\n"));NTSTATUS status = STATUS_SUCCESS;//完成IRPpIrp->IoStatus.Status = status;pIrp->/doc/9d0c60a2b14e852459fb5751.html rmation = 0; IoCompleteRequest(pIrp,IO_NO_INCREMENT);KdPrint(("Leave WdkDispatchRoutine"));return status;}。

WDK框架驱动和应用程序的交互通信实现(附加代码)

WDK框架驱动和应用程序的交互通信实现(附加代码)学习各种高级外挂制作技术,马上去百度搜索"魔鬼作坊",点击第一个站进入,快速成为做挂达人。

在学习wdk驱动的时候,关于通讯这块介绍真的很少,加上《天书夜读》没有公开代码,所以实现起来真的很困难,所以在学习的过程中做了些小结,附上源码,希望对初学者有一些帮助。

目录如下,如果有用过虚拟机,第三章可以忽略。

时间比较宝贵的直接看第五章。

word文档里面有超链接,阅读也方便一点。

从某种程度上说,这个算是自己第一次发帖,所以大家多多指教。

附件如下:《天书夜读》Windows驱动编程基础教程.rarComm.rardioc.rarfhlj1.rarirpcl.rarList.rar总.rar总的word文件:WDK下驱动和应用层序通信.rar第一章VC6.0+WDK(7600.16385.1)开发驱动的环境配置1第二章设备和符号链接生成以及删除2第三章虚拟机运行3第四章应用程序向驱动程序发送消息7第五章驱动程序主动发消息给应用程序10第一章VC6.0+WDK(7600.16385.1)开发驱动的环境配置(1)第一步:打开VC建立一个Win32Application工程,然后选择An empty Project。

(2)第二步:随便找一个驱动程序,主要是.C,.h及rc资源文件,加入第一步建立的工程(3)第三步:设置VC编译驱动的环境,这才是重点。

打开VC的Tool->Options->Directories里设置Include,Lib,及Exectuable File。

设置Include路径:C:/WINDDK/7600.16385.1/INCC:/WinDDK/7600.16385.1/INC/wdfC:/WinDDK/7600.16385.1/INC/wdf/kmdf/1.9C:/WINDDK/7600.16385.1/INC/CRTC:/WINDDK/7600.16385.1/INC/DDKC:/WINDDK/7600.16385.1/INC/API(这里可能有些不需要,也可能少了,根据自己的情况在INC目录下继续添加就OK了)设置LIB路径:C:/WINDDK/7600.16385.1/LIBC:/WINDDK/7600.16385.1/LIB/WDF/KMDF/I386/1.9C:/WINDDK/7600.16385.1/LIB/CRT/I386C:/WINDDK/7600.16385.1//LIB/WNET/I386设置Executable Files:C:/WINDDK/7600.16385.1/BIN/X86/X86(这里要注意,一定要在bin/x86目录下,确切的找到Cl.exe文件,然后添加它所在的目录,DDK与WDK这个文件所在的路径并不是一样的,上面的是我所安装的WDK中cl.exe所在的路径,这里要根据不同情况选择正确的路径)(4)第四步:这里要设置工程的属性:打开VC->Project菜单,找到C/C++选项卡,在Preprocesser definitions里输入如下字符串:Release下输入:_X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,NDEBUGDebug下输入:_X86_=1,i386=1,STD_CALL,WIN32=100,_WIN32_WINNT=0x0501,WINVER=0x0501,_DEBUG在Code Generation里的Calling convention用_STDCALLDebug版有个特殊编译选项/GZ(注意是大写的,小写的不要删!)删掉,否则有链接错误,chkesp链接不上什么的。

WDK开发手册V1.0

WDK开发手册 VERSION 1.0目录第一章WEBTOP剖析 (1)1.1WEBTOP组成 (1)1.2WEBTOP配置和部署 (3)1.2.1 Application Layers (3)1.2.2 WEBTOP目录结构 (5)1.2.3 实战WEBTOP (5)第二章WDK概述 (13)2.1WDK架构层 (13)2.2WDK使用方式 (14)2.3WDK目录结构 (14)2.4WDK应用组成元素 (15)第三章COMPONENTS (17)3.1C OMPONENT组成 (17)3.2C OMPONENT实例 (17)3.2.1 component definition (17)3.2.2 component forms (18)3.2.3 component behavior class (18)3.3如何调用C OMPONENT (22)3.3.1 通过URL来调用 (22)3.3.2 从action调用component (22)3.3.3 从JavaScript调用component (22)3.4如何在C OMPONENT内或者C OMPONENT之间导航 (22)3.4.1 Navigating within a component (22)3.4.2 Jumping to a component (22)3.4.3 Nesting to another component (22)3.4.4 Returning to the calling component (23)3.4.5 Returning to a component, then jumping to another (23)3.5C OMPONENT处理流程 (23)第四章CONTAINERS (24)4.1C ONTAINERS概述 (24)4.2C ONTAINER T YPE (24)4.3C ONTAINERS实战 (25)4.3.1 container配置 (25)4.3.2 container JSP (28)4.3.3 container Behaviour 类 (30)第五章ACTIONS (32)5.1A CTION DEFINITION (32)5.2A CTION E XCUTION C LASS (33)5.3A CTION 测试 (35)第六章CONFIGURATION SERVICE (36)6.1C ONFIGURATION S ERVICE (36)6.2C REATE A CUSTOM QUALIFIER (37)第七章ROLES (40)7.1R OLE概述 (40)7.2R OLE M ODEL (40)第八章CONTROLS (41)8.1C ONTROL概述 (41)8.2C ONTROL实例 (42)8.2.1 Control类 (42)8.2.2 ControlTag类 (42)8.2.3 tld文件定义 (42)8.2.4 测试 (44)第九章CONTENT TRANSFER (46)9.1C ONTENT T RANSFER概述 (46)9.2HTTP C ONTENT T RANSFER (46)9.3UCF (46)第一〇章TBO和SBO在WDK中的运用 (48)10.1WDK调用SBO (48)10.2WDK调用TBO (48)第一一章WDK其他内容 (49)11.1L OCALE S ERVICE (49)11.2WDK A UTHENTICATION管理 (49)第一二章附录 (51)12.1WDK组件清单 (51)12.2说明 (54)第一章WEBTOP剖析这一章将通过剖析一个已有的WDK应用——WEBTOP,来熟悉一些基本的WDK概念。

WDK_MiniFilter Design Guide_ZH

Filter管理器和MiniFilter驱动架构Filter管理器是一个内核模式驱动,它遵照遗留文件系统过滤模型并暴露了FSFD中必需的一般功能。

利用这些功能,第三方开发者可以写MiniFilter驱动,这样的驱动比遗留FSFD更易于开发,因此缩短了开发过程同时制造出更高质量、更灵活的驱动。

本章包括:一、Filter管理器概念Filter管理器随Windows一起被安装,但它只在一个MiniFilter驱动被加载时才会起作用。

Filter管理器绑定到目标卷的文件系统栈上。

MiniFilter驱动通过向Filter管理器注册,间接绑定到文件系统栈上,从而过滤I/O操作。

遗留过滤驱动相对于其他过滤驱动在文件系统I/O栈中的位置,来由系统启动时由它的加载顺序组决定的。

例如,一个antivirus过滤驱动在栈中的位置应该高于一个replication过滤驱动,因而它能在文件被复制到远程服务器之前检测并消除文件中的病毒。

因此,FSFilter Anti-Virus 加载顺序组中的过滤驱动要先于FSFilter Replication组中的过滤驱动加载。

每一个加载顺序组都有一个相应的系统定义的类和类GUID(在INF文件中要使用)。

像遗留过滤驱动一样,MiniFilter驱动的绑定也按照一个特定的顺序。

不过,这个顺序是由一个叫altitude的唯一标识符决定的。

MiniFilter驱动在特定卷上的一个特定altitude的绑定,被称为这个MiniFilter驱动的一个instance。

MiniFilter驱动的altitude确保它的实例总是加载到相应的位置,它决定Filter管理器以什么顺序来调用MiniFilter驱动来处理I/O。

Altitudes由微软分配和管理。

下图展示了一个用Filter管理器简化后的I/O栈和三个MiniFilter驱动。

由Filter管理器和MiniFilter驱动构成的简化版I/O栈MiniFilter驱动能过滤基于IRP的I/O操作、fast I/O和FSFilter 回调操作。

C++第三十三篇--研究一下Windows驱动开发(一)内部构造介绍

C++第三⼗三篇--研究⼀下Windows驱动开发(⼀)内部构造介绍因为⼯作原因,需要做⼀些与⽹卡有关的测试,其中涉及到了驱动这⼀块的知识,虽然程序可以运⾏,但是不搞清楚,⼼⾥总是不安,觉得没理解清楚。

因此想看⼀下驱动开发。

查了很多资料,看到有⼈推荐Windows驱动开发技术详解这本书,因此本篇⽂章也是基于这本书进⾏学习的。

有些图⽚也是按照书上⾃⼰画的。

Windows操作系统⽰意图⾸先,需要下载相应的⼯具,将环境搭建起来,VS和WDK,由于我已经安装了VS2017,所以需要找对应版本的WDK()。

如果想要查OS的版本,可以WIN+R输⼊winver就可以看到OS的版本了,⽼版本对应链接:安装好了后就需要写⼀下程序了,参考链接:Windows架构简图Win32⼦系统将API函数转化为Native API函数。

在Native API接⼝中,已经没有了⼦系统的概念,它将这种调⽤转化为系统服务函数的调⽤。

其中,Native API穿过了⽤户模式和内核模式的界⾯,达到了内核模式。

系统服务函数通过I/O管理器将消息传递给驱动程序。

在内核模式下,执⾏体组件提供了⼤量的内核函数供驱动程序调⽤。

内核主要负责进程、线程的调度情况。

驱动程序通过硬件抽象层与具体硬件进⾏操作。

Windows API分为三类,分别是USER函数、GDI函数和KERNEL函数。

》USER函数:这类函数管理窗⼝、菜单、对话框和控件。

》GDI函数:这类函数在物理设备商执⾏绘图操作。

》KERNEL函数:这类函数管理⾮GUI资源,例如:进程、线程、⽂件和同步服务等。

可以发现Windows系统⽬录中有对应的三个系统⽂件,分别是USER32.dll、GDI32.dll和KERNEL32.dll。

这三个⽂件提供了以上三类API的接⼝。

当应⽤程序加载的时候,操作系统出了将应⽤程序加载到内存中,同时将以上三个DLL⽂件加载到内存中。

1、Native API⼤部分Win32⼦系统的API,都通过Native API实现的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档