OpenThread种种

本文探讨了在不同Windows系统版本上如何实现OpenThread功能。从Windows NT 4.0的Native API NtOpenThread,到Windows 2K/XP的Win32 API,再到Windows 95/98的变通方法,以及Windows CE平台的解决方案,详细阐述了在没有直接API支持的情况下,如何模拟OpenThread以获取和控制线程。
摘要由CSDN通过智能技术生成

我在Windows NT系统(包括2K和XP)和Windows CE系统各写有一个工具,专门用来研究系统的运行时状态,比如进程、线程的各种信息,哪些DLL被哪些进程加载了,等等。如果某天突然想到一些好玩的东西,我也会把它加到工具里,比如,下图的这个,在系统登陆、锁定界面上运行了一个计算器。

一般情况下,我比较喜欢做的事是观察线程的Call Stack。这就要用到一个关键的API:OpenThread。基本上,想要获得跟线程有关的信息或者控制线程的运行(比如说你可以用 SuspendThread挂起一个线程甚至整个进程),都得先通过它来拿到线程的句柄。不过在Windows系统上,除了Windows 2K/XP/ME等平台,其他平台并没有一个现成的WIN32 API可供使用。这种情况下,我们必须以某种形式模拟OpenThread。

  • Windows NT 4.0。在NT 4.0的时代,可能是微软担心它过于危险,OpenThread还没成为一个标准的Win32 API。但是在NTDLL里提供了一个Native API:NtOpenThread。如果你反汇编跟踪过NtOpenProcess和NtOpenThread,会发现除了ClientId的初始化, NtOpenThread和NtOpenProcess基本上完全一样。利用NtOpenThread,OpenThread的NT4可实现如下:
HANDLE OpenThreadNT(DWORD dwDesiredAccess,
                    BOOL  bInheritHandle,
                    DWORD dwThreadId)
{
    OBJECT_ATTRIBUTES   ObjectAttributes;
    CLIENT_ID           ClientId;
    HANDLE              hThread;
    NTSTATUS            Status;

    InitializeObjectAttributes(
&ObjectAttributes, NULL, 0, NULL, NULL);

    
if (bInheritHandle)
        
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值