USN日志
转载:https://www.iteye.com/blog/univasity-805234 https://blog.51cto.com/velika/1440105
源码:https://files.cnblogs.com/files/Toya/USN.7z
本程序需要管理员权限
#include<iostream>
#include<stdio.h>
#include<string>
#include<tchar.h>
#include<Windows.h> using namespace std; bool isNTFS(string path);
HANDLE getHandle(string volName);
bool createUSN(HANDLE hVol, CREATE_USN_JOURNAL_DATA& cujd);
bool getUSNInfo(HANDLE hVol, USN_JOURNAL_DATA& ujd);
bool getUSNJournal(HANDLE hVol, USN_JOURNAL_DATA& ujd);
bool deleteUSN(HANDLE hVol, USN_JOURNAL_DATA& ujd); int main(){
//isNTFS("C:/");
CREATE_USN_JOURNAL_DATA* cujd = new CREATE_USN_JOURNAL_DATA;
USN_JOURNAL_DATA* ujd = new USN_JOURNAL_DATA;
HANDLE hVol = getHandle("C:");
createUSN(hVol, *cujd);
getUSNInfo(hVol, *ujd);
getUSNJournal(hVol, *ujd);
deleteUSN(hVol, *ujd);
system("pause");
return ;
} //判断是否是NTFS盘
bool isNTFS(string path){//"C:/"
char sysNameBuf[MAX_PATH];
int status = GetVolumeInformationA(path.c_str(),
NULL,
,
NULL,
NULL,
NULL,
sysNameBuf,
MAX_PATH); if ( != status){
if ( == strcmp(sysNameBuf, "NTFS")){
//printf(" 文件系统名 : %s\n", sysNameBuf);
cout << "盘符:" << path << "\n文件系统名:" << sysNameBuf << endl;
return true;
}
else {
printf(" 该驱动盘非 NTFS 格式 \n");
return false;
} }
return false;
} /**
* step 02. 获取驱动盘句柄
*/
HANDLE getHandle(string volName){ char fileName[MAX_PATH];
fileName[] = '\0'; // 传入的文件名必须为\\.\C:的形式
strcpy_s(fileName, "\\\\.\\");
strcat_s(fileName, volName.c_str());
// 为了方便操作,这里转为string进行去尾
string fileNameStr = (string)fileName;
fileNameStr.erase(fileNameStr.find_last_of(":") + ); printf("驱动盘地址: %s\n", fileNameStr.data()); // 调用该函数需要管理员权限
HANDLE hVol = CreateFileA(fileNameStr.data(),
GENERIC_READ | GENERIC_WRITE, // 可以为0
FILE_SHARE_READ | FILE_SHARE_WRITE, // 必须包含有FILE_SHARE_WRITE
NULL, // 这里不需要
OPEN_EXISTING, // 必须包含OPEN_EXISTING, CREATE_ALWAYS可能会导致错误
FILE_ATTRIBUTE_READONLY, // FILE_ATTRIBUTE_NORMAL可能会导致错误
NULL); // 这里不需要 if (INVALID_HANDLE_VALUE != hVol){
//getHandleSuccess = true;
cout << "获取驱动盘句柄成功!\n";
return hVol;
}
else{
printf("获取驱动盘句柄失败 —— handle:%x error:%d\n", hVol, GetLastError());
return ;
}
return ;
} /**
* step 03. 初始化USN日志文件
*/
bool createUSN(HANDLE hVol, CREATE_USN_JOURNAL_DATA& cujd){
DWORD br;
cujd.MaximumSize = ; // 0表示使用默认值
cujd.AllocationDelta = ; // 0表示使用默认值
bool status = DeviceIoControl(hVol,
FSCTL_CREATE_USN_JOURNAL,
&cujd,
sizeof(cujd),
NULL,
,
&br,
NULL); if ( != status){
//initUsnJournalSuccess = true;
return true;
}
else{
printf("初始化USN日志文件失败 —— status:%x error:%d\n", status, GetLastError());
return false;
}
return false;
} /** * step 04. 获取USN日志基本信息(用于后续操作) * msdn:http://msdn.microsoft.com/en-us/library/aa364583%28v=VS.85%29.aspx */
bool getUSNInfo(HANDLE hVol, USN_JOURNAL_DATA& ujd){
bool getBasicInfoSuccess = false;
DWORD br;
bool status = DeviceIoControl(hVol,
FSCTL_QUERY_USN_JOURNAL,
NULL,
,
&ujd,
sizeof(ujd),
&br,
NULL);
if ( != status){
//getBasicInfoSuccess = true;
printf("获取USN日志基本信息成功\n");
return true;
}
else{
printf("获取USN日志基本信息失败 —— status:%x error:%d\n", status, GetLastError());
return false;
}
return false;
} bool getUSNJournal(HANDLE hVol, USN_JOURNAL_DATA& ujd){
MFT_ENUM_DATA_V0 med;
med.StartFileReferenceNumber = ;
med.LowUsn = ujd.FirstUsn;
med.HighUsn = ujd.NextUsn;
#define BUF_LEN 4096
CHAR buffer[BUF_LEN]; // 用于储存记录的缓冲 , 尽量足够地大
DWORD usnDataSize = ;
PUSN_RECORD UsnRecord;
while ( != DeviceIoControl(hVol,
FSCTL_ENUM_USN_DATA,
&med,
sizeof (med),
buffer,
BUF_LEN,
&usnDataSize,
NULL))
{
DWORD dwRetBytes = usnDataSize - sizeof (USN);
// 找到第一个 USN 记录
// from MSDN(http://msdn.microsoft.com/en-us/library/aa365736%28v=VS.85%29.aspx ):
// return a USN followed by zero or more change journal records, each in a USN_RECORD structure.
UsnRecord = (PUSN_RECORD)(((PCHAR)buffer) + sizeof (USN));
printf(" ********************************** \n");
while (dwRetBytes>){
// 打印获取到的信息
const int strLen = UsnRecord->FileNameLength;
char fileName[MAX_PATH] = { };
WideCharToMultiByte(CP_OEMCP, NULL, UsnRecord->FileName, strLen / , fileName, strLen, NULL, FALSE);
printf("FileName: %s\n", fileName);
// 下面两个 file reference number 可以用来获取文件的路径信息
printf("FileReferenceNumber: %xI64\n", UsnRecord->FileReferenceNumber);
printf("ParentFileReferenceNumber: %xI64\n", UsnRecord->ParentFileReferenceNumber);
printf("\n");
// 获取下一个记录
DWORD recordLen = UsnRecord->RecordLength;
dwRetBytes -= recordLen;
UsnRecord = (PUSN_RECORD)(((PCHAR)UsnRecord) + recordLen);
}
// 获取下一页数据, MTF 大概是分多页来储存的吧?
// from MSDN(http://msdn.microsoft.com/en-us/library/aa365736%28v=VS.85%29.aspx ):
// The USN returned as the first item in the output buffer is the USN of the next record number to be retrieved.
// Use this value to continue reading records from the end boundary forward.
med.StartFileReferenceNumber = *(USN *)&buffer;
}
return true;
} /**
* step 06. 删除 USN 日志文件 ( 当然也可以不删除 )
*/
bool deleteUSN(HANDLE hVol, USN_JOURNAL_DATA& ujd){
DELETE_USN_JOURNAL_DATA dujd;
dujd.UsnJournalID = ujd.UsnJournalID;
dujd.DeleteFlags = USN_DELETE_FLAG_DELETE;
DWORD br;
int status = DeviceIoControl(hVol,
FSCTL_DELETE_USN_JOURNAL,
&dujd,
sizeof (dujd),
NULL,
,
&br,
NULL);
if ( != status){
CloseHandle(hVol);
printf(" 成功删除 USN 日志文件 !\n");
return true;
}
else {
CloseHandle(hVol);
printf(" 删除 USN 日志文件失败 —— status:%x error:%d\n", status, GetLastError());
return false;
}
return false;
}
运行结果:

USN日志的更多相关文章
- NTFS文件系统简介(转载)
原文地址:http://www.cnblogs.com/watertao/archive/2011/11/28/2266595.html 1.简介 NTFS(New Technology File S ...
- (其他)window10上好用的软件
1.everything:比我用电脑搜索快一些,(常用的搜索其实熟悉电脑的都会,不过想快一点) 如果你曾对效率工具有过研究,想必对 Everything 的名字不会陌生.这款仅有 1.3 MB 的小软 ...
- NTFS文件系统简介
原文地址:http://www.cnblogs.com/watertao/archive/2011/11/28/2266595.html 1.简介 NTFS(New Technology File S ...
- Windows下的搜索神器 —— everything
介绍一款Windows下的神奇 -- everything,软件很小巧,但是搜索速度非常快,比Windows自带的搜索功能更强大.更快.掌握它的基本用法,在查找文件时能提升很高的效率 1.下载 2.基 ...
- why "Everything" is so fast?
Everything并不扫描整个磁盘,只是读取磁盘上的USN日志,所以速度飞快.但因此缺点也明显:1.只支持NTFS格式的分区,因为USN日志是NTFS专有的.在FAT.FAT32格式分区上无法使用E ...
- kali linux之取证
取证简介: CSI:物理取证 指纹.DNA.弹道.血迹 无力取证的理论基础是物质交换原则 数字取证/计算机取证 智能设备.计算机.手机平板.loT.有线及无线信道.数据存储 事件响应调查------黑 ...
- [转载]Delphi 版 everything、光速搜索代码
近日没啥事情,研究了一下 everything.光速搜索原理.花了一个礼拜时间,终于搞定. 废话不多说,直接上代码: unit uMFTSearchFile; { dbyoung@sina.com 2 ...
- 仿照everything写的一个超级速查 原创
http://files.cnblogs.com/files/jacd/%E8%B6%85%E9%80%9F%E6%9F%A5%E6%96%87%E4%BB%B6.zip 速度奇快无比,体积奇小无比, ...
- <Win7硬件故障分析>
查看当前系统正在运行的硬件信息. 右击计算机——属性——设备管理器看到下面: 一些常见的硬件故障: 主板故障 >开机不正常,偶尔出现突然的断电现象 >明明自己选择了关机,但是还是无法关机或 ...
随机推荐
- FILES源代码
FILESの源码 #include <bits/stdc++.h> #include <game.h> #define pause getchar(); #define c ...
- Ubuntu18.04安装Vim-plug与YCM
由于个人强迫症的原因,之前的ycm是通过vundle来管理的,这次想更新一下ycm发现问题太多,于是就重新装了个Ubuntu虚拟机,用vim-plug来进行管理ycm及其他插件. 首先要换一下Ubun ...
- 用Python给头像加上圣诞帽或圣诞老人小徽章
随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章: https://zhuanlan.zh ...
- MSComm控件进行串口编程的基本步骤
Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控 ...
- php常用函数归纳
php常用函数归纳: /** * 截取指定长度的字符 * @param type $string 内容 * @param type $start 开始 * @param type $length 长度 ...
- Block Chain Learning Notes
区块链是什么 区块链技术是由比特币创造的,本文也将从比特币开始进行引导,一步一步告诉大家什么是区块链.如果你想立马知道区块链是什么,也可以直接转到文章末尾的区块链定义. 区块链,可能是当下最有前景又充 ...
- Git添加和克隆远程库
首先我们得有一个GitHub账号,然后把当前电脑的SSH Key添加到GitHub上面 第1步:创建SSH Key.在用户主目录下(可用 “cd ~”进入用户主目录),看看有没有.ssh目录,如果有, ...
- [C++_QT] Error: Not a signal or slot declaration
问题: 在Qt工程中添加了一个新的窗口之后 一直报错 如下 单单从错误描述上看 是缺少信号或者槽 但是我确定没有缺少啊 然后第二个错误显示了一个mox_xxxx文件 然后我就去那个目录下去找那个文件 ...
- nginx+keepalived实现主从高可用
设备: 主:192.168.200.122 从:192.168.200.124 安装:两台都分别安装nginx以及keepalived 两台机步骤一致一主一从 安装nginx的依赖包 [root@lo ...
- mysql 多次分组查询 数据最大的一行
SELECT B, D, Max(E)FROM `总表`WHERE B = '张士建'GROUP BY B, D 通过查询创建工具 编写查询语句