以下是一个简单的代码示例,可以监视自己进程文件读写操作并使用 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;
}
写一个 监视自己进程文件读写操作的代码用OutPutDebugStringA调试输出

原文地址: https://www.cveoy.top/t/topic/0Fq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录