(转载)Windows文件系统过滤驱动开发教程 联系客服

发布时间 : 星期日 文章(转载)Windows文件系统过滤驱动开发教程更新完毕开始阅读1b486c1614791711cc79175f

// 然后我生成控制设备,虽然现在我的控制设备什么都不干 wd_ustr_init(&name,L\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\status = wdff_cdo_create(driver,0,&name,&g_cdo); };

if(!wd_suc(status)) {

wd_printf0(\return status; } }

wd_printf0(\return status; }

为了让代码看起来象上边的那样,我不得不做了很多转换。如

#define DriverEntry wd_main

一种爽的感觉,终于可以在写看起来更象是main()的函数中工作了。 wd_dev_create 这个函数内部调用的是IoCreateDevice.而wd_suc实际上是SUCCESS()这样的宏。

// ----------------------wdf.h中的内容------------------------------ #include \

#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 DRIVER_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 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改为\希望这个过程中您不会出现问题)。然后把wdf.h和wdf_filter.c放在您新建立的目录下,这个目录下还应该有另两个文件。一个是Makefile,请从sfilter目录下拷贝。另一个是SOURCES,请输入如下内容: TARGETNAME=our_fs_filter TARGETPATH=obj

TARGETTYPE=DRIVER DRIVERTYPE=FS BROWSER_INFO=1 SOURCES=wdf_filter.c

使用ddk编译之后您将得到our_fs_filter.sys.把这个文件与前所描述的inf文件同一目录,按上节所叙述方法安装。

这个驱动不起任何作用,但是你已经成功的完成了\

2. 分发例程,fast io

上一节仅仅生成了控制设备对象。但是不要忘记,驱动开发的主要工作是撰写分发例程(dispatch functions.).接上一接,我们已经知道自己的DriverObject保存在上文代码的driver中。现在我写如下一个函数来指定一个默认的dispatch function给它。

//-----------------wdf.h中的代码---------------------- typedef PDRIVER_DISPATCH wd_disp_fuc;

_inline wd_void wd_drv_set_dispatch(in wd_drv* driver, in wd_disp_fuc disp) {

wd_size i;

for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) driver->MajorFunction = disp; }

在前边的wd_main中,我只要加

wd_drv_set_dispatch(driver,my_dispatch_func);

就为这个驱动指定了一个默认的Dispatch Function.所有的irp请求,都会被发送到这个函数。但是,我可能不希望这个函数处理过于复杂,而希望把一些常见的请求独立出来,如Read,Write,Create,Close,那我又写了几个函数专门用来设置这几个Dispatch Functions.

//-----------------wdf.h中的代码---------------------- _inline wd_void wd_drv_set_read( in wd_drv* driver, in wd_disp_fuc read) {

driver->MajorFunction[IRP_MJ_READ] = read; }

_inline wd_void wd_drv_set_write( in wd_drv* driver, in wd_disp_fuc write) {

driver->MajorFunction[IRP_MJ_WRITE] = write; }

wd_void wd_drv_set_create(in wd_drv* driver, in wd_disp_fuc create) {

driver->MajorFunction[IRP_MJ_CREATE] = create;

driver->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = create; driver->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = create; }

wd_void wd_drv_set_file_sys_control(in wd_drv* driver, in wd_disp_fuc control) {

driver->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = control; }

wd_void wd_drv_set_clean_up(in wd_drv* driver, in wd_disp_fuc clean_up) {

driver->MajorFunction[IRP_MJ_CLEANUP] = clean_up; }

wd_void wd_drv_set_close(in wd_drv* driver, in wd_disp_fuc close) {

driver->MajorFunction[IRP_MJ_CLOSE] = close; }

别看我罗列n多代码,其实就是在设置driver->MajorFunction这个数组而已。因此在wd_main对dispatch functions的设置,就变成了下边这样的: