打开带有DEBUG标志的进程的问题
Problems with opening a process with DEBUG flags
我试图用我的调试器打开一个进程,使用DEBUG_PROCESS
和DEBUG_ONLY_THIS_PROCESS
标志的CreateProcess
和进程被打开,但是当我尝试用我收到的句柄调用SymInitialize
时,它失败了。
这是我的代码:
#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();
}
如果我在没有创建标志的情况下调用CreateProcess,则syminialize成功。
我做错了什么?
您的错误是调用MAKE_HRESULT宏的结果
MAKE_HRESULT(ERROR_SEVERITY_ERROR, FACILITY_NULL, ERROR_INVALID_DATA)
所以你的错误代码不是垃圾。文档没有说明在这种情况下哪种数据可能是无效的。我要看看究竟是什么原因引起的问题。
编辑:这个代码为我工作
#include <windows.h>
#include <stdio.h>
#include <dbghelp.h>
#include <WinError.h>
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 = "C:\Windows\Notepad.exe";
// 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);
HRESULT err = HRESULT_FROM_WIN32(GetLastError());
}
我不知道为什么它不适合你-我运行的是windows XP,它可能是不同的。对于我来说,syminialize返回true,而GetLastError返回0x800700cb,这只意味着它没有找到将其指向带有符号文件的目录的环境变量。
这可能是一个愚蠢的问题,但也许你的系统中缺少一些调试库?你试过安装吗?调试工具窗户吗?我推荐"从Windows SDK下载调试工具"选项-阅读描述。我猜周围的每个编程IDE都会为你安装它,或者让你在调试任何东西之前安装它,但最好还是检查一下。
使用DEBUG_PROCESS标志创建进程时,不加载任何符号。需要等待一些LOAD_DLL_DEBUG_EVENT,然后调用syminialize()。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 使用管道从 STDIN 读取分叉进程时出现问题
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 在 c++ 中等待一个子进程与另一个子进程时遇到问题
- 使用boost进程间库的phpexec共享内存和Cloudfoundry容器问题
- 从导致问题的java进程附加到外部c++进程
- 使用SetParent将窗口嵌入外部进程的各种问题
- 读取进程内存问题未更新
- C++创建进程 - 系统错误#2找不到文件 - 我的文件路径有什么问题?
- 从另一个进程访问STA对象时出现问题
- COM进程中DLL中的DllMain出现问题
- 打开带有DEBUG标志的进程的问题
- 创建读取面向互联网的套接字的守护进程有什么安全问题?
- Q执行带参数的exe时出现进程问题
- 枚举进程句柄,奇怪的问题
- Q进程::执行(“清除”)问题
- 在Qt中使用windows进程时的问题