Windows窗体之ShowWindow函数分析

Windows窗体之ShowWindow函数分析

南极向北 

一、窗体创建过程

    在文章《Windows消息机制的逆向分析》中详细分析了Windows的消息机制以及窗体的创建过程,文章中表述Windows窗体的创建分为三步:声明WNDCLASS实例、窗体注册、创建窗体。如果继续细分可以分为四步:声明WNDCLASS实例、窗体注册、创建窗体、显示窗体

    其中窗体注册函数是RegisterClass()或RegisterClassEx(),创建窗体则是CreateWindow()或CreatewindowEx()函数,显示窗体则是利用ShowWindow()函数。

    本文重点描述ShowWindow()函数。

二、ShowWindow函数

    CreateWindowEx 建立窗口以后,这时候,窗口虽已建立,但还没有在屏幕上显示出来。

    ShowWindow函数

    函数功能:该函数设置指定窗口的显示状态。

    函数原型:BOOL ShowWindow(HWND hWnd, int nCmdShow

    其中hWnd指窗口句柄;nCmdShow指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。在随后的调用中,该参数可以为下列值之一:

预定义值等 效 值nCmdShow值
SW_FORCEMINIMIZE在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数11
 SW_HIDE 隐藏窗口,大小不变,激活状态不变0
 SW_MAXIMIZE 最大化窗口,显示状态不变,激活状态不变3
 SW_MINIMIZE 最小化指定的窗口并且激活在Z序中的下一个顶层窗口6
 SW_RESTORE 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志9
 SW_SHOW在窗口原来的位置以原来的尺寸激活和显示窗口5
 SW_SHOWMAXIMIZED 显示并激活窗口,以最大化显示3
 SW_SHOWMINIMIZED 显示并激活窗口,以最小化显示2
 SW_SHOWMINNOACTIVE 显示窗口并最小化,激活窗口仍然维持激活状态7
 SW_SHOWNA 以窗口原来的状态显示窗口。激活窗口仍然维持激活状态8
 SW_SHOWNOACTIVATE 以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态4
SW_SHOWDEFAULT依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的10
 SW_SHOWNORMAL 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志1

三、函数过程分析

    本次分析样本仍以https://blog.csdn.net/weixin_39768541/article/details/85010183 文章中的CM。在RegisterClass、CreateWindow以及NtUserShowWindow(模块间调用无ShowWindow函数)处下断点。

    可以观察到函数执行流程是先将所有的窗体注册与创建完成后,再逐一执行NtUserShowWindow函数

    那么现在来搜索ShowWindow函数何处调用。利用RUN跟踪:

    调用函数即为NtUserShowWindow外层函数,其中标红位置即为nCmdShow值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值