我想检索操作系统中进程访问的所有文件路径。检索进程列表并且这些进程具有正确的句柄值。所以现在我想使用GetFinalPathNameByHandle
函数来获取这些文件的路径,但是所有记录的路径变量都是相同的。伙计们,我需要帮助。
源代码在这里:http://pastebin.com/nU26Vcsd或者如果 pastebin 无法访问这里http://hastebin.com/wahudogawa.avrasm
第 66 行是我需要帮助的地方。测试进程的每个文件处理程序的路径都相同,并且等于执行该程序的路径(而不是进程启动文件夹)。
我将其运行为:testprogram.exe | grep 5231
其中 5231 是我需要的进程的 PID。
结果如下所示:
PID: 5231 FileHandlePid: 44 The final path is: \Device\HarddiskVolume4\KillFileHandle\C++\Debug
虽然那些应该像:
PID: 5231 FileHandlePid: 44 The final path is: \Device\HarddiskVolume2\Users\username\AppData\Roaming\testapp
或者,如果我的预期结果有误,请纠正我。
最新补充:
感谢@Raymond Chen 的评论,我正在努力前进并使用 DuplicateHandle() 功能。到目前为止,我已经更新了代码(现在是硬编码的 pid,抱歉),添加了 HandleValueTemp,试图将它传递给 DuplicateHandle。输出更改为不可打印的字符。
for (i = 0; i < hCount; ++i)
if ((hFirstEntry[i].ObjectType == 28))
{
HANDLE TargetHandleValueTemp = (HANDLE)hFirstEntry[i].HandleValue;
HANDLE SourceProcHandleTemp = OpenProcess(PROCESS_DUP_HANDLE, FALSE, hFirstEntry[i].OwnerPid);
if (!DuplicateHandle(SourceProcHandleTemp, (HANDLE)hFirstEntry[i].HandleValue, GetCurrentProcess(), &TargetHandleValueTemp, 0, FALSE, DUPLICATE_SAME_ACCESS))
{
cout << "Error in DuplicateHandle"
}
CloseHandle(SourceProcHandleTemp);
TCHAR Path[MAX_PATH];
DWORD dwret = GetFinalPathNameByHandle(TargetHandleValueTemp, Path, MAX_PATH, 0);
_tprintf(TEXT("PID: %d\tFileHandle: %d\tThe final path is: %s\n"), hFirstEntry[i].OwnerPid, TargetHandleValueTemp, Path);
CloseHandle(TargetHandleValueTemp);
}
不时深入挖掘并查看评论。也许这段代码对这里的其他人有用。