[英]running process command line
我试图使用下面的代码获取Windows中运行进程的命令行:但我只得到IDman.exe
的命令行,如下所示:
C:\\Program Files (x86)\\Internet Download Manager\\IDMan.exe" /onboot
但我知道命令行还有很多其他进程。
知道我的代码有什么问题。
PVOID GetPebAddress(HANDLE ProcessHandle )
{
_NtQueryInformationProcess NtQueryInformationProcess =
(_NtQueryInformationProcess)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
PROCESS_BASIC_INFORMATION pbi;
NtQueryInformationProcess(ProcessHandle, 0, &pbi, sizeof(pbi), NULL);
return pbi.PebBaseAddress;
}
void get_process_cmd_line(DWORD pID)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ |
PROCESS_TERMINATE,
FALSE, pID);
PPEB ppeb = (PPEB) GetPebAddress(hProcess);
PPEB ppebCopy = (PPEB)malloc(sizeof(PEB));
BOOL result = ReadProcessMemory(hProcess,
ppeb,
ppebCopy,
sizeof(PEB),
NULL);
if(!result){std::cout<<"Er. adress";return;}
PRTL_USER_PROCESS_PARAMETERS pRtlProcParam = ppebCopy->ProcessParameters;
PRTL_USER_PROCESS_PARAMETERS pRtlProcParamCopy =
(PRTL_USER_PROCESS_PARAMETERS)malloc(sizeof(RTL_USER_PROCESS_PARAMETERS));
result = ReadProcessMemory(hProcess,
pRtlProcParam,
pRtlProcParamCopy,
sizeof(RTL_USER_PROCESS_PARAMETERS),
NULL);
if(!result){std::cout<<"Er. ";return;}
PWSTR wBuffer = pRtlProcParamCopy->CommandLine.Buffer;
USHORT len = pRtlProcParamCopy->CommandLine.Length;
PWSTR wBufferCopy = (PWSTR)malloc(len);
result = ReadProcessMemory(hProcess,
wBuffer,
wBufferCopy,
len,NULL);
if(!result){std::cout<<"Er. cmdLine";return;}
std::wcout<<wBufferCopy;
return;
}
目前还不清楚你想要实现什么,以及为什么这样。 为什么不能使用GetCommandLine呢?
无论动机和方法如何,我建议你在每个函数调用中彻底检查失败(从OpenProcess
开始)。 阅读有关特定功能在失败或成功时返回的文档。 始终使用GetLastError
来确定确切原因(或MSDN中提到的任何其他相关功能)。
您是否正在运行或愿意将您的程序作为服务运行? 如果没有,为什么不能一步一步地调试?
您当前的进程可能没有足够的权限来读取其他进程内存。 尝试以管理员身份运行该过程。
代码本身看起来基本没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.