【系统】Windows窗口数据管理和PE菜单资源分析

来源:互联网 发布:云上贵州数据交换平台 编辑:程序博客网 时间:2024/05/17 22:27

一、窗口分析

         CreateWindow创建一个窗口对象时,Windows为创建的窗口对象分配私有数据存储区,其中存储有窗口的实例句柄、父窗口句柄、窗口函数的地址和其它Windows用于管理窗口对象的数据。

        获取这些私有数据用GetWindowWord/GetWindowLong等函数。还有RegisterWindowClass()。

二、菜单分析

      1、菜单遍历

        其基本结构如下:

       

        实际的存储时,数据块1的子指针指向2、数据块2的兄弟指针指向指向数据块3、3的兄弟指针指向4、数据块2的子指针指向5。对于菜单而言,1是弹出式菜单,2、3、4也是弹出式菜单,叶子节点5、6、7、8、9是普通菜单。

//弹出式菜单typedef struct{WORD     fItemFlag; //菜单项标志WCHAR[]  szItemText;//菜单名}PopupMenuItem;//普通菜单typedef struct{WORD     fItemFlag; //菜单项标志WORD     wMenuID;   //菜单IDWCHAR[]  szItemText;//菜单名,是一个指针}NormalMenuItem;

            读取分析:数据指针定位到菜单数据,如何整个菜单读取结束,可设置level标记,将其改变,新的和原来的进行比较,即可判断是否读取完毕。

#define MF_END              0x00000080L //说明该菜单项是结束标记#define MF_ENABLED          0x00000000L //说明是普通菜单//菜单遍历分析void PEResourse::GetMenu(PBYTE *begin,int level){  WORD fItemFlag = **(WORD **)begin;//int endlevel = level;  if (level < 0)    return;  if (fItemFlag & 0x10)//弹出菜单项  {    GetPopMenuItem(begin);    ++ level;  }  else    GetNormalMenuItem(begin);//普通菜单项  if (fItemFlag & 0x80)    -- level;//   //if(endlevel = level),说明该层菜单已经读取完毕  GetMenu(begin,level);}//读取一个菜单的子菜单设计GetSubMenus(PBYTE* begin , int level){   int endlevel = level;   WORD fItemFlag;   while(endlevel ! = level ){   fItemFlag = **(WORD **)begin;   if(fItemFlag & 0x10)//是否是弹出式菜单   {       m_menu_str.push_back(begin+字符数据偏移);//弹出菜单名       level++;        GetMenu(begin,&level);//让begin指针指向本级下一个菜单项   }     else       m_menu_str.push_back(begin+字符数据偏移);//普通菜单名}   }

 参考:1、WINDOWS应用程序组织及实例

2、PE文件中菜单资源的格式分析

3、三维游戏场景的组织和绘制

  

原创粉丝点击