还是学习VLD2.X版本看到的:

在Windows XP及之前的操作系统没有提供GetProcessIdOfThread的API,这里给出了一个替代的实现方式:

头文件:

#if _WIN32_WINNT < 0x0600 // Windows XP or earlier, no GetProcessIdOfThread()
DWORD _GetProcessIdOfThread (HANDLE thread);
#define GetProcessIdOfThread _GetProcessIdOfThread
#endif

源文件:

通过NtQueryInformationThread函数获取:

DWORD _GetProcessIdOfThread (HANDLE thread)
{
    typedef struct _CLIENT_ID {
        HANDLE UniqueProcess;
        HANDLE UniqueThread;
    } CLIENT_ID, *PCLIENT_ID;

typedef LONG NTSTATUS;
    typedef LONG KPRIORITY;

typedef struct _THREAD_BASIC_INFORMATION {
        NTSTATUS  ExitStatus;
        PVOID     TebBaseAddress;
        CLIENT_ID ClientId;
        KAFFINITY AffinityMask;
        KPRIORITY Priority;
        KPRIORITY BasePriority;
    } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;

const static THREADINFOCLASS ThreadBasicInformation = (THREADINFOCLASS)0;

typedef NTSTATUS (WINAPI *PNtQueryInformationThread) (HANDLE thread,
        THREADINFOCLASS infoclass, PVOID buffer, ULONG buffersize,
        PULONG used);

static PNtQueryInformationThread NtQueryInformationThread = NULL;

THREAD_BASIC_INFORMATION tbi;
    NTSTATUS status;
    if (NtQueryInformationThread == NULL) {
        HMODULE ntdll = GetModuleHandleW(L"ntdll.dll");
        if (ntdll)
        {
            NtQueryInformationThread = (PNtQueryInformationThread)GetProcAddress(ntdll, "NtQueryInformationThread");
        }

if (NtQueryInformationThread == NULL) {
            return 0;
        }
    }

status = NtQueryInformationThread(thread, ThreadBasicInformation, &tbi, sizeof(tbi), NULL);
    if(status < 0) {
        // Shall we go through all the trouble of setting last error?
        return 0;
    }

return (DWORD)tbi.ClientId.UniqueProcess;
}

GetProcessIdOfThread在WinXP及之前操作系统的替代实现的更多相关文章

  1. winxp退市是微软windows操作系统的滑铁卢

    winxp退市是微软windows操作系统的滑铁卢 兵败如山倒,windowsxp退市.宣布微软时代结束,windows将逐步退出中国市场,取而代之将是中国人自己的操作系统.中国人努力.中国人加油,不 ...

  2. 利用Javascript判断操作系统的类型实现不同操作系统下的兼容性

    原文地址 http://www.jb51.net/article/33640.htm 在通过Javascript实现客户端和服务端的交互时,有时候需要对操作系统进行判断,以便实现不同操作系统下的兼容性 ...

  3. Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案

    本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...

  4. C#程序及批处理中确定windows操作系统的方法

    先上一段代码: private void Form1_Load(object sender, EventArgs e) { OperatingSystem os = Environment.OSVer ...

  5. WinXP系统下Opencms的安装与配置

    1.WinXP系统下安装opencms (1)mysql已安装5.1.40 cmd命令行:mysql   -uroot  -proot (2)OpenCMS在安装时要求MySQL系统变量“max_al ...

  6. 杂谈:Windows操作系统的介绍与对Win8操作系统市场反响冷淡原因的分析

    Windows操作系统,毫无疑问是操作系统市场上的霸主,也正因为Windows操作系统的诞生让电脑的操作性能变得更加平民化,深的用户的喜爱.至今身边的人也是选择windows操作系统的居多,这篇文章也 ...

  7. CassiniDev源码学习 - 可替代IIS的单机Web Form解决方案

    最近一个项目是将web版的程序,改为单机版.话说这个web版号称当年十几个人用了至少3个月的时间开发,后来三年还不断有修改,而现在要在1个月内由一个人完成,这简直是不可能完成的任务!直觉告诉我,重写肯 ...

  8. USB耳机声卡-音频输入/输出控制器:DP108替代兼容CM108

    DP108是一款完全替代CM108的高度集成的单芯片USB音频解决方案芯片.方便的USB即插即用的兼容性,用户可以快速创建易用性,高质量和便携式USB音频产品基于高度集成的单芯片解决方案.所有重要的模 ...

  9. 操作系统的启动与引导问题 BIOS、UEFI、MBR、GPT

    关于ISO.WIM.GHO三者的正确理解. ISO(Isolation)文件一般以ISO为扩展名,是复制光盘上全部信息而形成的镜像文件. WIM是英文Microsoft Windows Imaging ...

随机推荐

  1. sublime 快键

    Keyboard Shortcuts - Windows/Linux Warning This topic is a draft and may contain wrong information. ...

  2. mono for android 学习资料

    http://www.cnblogs.com/Hua-Min/tag/Android/

  3. 手工启动oracle EM

    在WINDOWS上安完ORACLE发现没有EM没有启动,在网上找了一个手工启动的方法,试了,在WIN下同样可用. 人家的原文如下: oracle@linux:~> sqlplus/ as sys ...

  4. sql 练习(2)

    1.用Decode函数实现横表和竖表的转换 SELECT deptno DEPARTMENT_ID, COUNT(*) "部门人数", ),,,)) "超高收入人数()& ...

  5. 【转载】Xcode6中添加pch文件

    //原文地址:http://www.cnblogs.com/YouXianMing/p/3989155.html 1. 新建工程: 2. 创建pch文件:cmd+n->other->PCH ...

  6. 工具使用 eclipse the user operation is waiting for Building Working to be completed。

    问题定位: 在使用 IDE开发时,学习一个新事物如语言,框架,出现错误时暂时无法判断是新写的代码错还是IDE使用错: 则编写简单的未使用该技术的test.java ,运行后还有异常出现,则不是代码问题 ...

  7. Z - 不容易系列之(3)―― LELE的RPG难题

    Description          人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深C ...

  8. CAD2014以上版本不信任加载项解决方法

    前一段时间做CAD插件支持版本升级遇到了一个很棘手的问题,CAD2014以上版本增加了受信任功能,每次用程序启动CAD并加载arx文件时都弹出对话框询问是否加载 我的解决方法如下:(仅供参考) 读取注 ...

  9. volatile 和const 变量的使用

    一.volatile定义: 一个定义为volatile的变量是说这变量可能会被意想不到的被改变,这样,有了volatile变量后,就提醒编译器就不会去假设这个变量的值了.精确地说就是,编译中的优化器在 ...

  10. go import

    import "fmt"最常用的一种形式 import "./test"导入同一目录下test包中的内容 import f "fmt"导入f ...