我有一个应用程序正在更改其他应用程序的某些设置(它是一个简单的C#应用程序,通过双击运行(无需安装)).
更改设置后,我需要重新启动其他应用程序,以便它反映更改的设置.
所以要做,我必须杀死正在运行的进程并再次启动进程,但问题是在杀死后我无法找到进程.(原因是系统不知道exe文件在哪里..)
有没有办法找出运行进程或exe的路径,如果它正在运行?
我不想手动给路径,即如果它正在运行获取路径,杀死进程并再次启动....我将稍后处理
下面的代码非常适合从32位应用程序获取32位进程的命令行字符串,从64位应用程序获取64位进程,从64位应用程序获取32位进程.如果我尝试从32位应用程序使用64位进程,这将会中断.原因是PROCESS_BASIC_INFORMATION和地址大小的结构大小差异.所以这是我的问题 -
1)在进程黑客(http://processhacker.sourceforge.net/forums/viewtopic.php?f=15&t=181)中使用wow64函数的建议似乎不起作用并且失败并出现以下错误 -
从A68291A0004028E0读取ProcessParameters地址时出现NtWow64ReadVirtualMemory64错误:8000000D
有没有人试过这个并且可以成功获取信息?我在他们的论坛上发布了同样的问题.
2)是否有其他方法可以查询可以可靠地用于x86和x64的peb信息?
int get_cmdline_from_pid( DWORD dwPid, char** cmdLine )
{
DWORD dw, read;
HANDLE hProcess;
NtQueryInformationProcess* pNtQip;
PROCESS_BASIC_INFORMATION pbInfo;
UNICODE_STRING cmdline;
WCHAR* wcmdLine;
*cmdLine = NULL;
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid );
if( !hProcess )
return FALSE;
pNtQip = (NtQueryInformationProcess*) GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQueryInformationProcess");
if(!pNtQip)
return FALSE;
pNtQip(hProcess, PROCESSBASICINFOMATION, &pbInfo, sizeof(pbInfo), NULL);
#ifdef _WIN64
ReadProcessMemory(hProcess, pbInfo.PebBaseAddress + 0x20, &dw, sizeof(dw),
&read);
#else
ReadProcessMemory(hProcess, pbInfo.PebBaseAddress + 0x10, &dw, sizeof(dw),
&read);
#endif
#ifdef _WIN64 …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来使用其服务名称而不是进程名称或PID来终止Windows服务.两个显而易见的选择是pskill或taskkill,但我似乎找不到使用这些方法中的任何一种来按名称终止服务的方法.
可以通过服务名称来实现吗?如果是这样,有人能够提供一个快速的例子吗?
如何根据可执行文件的路径杀死任务?
taskkill /F /IM "app.exe"
在这种情况下,的用法不起作用,因为还有其他程序在运行,它们具有相同的映像/进程/文件名,但它们是完全不同的可执行文件。路径不同,相同文件名的.exe文件也不同。
像"taskkill /F /IM "C:\path\to\exe\app.exe"
这样的东西是理想的。