使用DEBUG标志打开进程的问题

时间:2011-10-07 12:26:37

标签: c++ windows-7 createprocess dbghelp

我正在尝试使用带有CreateProcessDEBUG_PROCESS标记的DEBUG_ONLY_THIS_PROCESS调试器打开一个进程,然后打开进程,但是当我尝试调用{{ 1}}我收到的句柄失败了。

这是我的代码:

SymInitialize

如果我在没有创建标志的情况下调用CreateProcess,则symInitialize会成功 我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的错误是将MAKE_HRESULT macro称为

的结果
MAKE_HRESULT(ERROR_SEVERITY_ERROR, FACILITY_NULL, ERROR_INVALID_DATA)

所以你的错误代码不是垃圾。 Documentaion没有说明在这种情况下哪种数据可能无效。我会试着看看究竟是什么导致了这个问题。

编辑:

此代码适用于我

#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,它可能会有所不同。对我来说,SymInitialize返回true,GetLastError返回0x800700cb,这意味着它没有找到evirnment变量,指向带有符号文件的目录。

这可能是一个愚蠢的问题,但是您可能缺少系统中的一些调试库?你试过安装吗? Debugging Tools for Windows?我想推荐'从Windows SDK下载调试工具'选项 - 阅读说明。我想每个编程IDE都会为你安装它,或者在调试任何东西之前安装它,但最好还是检查一下。

答案 1 :(得分:0)

当使用DEBUG_PROCESS标志创建进程时,不会加载任何符号。需要等待一些LOAD_DLL_DEBUG_EVENT,然后调用SymInitialize()。