这段时间公司项目中为了支持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

具体代码如下:

  1. #include "stdafx.h"
  2. #include <Windows.h>
  3. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
  4. typedef enum _THREADINFOCLASS {
  5. ThreadBasicInformation = ,
  6. ThreadTimes = ,
  7. ThreadPriority = ,
  8. ThreadBasePriority = ,
  9. ThreadAffinityMask = ,
  10. ThreadImpersonationToken = ,
  11. ThreadDescriptorTableEntry = ,
  12. ThreadEnableAlignmentFaultFixup = ,
  13. ThreadEventPair_Reusable = ,
  14. ThreadQuerySetWin32StartAddress = ,
  15. ThreadZeroTlsCell = ,
  16. ThreadPerformanceCount = ,
  17. ThreadAmILastThread = ,
  18. ThreadIdealProcessor = ,
  19. ThreadPriorityBoost = ,
  20. ThreadSetTlsArrayAddress = , // Obsolete
  21. ThreadIsIoPending = ,
  22. ThreadHideFromDebugger = ,
  23. ThreadBreakOnTermination = ,
  24. ThreadSwitchLegacyState = ,
  25. ThreadIsTerminated = ,
  26. ThreadLastSystemCall = ,
  27. ThreadIoPriority = ,
  28. ThreadCycleTime = ,
  29. ThreadPagePriority = ,
  30. ThreadActualBasePriority = ,
  31. ThreadTebInformation = ,
  32. ThreadCSwitchMon = , // Obsolete
  33. ThreadCSwitchPmu = ,
  34. ThreadWow64Context = ,
  35. ThreadGroupInformation = ,
  36. ThreadUmsInformation = , // UMS
  37. ThreadCounterProfiling = ,
  38. ThreadIdealProcessorEx = ,
  39. ThreadCpuAccountingInformation = ,
  40. ThreadSuspendCount = ,
  41. ThreadActualGroupAffinity = ,
  42. ThreadDynamicCodePolicyInfo = ,
  43. MaxThreadInfoClass = ,
  44. } THREADINFOCLASS;
  45. typedef NTSTATUS (WINAPI*ZWQUERYINFORMATIONTHREAD)(
  46. _In_ HANDLE ThreadHandle,
  47. _In_ THREADINFOCLASS ThreadInformationClass,
  48. _In_ PVOID ThreadInformation,
  49. _In_ ULONG ThreadInformationLength,
  50. _Out_opt_ PULONG ReturnLength
  51. );
  52. typedef struct _CLIENT_ID {
  53. DWORD UniqueProcess;
  54. DWORD UniqueThread;
  55. } CLIENT_ID;
  56. typedef CLIENT_ID *PCLIENT_ID;
  57. typedef struct _THREAD_BASIC_INFORMATION {
  58. NTSTATUS ExitStatus;
  59. PVOID TebBaseAddress;
  60. CLIENT_ID ClientId;
  61. KAFFINITY AffinityMask;
  62. LONG Priority;
  63. LONG BasePriority;
  64. } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
  65. ZWQUERYINFORMATIONTHREAD ZwQueryInformationThread;
  66. HMODULE init(LPCSTR szFuncNmae)
  67. {
  68. HMODULE hModule = LoadLibrary(_T("ntdll.dll"));
  69. if (hModule)
  70. ZwQueryInformationThread = (ZWQUERYINFORMATIONTHREAD)::GetProcAddress(hModule, szFuncNmae);
  71. return hModule;
  72. }
  73. int WINAPI threadProc(LPVOID ARG)
  74. {
  75. int i = ;
  76. while (--i)
  77. {
  78. printf("%d\r\n", i);
  79. Sleep();
  80. }
  81. return i;
  82. }
  83. int main()
  84. {
  85. DWORD dwThreadID = NULL;
  86. DWORD dwOldThreadID = NULL;
  87. HMODULE hModule = nullptr;
  88. hModule = init("ZwQueryInformationThread");
  89. HANDLE hthread = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)threadProc, NULL, NULL, &dwOldThreadID);
  90. if (hModule && ZwQueryInformationThread)
  91. {
  92. THREAD_BASIC_INFORMATION tbi;
  93. DWORD lRet = NULL;
  94. ZeroMemory(&tbi, sizeof(THREAD_BASIC_INFORMATION));
  95. if (ZwQueryInformationThread(hthread, ThreadBasicInformation, &tbi, sizeof(THREAD_BASIC_INFORMATION), &lRet) != STATUS_SUCCESS)
  96. {
  97. printf("获取失败\r\n");
  98. }
  99. printf("PROCESSid %d ThreadID %d\r\n", tbi.ClientId.UniqueProcess, tbi.ClientId.UniqueThread);
  100. FreeLibrary(hModule);
  101. }
  102.  
  103. CloseHandle(hthread);
  104. return ;
  105. }

调用微软未公开ZwQueryInformationThread函数根据线程句柄获取线程ID的更多相关文章

  1. CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视

    一.需求无论何时,当你在Explorer窗口中创建.删除或重命名一个文件夹/文件,或者插入拔除移动存储器时,Windows总是能非常快速地更新它所有的视图.有时候我们的程序中也需要这样的功能,以便当用 ...

  2. 线程、线程句柄、线程ID

     什么是句柄:句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...

  3. 微软未公开的 SP

    一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程.微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了).虽然这些存储过程可能很有用并为你节省了很多时 ...

  4. lua入门之二:c/c++ 调用lua及多个函数返回值的获取

    当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...

  5. 线程句柄和线程ID的区别

    ●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...

  6. 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)

    正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...

  7. 利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)

    利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔)   发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请 ...

  8. 线程属性总结 线程的api属性

    http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下:typedef struct{ int etachstate; //线程 ...

  9. 【windows 操作系统】线程句柄HANDLE与线程ID的关系

    什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...

随机推荐

  1. mysql ip常见异常

    这次的项目采用mysql数据库,以前没怎么接触过,所以遇到很多问题,在此小小总结一下: (1)com.mysql.jdbc.exceptions.jdbc4.CommunicationsExcepti ...

  2. laravel拓展validator验证

    https://blog.csdn.net/zl20117/article/details/53536520 首先,扩展的收个问题是,我的扩展类应该放在哪儿才好呢? 直接在app目录下,建立一个目录: ...

  3. 关于react-router 路径改变页面没有刷新

    routert.js 中: <Router> <Switch> <Route exact path="/" component={Login}> ...

  4. redis 清除缓存

  5. Python基础之(三)----PyGame安装步骤

    http://blog.csdn.net/qq_33166080/article/details/68928563 如果你已经有一定的编程经验,那么学习一门新语言最快的方式就是拿着一个比较中型的项目, ...

  6. Open Source Software List: The Ultimate List

    http://www.datamation.com/open-source/ Accessibility 1. The Accessibility Project The Business Value ...

  7. SuperSocket证书节点新增配置属性 "storeLocation"

    你可以指定你想要加载的证书的存储地点: <certificate storeName="My" storeLocation="LocalMachine" ...

  8. supersockets服务器配置热更新

    Keywords: 配置,热更新 此功能能够允许你在不重启服务器的前提下更新服务器实例的配置. (仅限1.6.5及其以上版本)

  9. HTML5 meta 属性整理

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...

  10. POJ 1321 深搜dfs

    思路其实挺简单的,为什么我想不到呢!!! 原因分析:(1)题目还是做少了 (2)做题目的时候在放音乐 (3)最近脑袋都不愿意想思路总是想一些无用的 改进:(1)以后做题目坚决不开音乐,QQ直接挂隐身 ...