GetThreadContext返回错误6,无效句柄
GetThreadContext returning error 6, Invalid Handle?
#include <iostream>
#include <Windows.h>
using std::cout;
using std::endl;
using std::cin;
int main()
{
cout << "1." << GetLastError() << endl;
PROCESS_INFORMATION processInfo;
STARTUPINFOA startupInfo = {0};
CONTEXT context;
context.ContextFlags = CONTEXT_FULL;
cout << "3." << GetLastError() << endl;
if (CreateProcess((PCHAR)"rsclient.exe", NULL, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInfo) == false) {
cout << "CreateProcess error: " << GetLastError() << endl;
}
cout << "4." << GetLastError() << endl;
if (GetThreadContext(processInfo.hProcess, &context) == false) {
cout << "GetThreadContext error:" << GetLastError() << endl;
}
return 0;
}
输出:1.2
3.2
4.1813
GetThreadContext error:6
我可以在任务管理器中看到挂起的进程,但我得到一个无效的句柄错误?
为什么GetLastError()在程序开始时给出ERROR_FILE_NOT_FOUND ?
您应该使用processInfo.hThread
,因为它是新进程的主线程句柄。processInfo.hProcess
是进程句柄,而不是线程句柄。
对于GetLastError()
返回ERROR_FILE_NOT_FOUND
,可能是别人调用了一个API,叫做SetLastError(ERROR_FILE_NOT_FOUND)
。来自GetLastError()
的文档:
返回值返回值是调用线程的最后一个错误代码。
文档中每个函数的返回值部分设置最后错误代码,记录函数所处的条件设置最后一个错误代码。设置线程的大多数函数最后错误代码在它们失败时设置它。然而,有些函数也当它们成功时设置最后错误代码。如果函数不是文档用于设置最后一个错误代码,由此返回值函数只是最近设置的最后错误代码;有些函数在成功时将最后错误代码设置为0,而其他函数则设置为0不是。
当你用进程id作为输入调用GetThreadContext时,因此Windows无法找到任何此类线程,因此返回ERROR_FILE_NOT_FOUND。你最好给新创建的进程的主线程,你会得到想要的结果。
相关文章:
- 枚举进程模块在有效句柄上返回无效句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取进程内存信息失败,错误 6 句柄无效
- 发布信号量返回错误 6(无效句柄)
- 如何测试 USB HID 句柄由于设备被重新插入而无效
- 为什么错误1400无效的窗口句柄
- 打电话给谁是无效的关闭手(句柄)是安全的吗?
- 在列表视图中启用分组 - 无效句柄
- DirectShow BindToObject返回无效句柄
- DoModal 返回 -1 Getlasterror 说句柄无效
- C++RegOpenKeyEx-错误6:句柄无效
- 错误 6 句柄在 Windows 上写入文件无效
- 错误 1400 无效的窗口句柄
- 无效句柄(使用应用程序验证程序)
- Qt 5.8 windows打印机api无效句柄错误
- FindFirstFile总是返回无效句柄
- ReadFileEx使用CreateFile的有效句柄时出现无效句柄错误
- GetThreadContext返回错误6,无效句柄
- OpenProcess函数返回无效句柄
- 为什么创建文件返回无效句柄