写一个 监视自己进程文件读写操作的代码用OutPutDebugStringA调试输出
以下是一个简单的代码示例,可以监视自己进程文件读写操作并使用 OutPutDebugStringA 进行调试输出:
#include <Windows.h>
#include <iostream>
// 监视自己进程的文件读写操作
void monitorSelfFileIO()
{
// 获取当前进程句柄
HANDLE hProcess = GetCurrentProcess();
// 为当前进程创建一个文件操作的通知对象
HANDLE hFileIO = CreateFileW(
L"\\\\.\\FileSystem\\C:\\", // 监视 C 盘根目录下的所有文件
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if (hFileIO == INVALID_HANDLE_VALUE)
{
std::cout << "CreateFileW failed, error code: " << GetLastError() << std::endl;
return;
}
// 开始监视文件读写操作
while (true)
{
// 等待文件操作通知对象的状态变化
DWORD dwBytesReturned = 0;
BYTE buffer[1024];
if (ReadDirectoryChangesW(hFileIO, &buffer, sizeof(buffer), TRUE,
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SIZE,
&dwBytesReturned, NULL, NULL))
{
// 遍历通知结果
FILE_NOTIFY_INFORMATION* pNotifyInfo = (FILE_NOTIFY_INFORMATION*)buffer;
while (pNotifyInfo != NULL)
{
// 如果文件操作是由当前进程发起的,则进行调试输出
if (pNotifyInfo->Action != FILE_ACTION_REMOVED &&
pNotifyInfo->Action != FILE_ACTION_RENAMED_OLD_NAME &&
pNotifyInfo->Action != FILE_ACTION_RENAMED_NEW_NAME &&
(HANDLE)pNotifyInfo->FileHandle == hProcess)
{
char szFilePath[MAX_PATH] = { 0 };
WideCharToMultiByte(CP_UTF8, 0, pNotifyInfo->FileName, pNotifyInfo->FileNameLength / 2, szFilePath, sizeof(szFilePath), NULL, NULL);
char szAction[32] = { 0 };
switch (pNotifyInfo->Action)
{
case FILE_ACTION_ADDED:
strcpy_s(szAction, "added");
break;
case FILE_ACTION_MODIFIED:
strcpy_s(szAction, "modified");
break;
case FILE_ACTION_RENAMED_OLD_NAME:
strcpy_s(szAction, "renamed (old name)");
break;
case FILE_ACTION_RENAMED_NEW_NAME:
strcpy_s(szAction, "renamed (new name)");
break;
case FILE_ACTION_REMOVED:
strcpy_s(szAction, "removed");
break;
default:
strcpy_s(szAction, "unknown");
break;
}
OutputDebugStringA(("File " + std::string(szFilePath) + " is " + std::string(szAction) + "\n").c_str());
}
// 继续遍历下一个通知结果
if (pNotifyInfo->NextEntryOffset == 0)
{
break;
}
pNotifyInfo = (FILE_NOTIFY_INFORMATION*)((BYTE*)pNotifyInfo + pNotifyInfo->NextEntryOffset);
}
}
else
{
std::cout << "ReadDirectoryChangesW failed, error code: " << GetLastError() << std::endl;
break;
}
}
CloseHandle(hFileIO);
}
int main()
{
monitorSelfFileIO();
return 0;
}
原文地址: https://www.cveoy.top/t/topic/0Fq 著作权归作者所有。请勿转载和采集!