一个对硬盘文件进行监视的的问题,非高人莫进哟!

明行 2001-12-11 12:12:52
各位BCB高人们,我在练习用win api对硬盘的监视过程中,碰到一个不知道怎么办的问题,一个MEMO一个Button我用如下代码在Button1按钮中:
if(FindFirstChangeNotification("e:\\Sxzp501\\",false,FILE_NOTIFY_CHANGE_LAST_WRITE)==INVALID_HANDLE_VALUE)
ShowMessage("Error");
else
{
if(WaitForSingleObject(FindFirstChangeNotification("e:\\Sxzp501\\",false,FILE_NOTIFY_CHANGE_LAST_WRITE),INFINITE)==WAIT_FAILED)
ShowMessage("Error");
else
Memo1->Lines->Add("Changed");
FindCloseChangeNotification(FindFirstChangeNotification("e:\\Sxzp501\\",false,FILE_NOTIFY_CHANGE_LAST_WRITE));
}
的确可以发现有文件在作存盘操作,可是我怎么知道具体是什么文件呢在作存盘操作呢?
请缎给出具体的代码。分数大的,不够再加!

另外,对注册表进行监视的API有哪些呢?请详细一些。



...全文
109 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
蚊子王 2002-01-13
  • 打赏
  • 举报
回复
MARK
明行 2001-12-15
  • 打赏
  • 举报
回复
真是多谢各位兄弟了。
我只能。。。









































































































































































































































































































































































































加分啦..............
明行 2001-12-11
  • 打赏
  • 举报
回复
不会吧,我以为,在夜里高人多些!!!
csz_cmy 2001-12-11
  • 打赏
  • 举报
回复
你这叫监视吗?
请把你的消息处理函数关联到文件或文件夹OnChange!
他会给你有用的参数!
使用API,请见Delphi6.0 TShellListView的实现.
rak 2001-12-11
  • 打赏
  • 举报
回复
给你找段代码吧。。

在WIN32下用DELPHI侦测目录变化,可用WIN32提供的文件改变通知API来完成。FindFirstChangeNotification, FindNextChangeNotification,FindCloseChangeNotification。
在应用程序中调用这些函数时,产生一个监控这个变化的句柄,可用WAIT函数集来等待这个变化。这样,当监控程序运行时,可以达到监控文件变化的动作。更进一步,可把此程序做成一个状态区图标(TRAY)来完成监控。

Windows在删除、复制、移动、访问文件时并不发送消息,当然截获不到。要截取这些操作过程的唯一办法就是截获API,这又需要你编写Vxd程序了,杀毒软件都是这样作的。你注意一下杀毒软件一般都带有一个vxd程序。光有vxd还不行,还需截获文件API。还有另外一个办法,就是CIH病毒采用的办法,直接跳到系统零层去操作。具体办法如下:
一、SIDT指令( 将中断描述符表寄存器IDTR--64位宽,16~47Bit存有中断描述符表IDT基地址--的内容存入指定地址单元)不是特权指令,就是说我们可以在Ring3下执行该指令,获得IDT的基地址,从而修改IDT,增加一个中断门安置我们的中断服务,一旦Ring3程序中产生此中断,VMM就会调用此中断服务程序,而此中断服务程序就运行在Ring0下了。这一点与在DOS下非常相似。

二、要实现对系统中所有文件I/O操作的实时监视,还要用到另一种关键技-FileHooking,通过挂接一个处理函数,截获所有与文件I/O操作有关的系 统调用。Windows9x使用32位保护模式可安装文件系统(IFS),由可安装文件系统管理器(IFSManager)协调对文件系统和设备的访问,它接收以Win32API函数调用形式向系统发出的文件I/O请求,再将请求转给文件系统驱动程序FSD,由它调用低级别的IOS系统实现最终访问。每个文件I/OAPI调用都有一个特定的FSD函数与之对应,IFSManager负责完成由API到FSD的参数装配工作,在完成文件I/OAPI函数参数的装配之后转相应FSD执行之前,它会调用一个称为FileSystemApiHookFunction的Hooker函数。通过安装自己的Hooker函数,就可以截获系统内所有对文件I/O的API调用,从而实现实时监控。
=========================================
procedure TForm1.Button2Click(Sender: TObject);
begin
{establish a notification for file name changes on the selected directory}
NotificationHandle := FindFirstChangeNotification(PChar(DirectoryListBox1.Directory), FALSE,FILE_NOTIFY_CHANGE_FILE_NAME);
{if the notification was set up correctly, modify some UI elements...}
if (NotificationHandle <> INVALID_HANDLE_VALUE) then
begin
Button1.Enabled := TRUE;
Button2.Enabled := FALSE;
end
else
begin
{...otherwise indicate that there was an error}
ShowMessage('There was an error setting the notification');
Exit;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
dwResult: DWORD; // holds the result of waiting on the notification
Waiting: Boolean; // loop control variable
begin
{setup the loop control for a continuous loop}
Waiting := TRUE;
{indicate that the application is waiting for the change notification to fire}
Button1.Enabled := FALSE;
StatusBar1.SimpleText := 'Now waiting for a filename change';
Application.ProcessMessages;
{enter the loop}
while Waiting do
begin
{at this point, the application is suspended until the notification
object is signaled that a filename change has occured in the
selected directory (this includes file deletions)}
dwResult := WaitForSingleObject(NotificationHandle,INFINITE);
if (dwResult = WAIT_OBJECT_0) then

begin
{indicate that the notification object was signaled}
ShowMessage('The selected directory signaled a filename change');

{query the user to see if they wish to continue monitoring this
directory}
if Application.MessageBox('Do you wish to continue monitoring this directory?', 'Continue?', MB_ICONQUESTION or
MB_YESNO) = IDYES then

{if the user wishes to continue monitoring the directory, reset
the notification object and continue the loop...}
FindNextChangeNotification(NotificationHandle)
else
{...otherwise break out of the loop}
Waiting := FALSE;
end;
end;

{close the notification object}
FindCloseChangeNotification(NotificationHandle);

{reset UI elements}

Button1.Enabled := FALSE;
Button2.Enabled := TRUE;
StatusBar1.SimpleText := '';
FileListBox1.Update;
end;
===========================================
下面是一个监视的控件:
unit dirnotify;

interface

uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;

type
EDirNotificationError = class(Exception);

TDirNotify = class;
TNotifyFilter = (nfFileName, nfDirName, nfAttributes, nfSize, nfLastWrite,
nfSecurity);
TNotifyFilters = set of TNotifyFilter;

TNotificationThread = class(TThread)
Owner: TDirNotify;
procedure Execute; override;
procedure DoChange;
end;

TDirNotify = class(TComponent)
private
FEnabled: Boolean;
FOnChange: TNotifyEvent;
FNotificationThread: TNotificationThread;
FPath: String;
FWatchSubTree: Boolean;
FFilter: TNotifyFilters;

procedure SetEnabled( Value: Boolean );
procedure SetOnChange( Value: TNotifyEvent );
procedure SetPath( Value: String );
procedure SetWatchSubTree( Value: Boolean );
procedure SetFilter( Value: TNotifyFilters );

procedure RecreateThread;

protected
procedure Change;
procedure Loaded; override;

public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

published
property Enabled: Boolean read FEnabled write SetEnabled default True;
property OnChange: TNotifyEvent read FOnChange write SetOnChange;
property Path: String read FPath write SetPath;
property WatchSubTree: Boolean read FWatchSubTree write SetWatchSubTree;
property Filter: TNotifyFilters read FFilter write SetFilter default [nfFileName, nfDirName, nfAttributes, nfLastWrite, nfSecurity];
end;


procedure Register;

implementation

const
LASTERRORTEXTLENGTH = 500;

var
LastErrorText: array [0..LASTERRORTEXTLENGTH] of char;


function GetLastErrorText: PChar;
begin
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,
nil, GetLastError, 0, LastErrorText, LASTERRORTEXTLENGTH, nil );
Result := LastErrorText;
end;


procedure TNotificationThread.Execute;
var
h: THandle;
nf: Longint;
wst: LongBool;
begin
nf := 0;
if (nfFileName in Owner.Filter) then nf := FILE_NOTIFY_CHANGE_FILE_NAME;
if (nfDirName in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_DIR_NAME;
if (nfAttributes in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_ATTRIBUTES;
if (nfSize in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_SIZE;
if (nfLastWrite in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_LAST_WRITE;
if (nfSecurity in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_SECURITY;

// yeahh, this one is stupid but Win98 malfunctions in any other value than 0 or 1
if Owner.FWatchSubTree then wst := Longbool(1)
else wst := Longbool(0);

h := FindFirstChangeNotification( Pointer(Owner.Path), wst, nf );
if (h = INVALID_HANDLE_VALUE) then
raise EDirNotificationError.Create( GetLastErrorText );

repeat
if (WaitForSingleObject( h, 1000 ) = WAIT_OBJECT_0) then
begin
Synchronize(DoChange);

if not FindNextChangeNotification( h ) then
raise EDirNotificationError.Create( GetLastErrorText );
end;
until Terminated;
end;


procedure TNotificationThread.DoChange;
begin
Owner.Change;
end;


constructor TDirNotify.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

FEnabled := True;
FFilter := [nfFileName];
end;


destructor TDirNotify.Destroy;
begin
FNotificationThread.Free;
inherited Destroy;
end;

procedure TDirNotify.Loaded;
begin
inherited;

RecreateThread;
end;


procedure TDirNotify.SetEnabled(Value: Boolean);
begin
if Value <> FEnabled then
begin
FEnabled := Value;

RecreateThread;
end;
end;


procedure TDirNotify.SetPath( Value: String );
begin
if Value <> FPath then
begin
FPath := Value;
RecreateThread;
end;
end;


procedure TDirNotify.SetWatchSubTree( Value: Boolean );
begin
if Value <> FWatchSubTree then
begin
FWatchSubTree := Value;
RecreateThread;
end;
end;


procedure TDirNotify.SetFilter( Value: TNotifyFilters );
begin
if Value <> FFilter then
begin
FFilter := Value;
RecreateThread;
end;
end;


procedure TDirNotify.SetOnChange(Value: TNotifyEvent);
begin
FOnChange := Value;
end;


procedure TDirNotify.Change;
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;


procedure TDirNotify.RecreateThread;
begin
// destroy thread
FNotificationThread.Free;
FNotificationThread := nil;

if FEnabled and not(csDesigning in ComponentState)
and not(csLoading in ComponentState) and (FPath <> '') then
begin
// create thread
FNotificationThread := TNotificationThread.Create(True);
FNotificationThread.Owner := self;
FNotificationThread.Resume;
end;
end;


procedure Register;
begin
RegisterComponents('System', [TDirNotify]);
end;

end.
NowCan 2001-12-11
  • 打赏
  • 举报
回复
注册表的有RegNotifyChangeKeyValue,但也有同样的问题,不能知道具体位置。
NowCan 2001-12-11
  • 打赏
  • 举报
回复
怎么关联?
另外有个函数叫ReadDirectoryChangesW,好像比较牛,谁知道怎么用?我看过MSDN的例子,好复杂。
csz_cmy 2001-12-11
  • 打赏
  • 举报
回复
你这叫监视吗?
请把你的消息处理函数关联到文件或文件夹OnChange!
他会给你有用的参数!
使用API,请见Delphi6.0 TShellListView的实现
「已注销」 2001-12-11
  • 打赏
  • 举报
回复
我错了

其实你也看那篇文章了……

他写道 如果想做到那种效果 需要先做文件的详细信息列表

在监视后再读一遍详细信息 和你保存的比较 然后你就知道任何的改动了

这种监视最好采取多线程 否则系统会太忙……

好了 好了 我估计早期的反安装也就是这么做的了

不过 比较一次注册表可是恐怖的工程……

大家继续讨论吧

@_@
「已注销」 2001-12-11
  • 打赏
  • 举报
回复
我记错了 是《电脑爱好者》2001年第20期介绍的

主要用到以下API

FindFirstChangeNotification(...
功能 创建、安装并根据设定的条件初始化磁盘监视器

WaitForSingleObject(...
功能 等待 直到所监视对象发生改变 或等待时间到 可以设置为无限等待

FindCloseChangeNotification(..
功能 关闭磁盘监视器 必须在结束程序之前调用

该文章作者为 广东 许昭鹏

整个示例很简单的 用Delphi编写 在第85页…………

哥们 加油吧

@_@
781014 2001-12-11
  • 打赏
  • 举报
回复
关注
「已注销」 2001-12-11
  • 打赏
  • 举报
回复
我在《程序员大本营2001》的杂志上看到过

建议你也找来一看

@_@
本软件的作用:加密指定文件夹下的重要文件(如文档、源码、图像等),加密后,即便硬盘或U盘被盗去,文件的内容也不会泄密。解密后文件还原,即可正常操作文件,只加密一次后,以后的加密均为一键完成,操作便捷。 本软件采用密码分段输入的方式,使用了多层算法加密(类似RSA,RC6,AES这样的国际知名标准加密算法,用了3种以上,作者的私人不公开加密算法,用了3种以上,即对每文件的加密总共是6层,等于一自行车上有六把不同厂家的锁)软件界面差但注重实用,尤其注重安全强度,并有反暴破,反篡改,反窥视,反钓鱼,反HOOK等优点,尽力做到了全方位堵死。作者在此承诺本软件未设计任何后门,也无万能密码,更无任何后台网络数据传输的代码,确保用户的隐私数据神圣不受侵犯,如果按作者意愿在本网站发布的本软件存在窃取用户隐私数据的事实,作者愿承担法律责任。但是注意:如果密码忘记,作者也不能根据所有文件来反推出密码是什么,也没有无密码能还原文件的方法,所以用户忘记密码后出现的一切问题和不良后果,作者概不负责。最好的防意外办法是:1.把加密后的文件再复制一份放在U盘或移动硬盘上。2.把密码记在手机或本纸上(最好不要再记入电脑文档)。 软件设计者本人也是用此软件保护源代码和WORD文档,建议先“断开网络连接”之后再解密文件,用完文件后再一键加密。在黑客大行其道的今天,我们只能努力做到“相对”地提高安全度。说得简单些,别人发张图像给你,你打开看了,可能你就已中了木马;到网上随便下软件来安装,中木马机会就更高了;你用输入法打字,假如输入法被木马注入后,所有的字全部打包存了起来,网一通就发到别人的服务器上;而且一般是一种新木马危害一段时间后才被发现,对应的杀马功能才研制出来。很多人通过路由器上网,又有防火墙,以为本机没开放21端口就安全了,但黑客的木马采用反弹连接技术,照样远程监视你的屏幕和FTP你的文件。据我听说现已有很多网络监控产品,卡在网络的总线出口上,几乎能取到并解开用户的所有走网络的信息。黑客有时组团攻击敌国的电脑,这看上去好像是正义的,但当他们没有牛奶和面包时,或没有高人一等的物质生活时,就会涮本国人民的电脑了。作者编软件近20年,至今为止,在家上网的电脑信息都被第三方黑客集团监控,因为工作需要,不得不常在网上下些软件来安装的原因带入木马,但一直找不到好的解决方案。这就是设计这套009加密软件的初衷。
本软件的作用:加密指定文件夹下的重要文件(如文档、源码、图像等),加密后,即便硬盘或U盘被盗去,文件的内容也不会泄密。解密后文件还原,即可正常操作文件,只加密一次后,以后的加密均为一键完成,操作便捷。 本软件采用密码分段输入的方式,使用了多层算法加密(类似RSA,RC6,AES这样的国际知名标准加密算法,用了3种以上,作者的私人不公开加密算法,用了3种以上,即对每文件的加密总共是6层,等于一自行车上有六把不同厂家的锁)软件界面差但注重实用,尤其注重安全强度,并有反暴破,反篡改,反窥视,反钓鱼,反HOOK等优点,尽力做到了全方位堵死。作者在此承诺本软件未设计任何后门,也无万能密码,更无任何后台网络数据传输的代码,确保用户的隐私数据神圣不受侵犯,如果按作者意愿在本网站发布的本软件存在窃取用户隐私数据的事实,作者愿承担法律责任。但是注意:如果密码忘记,作者也不能根据所有文件来反推出密码是什么,也没有无密码能还原文件的方法,所以用户忘记密码后出现的一切问题和不良后果,作者概不负责。最好的防意外办法是:1.把加密后的文件再复制一份放在U盘或移动硬盘上。2.把密码记在手机或本纸上(最好不要再记入电脑文档)。 软件设计者本人也是用此软件保护源代码和WORD文档,建议先“断开网络连接”之后再解密文件,用完文件后再一键加密。在黑客大行其道的今天,我们只能努力做到“相对”地提高安全度。说得简单些,别人发张图像给你,你打开看了,可能你就已中了木马;到网上随便下软件来安装,中木马机会就更高了;你用输入法打字,假如输入法被木马注入后,所有的字全部打包存了起来,网一通就发到别人的服务器上;而且一般是一种新木马危害一段时间后才被发现,对应的杀马功能才研制出来。很多人通过路由器上网,又有防火墙,以为本机没开放21端口就安全了,但黑客的木马采用反弹连接技术,照样远程监视你的屏幕和FTP你的文件。据我听说现已有很多网络监控产品,卡在网络的总线出口上,几乎能取到并解开用户的所有走网络的信息。黑客有时组团攻击敌国的电脑,这看上去好像是正义的,但当他们没有牛奶和面包时,或没有高人一等的物质生活时,就会涮本国人民的电脑了。作者编软件近20年,至今为止,在家上网的电脑信息都被第三方黑客集团监控,因为工作需要,不得不常在网上下些软件来安装的原因带入木马,但一直找不到好的解决方案。这就是设计这套009加密软件的初衷。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧