NTFS Change Journal
NTFS卷上的变化日志,每个卷上都有自己的变化日志。
文件被隐藏
初始化的时候为空,文件或目录发生改变,写到日志的末尾
每条记录是一个USN(Update Sequence Number),64位的标示
USNs按增长顺序生成
每页大概包含30-40个记录,记录不可以跨页,所以页尾可能浪费一些
NTFS卷上文件,目录信息存储在MFT(Master File Table)上,
MFT上的记录描述了文件的名称,位置,大小,属性。。。
每个文件的MFT条目记录了这个文件的最新USN
文件系统更新变化文件的MFT的最新USN
日志文件增长过大,文件系统允许在文件的开始处,清除旧的记录
传统的方法,清除前面的要很多IO操作,后面的还要移到新的位置
但是日志十个稀疏文件,支持清除不需要的部分,保留部分的偏移量仍然可用
某卷的变化日志可以被禁用,防止系统为文件和目录写日志,默认情况下是关闭的,
应用程序需要激活它
任何应用程序都可以在任何时候,禁用,启用日志,所以当有程序使用的情况,要温柔的处理
当日志被禁用的时候,系统要清除日志的记录内容,防止程序读不可靠的信息,
日志仅保留持续活动期间的记录
目前的实现是,禁用时候删除变化日志,启用的时候创建一个新的日志,
虽然应用程序不关心删除和创建操作,但是平台编成却要使用
***************************************************************************
***************************************************************************
访问Change Journal要通过DeviceIoControl
BOOL DeviceIoControl(
(HANDLE) hDevice, // 文件,目录,设备,用CreateFile取得句柄
FSCTL_READ_USN_JOURNAL, // 请求
(LPVOID)lpInBuffer, // input buffer
(DWORD)nInBufferSize, // size of input buffer
(LPVOID)lpOutBuffer, // output buffer
(DWORD)nOutBufferSize, // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
HANDLE hcj = CreateFile("////.//C:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
***************************************************************************
***************************************************************************
typedef struct {
DWORD RecordLength; // 记录长度
WORD MajorVersion; // 主办本
WORD MinorVersion; // 次版本
DWORDLONG FileReferenceNumber; // 文件引用数
DWORDLONG ParentFileReferenceNumber; // 父目录引用数
USN Usn; // USN
LARGE_INTEGER TimeStamp; // 时间戳
DWORD Reason; // 原因
DWORD SourceInfo; // 源信息
DWORD SecurityId; // 安全ID
DWORD FileAttributes; // 文件属性
WORD FileNameLength; // 文件长度
WORD FileNameOffset; // penultimate of original version 2.0
DWORD ExtraInfo1; // Hypothetically added in version 2.1
DWORD ExtraInfo2; // Hypothetically added in version 2.2
DWORD ExtraInfo3; // Hypothetically added in version 2.3
WCHAR FileName[1]; // variable length always at the end
} USN_RECORD, *PUSN_RECORD;
应用程序不去填写这些信息,当程序读Change Journal时由系统返回。
PUSN_RECORD pNext;
pNext = (PUSN_RECORD) (((PBYTE) pRecord) + pRecord->RecordLength);
在网上突然发现了Everything这个程序对NTFS磁盘文件可以快速的进行搜索,而且搜素的速度之快,让你惊讶这个东西怎么工作的? 具介绍说是 采用了NTFS的 Change Journal这个特性进行开发的。总算对这个 USN的说法有了个了解,但是这个特性如何对他的检索怎么应用的还没有想清楚。不过看它的搜索速度真是让人惊奇! NTFS Change Journal NTFS卷上的变化日志,每个卷上都有自己的变化日志。 文件被隐藏 初始化的时候为空,文件或目录发生改变,写到日志的末尾 每条记录是一个USN(Update Sequence Number),64位的标示 USNs按增长顺序生成 每页大概包含30-40个记录,记录不可以跨页,所以页尾可能浪费一些 NTFS卷上文件,目录信息存储在MFT(Master File Table)上, MFT上的记录描述了文件的名称,位置,大小,属性。。。 每个文件的MFT条目记录了这个文件的最新USN 文件系统更新变化文件的MFT的最新USN 日志文件增长过大,文件系统允许在文件的开始处,清除旧的记录传统的方法,清除前面的要很多IO操作,后面的还要移到新的位置但是日志十个稀疏文件,支持清除不需要的部分,保留部分的偏移量仍然可用 某卷的变化日志可以被禁用,防止系统为文件和目录写日志,默认情况下是关闭的, 应用程序需要激活它 任何应用程序都可以在任何时候,禁用,启用日志,所以当有程序使用的情况,要温柔的处理 当日志被禁用的时候,系统要清除日志的记录内容,防止程序读不可靠的信息, 日志仅保留持续活动期间的记录 目前的实现是,禁用时候删除变化日志,启用的时候创建一个新的日志, 虽然应用程序不关心删除和创建操作,但是平台编成却要使用 *************************************************************************** *************************************************************************** 访问Change Journal要通过DeviceIoControl BOOL DeviceIoControl( (HANDLE) hDevice, // 文件,目录,设备,用CreateFile取得句柄 FSCTL_READ_USN_JOURNAL, // 请求 (LPVOID)lpInBuffer, // input buffer (DWORD)nInBufferSize, // size of input buffer (LPVOID)lpOutBuffer, // output buffer (DWORD)nOutBufferSize, // size of output buffer (LPDWORD) lpBytesReturned, // number of bytes returned (LPOVERLAPPED) lpOverlapped // OVERLAPPED structure ); HANDLE hcj = CreateFile("\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); *************************************************************************** *************************************************************************** typedef struct { DWORD RecordLength; // 记录长度 WORD MajorVersion; // 主办本 WORD MinorVersion; // 次版本 DWORDLONG FileReferenceNumber; // 文件引用数 DWORDLONG ParentFileReferenceNumber; // 父目录引用数 USN Usn; // USN LARGE_INTEGER TimeStamp; // 时间戳 DWORD Reason; // 原因 DWORD SourceInfo; // 源信息 DWORD SecurityId; // 安全ID DWORD FileAttributes; // 文件属性 WORD FileNameLength; // 文件长度 WORD FileNameOffset; // penultimate of original version 2.0 DWORD ExtraInfo1; // Hypothetically added in version 2.1 DWORD ExtraInfo2; // Hypothetically added in version 2.2 DWORD ExtraInfo3; // Hypothetically added in version 2.3 WCHAR FileName[1]; // variable length always at the end } USN_RECORD, *PUSN_RECORD; 应用程序不去填写这些信息,当程序读Change Journal时由系统返回。 PUSN_RECORD pNext; pNext = (PUSN_RECORD) (((PBYTE) pRecord) + pRecord->RecordLength);
取得NTFS磁盘上的MTF信息
2010-10-28 06:33752人阅读评论(1)收藏举报
[cpp] view plaincopyprint?
01.#include "ntfs.h"
02.#include
03.#include
04.#include