走进Windows 2000 内部(二)

走进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));

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Windows 2000,原名Windows NT 5.0。它结合了Windows 98和Windows NT 4.0的很多优良的功能/性能与一身,超越了Windows NT的原来含义。   Windows 2000系列分成四个产品:Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows 2000 Datacenter Server。 Windows 2000 Professional 是一个商业用户的桌面操作系统,也适合移动用户,是Windows NT Workstation 4.0的升级。Windows 2000 Server和Advanced Server分别是Windows NT Server 4.0及其企业版的升级产品。Windows 2000 Datacenter Server是一个新的品种,主要通过OEM的方式销售,是,支持32个以上的CPU和64GB的内存,以及4个节点的集群服务。 Windows 2000平台包括了Windows 2000 Professional 和Windows 2000 Server前后台的集成,下面仅从五个方面简要地介绍一下它的新特性和新功能。   一、活动目录   Windows 2000 Server在Windows NT Server 4.0的基础上,进一步发展了“活动目录(Active Directory)”。活动目录是从一个数据存储开始的。它采用了类似Exchange Server的数据存储,称为:Extensible Storage Service (ESS)。其特点是不需要事先定义数据库的参数,可以做到动态地增长,性能非常优良。这个数据存储之上已建立索引的,可以方便快速地搜索和定位。活动目录的分区是“域(Domain)”,一个域可以存储上百万的对象。域之间还有层次关系,可以建立域树和域森林,无限地扩展。   在数据存储之上,微软建立了一个对象模型,以构成活动目录。这一对象模型对LDAP有纯粹的支持,还可以管理和修改Schema。Schema包括了在活动目录中的计算机、用户和打印机等所有对象的定义,其本身也是活动目录的内容之一,在整个域森林中是唯一的。通过修改Schema的工具,用户或开发人员可以自己定义特殊的类和属性,来创建所需要的对象和对象属性。   活动目录包括两个方面:一个目录和与目录相关的服务。目录是存储各种对象的一个物理上的容器;而目录服务是使目录中所有信息和资源发挥作用的服务。活动目录是一个分布式的目录服务。信息可以分散在多台不同的计算机上,保证快速访问和容错;同时不管用户从何处访问或信息处在何处,都对用户提供统一的视图。 活动目录充分体现了微软产品的“ICE”,即集成性(Integration),深入性(Comprehensive),和易用性(Ease of Use)等优点。活动目录是一个完全可扩展,可伸缩的目录服务,既能满足商业ISP的需要,又能满足企业内部网和外联网的需要 最近在网上游荡的时候发现msdos和windows 2000的原代码 ,不敢独享,所以分享给大家
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值