【发布时间】:2011-10-07 10:08:42
【问题描述】:
我在 c++ 中使用OpenProcess 打开一个进程,但我得到它后无法立即使用它,因为我收到“无效句柄错误”。我知道正确的句柄,因为当我在此句柄上执行 GetProcessId 时,它给了我正确的 PID。
这就是我打开进程的方式。
#include <windows.h>
#include <stdio.h>
#include <dbghelp.h>
#pragma (lib, "dbghelp.lib");
bool EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
bool ret;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &hToken))
return FALSE;
if (!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))
return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
ret = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
CloseHandle(hToken);
return ret;
}
void main()
{
EnablePrivilege(SE_DEBUG_NAME, TRUE);
STARTUPINFOA startInfo;
PROCESS_INFORMATION processInfo;
ZeroMemory( &startInfo, sizeof(startInfo) );
startInfo.cb = sizeof(startInfo);
ZeroMemory( &processInfo, sizeof(processInfo) );
DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
const char* comLine = "Some process path and name";
// Start the child process.
if( CreateProcessA( NULL, // No module name (use command line)
(LPSTR)comLine, //argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
creationFlags, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&startInfo, // Pointer to STARTUPINFO structure
&processInfo ) // Pointer to PROCESS_INFORMATION structure
== false )
{
printf("FAIL!");
return;
}
SetLastError(0);
bool ok = SymInitialize(processInfo.hProcess, NULL, true);
int err = GetLastError();
}
由于某种原因,最后一个错误值是垃圾。
有没有办法检查进程句柄是否可以使用?
【问题讨论】:
-
你具体想看什么?
-
怎么称呼
OpenProcess,句柄怎么办。 -
PROCESS_VM_READ 和 PROCESS_QUERY_INFORMATION 不是有效的进程创建标志。
-
好的,我删除了它们,但没有帮助。
-
Re "由于某种原因最后一个错误值是垃圾" -- 系统将 last-error 设置为错误;它不保证不会在 not-an-error 上设置 last-error。这可能不会导致错误 => 最后一个错误是“垃圾”。
标签: c++ windows process handle