02.Windows文件系统过滤驱动开发教程(2)
自动化安装Windows驱动程序脚本

自动化安装Windows驱动程序脚本Windows操作系统是目前广泛使用的操作系统之一,它可以适应各种硬件设备的需求。
为了使这些硬件设备能够正常工作,我们需要安装相应的驱动程序。
然而,手动安装大量驱动程序可能会非常繁琐和耗时。
为了简化这一过程,让我们来介绍一种自动化安装Windows驱动程序的脚本。
首先,我们需要一个针对Windows操作系统的批处理脚本。
我们可以使用Windows自带的文本编辑器Notepad来创建脚本文件,并将其保存为批处理文件后缀(.bat)。
接下来,我们来介绍一些常见的脚本命令和语法。
1. 注释在脚本中添加注释是一种良好的编程习惯,可以使其他人更容易理解脚本的逻辑和功能。
在批处理脚本中,我们可以使用“REM”关键字来添加注释。
例如:```REM 这是一个自动化安装Windows驱动程序的脚本示例```2. 文件路径在脚本中,我们需要指定驱动程序的文件路径。
可以使用以下命令将指定路径保存到变量中:```SET driverPath=C:\path\to\driver```在后续的命令中,可以使用%driverPath%来引用该路径。
3. 安装驱动程序使用以下命令安装指定路径下的驱动程序:```start /wait pnputil.exe -i -a %driverPath%\*.inf```这个命令使用了Windows自带的工具“pnputil.exe”,通过传递驱动程序的.inf文件路径来安装驱动程序。
4. 批量安装多个驱动程序如果有多个驱动程序需要安装,我们可以使用循环来处理。
以下是一个示例:```FOR %%f IN (%driverPath%\*.inf) DO (start /wait pnputil.exe -i -a %%f)```这个命令将遍历指定路径下的所有.inf文件,并依次安装驱动程序。
5. 错误处理在自动化脚本中,错误处理是非常重要的。
我们可以使用以下语句来检查脚本中的错误:```IF %ERRORLEVEL% NEQ 0 (REM 处理错误的逻辑)```在错误处理部分,可以输出错误信息、重新尝试安装或退出脚本。
WDM驱动程序

建立驱动开发环境建立驱动开发环境,所需的软件为DriverStudio3.2 + DDK2003 + VC。
DDK建议使用最新的DDK2003,因为可以减少很多麻烦。
使用DDK2600的话,很多人反映会碰到一个编译出错的问题。
这是我使用DDK2600时碰到的同样的问题,然后在EDNchina网站上发的贴:--------------我在用DriverStudio开发驱动时,碰到了这样的问题:--------------------Configuration: KFileWrite - Win32Free--------------------d:\DESIGN~1\DRIVER~1\DRIVER~4\include\kcsq.h(35): Could not find the file csq.h.d:\DESIGN~1\DRIVER~1\DRIVER~4\include\kcsq.h(35): Could not find the file csq.h.Linking with DDK linker...LINK : fatal error LNK1181: cannot open input file 'ntstrsafe.lib' Error executing link.exe.KFileWrite.sys - 1 error(s), 0 warning(s)关键是这个ntstrsafe.lib.我在网上一搜,碰到这种问题的人还不少呢,虽然解决方法是很多,但都差不了几个字,要么从DDK2003那拷一个,或者是在project-->setting-->link下去掉对ntstrsafe.lib的链接,也不知他们自己到底有没有试,我在project-->setting-->link下压根就没看到ntstrsafe.lib几个字...很郁闷啊--------------网上所说的解决方法是对的,但没有说清楚,使人无法一时明白。
installshield 加载windows2012驱动方法

installshield加载windows server 2012 r2 驱动方法加载步骤如下:1.在\FronwareToolsInstall\Source\Drivers\目录下的各个驱动文件加下(如viostor、netkvm、virtmouse等等)分别新建一个目录(如文件夹名为W12)用于装载windows server 2012的驱动文件(这里将Wnet的驱动文件复制进去即可)。
2.打开FronwareTools - OEM\ FronwareTools -FW文件,点击Project Assistant 选择,进入界面如下,3.展开Drivers文件夹,分别点击这几个驱动文件夹,右边的界面会显示所有的驱动文件,点击,将windows server 2012的驱动文件(即W12里面的文件)添加进来,由于windows server 2012只有64位,我们只需要添加64位的驱动文件即可,添加后会提示,选择No to All 即可。
3文件添加完成以后,点击,进入界面点击“Components”,分别添加Drivers_ac97_W2012_x64、Drivers_fronmouse_W2012_x64、Drivers_fronram_W2012_x64、Drivers_fronserial_W2012_x64、Drivers_virtqxl_W2012_x64、Drivers_netkvm_W2012_x64、Drivers_virstor_W2012_x64、Drivers_virsscsi_W2012_x64,这几个目录。
分别点击这几个目录,将右侧“属性”中的“Condition”设置为“VersionNT64=603”。
然后展开这几个目录,例如点击“file”,右侧空白处点右键选择“add”,分别添加相应的驱动文件夹下名为“W12”里面的驱动文件,完成即可。
4.文件添加完成后,点击编译调试即可。
windows设备驱动程序WDF开发(1)

windows设备驱动程序WDF开发(1)武安河另外讲WDM的书是《windows 2000/xp wdm设备驱动开发》KDMF 构建在WDM之上,内核级,sys⽂件UDMF ⽤户级,dll⽂件第1章 Windows 2000和WDM驱动程序1.中断优先级(IRQL): 32个中断级别,可打断0 : PASSIVE_LEVEL, 常规线程1:APC_LEVEL, 异步调⽤过程2:DISPATCH_LEVEL, 延迟过程调⽤3~26: DIRQL, 硬件中断2. 在DISPATCH_LEVEL 运⾏代码时,访问⾮分页内存是⼀个根本原则第2章 KMDF驱动程序框架1. 环境变量结构_DEVICE_CONTEXT{}pDeviceContext = GetDeviceContext(Device);2. 创建对象的⽅法KMDF控制的对象⽣命周期:WDFDRIVER, WDFDEVICE, WDFFILEOBJECT, WDFREQUEST (IRP)3. KMDF结构1)DriverEntry:设置 EvtDeviceAdd (安装时调),WdfDriverCreate 创建驱动对象2) EvtDriverDeviceAdd: 新设备被枚举时会调⽤,职责:创建设备对象,I/O队列,GUID接⼝,事件回调例程,WdfDeviceCreate, WdfDeviceCreateDeviceInterface, WdfDeviceInitSetExclusive(DeviceInit,TRUE); // 独占,只允许⼀个应⽤打开WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchSequential); // IO为串⾏ WdfIoQueueCreate // io队列WdfDeviceCreateDeviceInterface // guid接⼝3)I/O处理例程WDF_FILEOBJECT_CONFIG_INIT(&FileConfig,EvtDeviceFileCreate, EvtFileClose, EvtFileCleanup);ioQueueConfig.EvtIoDeviceControl = PCI9056WDF_EvtIoDeviceControl; // DeviceIoControl 调⽤ioQueueConfig.EvtIoRead = PCI9056WDF_EvtIoRead; // ReadFileioQueueConfig.EvtIoWrite = PCI9056WDF_EvtIoWrite; // WriteFile第3章基本对象1. WDFREQUEST: I/O请求,即IRPWdfRequestComplete :完成请求WdfRequestCompleteWithInformation :完成请求,完成的传输字节数WdfRequestRetrieveInputBuffer: 获取输⼊缓冲器地址WdfRequestRetrieveInputMemory: 获取输⼊缓冲器地址,形式为WDFMEMORYWdfRequestRetrieveInputWdmMdl: 获取输⼊缓冲器地址,形式为MDLWdfRequestGetIoQueue:返回队列对象WdfRequestGetFileObject: 返回⽂件对象WdfRequestGetInformation: 完成的传输字节数WdfRequestCreate: 创建IO请求2. IO请求(IRP)基本操作取消IO请求:编写取消例程向下传递IO请求3. WDFQUEUE 队列, WdfIoQueueDispatchSequential 串⾏初始化默认队列 WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUEWdfIoQueueCreateWdfIoQueueStart : 启动接收和分发IRPWdfIoQueueStop:暂停分发,但还接收WdfIoQueueDrain: 停⽌接收,但分发WdfIoQueuePurge: 停⽌接收,取消队列中的IRP4. WDFTIMER, WDFDPC, WDFWORKITEM, WDFMEMORY5. 数据同步1)⾃旋锁运⾏在DISPATCH_LEVEL(⾃动提升),因此不能访问分页内存WdfSpinLockCreate, WdfSpinLockAcquire, WdfSpinLockRelease2)WDFWAITLOCK 运⾏在PASSIVE_LEVEL, 同步锁WdfWaitLockCreate, WdfWaitLockAcquire, WdfWaitLockRelease6. 字符串CHAR, WCHAR, STRING, UNICODE_STRINGWDFSTRING: WdfStringCreate串处理函数:strlen之类7. 队列编程 QueueSample// 因为取消例程等要⽤环境变量,所以⽤⼀个设备对象范围同步(重要)deviceAttr.SynchronizationScope = WdfSynchronizationScopeDevice;调⽤例程,取消例程,定时器回调例程,都⽤了设备对象范围同步,所以运⾏在DISPATCH_LEVEL,不能⽤分页内存。
Windows调试工具入门7(WinDbg驱动程序源码调试)

系列前面的几篇文章已经介绍过对符号路径和源码路径的设置。调试自己编写的驱动时,如 果是主控机上编译,在目标机上运行,那么一般都不需要专门设置 路径 WinDbg 就能找到正 确的符号和源文件。如果驱动不是在主控机上编译的,或者编译之后移动了源码或符号文件 就必须要进行设置。在这里我是这样设置 的:
1.准备
Windows 调试工具优于目前的其他内核调试器很重要的一点,就是能够非常方便的对自己编 写的驱动程序进行源码调试。为了能够更好的说明,我们首先需要做一些准备工作,分别编 写一个测试驱动程序和一个应用程序来使用驱动的功能。 驱动程序 首先实现一个最简单的驱动程序,除了 DriverEntry 等框架代码之外,我们添加一个 IRP_MJ_READ 的 Dispatch 例程,当应用程 序调用 ReadFile 时返回一个值递增的字节。另 外,实现两个 DeviceIoControl Code,一个调用 DbgPrint 向调试器显示信息并返回,另一 个访问非法指针造成崩溃。代码片断如下,完整的代码和编译出来的文件可以在附件中获取:
pstIrpStack = IoGetCurrentIrpStackLocation( Irp); pbyUserBuffer = (PUCHAR)Irp->UserBuffer; ulSize = pstIrpStack->Parameters.Read.Length;
if ( ulSize == 1) {
Device Object list: 82138030 kd> !devobj SrcDbgKnlDrv Device object (82138030) is for: SrcDbgKnlDrv \Driver\SrcDbgKnlDrv DriverObject 8219f5f0 Current Irp 00000000 RefCount 0 Type 00000022 Flags 000000c0 Dacl e10361f4 DevExt 00000000 DevObjExt 821380e8 ExtensionFlags (0000000000) Device queue is not busy. 如果我们的设备有附加到某个设备栈上的话,可以用!devstack 扩展命令显示设备栈的信 息。 kd> !devstack 82138030 !DevObj !DrvObj !DevExt ObjectName > 82138030 \Driver\SrcDbgKnlDrv00000000 SrcDbgKnlDrv 这里看到的输出说明 SrcDbgKnlDrv 没有附加到任何设备栈。 通过!devhandles 命令可以查看设备被打开的句柄。目前在这个地方使用的话,由于没有句 柄被打开,还看不到什么有用的信息,在后面进行演示。
如何使用Windows cmd命令进行驱动程序管理

如何使用Windows cmd命令进行驱动程序管理随着计算机技术的不断发展,驱动程序在操作系统中扮演着至关重要的角色。
驱动程序是操作系统与硬件设备之间的桥梁,它们负责使硬件设备与操作系统能够正常通信和协作。
在Windows操作系统中,我们可以使用命令提示符(cmd)来管理驱动程序,这为我们提供了更加灵活和高效的方式来处理驱动程序的安装、卸载和更新等操作。
本文将介绍如何使用Windows cmd命令进行驱动程序管理。
首先,我们需要打开命令提示符(cmd)。
在Windows操作系统中,我们可以按下Win+R键,然后输入"cmd"并按下回车键来打开命令提示符窗口。
接下来,我们可以使用一些常用的命令来管理驱动程序。
1. 查看已安装的驱动程序使用命令"driverquery"可以查看已安装的驱动程序列表。
该命令会显示驱动程序的名称、描述、供应商以及驱动程序的版本等信息。
通过查看已安装的驱动程序列表,我们可以了解系统中已安装的驱动程序情况。
2. 安装新的驱动程序使用命令"pnputil -i -a <驱动程序文件路径>"可以安装新的驱动程序。
在执行该命令之前,我们需要将驱动程序文件保存到本地,并记住其文件路径。
通过执行该命令,系统将会安装指定路径下的驱动程序。
3. 卸载已安装的驱动程序使用命令"pnputil -d <驱动程序名称>"可以卸载已安装的驱动程序。
在执行该命令之前,我们需要查看已安装的驱动程序列表,以确定要卸载的驱动程序名称。
通过执行该命令,系统将会卸载指定名称的驱动程序。
4. 更新已安装的驱动程序使用命令"pnputil -i -a <驱动程序文件路径>"可以更新已安装的驱动程序。
在执行该命令之前,我们需要将新的驱动程序文件保存到本地,并记住其文件路径。
通过执行该命令,系统将会更新指定路径下已安装的驱动程序。
网络操作系统项目教程((微课版)(第3版)项目2 安装与规划Windows Server 2022

2022
某高校要组建校园 网,需要架设一台具有 DNS、DHCP、Web、 FTP等功能的服务器来 为校园网用户提供服务 ,现需要选择一种既安 全又易于管理的网络操 作系统。
项目背景
2
在完成该项目之前 ,首先应选定网络中计 算机的组织方式;然后 根据微软操作系统的要 求确定每台计算机应当 安装的版本;再对安装 方式、安装磁盘的文件 系统格式、安装启动方 式等进行选择;最后才 能开始系统的安装。
系统功能
此外,可借助数据中心版, 利用Azure云的优势使虚拟 机保持最新状态,同时最大 限度地减少停机时间。
2.2
项目设计及准备
盛年不重来,一日难再晨。 及时当勉励,岁月不待人。
项目设计及准备
项目设计
项目设计及准备
项目准备
满足硬件要求的计算机 安装光盘(产品密匙) 磁盘检查、备份文件、格式化
设置IP地址
v 启动网络发现功能
项目实施 06-外观设置
v 外观设置
项目实施 07-配置防火墙
v 设置入站规则
项目实施 08-其他配置
1、更改计算机名 及工作组
v
2、启用文件和打 印机共享
3、配 置虚拟 内存
项目实施 任务4 快照与克隆
克隆完成后,进入用系统准备工具重整系统 c:\windows\system32\sysprep\sysprep.exe
IPv4和IPv6
对于我国而言,在接下来的 IPv6时代,我国有着巨大机 遇,其中我国推出的“雪人计 划”就是一件益国益民的大事 ,这一计划助力我国在互联 网方面取得更多话语权。
2.4
习题与实训
功崇惟志,业广惟勤。
Win XP Embedded(xpe)安装入门

Windows XP Embedded (xpe)入门概述对于一种开发工具的学习,最重要也最困难的阶段就是概念的建立,只要建立了正确的概念,明白整个系统的体系结构和各种工具作用,剩下的工作就是实际操作,积累经验了,最多不过在需要的时候查一查手册。
本文通过指导读者进行实际操作,一步步地完成一次完整的开发工作,从而帮助读者建立一个清晰明确的概念。
因为我们开发的产品不是普通的软件,而是专用的操作系统,所以需要针对某个特定的硬件平台(目标机)来进行开发;首先需要一个强大的工作站来运行开发环境和开发工具,然后根据目标机硬件配置和软件需求进行开发,开发完成后将做好的操作系统影象文件(Ima ge)与目标机硬件结合,运行系统并测试。
配置开发工作站首先介绍开发用的工作站,一台标准PC机,硬件配置要求如下:操作系统Windows XP ProfessionalPIII 500MHz 以上(建议1GHz以上)256MB 内存(建议512MB)3GB 剩余硬盘空间对该PC机的配置如下:将硬盘设置两个分区第二个分区分配为700MB,可以是FAT32格式或NTFS格式(这个分区将包含可启动的Windows XP Embedded Image)主分区使用所有剩余的硬盘空间,可以设置为FAT32格式或者NTFS格式在主分区中安装Windows XP Professional系统,并安装Windows XP Embedded 开发工具修改BOOT.ini文件,将下面的代码部分增加到该文件中,可以使这台PC机双重启动,作为开发用的Windows XP Professional系统从分区一启动,而开发好的Windows XP Em bedded Image从分区二启动。
[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\\Windows[operating systems]multi(0)disk(0)rdisk(0)partition(1)\\Windows="Microsoft Windows XP Professional" /fast detectmulti(0)disk(0)rdisk(0)partition(2)\\Windows="Microsoft Windows XP Embeddedd" /fast detect安装Windows XP Embedded开发工具将Windows XP Embedded开发包的CD1放入CD-ROM中,在自动运行的提示中,按照以下顺序安装XPE开发工具:Tools Setup:安装XPE开发工具(包括Target Designer, Component Designer, Comp onent Database Manager, 以及其他工具)Database Engine Setup:安装SQL Server 2000 Desktop Edition database engine (MSDE)Database Setup:安装组件数据库及Repositories开发工作站的其他配置在C盘新建一个XPE_Demo目录,用来放置开发中生成的配置定义文件和组件定义文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows文件系统过滤驱动开发教程2.hello world,驱动对象与设备对象这里所说的驱动对象是一种数据结构,在DDK中名为DRIVER_OBJECT。
任何驱动程序都对应一个DRIVER_OBJECT.如何获得本人所写的驱动对应的DRIVER_OBJECT呢?驱动程序的入口函数为DriverEntry,因此,当你写一个驱动的开始,你会写下如下的代码:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ){}这个函数就相当与喜欢c语言的你所常用的main().IN是无意义的宏,仅仅表明后边的参数是一种输入,而对应的OUT则代表这个参数是一种返回。
这里没有使用引用,因此如果想在参数中返回结果,一律传入指针。
DriverObject就是你所写的驱动对应的DRIVER_OBJECT,是系统在加载你的驱动时候所分配的。
RegisteryPath是专用于你记录你的驱动相关参数的注册表路径。
DriverObject重要之处,在于它拥有一组函数指针,称为dispatch functions.开发驱动的主要任务就是亲手撰写这些dispatch functions.当系统用到你的驱动,会向你的DO发送IRP(这是windows所有驱动的共同工作方式)。
你的任务是在dispatch function中处理这些请求。
你可以让irp失败,也可以成功返回,也可以修改这些irp,甚至可以自己发出irp。
设备对象则是指DEVICE_OBJECT.下边简称DO.但是实际上每个irp都是针对DO发出的。
只有针对由该驱动所生成的DO的IRP, 才会发给该驱动来处理。
当一个应用程序打开文件并读写文件的时候,windows系统将这些请求变成irp发送给文件系统驱动。
文件系统过滤驱动将可以过滤这些irp.这样,你就拥有了捕获和改变文件系统操作的能力。
象Fat32,NTFS这样的文件系统(File System,简称FS),可能生成好几种设备。
首先文件系统驱动本身往往生成一个控制设备(CDO).这个设备的主要任务是修改整个驱动的内部配置。
因此一个Driver只对应一个CDO.另一种设备是被这个文件系统Mount的Volume。
一个FS可能有多个Volume,也可能一个都没有。
解释一下,如果你有C:,D:,E:,F:四个分区。
C:,D:为NTFS,E:,F:为Fat32.那么C:,D:则是Fat的两个Volume设备对象.实际上"C:"是该设备的符号连接(Symbolic Link)名。
而不是真正的设备名。
可以打开Symbolic Links Viewer,能看到:C: DeviceHarddiskVolume1因此该设备的设备名为“DeviceHarddiskVolume1”.这里也看出来,文件系统驱动是针对每个Volume来生成一个DeviceObject,而不是针对每个文件的。
实际上对文件的读写的irp,都发到Volume设备对象上去了。
并不会生成一个“文件设备对象”。
掌握了这些概念的话,我们现在用简单的代码来生成我们的CDO,作为我们开发文件系统驱动的第一步牛刀小试。
我不喜欢用微软风格的代码。
太长而且难看。
我对大部分数据结构和函数进行了重定义。
为此我写了一个名为wdf.h的头文件帮助我转换。
有兴趣的读者可以发邮件向索取这个文件。
没有也没有关系,我总是会写出wd_xxx系列的东西在DDK中的原形。
// -----------------wdf_filter.c中的内容-------------------------#include "wdf.h"wd_stat wdff_cdo_create(in wd_drv *driver, in wd_size exten_len,in wd_ustr *name, out wd_dev **device){return wd_dev_create(driver, exten_len, name, wd_dev_disk_fs,wdf_dev_secure_open, wd_false, device);}wd_stat wd_main(in wd_drv* driver, in wd_ustr* reg_path){wd_ustr name;wd_stat status = wd_stat_suc;// 然后我生成控制设备,虽然现在我的控制设备什么都不干wd_ustr_init(&name,L"\FileSystem\Filters\our_fs_filter");status = wdff_cdo_create(driver,0,&name,&g_cdo);if(!wd_suc(status)){if(status == wd_stat_path_not_found){// 这种情况发生于FileSystemFilters路径不存在。
这个路径是// 在xp上才加上的。
所以2000下会运行到这里wd_ustr_init(&name,L"\FileSystem\our_fs_filter");status = wdff_cdo_create(driver,0,&name,&g_cdo);};if(!wd_suc(status)){wd_printf0("error: create cdo failed.rn");return status;}}wd_printf0("success: create cdo ok.rn");return status;}为了让代码看起来象上边的那样,我不得不做了很多转换。
如#define DriverEntry wd_main一种爽的感觉,终于可以在写看起来更象是main()的函数中工作了。
wd_dev_create 这个函数内部调用的是IoCreateDevice.而wd_suc实际上是SUCCESS()这样的宏。
// ----------------------wdf.h中的内容------------------------------#include "ntifs.h"#define in IN#define out OUT#define optional OPTIONAL#define wd_ustr UNICODE_STRING#define wdp_ustr PUNICODE_STRING#define wd_main DriverEntry// 设备、驱动对象类型typedef DRIVER_OBJECT wd_drv;typedef DEVICE_OBJECT wd_dev;typedef PDRIVER_OBJECT wd_pdrv;typedef PDEVICE_OBJECT wd_pdev;enum {wd_dev_disk_fs = FILE_DEVICE_DISK_FILE_SYSTEM,wd_dev_cdrom_fs = FILE_DEVICE_CD_ROM_FILE_SYSTEM,wd_dev_network_fs = FILE_DEVICE_NETWORK_FILE_SYSTEM};// 状态相关的类型和宏typedef NTSTATUS wd_stat;enum {wd_stat_suc = STATUS_SUCCESS,wd_stat_path_not_found = STATUS_OBJECT_PATH_NOT_FOUND,wd_stat_insufficient_res = STATUS_INSUFFICIENT_RESOURCES,wd_stat_invalid_dev_req = STATUS_INVALID_DEVICE_REQUEST,wd_stat_no_such_dev = STATUS_NO_SUCH_DEVICE,wd_stat_image_already_loaded = STATUS_IMAGE_ALREADY_LOADED, wd_stat_more_processing = STATUS_MORE_PROCESSING_REQUIRED, wd_stat_pending = STATUS_PENDING};(inline的使用是有所限制的,inline 函数一般必须在头文件内,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
)_inline wd_bool wd_suc(wd_stat state) //内聯函數{return NT_SUCCESS(state);}#define wd_printf0 DbgPrint_inline wd_void wd_ustr_init(in out wd_ustr* str,in const wd_wchar* chars){RtlInitUnicodeString(str,chars);};_inline wd_void wd_ustr_init_em(in out wd_ustr *str ,in wd_wchar *chars,in wd_size size){RtlInitEmptyUnicodeString(str,chars,size);};wdf.h这个文件我仅仅节选了需要的部分。
以上您已经拥有了一个简单的“驱动”的完整的代码。
它甚至可以编译,安装(请修改sfilter.inf文件,其方法不过是将多处sfilter 改为"our_fs_filter",希望这个过程中您不会出现问题)。
然后把wdf.h和wdf_filter.c 放在您新建立的目录下,这个目录下还应该有另两个文件。
一个是Makefile,请从sfilter目录下拷贝。
另一个是SOURCES,请输入如下内容:TARGETNAME=our_fs_filterTARGETPATH=objTARGETTYPE=DRIVERDRIVERTYPE=FSBROWSER_INFO=1SOURCES=wdf_filter.c使用DDK编译之后您将得到our_fs_filter.sys.把这个文件与前所描述的inf 文件同一目录,按上节所叙述方法安装。
这个驱动不起任何作用,但是你已经成功的完成了"hello world".。