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硬件故障分析>
查看当前系统正在运行的硬件信息. 右击计算机——属性——设备管理器看到下面: 一些常见的硬件故障: 主板故障 >开机不正常,偶尔出现突然的断电现象 >明明自己选择了关机,但是还是无法关机或 ...
随机推荐
- redis环境搭建学习笔记
学习环境为windows.java环境 一.学习教程: 1.菜鸟教程:http://www.runoob.com/redis/redis-tutorial.html 2.redis中文网:http:/ ...
- 2019,.Net开发者的高光时刻
随着微软发布的一系列关于Windows..net和C#的公告,.Net开发者将在2019年,迎来自己的高光时刻,毕竟“世界上只有少数几种语言是多功能的,而没有一个像C#那样干净整洁.” 一.现在学C# ...
- Java开发中模拟接口工具moco的使用
场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...
- hackinglab-脚本关1——key又又找不到了
首先打开链接然后会发现是 然后用bp进行抓包然后会发现 然后点一下网页中的链接然后会发现 会发现抓包抓到一个地址 然后提示改一下网页的后缀地址 然后就得到了 key
- angular常用命令整理
1.创建项目 ng new 命令 描述ng new <project-name> [options] 创建一个新的 Angular 项目,默认在当前所在目录下参数 描述--dry-run ...
- Java面向对象编程 -6.4
二维数组 数组的定义格式 数组的动态初始化:初始化之后数组中的每一个元素的保存的内容为其对应数据类型的默认值 声明并初始化数组: 数据类型 数组名称 [][] = new 数据类型[行个数][列个数] ...
- Linux - Shell后台、前台,运行命令
后台运行(终端能操纵) 只需要在后面加& gedit & 查看正在运行的jobs jobs 放到前台运行(终端不能操作) fg % fg %1 一个终端一个context.一个终端就是 ...
- websocket 无法查看Data
websocket 是浏览器新的信息传输协议,记录一些遇到的问题: 调试相关: websocket 连接以后可以在Chrome tools 中的network下看到,如图 要查看通信内容可以选中点击f ...
- 关于SQL
set nocount on 作用 阻止在结果集中返回显示受t-sql语句影响的行计数信息 set nocount on 不返回计数,set nocount off 返回计数 即使当set nocou ...
- python:布尔类型
bool:有两个值,True 和 False bool 其实是int类型的一个子类,True一般为1,False一般为0 判断前一个是否是后一个的子类:issubclass(A, B) 内建函数boo ...