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硬件故障分析>
查看当前系统正在运行的硬件信息. 右击计算机——属性——设备管理器看到下面: 一些常见的硬件故障: 主板故障 >开机不正常,偶尔出现突然的断电现象 >明明自己选择了关机,但是还是无法关机或 ...
随机推荐
- P&R 7
Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 通常,遇到floorplan问题,大致的debug步骤跟方法有哪些? 如何衡量floorplan的QA? [哥简单点说]:flo ...
- <好きになるなら> 歌詞
あー生意気なこと言ったあと 何故かしらぽつんとしてしまう あー偶然のふり待ちぶせた ゴメンネと素直に言えるかな 帰る道はいつもカナリア 変ねこのごろ自分の気持ちがよめない もうじき風の向きが変わりそう ...
- AngularJS请求数据提示resource from url not allowed by $sceDelegate policy
AngularJS iframe跨域打开内容时报错 解决方案 使用 $sceDelegateProvider 配置跨域请求域名 config.js app.config(function($sce ...
- 如何用 Python 实现超级玛丽的人物行走和碰撞检测?
功能介绍 人物行走 人物的行走速度这边分成水平方向(X轴)和竖直方向(Y轴),水平方向的速度要考虑加速度和摩擦力,竖直方向的速度要考虑重力加速度. 水平方向:设定X轴向右走的速度为大于0,向左走的 ...
- OGG在windows环境下字符集的配置
windows环境下不配置字符集(默认使用windows自己的字符集),从linux等系统同步过来的表中如果含有中文字符列将显示为乱码,被ogg误认为虚拟列,从而导致进程abend. 设置ogg进程在 ...
- 吴裕雄 PYTHON 人工智能——基于MASK_RCNN目标检测(4)
import os import sys import random import math import re import time import numpy as np import tenso ...
- dropna fillna
# NaN 浮点类型 np.nan+1 =>nan Python type(None) // NoneType类型 不能参与运算 import pandas as pd from pand ...
- 【Go语言系列】1.1、GO语言简介:什么是GO语言
一.Go的起源 Go语言的所有设计者都说,设计Go语言是因为 C++ 给他们带来了挫败感.在 Google I/O 2012 的 Go 设计小组见面会上,Rob Pike 是这样说的: 我们做了大量的 ...
- pikachu-搜索型注入 #手工注入
1.搜索型注入漏洞产生的原因: 在搭建网站的时候为了方便用户搜索该网站中的资源,程序员在写网站脚本的时候加入了搜索功能,但是忽略了对搜索变量的过滤,造成了搜索型注入漏洞,又称文本框注入. 2.搜索型注 ...
- DataFrame loc和iloc的区别
loc loc是select by label(name) loc函数是选择dataframe中那一行的index == k的 iloc loc是select by position loc函数是选择 ...