走进Windows 2000 内部(一)

原创 2004年04月02日 15:43:00

走进Windows 2000 内部()<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       --Windows 源代码解读与发现

       拿到Windows2000的源代码有些日子了,业余时间就看看,总结出了一些东西.我先发表一些比较有实用价值的,希望能对大家的学习与工作有所帮助.如果大家觉得有必要,我会陆陆续续发表解读出来的一些东西与大家共同进步.

       这一次主要讲讲user32模块里的一些东西.

       首先,我们需要一个能访问内核内存的工具函数库.令我感到奇怪的是,user32大量的代码在Kernel Mode下运行.不过那是MS的事,先说说这个工具函数库.我用DDK构建的它.很简单.有两个功能地:,写内核内存.

       为了不偏离主题,只列出最后的函数原形

BOOL WriteSysMemroy(PVOID pAddr , PVOID pBuff , DWORD dwLen);

BOOL ReadSysMemroy(PVOID pBuff , PVOID pAddr , DWORD dwLen);

 

1 关于THREADINFO

先列出这个结构的原形

 

// 大部分都有注释,它们的意意慢慢说

 

typedef struct tagTHREADINFO

{

       //W32THREAD;

    //PTL             ptl;                // Listhead for thread lock list

// W32THREAD PTL 是我所不知道的结构,通过SoftICE的帮助,我知道了它们的大小,

//于是我弄了个东东来填充它

       PADDING(padding1 , 0x2c);                    

    PVOID               ppi;                // process info struct for this thread

                                                                      // type is PPROCESSINFO

       PVOID                  rpdesk;                            // type is PDESKTOP

    PDESKTOPINFO     pDeskInfo;          // Desktop info visible to client

                                                                      // type is PDESKTOPINFO

    PCLIENTINFO           pClientInfo;       // Client info stored in TEB

                                                                      // type is PCLIENTINFO

       DWORD           TIF_flags;          // TIF_ flags go here.

       PUNICODE_STRING pstrAppName;        // Application module name.

       PVOID           psmsSent;           // Most recent SMS this thread has sent

                                                                      // type is PSMS

    PVOID           psmsCurrent;        // Received SMS this thread is currently processing

                                                                      // type is PSMS

 

    PVOID           psmsReceiveList;    // SMSs to be processed

                                                                      // type is PSMS

       LONG            timeLast;           // Time, position, and ID of last message

    ULONG_PTR       idLast;

       int             cQuit;

    int             exitCode;

       HDESK           hdesk;              // Desktop handle

                                                                      // HDESK

    int             cPaintsReady;

    UINT            cTimersReady;

       PVOID                 pMenuState;                     // type is PMENUSTATE

       union {

        PVOID            ptdb;          // Win16Task Schedule data for WOW thread

                                                                      // type is PTDB

        PVOID                  pwinsta;        // Window station for SYSTEM thread

// type is PWINDOWSTATION

    };

       PVOID                         psiiList;       // thread DDEML instance list

                                                                      // type is PSVR_INSTANCE_INFO

    DWORD           dwExpWinVer;

    DWORD           dwCompatFlags;      // The Win 3.1 Compat flags

    DWORD           dwCompatFlags2;     // new DWORD to extend compat flags for NT5+ features

       PVOID           pqAttach;           // calculation variabled used in

                                                                      // type is PQ

       // zzzAttachThreadInput()

      

    PTHREADINFO     ptiSibling;         // pointer to sibling thread info

      

    PVOID               pmsd;                            // type is PMOVESIZEDATA

      

    DWORD           fsHooks;            // WHF_ Flags for which hooks are installed

                                                                     

    PHOOK           sphkCurrent;        // Hook this thread is currently processing

                                                                      // type is PHOOK

      

    PVOID                  pSBTrack;                     // type is PSBTRACK

      

    HANDLE          hEventQueueClient;

    PVOID            pEventQueueServer;  // type is PKEVENT

 

    PVOID                 PtiLink;            // Link to other threads on desktop

                                                                      // type is LIST_ENTRY

    int             iCursorLevel;       // keep track of each thread's level

   

       PADDING(padding2 , 4);

 

       POINT           ptLast;

      

    PWND            spwndDefaultIme;            // Default IME Window for this thread

                                                                      // type is PWND

 

    PVOID           spDefaultImc;                      // Default input context for this thread

                                                                      // type is PIMC

 

    HANDLE          hklPrev;                       // Previous active keyboard layout

// type is HKL

 

    int             cEnterCount;

      

    MLIST           mlPost;             // posted message list.

    USHORT          fsChangeBitsRemoved;// Bits removed during PeekMessage

    WCHAR           wchInjected;        // character from last VK_PACKET

    DWORD           fsReserveKeys;      // Keys that must be sent to the active

       // active console window.

    PVOID                  *apEvent;           // Wait array for xxxPollAndWaitForSingleObject

                                                                      // type is PKEVENT

    ACCESS_MASK     amdesk;             // Granted desktop access

 

    UINT            cWindows;           // Number of windows owned by this thread

    UINT            cVisWindows;        // Number of visible windows on this thread

      

    PHOOK           aphkStart[CWINHOOKS];   // Hooks registered for this thread

                                                                             // type is PHOOK

    BYTE                    cti;                        // Use this when no desktop is available

                                                                      // type is CLIENTTHREADINFO

      

       }THREADINFO ,* PTHREADINFO;

这个结构用来保存线程的一些信息,它怎么得到呢,请看下面的代码

PTHREADINFO WINAPI NtPtiCurrent(void)

{

      

       PTHREADINFO pti = NULL;

       __asm

       {

              mov eax,fs:[00000018h]

              mov eax,[eax+40h]

       mov pti , eax ; 现在pti 保存的就是当前线程的THREADINFO.

       }

       return  pti;

}

 

知道这个结构很重要,下面我就说一个这个结构的应用.

大家都知道Windows的消息Hook,下面这段代码可是让你的线程不被Hook,也就是让Hook失效

 

// 这个宏得到一个结构指针的成员地址

#define memaddr(p , s , m)          (PVOID) ( (DWORD ) p + offsetof(s , m) )

 

 

 

       PTHREADINFO pti = NtPtiCurrent();

      

       if (pti == NULL)

              return FALSE;

 

       DWORD TIF_flags;

 

       if (!ReadSysMemroy(

              &TIF_flags ,

              memaddr(pti , THREADINFO , TIF_flags) ,

              sizeof(TIF_flags))

              )

              return FALSE;

      

       TIF_flags |= 0x20000000;

 

       return WriteSysMemroy(

              memaddr(pti , THREADINFO , TIF_flags) ,

              &TIF_flags ,

              sizeof(TIF_flags)

              );

原理很简单,就是设了一个标志,告诉Windows Hook ,别来惹我

好了,先开个头,看看反响,如果可以的话,再接着说.

走进Windows 2000 内部(二)

走进Windows 2000 内部(二)       --Windows 源代码解读与发现2 动态线程本地存储(TLS)TEB(Thread Environment Block 线程环境块) 是另一个...
  • ComeAlong
  • ComeAlong
  • 2004年04月07日 22:06
  • 960

Win2000 DDK 开发环境

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

windows 2000 server找不到dhcp服务器

        最近两天在学习dhcp协议,今天想自己配一下dhcp服务器,于是乎在虚拟机上装了Windows 2000 Server系统。正确安装dhcp所要的Windows组件后,怎么也开启不了d...
  • jucy1111
  • jucy1111
  • 2008年02月03日 18:17
  • 557

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

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

Windows2000下IE5升级到IE6

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

跟我学系列,走进Scrapy爬虫(五)聊一聊Items

本章工作任务 任务1:为什么要使用Item? 任务2:如何使用Item? 任务3:Item的扩展 本章技能目标及重难点 编号 技能点描述 级别 1 为什么要使用Item? ★ 2 如何使用Item? ...
  • fanfzj
  • fanfzj
  • 2017年03月18日 19:36
  • 149

Windows2000源代码下载

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

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

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
  • 2435

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

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

Windows 2000 Server Resource Kit CD BT下载地址

Windows 2000 Server资源工具包 (从俄罗斯网站上找到的,所以有很多俄文)年份:2001 Microsoft开发商:微软  Windows平台:Windows与Vista的兼容性:是系...
  • xcntime
  • xcntime
  • 2010年12月08日 20:44
  • 1216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:走进Windows 2000 内部(一)
举报原因:
原因补充:

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