走进Windows 2000 内部(二)

原创 2004年04月07日 22:06:00

走进Windows 2000 内部(二)

       --Windows 源代码解读与发现

2 动态线程本地存储(TLS)

TEB(Thread Environment Block 线程环境块) 是另一个更为重要的与线程信息相关的数据结构,现在我只知道它的一部分信息。不过没有关系,有了SoftICE,我还是找到了与TLS相关的信息。在当前TEB后0x00000e10外,是当前线程TLS表,它的大小是0x40。

       下面一段代码演示如何利用这个信息,对TLS进行操作。

PVOID GetCurrentTeb()

{

PTEB pTeb = NULL;

__asm

{

         mov eax,fs:[00000018h]

         mov pTeb , eax

}

         return pTeb;

}

 

// 得到 TLS 值

PVOID WINAPI MyTlsGet(DWORD dwIndex)

{

         if (dwIndex >= 0x40)

                   return FALSE;

         DWORD* pTls = (DWORD* )GetCurrentTeb();

         pTls = (DWORD *)((BYTE* )pTls + 0xe10);

         return (PVOID)pTls[dwIndex];

}

 

// 设置 TLS值

BOOL WINAPI MyTlsSet(DWORD dwIndex , PVOID pValue)

{

         if (dwIndex >= 0x40)

                   return FALSE;

         DWORD* pTls = (DWORD* )GetCurrentTeb();

         pTls = (DWORD *)((BYTE* )pTls + 0xe10);

         pTls[dwIndex] = (DWORD)pValue;

         return TRUE;

}

 

3 hotkey(热键)

       毫无疑问,这个信息比上面那个更有用。因为Win32并没有提供对hotkey进行直接操作的接口。

       在内部,这个管理是通过一个简单的链表来实现的,看下面的数据结构:

       typedef struct tagHOTKEY {

    PTHREADINFO pti;   // 相关的线程信息,这个结构说过的

    PWND    spwnd;               // 关联的窗口

    WORD    fsModifiers;      // MOD_SHIFT, MOD_ALT, MOD_CONTROL, MOD_WIN

    WORD    wFlags;     // MOD_SAS

    UINT    vk;                            // Virtual Key

    int     id;                    // ID

    struct tagHOTKEY *phkNext;          //支持链表的指针

} HOTKEY, *PHOTKEY;

 

         加上注释就一目了然了。系统为我们维护一个这样的链表,在有键盘中断时,会对这个链表进行查询,在查询匹配时,将发送消息线指定的窗口。

         现在的问题是找到链表的入口。这个入口是一个全局变量。利用SoftICE我找到了它在内存中的地址。不过在Windows的不同版本中这个值可能是不一样的。我使用的是 Windows 2000 Professional Sp4 (内部版本是 2195)。即使版本相同,如果你将你的系统设置成3GB的(不过在这个版本中,这样做没有任何好处,劝你不要这么做。),这个地址仍然会不同,现在我还没有找到好的办法解决这个问题。

        下面的代码演示对hotkey的一些操作

// 定义了入口指针的地址

#define HOTKEY_LIST_HEAD         (PHOTKEY* )(0xa01826c4)

typedef PHOTKEY HHOTKEY;

typedef struct tagHotKeyInfo

{

    HWND    hWnd;

    WORD    fsModifiers; // MOD_SHIFT, MOD_ALT, MOD_CONTROL, MOD_WIN

    UINT    vk;

    int     id;

}HotKeyInfo, *PHotKeyInfo;

// 得到入口地址

HHOTKEY WINAPI NtGetFirstHotKey()

{

         PHOTKEY phk = NULL;

         if (!ReadSysMemroy(&phk , HOTKEY_LIST_HEAD , sizeof(phk)))

                   return NULL;

         return phk;

}

 

// 得到下一个入口

HHOTKEY WINAPI NtGetNextHotKey(HHOTKEY hHotKey)

{

         PHOTKEY phk = NULL;

         if (!ReadSysMemroy(&phk ,

                  memaddr(hHotKey , HOTKEY ,  phkNext) ,

                  sizeof(phk))

                   )

                   return NULL;

         return phk;

}

 

// 得到完整的hotkeyinfo

BOOL WINAPI NtGetHotKeyInfo(HHOTKEY hHotKey , HotKeyInfo* hki)

{

         HOTKEY hk;

         if (!ReadSysMemroy(&hk , hHotKey  , sizeof(hk)))

                   return FALSE;

 

         HWND hwnd = NULL;

        

// WND 的信息还没有提供,不过hwnd在这个结构的0x0 处,你可以直接读取

         if (!ReadSysMemroy(&hwnd , memaddr(hk.spwnd, WND, head.toh.head.h), sizeof(hwnd)))

                   hwnd = NULL;

         hki->hWnd = hwnd;

         hki->id = hk.id;

         hki->fsModifiers = hk.fsModifiers;

         hki->vk = hk.vk;

         return TRUE;

}

 

// 搜索hotkey信息

PHOTKEY FindHotKey(HotKeyInfo* phki, BOOL bCheckK)

{

         HotKeyInfo hki;

         PHOTKEY phk;

         phk = NtGetFirstHotKey();

        

         while (phk)

         {

                   if (!NtGetHotKeyInfo(phk , &hki))

                            break;

                   if (bCheckK)

                   {

                            if (hki.vk == phki->vk && hki.fsModifiers == phki->fsModifiers)

                                     return phk;

                   }

                   else

                   {

                            if (hki.hWnd == phki->hWnd && hki.id == phki->id)

                                     return phk;

                   }

 

                   phk = NtGetNextHotKey(phk);

         }

        

         return NULL;

}

 

// 设置hotkey信息

BOOL WINAPI NtSetHotKeyInfo(HotKeyInfo* phki)

{

         PHOTKEY phk = FindHotKey(phki , TRUE);

         if (phk)

                   return FALSE;

 

         phk = FindHotKey(phki , FALSE);

         if (!phk)

                   return FALSE;;

        

         HOTKEY hk;

         if (!ReadSysMemroy(&hk , phk , sizeof(hk)))

                   return FALSE;

 

         hk.fsModifiers = phki->fsModifiers;

         hk.vk = phki->vk;

 

         return WriteSysMemroy(phk , &hk , sizeof(hk));

}

 

走进Windows 2000 内部(一)

走进Windows 2000 内部(一)       --Windows 源代码解读与发现       拿到Windows2000的源代码有些日子了,业余时间就看看,总结出了一些东西.我先发表一些比较...
  • ComeAlong
  • ComeAlong
  • 2004年04月02日 15:43
  • 1195

Win2000 DDK 开发环境

1.驱动程序开发环境开发Win2000下的驱动程序需要至少两台机器,一台用于开发,一台用于调试。如果驱动程序依赖低层设备,包括高级终端和服务器,则驱动程序必须经过多处理器环境中的调试和测试。1.1 F...
  • gch_ren
  • gch_ren
  • 2002年08月27日 09:23
  • 1994

Windows操作系统产品名与内部版本号的对应(windows版本号)

虽然Windows的命名取决于很多因素,形式各不相同,但是其内部版本号却是一脉相承的,从最初的Windows 1.0到之后的Windows 2.0、Windows 3.0,再到Windows 95,其...
  • whatday
  • whatday
  • 2013年08月07日 09:33
  • 14329

《走进搜索引擎》第二版勘误

P195 第4行 q_1, q_1, ..., q_T 应该改为: q_1, q_2, ..., q_T P199 7.7.1节第一自然段 x_{1,1}^j, x_{1,2}^...
  • pennyliang
  • pennyliang
  • 2011年06月10日 13:07
  • 2440

Windows2000下IE5升级到IE6

问: Windows2000下IE5不能升级到IE6 本人要把IE5.0升级到6.0,我已经下载了IE6.0,安装时显示出“以前的安装有尚未完成的操作,需重新启动,建议在运行安装程序之前重新启动计算机...
  • xpzhang
  • xpzhang
  • 2010年12月16日 14:29
  • 3385

Windows2000源代码下载

 // Microsoft copyright 1993-1999// Windows 2000 source code build on NT technology    SystemSetup()...
  • ingame
  • ingame
  • 2002年03月27日 17:58
  • 3100

搜索引擎最经典的书籍——《走进搜索引擎》(梁斌 著)百度网盘免费下载

最近在学习搜索引擎的一些知识,在网上下载了一本经典书籍——《走进搜索引擎》,在此和大家分享。 电子书基本信息: 《走进搜索引擎》 梁斌 著 2007年10月出版 ...
  • u013149325
  • u013149325
  • 2014年11月12日 10:09
  • 2434

走近Linux世界:Linux与Windows特性比较

1.Linux真的是免费的吗?  Linux和Windows最大的不同之处在哪里?Linux免费,而Windows要钱,并且很贵。真的是这样吗?  其实,并不是所有的Linux系统都是免费的。并且众多...
  • njchenyi
  • njchenyi
  • 2005年07月26日 14:48
  • 1781

Windows 2000 Server Resource Kit CD BT下载地址

Windows 2000 Server资源工具包 (从俄罗斯网站上找到的,所以有很多俄文)年份:2001 Microsoft开发商:微软  Windows平台:Windows与Vista的兼容性:是系...
  • xcntime
  • xcntime
  • 2010年12月08日 20:44
  • 1225

图解windows 2000系统安装步骤

1、插入WIN2K+SP4光盘,重启计算机(进入CMOS设置,设置计算机为“光盘第一启动”模式): (说明:如硬盘重新分区,请用DOS引导盘进入进行分区,格式化.最好C盘不小于5G.) 2、电脑重新启...
  • ecrown
  • ecrown
  • 2005年07月04日 09:53
  • 10147
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:走进Windows 2000 内部(二)
举报原因:
原因补充:

(最多只允许输入30个字)