文件监控(教学版)

参考FileSpy写的文件监控程序,但比它的抽象多了。可能瑞星的文件驱动也是这样写的,否则它为什么老阻止我安装驱动呢。测试程序是一个命令行小程序,负责打开设备,开启监控和关闭监控,运行时开启和关闭两次。

在DebugView中查看输出信息,我只是想看看能不能达到目的,所以信息量很少。

在驱动程序中开启和关闭监控的代码:

VOID AttachedToDeviceByName (__in PWSTR DeviceName, __in BOOLEAN attach)

{

UCHAR tmp_buf1[50];

UNICODE_STRING volumeName;

NTSTATUS status;

OBJECT_ATTRIBUTES objectAttributes;

IO_STATUS_BLOCK openStatus;

HANDLE fileHandle;

PDEVICE_OBJECT volume_obj, fs_obj, spy_obj;

PFILESPY_DEVICE_EXTENSION devExt;

ULONG i;

LARGE_INTEGER interval;

PDEVICE_OBJECT current_obj, next_obj;

PAGED_CODE();

//应用程序传过来的盘符

RtlInitEmptyUnicodeString(&volumeName, (PWSTR)tmp_buf1, sizeof(tmp_buf1));

RtlAppendUnicodeToString(&volumeName, L"\\DosDevices\\");

status = RtlAppendUnicodeToString(&volumeName, DeviceName);

InitializeObjectAttributes( &objectAttributes,

&volumeName,

OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

NULL,

NULL );

status = ZwCreateFile( &fileHandle,

SYNCHRONIZE|FILE_READ_DATA,

&objectAttributes,

&openStatus,

NULL,

0,

FILE_SHARE_READ|FILE_SHARE_WRITE,

FILE_OPEN,

FILE_SYNCHRONOUS_IO_NONALERT,

NULL,

0 );

status = ObReferenceObjectByHandle( fileHandle,

FILE_READ_DATA,

*IoFileObjectType,

KernelMode,

&volume_obj,

NULL );

fs_obj = IoGetBaseFileSystemDeviceObject( volume_obj );

ObReferenceObject( fs_obj );

if(attach)

{

ObDereferenceObject( volume_obj );

ZwClose( fileHandle );

status = IoCreateDevice( gFileSpyDriverObject,

sizeof( FILESPY_DEVICE_EXTENSION ),

NULL,

fs_obj->DeviceType,

0,

FALSE,

&spy_obj );

devExt = spy_obj->DeviceExtension;

devExt->AttachedToDeviceObject = NULL;

ASSERT( IS_FILESPY_DEVICE_OBJECT( spy_obj ) );

SetFlag( spy_obj->Flags, FlagOn( fs_obj->Flags, (DO_BUFFERED_IO | DO_DIRECT_IO | DO_SUPPORTS_TRANSACTIONS)));

SetFlag( spy_obj->Characteristics, FlagOn( fs_obj->Characteristics, (FILE_DEVICE_SECURE_OPEN) ));

for (i=0; i < 8; i++)

{

status = IoAttachDeviceToDeviceStackSafe( spy_obj, fs_obj, &devExt->AttachedToDeviceObject );

if (NT_SUCCESS(status) )

{

break;

}

interval.QuadPart = (500 * DELAY_ONE_MILLISECOND);

KeDelayExecutionThread( KernelMode, FALSE, &interval );

}

ClearFlag(spy_obj->Flags, DO_DEVICE_INITIALIZING);

ObDereferenceObject( fs_obj );

}

else

{

current_obj = IoGetAttachedDeviceReference( fs_obj );

while (NULL != current_obj)

{

if (IS_FILESPY_DEVICE_OBJECT( current_obj ))

{

spy_obj = current_obj;

break;

}

next_obj = IoGetLowerDeviceObject( current_obj );

ObDereferenceObject( current_obj );

current_obj = next_obj;

}

ObDereferenceObject( volume_obj );

ZwClose( fileHandle );

devExt = spy_obj->DeviceExtension;

IoDetachDevice( devExt->AttachedToDeviceObject );

IoDeleteDevice( spy_obj );

ObDereferenceObject( spy_obj );

ObDereferenceObject( spy_obj );

ObDereferenceObject( spy_obj );

interval.QuadPart = (5 * DELAY_ONE_SECOND); //等5秒

KeDelayExecutionThread( KernelMode, FALSE, &interval );

ObDereferenceObject( fs_obj );

}

}

写的时候遇到一个有趣的问题是,驱动安装卸载一次,然后再安装,应用程序就不能访问它了,GetError()提示说系统找不到指定的文件。原来是卸载的时候没有卸干净,所以第二次不能用,程序中有相连的三句话“ObDereferenceObject( spy_obj);”正是我担心spy_obj不释放才出此下策。

http://www.cnblogs.com/lzjsky/archive/2010/11/19/1881971.html

时间: 2024-10-12 19:57:31

文件监控(教学版)的相关文章

《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹

<PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版)>源码.教学视频下载地址: http://pan.baidu.com/s/1zt9hW 内 容 简 介 本书循序渐进地介绍了PHP 5.5开发动态站点的主要知识和技能,提供了大量的PHP应用实例供读者实践.每一章节都清晰讲述了代码作用及其编写思路,使读者能在最短时间内迅速掌握PHP的应用开发技能. 全

《PHP 5.5从零开始学(视频教学版)》内容简介、目录

<PHP 5.5从零开始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零开始学(视频教学版)>源代码.教学视频下载地址: http://pan.baidu.com/s/1zt9hW 内 容 简 介 本书循序渐进地介绍了PHP 5.5开发动态网站的主要知识和技能,提供了大量的PHP应用实例供读者实践.每一章节都清晰讲述了代码作用及其编写思路,使读者能在最短时间内迅速掌握PHP的应用开发技能.

自己动手写处理器之第三阶段——教学版OpenMIPS处理器蓝图

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第十篇,我尽量每周四篇 从本章开始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍了系统的设计目标,其中详细说明了OpenMIPS处理器计划实现的5级流水线.3.2节给出了OpenMIPS处理器的接口示意图,及各个接口的作用.3.3节简单解释了各个源代码文件的作用.最后描述了OpenMIPS处理器的实现方法,读者将发现本书给出的实现方法与现有书籍的方法完全不同,更加易于理解.便于实践

Android文件监控FileObserver介绍

在前面的Linux文件系统Inotify机制中介绍了Linux对文件变更监控过程.Android系统在此基础上封装了一个FileObserver类来方便使用Inotify机制.FileObserver是一个抽象类,需要定义子类实现该类的onEvent抽象方法,当被监控的文件或者目录发生变更事件时,将回调FileObserver的onEvent()函数来处理文件或目录的变更事件. 事件监控过程 在FileObserver类中定义了一个静态内部类ObserverThread,该线程类才是真正实现文件

用reg文件把便携版sublime text 3添加到右键菜单

假设sublime文件夹在C:\\Users\\T430i\\Downloads\\Sublime Text Build 3059 x64\\ 则: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Sublime Text 3] @="Sublime Text 3" "Icon"="C:\\Users\\T430i\\Downloads\\Sublime Text Build

【C/C++学院】(29)网络编程--实现跨平台传输文件(TCP版)

网络编程--实现跨平台传输文件(TCP版)源码下载地址 为了实现跨平台,需要对跨平台的代码进行条件编译. gcc的-D选项. 连接选项 -lWs2_32 代表要用Ws2_32.lib这个库 gcc编译选项,-D 代表定义一个宏,等同于在c语言当中定义 #defind WIN 在windows下,使用socket之前,必须使用WSAStartup初始化socket,程序运行结束以后必须调用WSACleanup释放相关资源 windown下,关闭socket使用closesocket函数 //mak

在C#使用文件监控对象FileSystemWatcher的几种方案

最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务器做别的操作,而那个文本的写入有时候会频繁,1秒可能多次,但是也有可能在相当长一段时间内是没有任何写入的. 这样一来如果每秒都去访问文件的话,一个是IO问题,还有就是每次操作都会引起后端一系列程序的反应,文本在长时间内无写入的话,一秒一次的触发一系列徒劳的事情太不可取了. 最终发现了c#中的File

zabbix之日志文件监控

一.日志item介绍 下面介绍zabbix另一个"重量级"的功能--日志文件监控,它最主要的是监控日志文件中有没有某个字符串的表达式,对应日志轮转与否,zabbix都支持. 在配置Item的时候,Type选择Zabbix agent (active),这里主要需要配置的是Key.下面是监控日志的两种key--log和logtr. log[/path/to/some/file,<regexp>,<encoding>,<maxlines>,<mod

falcon-web文件监控

1.配置前置环境,下载inotify-tools-3.14,libiconv-1.14源码包,通过yum安装libcurl库文件,另外由于最后编译提示缺少mysql库文件,yum还安装不到,所以我多了一步安装mysql 5.6的步骤. 安装apache环境 # yum install -y httpd 安装inotify-tools # tar xvzf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure # make