首页
社区
课程
招聘
GetThreadContext问题
发表于: 2010-10-26 16:03 4070

GetThreadContext问题

2010-10-26 16:03
4070
#include <windows.h>
#include<iostream>
#include<stdio.h>
#include <tlhelp32.h>
#include<WinNT.h>
int main()
{	CONTEXT Context;
	HANDLE snapshot;   
	PROCESSENTRY32 processinfo ;   
	processinfo.dwSize=sizeof(processinfo) ;   
	snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
	if(snapshot==INVALID_HANDLE_VALUE)  
		return FALSE;   
	BOOL status= Process32First(snapshot,&processinfo);   
	while(status)   
		{   
			if(strcmp("notepad.exe",processinfo.szExeFile)==0)  
					break;   
			status=Process32Next(snapshot,&processinfo);

		}   
	if(status==0)
	{	printf("CreateProcess failed (%d).\n",GetLastError());
		std::cout<<"没有找到你要挂起的进程","提示";
		return 1;
	}
	SuspendThread(snapshot);
	Context.ContextFlags = CONTEXT_CONTROL;
	if(!GetThreadContext(snapshot, &Context))
	{
		printf("CreateProcess failed (%d).\n",GetLastError());
	}
	CloseHandle(snapshot);
	return 0;

}
	


6号错误代码.表示无效的句柄.到底那里无效我也不懂了.请教大家

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你尝试获取的是notepad的进程句柄
然后调用suspendthread suspendthread的参数应该是线程的句柄

并且你穿进去的snapshot 在你的代码里是快照的句柄  不是进程的句柄 也不是线程的句柄

所以建议你再
CreateToolhelp32Snapshot 传入TH32CS_SNAPTHREAD来获取线程相关信息
通过
typedef struct tagTHREADENTRY32 {  
DWORD dwSize;  
DWORD cntUsage;  
DWORD th32ThreadID;  
DWORD th32OwnerProcessID;  
LONG tpBasePri;  
LONG tpDeltaPri;  
DWORD dwFlags;
} THREADENTRY32,  *PTHREADENTRY32;
里的 th32OwnerProcessID 和notepad的进程ID比较来确认线程是否属于notepad

然后选取你需要的线程ID  使用openthread来获取他的句柄

然后再把线程的句柄传给GetThreadContext
另外如果还不行的话 还要确认一下openthread的时候 线程句柄要有THREAD_GET_CONTEXT 的权限
2010-10-26 16:14
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
OpenThread
2010-10-26 17:11
0
游客
登录 | 注册 方可回帖
返回
//