Windows驱动开发入门

合集下载

Windows文件系统过滤驱动开发教程(第二版)

Windows文件系统过滤驱动开发教程(第二版)
同时最新的测试表明,在 Vista 系统上,sfilter 也可以正常的运行。 安装配置 ddk 和在 vc 中开发驱动的方法网上有很多的介绍。ifsddk 安装之后,src 目录下的 filesys 目录下有文件 系统驱动的示例。阅读这些代码你就可以快速的学会文件系统驱动开发。 filter 目录下的 sfilter 是一个文件系统过滤驱 动的例子。另一个 filespy 完全是用这个例子的代码加工得更复杂而已。 本文为觉得代码难懂的读者提供一个可能的捷径。 如何用 ddk 编译这个例子请自己查看相关的资料。 文件系统过滤驱动编译出来后你得到的是一个扩展名为 sys 的文件。同时你需要写一个.inf 文件来实现这个驱动的安 装。我这里不讨论.inf 文件的细节,你可以直接用 sfilter 目录下的 inf 文件修改。以后我们将提供一个通用的 inf 文件. 对 inf 文件点鼠标右键弹出菜单选择“安装”,即可安装这个过滤驱动。但是必须重新启动系统才生效。这是静态加载的 情况。静态加载后如果重启后蓝屏无法启动,可以用其他方式引导系统后到 system32\drivers 目录下删除你的.sys 文 件再重启即可。安全模式无法使你避免蓝屏。所以我后来不得不在机器上装了两个系统。双系统情况下,一个系统崩溃了用 另一个系统启动,删除原来的驱动即可。 同时 xp 和 2003 版本的驱动大多可以动态加载。调试更加快捷,也请阅读相关的资料。 如果要调试代码,请安装 softice 或者 windbg,并阅读 windows 内核调试的相关文档。
Hale Waihona Puke -1. 改版序大约两年以前我在驱动开发网上发表了一组描述如何开发 Windows 文件系统过滤驱动的文章。非常庆幸这些文章能 给大家带来帮助。
原本的文章中我使用了自己编写的代码。我不打算在这里论述代码风格的优劣并发起一场辩论,无可怀疑的是,读者们 大多喜欢看到类似微软范例的代码。为此我把文章中的代码换成微软标准的文件过滤驱动范例 sfilter 的代码。赠于喜欢此 书的读者和驱动开发的后来者们。

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。

WINDOWS 7 配置驱动开发环境(wdk7.60)

WINDOWS 7 配置驱动开发环境(wdk7.60)

WINDOWS 7 配置驱动开发环境(wdk7.60)1. 安装VS2010,WDK7.60(GRMWDK_EN_7600_1)2. 新建VC 控制台项目(选择为空项目)3. 新建项目配置“driver” ,点击下拉按钮-点击(配置管理器)输入名称(Driver Debug)点击确定就可以了,其他的不要动哦!完成后的效果!点击确定按钮之后呈现出来的画面鼠标右击工程选择属性,会弹出以下窗口!4. 设置VC++路径<我把wdk安装在E盘下>a. 配置可执行文件目录:E:\WinDDK\7600.16385.1\bin\x86;b. 配置包含目录:E:\WinDDK\7600.16385.1\inc\ddkE:\WinDDK\7600.16385.1\inc\E:\WinDDK\7600.16385.1\inc\apic. 配置库目录: E:\WinDDK\7600.16385.1\lib\win7\i3865新建C/C++文件不然无C/C++设置选项<刚开始我们创建了一个空的项目所以项目里没有c++文件,现在要做的就是在空的项目-源文件-添加一个新建项c++文件>常规目标文件扩展名:.sys //必选6. 设置C/C++选项常规选项卡1 调试信息格式(C7 兼容(/Z7) //可选2 警告等级(2 级(/W2) //可选3 将警告视为错误(是(/wx) //可选优化选项卡优化(禁用/Od) //可选预处理器预处理器定义:WIN32=100;_X86_=1;WINVER=0x501;DBG=1 //必选如果是Release,那么可想而知,不需要DBG=1代码生成启用最小重新生成:否//可选基本运行时检查:默认值//可选运行时库:多线程调试(/MTd) 或多线程(/MT) //建议选<本人选择的是多线程调试(/MTd)>缓冲区安全检查:否//可选(可避免出现LINK : error LNK2001: 无法解析外部符号__security_cookie)高级调用约定__stdcall(/Gz) //必选7. 链接器设置常规启用增量链接:否(/INCREMENTAL:NO) //建议选上忽略导入库:是// 可选( 设置为此值时,必须在附加库目录中加:E:\WinDDK\7600.16385.1\lib\win7\i3865 这样项目就不会依赖IDE 环境的设置)如果否( 设置为此值时,将依赖IDE 的环境的相关设置)输入附加依赖项ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB //必选//NT式驱动ntoskrnl.lib WDM式驱动wdm.lib( HalXXX 函数在Hal.lib,WmiXXX 函数在wmilib.lib ,NdisXXX函数在ndis.lib ) ( 必要时需要增加微软的标准库MSVCRT.LIB MSVCRTD.LIB(调试库) LIBCMT.LIBIBCMTD.LIB(调试库) )( 如果源码中有source 文件,那么该文件的TARGETLIBS 字段会列出该项目需要的库)忽略所有默认库:是(/NODEFAULTLIB) //必选清单文件:启用用户账户控制(UAC)否//必选不然会出现>LINK : fatal error LNK1295: “/MANIFESTUAC”与“/DRIVER”规范不兼容;链接时不使用“/MANIFESTUAC”调试:生成调试信息是(/DEBUG) //可选生成映像文件:是(/MAP) //可选映像文件名:$(TargetDir)$(TargetName).map //可选系统(System)子系统: 控制台(/SUBSYSTEM:CONSOLE) //必选堆栈保留大小:4194304 //可选堆栈提交大小:4096 //可选驱动程序: 驱动程序(/DRIVER) //必选高级:入口点:DriverEntry //必选随机基址:清空//把框里的数据删掉。

Windows驱动程序开发环境配置

Windows驱动程序开发环境配置

Windows驱动程序开发笔记一、WDK与DDK环境最新版的WDK 微软已经不提供下载了这里:https:/// 可以下并且这里有好多好东东!不要走进一个误区:下最新版的就好,虽然最新版是Windows Driver Kit (WDK) 7_0_0,支持windows7,vista 2003 xp等但是它的意思是指在windows7操作系统下安装能编写针对windows xp vista的驱动程序,但是不能在xp 2003环境下安装Windows Driver Kit (WDK) 7_0_0这个高版本,否则你在build的时候会有好多好多的问题.上文build指:首先安装好WDK/DDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库如果你是要给xp下的开发环境还是老老实实的找针对xp的老版DDK吧,并且xp无WDK 版只有DDK版build自己的demo 有个常见问题: 'jvc' 不是内部或外部命令,也不是可运行的程序。

解决办法:去掉build路径中的空格。

二、下载 WDK 开发包的步骤1、访问Microsoft Connect Web site站点2、使用微软 Passport 账户登录站点3、登录进入之后,点击站点目录链接4、在左侧的类别列表中选择开发人员工具,在右侧打开的类别:开发人员工具目录中找到Windows Driver Kit (WDK) and Windows Driver Framework (WDF)并添加到您的控制面板中5、添加该项完毕后,选择您的控制面板,就可以看到新添加进来的项了。

Windows下设备驱动程序的开发方法

Windows下设备驱动程序的开发方法

目录一、驱动开发环境的搭建 (1)1.1 关于DDK (1)1.2 关于驱动程序的编译 (1)1.3关于驱动程序的运行 (2)二、驱动程序的结构 (3)2.1 驱动程序的头文件 (3)2.2 驱动程序的入口点 (3)2.3 创建设备例程 (4)2.4 卸载驱动例程 (5)2.5 派遣例程 (6)三、编写驱动程序的基础知识 (6)3.1 内核模式下的字符串操作 (6)3.2 内核模式下各种开头函数的区别 (8)3.3 一个示例程序 (10)3.4 补充说明 (10)四、在驱动中使用链表 (10)4.1 内存的分配与释放 (10)4.2 使用LIST_ENTRY (12)4.3 使用自旋锁 (12)五、在驱动中读写文件 (15)5.1 使用OBJECT_ATTRIBUTES (15)5.2 创建、打开文件 (16)5.3 读写文件操作 (16)5.4 文件的其它相关操作 (18)六、在驱动中操作注册表 (18)6.1 创建、打开注册表 (19)6.2 读写注册表 (20)6.3 枚举注册表 (21)七、在驱动中获取系统时间 (21)7.1 获取启动毫秒数 (21)7.2 获取系统时间 (22)八、在驱动中创建内核线程 (23)8.1 创建内核线程 (23)8.2 关于线程同步 (24)九、初探IRP (25)9.1 IRP的概念 (25)9.2 IRP的处理 (26)9.3 IRP派遣例程示例 (27)十、驱动程序与应用层的通信 (29)10.1 使用WriteFile通信 (29)10.2 使用DeviceIoControl进行通信 (32)十二、驱动程序开发实例 (33)12.1 NT驱动程序 (33)12.2 WDM驱动程序 (35)十三、参考资料 (41)一、驱动开发环境的搭建1.1 关于DDK开发驱动程序必备的一个东西就是DDK(Device Development Kit,设备驱动开发包),它跟我们在ring3常听到的SDK差不多,只不过它们分别支持开发不同的程序而已。

Windows10WDF驱动初探(一)开发环境的安装

Windows10WDF驱动初探(一)开发环境的安装

Windows10WDF驱动初探(⼀)开发环境的安装
开发准备
开发⼯具:Visual Studio 2019 Professional
主机:Windows 10 专业版 21H1
⽬标机:Windows 10 专业版 21H1
虚拟机: Hyper-V
1.安装VS 2019,安装时选择“使⽤C++的桌⾯开发”(此处有坑,下⾯填)。

*开发驱动不需要通⽤Windows平台开发,只选择C++那个即可。

2.安装适⽤于系统版本的Windows SDK(可以在VS Installer中的单个组件中安装)。

3.安装适⽤于系统版本的WDK。

填坑时间:
WDK 默认启⽤了 Spectre 缓解,但需要为要开发的每个体系结构将 Spectre 缓解库安装在 Visual Studio 中。

此外,开发适⽤于
ARM/ARM64 的驱动程序还需要这些体系结构的⽣成⼯具也安装在 Visual Studio 中。

若要查找这些项,需要知道系统上安装的 MSVC 的最新版本。

若要查找系统上安装的最新版 MSVC,请在 Visual Studio 安装程序中转到“⼯作负荷”页,在右侧窗格的“安装详细信息”下展开“使⽤ C++ 的桌⾯开发”,然后找到“MSVC v142 - VS 2019 C++ x64/x86 ⽣成⼯具(V14.xx)”(请注意,其中的 xx 应该就是可⽤的最⾼版本)。

括号⾥可能不是Vxx.xx,⽽是最新!直接搜索最新,选择想要的⽣成⼯具和库安装即可。

#Windows文件系统过滤器之微过滤器驱动开发指南

#Windows文件系统过滤器之微过滤器驱动开发指南

微过滤器驱动开发指南0.译者序对我来说,中文永远是最美,最简洁,最精确和最高雅的文字。

本文翻译仅仅用做交流学习。

我不打算保留任何版权或者承担任何责任。

不要引用到赢利出版物中给您带来版权官司。

本文的翻译者是楚狂人,如果有任何问题,,或者是QQ16191935,或者是MSN 。

我翻译此文出于对文件系统技术的兴趣。

这就是新的文件系统过滤接口。

其实也不算什么新的东西,微软开发了另一个“旧模型的”过滤驱动,称之为过滤管理器<Filter Manager)。

从而提供了一系列新的接口来让你开发新的过滤器。

确实这套接口变简单清晰了。

你至少避免了包含无数个信息的IRP,避免了请求在各个部件中循环的发来发去,一个分发例程中处理无数中情况,一不小心系统崩溃。

我不知道花了多少时间才弄明白一个简单的缓冲读请求从用户到过滤到文件系统和缓冲管理器,虚拟内存管理器之间的关系!现在你也许不需要再管他们了,仅仅做好自己的过滤工作就可以。

这套接口强大吗?能实现你想要的功能吗?你很快就发现你没有研究过sfilter就看不懂Minifilter,或者是还得从sfilter开始做起更灵活一点。

微软就是这样,拿僵硬而且也不简单的东西来“简化”强大灵活但是设计上一团糟的东西,对于你来说是两者都必须学习,最后你的脑子被微软塞得满满的,不过没关系,我们已经习惯了.此文的原文是《Filter Driver Development Guide》,出自微软的网站。

我在以下这个地址下载得到此文:我尽量在翻译中使文章保持原貌。

如果您认为此文无法理解,建议您首先阅读旧的文件过滤驱动的相关资料。

我认为必须有文件系统和windows驱动的相关知识,才能阅读此文。

我未必总是使用规范的名词,但我总是使用最容易理解的名词。

一些常用的可能不翻译,比如IRP,MDL,有驱动开发经验的人应该可以理解。

另一些可能采用中文<英文)的方式。

一些解释如下:例程<Routine):我不懂得例程和函数有什么不同。

windowsce6.0入门详解(环境搭建系统开发起步)

windowsce6.0入门详解(环境搭建系统开发起步)

Windows CE 入门详解(环境搭建内核配置和应用开发起步)武汉众嵌科技有限公司修订历史记录A - 增加M - 修订D - 删除一、安装开发环境 ..................................... 错误!未定义书签。

A)按下列顺序安装所需软件............................ 错误!未定义书签。

B)安装说明.......................................... 错误!未定义书签。

C)装中可能出现的问题及解决方法...................... 错误!未定义书签。

二、WINDOWS CE 内核定制 .............................. 错误!未定义书签。

A)基W INDOWS CE产品开发流程大致分为以下几个阶段...... 错误!未定义书签。

1. 硬件设计......................................... 错误!未定义书签。

2. 选定BSP ......................................... 错误!未定义书签。

3. 获得驱动程序..................................... 错误!未定义书签。

4. 剪裁系统内核..................................... 错误!未定义书签。

5. 导出SDK ......................................... 错误!未定义书签。

B)详细制作流程...................................... 错误!未定义书签。

1. 新建立一个OS Design工程......................... 错误!未定义书签。

2. 建立工程......................................... 错误!未定义书签。

Windows7+WDK+VS2010+VisualDDK驱动开发环境搭建

Windows7+WDK+VS2010+VisualDDK驱动开发环境搭建

[置顶]Windows7+WDK+VS2010+VisualDDK驱动开发环境搭建(菜鸟的经验)分类:驱动开发2011-08-12 23:30 863人阅读评论(3) 收藏举报自己在研究驱动开发,第一步就是开发环境的搭建,网上已有很多的教程一,我也是按着教程一步一步搭建的,但在搭建过程的过程当中遇到一些问题,也花了我不少时间。

第一个难题就是,我是Windows7+VS2010+WDK的开发环境。

首先我参考了网上的一篇文章:/guojingjia2006/archive/2011/03/19/142211.html WINDOWS 7 配置驱动开发环境(wdk7.60)1. 安装VS2010,WDK7.60(GRMWDK_EN_7600_1)2. 新建VC 控制台项目(选择为空项目)3. 新建项目配置“driver” ,点击下拉按钮-点击(配置管理器)输入名称(driver)点击确定就可以了,其他的不要动哦!完成后的效果!点击确定按钮之后呈现出来的画面鼠标右击新建的driver属性,会弹出以下窗口!4. 设置VC++路径<我把wdk安装在E盘下>a. 配置可执行文件目录:E:\WinDDK\7600.16385.1\bin\x86;b. 配置包含目录:E:\WinDDK\7600.16385.1\inc\ddkE:\WinDDK\7600.16385.1\inc\E:\WinDDK\7600.16385.1\inc\api c. 配置库目录: E:\WinDDK\7600.16385.1\lib\win7\i3865新建C/C++文件不然无C/C++设置选项<刚开始我们创建了一个空的项目所以项目里没有c++文件,现在要做的就是在空的项目-源文件-添加一个新建项c++文件>常规目标文件扩展名:.sys //必选6. 设置C/C++选项常规选项卡1 调试信息格式(C7 兼容(/Z7) //可选2 警告等级(2 级(/W2) //可选3 将警告视为错误(是(/wx) //可选优化选项卡优化(禁用/Od) //可选预处理器预处理器定义:WIN32=100;_X86_=1;WINVER=0x501;DBG=1 //必选代码生成启用最小重新生成:否//可选基本运行时检查:默认值//可选运行时库:多线程调试(/MTd) 或多线程(/MT) //建议选<本人选择的是多线程调试(/MTd)>缓冲区安全检查:否//可选(可避免出现LINK : error LNK2001: 无法解析外部符号__security_cookie)高级调用约定__stdcall(/Gz) //必选7. 链接器设置常规启用增量链接:否(/INCREMENTAL:NO) //建议选上忽略导入库:是// 可选( 设置为此值时,必须在附加库目录中加:E:\WinDDK\7600.16385.1\lib\win7\i3865 这样项目就不会依赖IDE 环境的设置)如果否( 设置为此值时,将依赖IDE 的环境的相关设置)输入附加依赖项ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib; ndis.lib;MSVCRT.LIB;LIBCMT.LIB //必选//NT式驱动ntoskrnl.lib WDM式驱动wdm.lib( HalXXX 函数在Hal.lib,WmiXXX 函数在wmilib.lib ,NdisXXX函数在ndis.lib ) ( 必要时需要增加微软的标准库MSVCRT.LIB MSVCRTD.LIB(调试库)LIBCMT.LIBIBCMTD.LIB(调试库) )( 如果源码中有source 文件,那么该文件的TARGETLIBS 字段会列出该项目需要的库)忽略所有默认库:是(/NODEFAULTLIB) //必选清单文件:启用用户账户控制(UAC)否//必选不然会出现>LINK : fatal error LNK1295:“/MANIFESTUAC”与“/DRIVER”规范不兼容;链接时不使用“/MANIFESTUAC”调试:生成调试信息是(/DEBUG) //可选生成映像文件:是(/MAP) //可选映像文件名:$(TargetDir)$(TargetName).map //可选系统(System)子系统: 控制台(/SUBSYSTEM:CONSOLE) //必选堆栈保留大小:4194304 //可选堆栈提交大小:4096 //可选驱动程序: 驱动程序(/DRIVER) //必选高级:入口点:DriverEntry //必选随机基址:清空//把框里的数据删掉。

李银辉windows驱动开发教程

李银辉windows驱动开发教程

李银辉windows驱动开发教程李银辉Windows驱动开发教程在计算机领域中,驱动程序是操作系统与硬件设备之间的桥梁,起到了关键的作用。

Windows操作系统中的驱动开发,是指为硬件设备编写相应的驱动程序,以实现操作系统与设备的通信和协同工作。

本篇文章将介绍李银辉编写的Windows驱动开发教程,帮助读者了解和掌握该领域的知识和技术。

一、什么是Windows驱动开发?Windows驱动开发是指为Windows操作系统编写设备驱动程序的过程。

驱动程序是操作系统的核心组成部分,负责管理和控制计算机硬件设备的工作。

通过编写驱动程序,可以实现对硬件设备的访问和控制,使其能够与操作系统无缝协同工作。

二、为什么需要学习Windows驱动开发?随着计算机技术的不断发展,硬件设备的种类和数量也在不断增加。

为了更好地支持和兼容各种硬件设备,Windows操作系统提供了丰富的驱动开发接口和工具。

学习Windows驱动开发可以帮助我们理解和掌握操作系统与硬件设备之间的交互原理,为开发高性能、高可靠性的驱动程序提供基础。

三、李银辉Windows驱动开发教程的特点作为国内著名的Windows驱动开发专家,李银辉编写的驱动开发教程具有以下特点:1.系统全面:李银辉的教程从驱动开发的基础知识开始讲解,逐步深入,涵盖了驱动程序开发的方方面面。

读者可以系统地学习和掌握驱动开发的各个环节和技术。

2.实践性强:李银辉的教程以实际案例为基础,通过编写具体的驱动程序来讲解相关的知识和技术。

读者可以通过实际的编程练习,加深对驱动开发原理和方法的理解。

3.案例丰富:李银辉的教程提供了大量的案例代码和实验,覆盖了多种设备类型和应用场景。

这些案例可以帮助读者更好地理解和应用所学知识,提升驱动开发的实际能力。

4.实用性强:李银辉的教程注重实用性,重点介绍了一些常见的驱动开发技术和工具,以及解决实际问题的方法。

读者可以通过学习这些内容,提高自己的驱动开发水平。

windows驱动开发教程

windows驱动开发教程

windows驱动开发教程Windows驱动开发是指在Windows操作系统下编写、调试和部署驱动程序的过程。

驱动程序是操作系统的核心组成部分,它负责与硬件设备通信,使得操作系统能够正确地识别、管理和控制硬件设备。

在本教程中,我们将介绍Windows驱动开发的基本概念、工具和流程。

首先,为了进行Windows驱动开发,我们需要准备好相应的开发工具。

其中最重要的工具是Windows Driver Kit(WDK),它包含了用于驱动开发的各种工具和库文件。

我们可以从微软官方网站上下载并安装最新版本的WDK。

接下来,我们需要熟悉驱动程序的基本概念。

在Windows中,驱动程序可以分为内核驱动和用户模式驱动。

内核驱动运行在操作系统的内核空间,具有更高的权限和更广泛的硬件访问能力;而用户模式驱动则运行在用户空间,通过系统调用与内核驱动进行通信。

我们需要了解如何编写和编译这两种类型的驱动程序,并了解它们的工作原理和特点。

在编写驱动程序之前,我们还需要了解一些基本的Windows内核编程概念,例如驱动对象模型(Driver Object Model)、设备对象模型(Device Object Model)和驱动程序接口(Driver Interface)。

这些概念是驱动程序的基础,对于理解和设计驱动程序非常重要。

接下来,我们将介绍如何使用WDK的工具和库文件来编写驱动程序。

我们可以使用Visual Studio编写驱动程序的源代码,并使用WDK的编译工具将源代码编译成驱动程序二进制文件。

在编译过程中,我们需要配置驱动程序的环境和依赖项,并确保编译成功。

在编写和编译驱动程序之后,我们需要进行驱动程序的调试和部署。

对于驱动程序的调试,我们可以使用WDK提供的调试工具和技术,例如Kernel-Mode Debugging和WinDbg。

对于驱动程序的部署,我们需要将驱动程序二进制文件和相关的配置文件复制到操作系统的指定目录,并注册驱动程序的信息到操作系统的驱动程序数据库。

Windriver 快速说明书

Windriver 快速说明书

选择硬件:• 从开始菜单里,选择WinDriver|Driver Wizard,运行DriverWizard程序。

DriverWizard将会在你的机器上显示所有的即插即用设备。

• 对于即插即用设备: 从列表中选择你的硬件设备。

• 对于非即插即用设备: 从列表中选择“ISA”(你的鼠标,键盘,内存等都是ISA设备) 。

谁必须用WinDriver?1. 硬件开发者--用这个驱动程序向导来快速测试你的新硬件。

2. 软件开发者 --用这个驱动程序向导来产生设备驱动代码驱动你的硬件。

用 WinDriver 工具来检测和调试你的驱动程序。

.WinDriver支持哪个操作系统?1. WinDriver现在支持 Windows 95, 98, NT, 2000, Windows CE, Linux, Solaris和 VxWorks. 检查一下 RFTech网址看看在操作系统支持上是否有新的升级。

2. 利用WinDriver,你写一样的驱动程序将会运行在以上所有的平台上--只要重新编译即可运行。

学习WinDriver的方式,请看 WinDriver技术白皮书。

在哪获得更多深入的资料?1. 要想得到WinDriver技术白皮书、更深入的资料和价值30天的免费使用,请看 KRFTech 网址:/dnload.html2. 完整的 WinDriver指南可以从/manuals.html 下载。

六步建立设备驱动程序:快速入门指南安装:• 把硬件装置插入到PC机上• 安装 WinDriver。

五分钟学会写设备驱动程序.检测 / 定义硬件:• Driver Wizard 将自动测试即插即用设备资源(I/O 范围, 内存范围以及中断)。

你可以手动定义寄存器。

•对于非即插即用设备: 你需要动定义硬件资源。

.. .BYTE MyCard_ReadStatusRegister (MyCard_HANDLE hMyCard) {BYTE data;MyCard_ReadWriteBlock(hMyCard, MyCard_StatusRegister_SPACE, MyCard_StatusRegister_OFFSET, &data, sizeof(BYTE), MyCard_MODE_BYTE); 测试硬件:在写驱动程序之前确信你的硬件工作正常是很重要的。

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

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实现的。

Windows驱动开发学习记录-遍历内核已加载模块之一(使用DriverSection)

Windows驱动开发学习记录-遍历内核已加载模块之一(使用DriverSection)

Windows驱动开发学习记录-遍历内核已加载模块之⼀(使⽤DriverSection)附另两种⽅法链接:1.关键结构体 _LDR_DATA_TABLE_ENTRY为所需要的结构体,具体说明和如何获取该结构体数据见。

现在需要的是该结构体InLoadOrderLinks,这个链表为所有已加载的内核模块的_LDR_DATA_TABLE_ENTRY结构的指针,通过遍历这个链表就可以获取所有已加载的内核模块数据,再取该结构的FullDllName或者BaseDllName即为加载的内核模块的名称和全路径。

2.结构体_LDR_DATA_TABLE_ENTRY重要成员0: kd> dt _LDR_DATA_TABLE_ENTRYnt!_LDR_DATA_TABLE_ENTRY+0x000 InLoadOrderLinks : _LIST_ENTRY+0x010 InMemoryOrderLinks : _LIST_ENTRY+0x020 InInitializationOrderLinks : _LIST_ENTRY+0x030 DllBase : Ptr64 Void+0x038 EntryPoint : Ptr64 Void+0x040 SizeOfImage : Uint4B+0x048 FullDllName : _UNICODE_STRING+0x058 BaseDllName : _UNICODE_STRING+0x068 FlagGroup : [4] UChar...... 具体详细结构见3.实现 代码如下,实测 XP 32位、Win7 64位以及Win10 64位都能Pass。

.h⽂件1//头⽂件23#if DBG4#define KDPRINT(projectName, format, ...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, projectName "::【" __FUNCTION__ "】" ##format, ##__VA_ARGS__ )5#else6#define KDPRINT(format, ...)7#endif89 typedef enum10 {11 MmTagTypeDS = 'SD'//PrintAllLoadedMoudleByDriverSection12 }MmTagType;1314 typedef struct _LDR_DATA_TABLE_ENTRY {15 LIST_ENTRY InLoadOrderLinks;16 LIST_ENTRY InMemoryOrderLinks;17 LIST_ENTRY InInitializationOrderLinks;18 PVOID DllBase;19 PVOID EntryPoint;20 ULONG SizeOfImage;21 UNICODE_STRING FullDllName;22 UNICODE_STRING BaseDllName;23 union {24 ULONG FlagGroup;25 ULONG Flags;26 };27 }LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;.cpp⽂件1//.cpp2 NTSTATUS PrintAllLoadedMoudleByDriverSection(PDRIVER_OBJECT pDriverOjbect)3 {4 NTSTATUS ntStatus = STATUS_SUCCESS;5if ((pDriverOjbect) && (pDriverOjbect->DriverSection))6 {7 ANSI_STRING asBaseDllName = { 0 };8 ANSI_STRING asFullDllName = { 0 };9 PCHAR pBaseDllNameBufer = NULL;10 PCHAR pFullDllNameBufer = NULL;11do12 {13 pBaseDllNameBufer = (PCHAR)ExAllocatePoolWithTag(PagedPool, USHORT_MAX, MmTagTypeDS);14if (pBaseDllNameBufer == NULL)15 {16 KDPRINT("【PrintLoadedModule】", "pBaseDllNameBufer Allocate Memory Failed!\r\n");17 ntStatus = STATUS_INSUFFICIENT_RESOURCES;18break;19 }20 RtlZeroMemory(pBaseDllNameBufer, USHORT_MAX);21 pFullDllNameBufer = (PCHAR)ExAllocatePoolWithTag(PagedPool, USHORT_MAX, MmTagTypeDS);22if (pFullDllNameBufer == NULL)23 {24 KDPRINT("【PrintLoadedModule】", "pFullDllNameBufer Allocate Memory Failed!\r\n");25 ntStatus = STATUS_INSUFFICIENT_RESOURCES;26break;27 }28 RtlZeroMemory(pFullDllNameBufer, USHORT_MAX);29 RtlInitEmptyAnsiString(&asBaseDllName, pBaseDllNameBufer, USHORT_MAX);30 RtlInitEmptyAnsiString(&asFullDllName, pFullDllNameBufer, USHORT_MAX);31 PLDR_DATA_TABLE_ENTRY pldte = (PLDR_DATA_TABLE_ENTRY)pDriverOjbect->DriverSection;32if (pldte != NULL)33 {34const PLIST_ENTRY pListHeaderInLoadOrder = pldte->InLoadOrderLinks.Flink;35if (pListHeaderInLoadOrder != NULL)36 {37 ULONG ulCount = 0;38 PLIST_ENTRY pListTemp = pListHeaderInLoadOrder;39do40 {41 PLDR_DATA_TABLE_ENTRY pldteTemp = (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD(42 pListTemp,43 LDR_DATA_TABLE_ENTRY64,44 InLoadOrderLinks);45if ((pldteTemp != NULL) &&46 (pldteTemp->BaseDllName.Buffer != NULL) &&47 (pldteTemp->FullDllName.Buffer != NULL))48 {49//1.直接通过DbgPrintEx的 %wZ参数打印 BaseDllName和FullDllName时在XP系统下当时⽂件路径50// 中有中⽂的时候会截断,故先转化为ANSI类型再打印,如不需要打印则可将相关ANSI类型的定义51// 初始化以及转换去掉52//2.节点遍历过程中有⼀个空节点,其中字符串的Buffer为空,通过BaseDllName.Buffer以及53//FullDllName.Buffer为空来跳过54//KDPRINT("【PrintLoadedModule】","Name:%-30wZ Path:%wZ\r\n",55// &pldteTemp->BaseDllName, &pldteTemp->FullDllName);56 RtlUnicodeStringToAnsiString(&asBaseDllName, &pldteTemp->BaseDllName, false);57 RtlUnicodeStringToAnsiString(&asFullDllName, &pldteTemp->FullDllName, false);58 KDPRINT("【PrintLoadedModule】", "Name:%-30Z Path:%-130Z Base:0x%p\r\n",59 &asBaseDllName, &asFullDllName, pldteTemp->DllBase);6061 ulCount++;62 }63 pListTemp = pListTemp->Flink;6465 } while (pListTemp != pListHeaderInLoadOrder);6667 KDPRINT("【PrintLoadedModule】", "共计%d个内核模块!\r\n", ulCount);68 }69 }70 } while (false);71if (pBaseDllNameBufer)72 {73 ExFreePoolWithTag(pBaseDllNameBufer, MmTagTypeDS);74 pBaseDllNameBufer = NULL;75 }76if (pFullDllNameBufer)77 {78 ExFreePoolWithTag(pFullDllNameBufer, MmTagTypeDS);79 pFullDllNameBufer = NULL;80 }81 }82return ntStatus;83 }848586 EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,87 PUNICODE_STRING pRegistryPath)88 {89 PrintAllLoadedMoudleByDriverSection(pDriverObject);90return STATUS_SUCCESS;91 }4.运⾏效果 xp 32位:Win10 64位:。

windows驱动开发入门

windows驱动开发入门
➢ 避免定义过大的栈变量 ➢ 区分nonpaged pool和paged pool ➢ 注意中断级别 ➢ 注意多线程竞争和重入 ➢ 安全字符串
主要应用场合
➢安全软件 ➢硬件驱动 ➢各种底层相关,特殊功能的软件
需要掌握的基础知识
➢汇编语言 ➢C语言 ➢Windows操作系统知识 ➢硬件相关知识
Windows驱动开发入门
Windows驱动简介 几个典型的Windows驱动 一个简单的Windows驱动例子 Windows驱动的开发、编译和调试 寒江独钓中的例子浅析 驱动编程中的注意点
键盘硬件
特定功能的实现
➢保护用户输入信息
在用户输入敏感信息时,从底层接管键盘输入,绕过任何之前的黑客程序, 将键盘输入直接交给用户处理。
➢更改按键功能
监视所有按键操作,在用户使用特定按键时调用特定功能。
➢可编程键盘
监视所有按键操作,遇到被编程按键后根据编程信息将此按键输入转为其它 按键或多个按键组合
➢WinDbg的设置
"C:\Program Files\Debugging Tools for Windows\windbg.exe" -k com:port=\\.\pipe\com_1,baud=115200,pipe
Windows驱动开发入门
Windows驱动简介 几个典型的Windows驱动 一个简单的Windows驱动例子 Windows驱动的开发、编译和调试 寒江独钓中的例子浅析 驱动编程中的注意点
WDK
➢获取WDK(免费)
/whdc/DevTools/WDK/WDKpkg.mspx
➢安装WDK ➢WDK相关文档
WDK编译环境
➢各种Windows版本 ➢Check build和Release build ➢Source和makefile文件 ➢命令行编译

WES7 快速入门指南1-2

WES7 快速入门指南1-2
Windows Embedded Standard 7 快速入门指南 1 of 4
第一章 概述
1.1 Windows Embedded Standard 7 概述
Windows Embedded Standard 7 以组件化形式提供 Windows 7 操作 系统的功能、熟悉度和稳定性,能开发人员创建运行成千上万种现有 Windows 应用程序和驱动程序的高级商务设备和消费类设备。
人注目的用户界面。 o 由 Windows Embedded Standard 专家组成的整个合作体系可帮助
确保设备制造商能够灵活地访问开发下一代设备所需的技能。
1.4 Windows Embedded Standard 7 开发流程
Windows Embedded Standard 7 开发套件一共包含三张光盘。见图 1-1,一 张 Toolkit、一张 x86 的 Bootable IBW、一张 x64 的 Bootable IBW。两张 Bootable IBW 是可启动光盘。目标设备从 Bootable IBW 光盘启动之后会加载 Image Builder Wizard(IBW),用户可以一步一步的操作 IBW,来给目标设备 安装一个系统。这个过程和安装普通的 Win7 很像不过有了更多的选择项目。 Image Builder Wizard(IBW)是运行在 Windows PE 上的,不需要去安装其他 工具直接使用 Bootable IBW 光盘就可以构建 Runtime 镜像(目标系统镜像), 这颠覆了传统嵌入式开发的方式。
For example:
Windows Media Player 11 Internet Explorer 7
Standard 7 Toolkit:

Windows10驱动开发系列(一)环境搭建

Windows10驱动开发系列(一)环境搭建

Windows10驱动开发系列(⼀)环境搭建Windows 10驱动开发系列(⼀)环境搭建1. 主机安装或者升级到windows 10系统,安装完后点击开始à设置à系统,可以查看windows版本信息,如笔者安装后查看如下:2. 主机安装vs2015,下载地址如下:安装过程较慢,请耐⼼等候,安装完成后会提⽰安装成功,之后激活vs2015。

在C:\Program Files(x86) \Microsoft Visual Studio 14.0\Common7\IDE下(笔者默认是安装在系统盘下的)双击devenv.exe启动vs2015,点击菜单栏Help->About Microsoft Visual Studio,可看到vs2015版本信息,如笔者安装后查看如下:同时点击License status会显⽰license状况,如未激活,请进⾏激活,否则试⽤期过后就⽆法使⽤vs2015了,如笔者的vs2015已经激活显⽰如下:右击此电脑->属性->⾼级系统设置,点击⾼级选项卡->环境变量,在系统变量中可以查看安装后的环境变量VS140COMNTOOLS , 如笔者查看如下:3. 安装 Windows驱动程序⼯具包 (WDK) 10安装地址:⾸先会下载wdksetup.exe,然后双击此exe进⾏安装,安装成功后打开vs2015,新建⼀个⼯程,可以看到可供创建的驱动程序模板有很多。

Applications模板:Package模板:Devices模板:WDF模板:Legacy模板:WDK 10 包含⽤于为 Windows 10⽣成、测试、调试和部署驱动程序的⼯具。

WDK 10统⼀了对移动和桌⾯设备、通⽤ Windows驱动程序的⽀持,并借助 Visual Studio提供了带有可靠部署和调试设置(包括 WinDbg)的统⼀测试体验。

在集成的环境中,你可以运⾏各种基本认证测试。

Microsoft Windows Workflow Foundation 入门

Microsoft Windows Workflow Foundation 入门

Microsoft Windows Workflow Foundation 入门:开发人员演练发布日期: 11/30/2005 | 更新日期 : 11/30/2005Dino EspositoSolid Quality Learning适用于:Microsoft Windows Workflow FoundationMicrosoft Windows Vista摘要:对于需要为Microsoft .NET 平台创建工作流驱动应用程序的开发人员而言,本文将介绍他们感兴趣的Microsoft Windows Workflow Foundation 技术和功能。

注本文撰写的对象为 Windows Workflow Foundation bet a 1。

请注意,在该技术的最终版本问世之前,内容上很可能会发生更改。

本页内容有关向Windows 平台添加工作流支持的初步知识创建第一个工作流接收和使用数据工作流运行库工作流和活动开发自定义活动计划更现实的工作流小结有关向Windows 平台添加工作流支持的初步知识Microsoft Windows Workflow F oundation (WWF) 是一个可扩展框架,用于在Windows 平台上开发工作流解决方案。

作为即将问世的Microsoft WinFX 的组成部分,Windows Workflow Foundation 同时提供了 API 和一些工具,用于开发和执行基于工作流的应用程序。

Windows Workflow Foundation 提供单个统一的模型,以便创建跨越多个类别应用程序的端到端解决方案,包括人力工作流和系统工作流。

Windows Workflow Foundation 是一个广泛且通用的工作流框架,并且从下到上、在每个级别都针对可扩展性进行了设计。

基于Windows Workflow Foundation 的解决方案,由得到Microsoft .NET 代码支持且在宿主应用程序中运行的互连组件组成。

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

接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。

为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。

我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。

编译环境:WinDDK6001.18002。

代码编辑工具:SourceInsight。

IDE:VS2005/VC6.0。

调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE
上面所有工具均来自互联网。

对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。

前者用于查看日志信息,后者用于加载驱动。

下面从最简单的helloworld说起吧。

Follow me。

驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。

两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。

DriverEntry 类似于C语言中的main函数。

它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。

我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。

但到了上层应用程序,我们是看不到中断的影子的。

说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。

64位驱动不允许内嵌汇编。

下面是我的一个helloworld的源码:
注意第16行的宏。

目前我们的驱动程序暂时不需要和应用程序通信,所以用Macro注释掉。

从这里也可以看出来,想要实现sys和exe的通信,就要编写相应的派遣函数,在本例就是各种MajorFunction。

这个驱动完成的功能很简单,加载时,打印一句话“This is helloworld”
卸载时打印另外一句话“Driver Unloaded”。

DbgPrint跟c语言中的printf类似,也是在终端上输出调试信息。

我们可以利用前面介绍的DbgView来观察输出信息。

这个小东西只有四百多k,不过功能一点都不弱。

它能查看所有的内核日志,前提是要把capture里面的capture kernel选项打上勾。

上面这个图是我debug一个驱动时候的输出信息。

对了,忘了说怎么加载驱动程序了。

Windows驱动多种多样,加载方式也各不相同。

可以编写应用程序加载,不过这就麻烦了,还需要编写exe。

如果仅仅是想做驱动,那么我建议用上面提到的srvinstw工具来加载。

具体可以参考《寒江独钓windows内核安全编程》一书。

这这本书写的非常精彩,图文并茂,尤其是谭文写的那几章,深入浅出。

到这里,一个简单的windows驱动程序就完成了。

不过这个helloworld没干任何有意义的事,仅供演示用。

接下来探讨一下驱动层和应用层的交互问题。

驱动说到底,还是为上层服务。

它们之间一般用dll动态链接库来联系。

Dll其实也应该属于应用层的东西。

它将驱动提供的功能进一步封装,然后暴露接口给应用程序,应用程序利用这些接口api,来完成驱动程序预先设定好的各项功能。

Dll的编写不是本文讨论的内容,各位可以去网上搜一下dll的知识,很简单,按照标准格式填写就好了,只不过编译的时候,VC++或者VisualStudio要选择编译目标是动态链接库。

这里重点说下dll如何来调用驱动程序的各个功能。

也许你已经猜到了,对,我们现在把DriverEntry中16行的
DRIVER_APP_COMMUNICA TE打开。

打开后大家会发现,多了5个重要的东西。

1.创建设备对象
2.创建连接符号
3.填充IRP_MJ_CREATE
4.填充IRP_MJ_CLOSE
5.填充IRP_MJ_DEVICE_CONTROL
第一个和第二个是为了让应用程序找到我编写的驱动。

把应用程序领进门。

那么这里的门牌号就是符号链接LinkString。

要是就是IRP_MJ_CREATE(上层使用CreateFile调到DriverCreate)。

回想一下CreateFile的参数:
这里的lpFileName,其实对应于驱动中的LinkName。

只不过需要做个小转换。

驱动中这个字段一般是”\\??\\helloworldLink”,有些地方也写成\\DosDevices\\helloworldLink,一个意思。

应用程序中一般写作\\\\.\\helloworldLink,具体为啥这样,我还没弄清楚。

对了,设备对象名称也有规定,\\Device\\helloworld,前面这个Device也不是随便写的,读者可以用winobj查看,凡是winobj上面显示的有的,就可以用,否则不可以用。

那么好,现在你通过CreateFile打开了驱动,打开了门,那么我怎么跟门里面的人打交道呢?这就是IoControl要做的事情。

通过预先设定好的暗号,或者叫人名,这个人名应用程序知道,驱动也知道,就可以相互通信了。

所以我们经常看到别人的驱动代码里面DriverControl是一个很大的switch,case式结构。

Dll里面用DeviceIoControl这个api,将人名、驱动需要的参数、参数长度,输出结果等都填进去,驱动程序在switch case里面就可以做出回应。

写的比较乱,有很多东西没写出来。

欢迎大家一块交流。

相关文档
最新文档