调用微软未公开ZwQueryInformationThread函数根据线程句柄获取线程ID
这段时间公司项目中为了支持XP系统同事代码中用到了
GetThreadId
这个微软的API 但是这个API最低支持版本是
Windows version Windows Vista [desktop apps | UWP apps] Windows Server 2003 [desktop apps | UWP apps]
最后使用了
ZwQueryInformationThread 来解决
解决以后记录下 如果又遇到同样问题的 可以参考
参考文档
http://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FThread%2FTHREAD_INFORMATION_CLASS.html
具体代码如下:
- #include "stdafx.h"
- #include <Windows.h>
- #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
- typedef enum _THREADINFOCLASS {
- ThreadBasicInformation = ,
- ThreadTimes = ,
- ThreadPriority = ,
- ThreadBasePriority = ,
- ThreadAffinityMask = ,
- ThreadImpersonationToken = ,
- ThreadDescriptorTableEntry = ,
- ThreadEnableAlignmentFaultFixup = ,
- ThreadEventPair_Reusable = ,
- ThreadQuerySetWin32StartAddress = ,
- ThreadZeroTlsCell = ,
- ThreadPerformanceCount = ,
- ThreadAmILastThread = ,
- ThreadIdealProcessor = ,
- ThreadPriorityBoost = ,
- ThreadSetTlsArrayAddress = , // Obsolete
- ThreadIsIoPending = ,
- ThreadHideFromDebugger = ,
- ThreadBreakOnTermination = ,
- ThreadSwitchLegacyState = ,
- ThreadIsTerminated = ,
- ThreadLastSystemCall = ,
- ThreadIoPriority = ,
- ThreadCycleTime = ,
- ThreadPagePriority = ,
- ThreadActualBasePriority = ,
- ThreadTebInformation = ,
- ThreadCSwitchMon = , // Obsolete
- ThreadCSwitchPmu = ,
- ThreadWow64Context = ,
- ThreadGroupInformation = ,
- ThreadUmsInformation = , // UMS
- ThreadCounterProfiling = ,
- ThreadIdealProcessorEx = ,
- ThreadCpuAccountingInformation = ,
- ThreadSuspendCount = ,
- ThreadActualGroupAffinity = ,
- ThreadDynamicCodePolicyInfo = ,
- MaxThreadInfoClass = ,
- } THREADINFOCLASS;
- typedef NTSTATUS (WINAPI*ZWQUERYINFORMATIONTHREAD)(
- _In_ HANDLE ThreadHandle,
- _In_ THREADINFOCLASS ThreadInformationClass,
- _In_ PVOID ThreadInformation,
- _In_ ULONG ThreadInformationLength,
- _Out_opt_ PULONG ReturnLength
- );
- typedef struct _CLIENT_ID {
- DWORD UniqueProcess;
- DWORD UniqueThread;
- } CLIENT_ID;
- typedef CLIENT_ID *PCLIENT_ID;
- typedef struct _THREAD_BASIC_INFORMATION {
- NTSTATUS ExitStatus;
- PVOID TebBaseAddress;
- CLIENT_ID ClientId;
- KAFFINITY AffinityMask;
- LONG Priority;
- LONG BasePriority;
- } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
- ZWQUERYINFORMATIONTHREAD ZwQueryInformationThread;
- HMODULE init(LPCSTR szFuncNmae)
- {
- HMODULE hModule = LoadLibrary(_T("ntdll.dll"));
- if (hModule)
- ZwQueryInformationThread = (ZWQUERYINFORMATIONTHREAD)::GetProcAddress(hModule, szFuncNmae);
- return hModule;
- }
- int WINAPI threadProc(LPVOID ARG)
- {
- int i = ;
- while (--i)
- {
- printf("%d\r\n", i);
- Sleep();
- }
- return i;
- }
- int main()
- {
- DWORD dwThreadID = NULL;
- DWORD dwOldThreadID = NULL;
- HMODULE hModule = nullptr;
- hModule = init("ZwQueryInformationThread");
- HANDLE hthread = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)threadProc, NULL, NULL, &dwOldThreadID);
- if (hModule && ZwQueryInformationThread)
- {
- THREAD_BASIC_INFORMATION tbi;
- DWORD lRet = NULL;
- ZeroMemory(&tbi, sizeof(THREAD_BASIC_INFORMATION));
- if (ZwQueryInformationThread(hthread, ThreadBasicInformation, &tbi, sizeof(THREAD_BASIC_INFORMATION), &lRet) != STATUS_SUCCESS)
- {
- printf("获取失败\r\n");
- }
- printf("PROCESSid %d ThreadID %d\r\n", tbi.ClientId.UniqueProcess, tbi.ClientId.UniqueThread);
- FreeLibrary(hModule);
- }
- CloseHandle(hthread);
- return ;
- }
调用微软未公开ZwQueryInformationThread函数根据线程句柄获取线程ID的更多相关文章
- CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视
一.需求无论何时,当你在Explorer窗口中创建.删除或重命名一个文件夹/文件,或者插入拔除移动存储器时,Windows总是能非常快速地更新它所有的视图.有时候我们的程序中也需要这样的功能,以便当用 ...
- 线程、线程句柄、线程ID
什么是句柄:句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...
- 微软未公开的 SP
一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程.微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了).虽然这些存储过程可能很有用并为你节省了很多时 ...
- lua入门之二:c/c++ 调用lua及多个函数返回值的获取
当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...
- 线程句柄和线程ID的区别
●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...
- 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)
正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...
- 利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)
利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔) 发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请 ...
- 线程属性总结 线程的api属性
http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下:typedef struct{ int etachstate; //线程 ...
- 【windows 操作系统】线程句柄HANDLE与线程ID的关系
什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...
随机推荐
- mysql ip常见异常
这次的项目采用mysql数据库,以前没怎么接触过,所以遇到很多问题,在此小小总结一下: (1)com.mysql.jdbc.exceptions.jdbc4.CommunicationsExcepti ...
- laravel拓展validator验证
https://blog.csdn.net/zl20117/article/details/53536520 首先,扩展的收个问题是,我的扩展类应该放在哪儿才好呢? 直接在app目录下,建立一个目录: ...
- 关于react-router 路径改变页面没有刷新
routert.js 中: <Router> <Switch> <Route exact path="/" component={Login}> ...
- redis 清除缓存
- Python基础之(三)----PyGame安装步骤
http://blog.csdn.net/qq_33166080/article/details/68928563 如果你已经有一定的编程经验,那么学习一门新语言最快的方式就是拿着一个比较中型的项目, ...
- Open Source Software List: The Ultimate List
http://www.datamation.com/open-source/ Accessibility 1. The Accessibility Project The Business Value ...
- SuperSocket证书节点新增配置属性 "storeLocation"
你可以指定你想要加载的证书的存储地点: <certificate storeName="My" storeLocation="LocalMachine" ...
- supersockets服务器配置热更新
Keywords: 配置,热更新 此功能能够允许你在不重启服务器的前提下更新服务器实例的配置. (仅限1.6.5及其以上版本)
- HTML5 meta 属性整理
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- POJ 1321 深搜dfs
思路其实挺简单的,为什么我想不到呢!!! 原因分析:(1)题目还是做少了 (2)做题目的时候在放音乐 (3)最近脑袋都不愿意想思路总是想一些无用的 改进:(1)以后做题目坚决不开音乐,QQ直接挂隐身 ...