调用微软未公开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的关系
什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...
随机推荐
- Java练习 SDUT-1133_模拟计算器
C/C++经典程序训练3---模拟计算器 Time Limit: 1000 ms Memory Limit: 8192 KiB Problem Description 简单计算器模拟:输入两个整数和一 ...
- @loj - 2480@ 「CEOI2017」One-Way Streets
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一张 n 个点 m 条边的无向图,现在想要把这张图定向. 有 ...
- P2P四红线
P2P四红线 刘张君指出,P2P网络借贷平台是一种新兴金融业态,在鼓励其创新发展的同时,要记住四点:一是要明确这个平台的中介性质,二是要明确平台本身不得提供担保,三是不得将归集资金搞资金池,四是不得非 ...
- Java版各种排序算法 (冒泡,快速,选择,插入)
package com.test4; import java.util.*; //Calendar 显示时间 /** * @author qingfeng * 功能:排序算法 */ public cl ...
- 2018-3-22-win10-uwp-设置-HttpClient-浏览器标识
title author date CreateTime categories win10 uwp 设置 HttpClient 浏览器标识 lindexi 2018-3-22 9:1:55 +0800 ...
- [***]HZOJ 跳房子
一道非常神仙的题. 算法一:对于20%的数据: 模拟,直接走K步,时间复杂度O(K) 算法二:对于40%的数据:走M*N步内必有一个循环节.直接走,找循环节,时间复杂度O(M*N) 正解大概有两种做法 ...
- 可运行的js代码
canrun <html> <head> <title>测试博客园HTML源码运行程序</title> <meta http-equiv=&quo ...
- H3C Inverse ARP
- laravel post提交数据时显示异常
post提交数据时候显示如下: The page has expired due to inactivity. Please refresh and try again 这是由于在laravel框架中 ...
- tf.contrib.learn.preprocessing.VocabularyProcessor()
tf.contrib.learn.preprocessing.VocabularyProcessor (max_document_length, min_frequency=0, vocabulary ...