看黑客怎样汇编创建简单的窗口

网站建设 2023-02-09 11:06www.1681989.com免费网站
理论 Wdows 程序中,在写图形用户界面时需要调用大量的标准 Wdows Gui 函数。其实这对用户和程序员来说都有好处,对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。对程序员来说,这些 Gui 源代码都是经过了微软的严格测试,随时拿来就可以用的。至于具体地写程序对于程序员来说还是有难度的。为了创建基于窗口的应用程序,必须严格遵守规范。作到这一点并不难,只要用模块化或面向对象的编程方法即可。 下面我就列出在桌面显示一个窗口的几个步骤 得到您应用程序的句柄(必需);
得到命令行参数(如果您想从命令行得到参数,可选);
注册窗口类(必需,除非您使用 Wdows 预定义的窗口类,如 MessageBox 或 dialog box;
产生窗口(必需);
在桌面显示窗口(必需,除非您不想立即显示它);
刷新窗口客户区;
进入无限的获取窗口消息的循环;
如果有消息到达,由负责该窗口的窗口回调函数处理;
如果用户关闭窗口,进行退出处理。
相对于单用户的 DOS 下的编程来说,Wdows 下的程序框架结构是相当复杂的。 Wdows 和 DOS 在系统架构上是截然不同的。Wdows 是一个多任务的操作系统,故系统中有多个应用程序彼此协同运行。这就要求 Wdows 程序员必须严格遵守编程规范,并养成良好的编程风格。 内容 下面是我们简单的窗口程序的源代码。在进入复杂的细节前,我将提纲挈领地指出几点要点 您应当把程序中要用到的所有常量和结构体的声明放到一个头文件中,并且在源程序的开始处包含这个头文件。这么做将会节省您大量的时间,也免得一次又一次的敲键盘。目前,最完善的头文件是 hutch 写的,您可以到 hutch 或我的网站下载。您也可以定义您自己的常量和结构体,但最好把它们放到独立的头文件中
用 cludelib 指令,包含您的程序要引用的库文件,譬如若您的程序要调用 "MessageBox",您就应当在源文件中加入如下一行 cludelib user32.lib 这条语句告诉 MASM 您的程序将要用到一些引入库。如果您不止引用一个库,只要简单地加入 cludelib 语句,不要担心链接器如何处理这么多的库,只要在链接时用链接开关 /LIBPATH 指明库所在的路径即可。
在其它地方运用头文件中定义函数原型,常数和结构体时,要严格保持和头文件中的定义一致,包括大小写。在查询函数定义时,这将节约您大量的时间;
在编译,链接时用makefile文件,免去重复敲键。
.386
.model flat,stdcall
option casemap:none
clude \masm32\clude\wdows.c
clude \masm32\clude\user32.c
cludelib \masm32\lib\user32.lib ; calls to functions user32.lib and kernel32.lib
clude \masm32\clude\kernel32.c
cludelib \masm32\lib\kernel32.lib WMa proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ; itialized data
ClassName db "SimpleWClass",0 ; the name of our wdow class
AppName db "Our First Wdow",0 ; the name of our wdow .DATA? ; Unitialized data
hInstance HINSTANCE ? ; Instance handle of our program
CommandLe LPSTR ?
.CODE ; Here begs our code
start:
voke GetModuleHandle, NULL ; get the stance handle of our program.
; Under W32, hmodule==hstance mov hInstance,eax
mov hInstance,eax
voke GetCommandLe ; get the mand le. You don't have to call this function IF
; your program doesn't process the mand le.
mov CommandLe,eax
voke WMa, hInstance,NULL,CommandLe, SW_SHOWDEFAULT ; call the ma function
voke ExitProcess, eax ; quit our program. The exit code is returned eax from WMa. WMa proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLe:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; create local variables on stack
LOCAL msg:MSG
LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX ; fill values members of wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW 1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
voke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
voke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
voke RegisterClassEx, addr wc ; register our wdow class
voke CreateWdowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
voke ShowWdow, hwnd,CmdShow ; display our wdow on desk
voke UpdateWdow, hwnd ; refresh the client area .WHILE TRUE ; Enter message loop
voke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
voke TranslateMessage, ADDR msg
voke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; return exit code eax
ret
WMa endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY ; if the user closes our wdow
voke PostQuitMessage,NULL ; quit our application
.ELSE
voke DefWdowProc,hWnd,uMsg,wParam,lParam ; Default message processg
ret
.ENDIF
xor eax,eax
ret
WndProc endp end start 分析 看到一个简单的 Wdows 程序有这么多行,您是不是有点想撤? 您必须要知道的是上面的大多数代码都是模板而已,模板的意思即是指这些代码对差不多所有标准 Wdows 程序来说都是相同的。在写 Wdows 程序时您可以把这些代码拷来拷去,把这些重复的代码写到一个库中也挺好。其实真正要写的代码集中在 WMa 中。这和一些 C 编译器一样,无须要关心其它杂务,集中精力于 WMa 函数。唯一不同的是 C 编译器要求您的源代码有必须有一个函数叫 WMa。否则 C 无法知道将哪个函数和有关的前后代码链接。相对C,汇编语言提供了较大的灵活性,它不强行要求一个叫 WMa 的函数。 下面我们开始分析,您可得做好思想准备,这可不是一件太轻松的活。 .386
.model flat,stdcall
option casemapnone WMa proto DWORD,DWORD,DWORD,DWORD clude \masm32\clude\wdows.c
clude \masm32\clude\user32.c
clude \masm32\clude\kernel32.c
cludelib \masm32\lib\user32.lib
cludelib \masm32\lib\kernel32.lib 您可以把前三行看成是"必须"的. .386告诉MASN我们要用80386指令集。
. model flat,stdcall告诉MASM 我们用的内存寻址模式,此处也可以加入stdcall告诉MASM我们所用的参数传递约定。 接下来是函数 WMa 的原型申明,因为我们稍后要用到该函数,故必须先声明。我们必须包含 wdow.c 文件,因为其中包含大量要用到的常量和结构的定义,该文件是一个文本文件,您可以用任何文本编辑器打开它, wdow.c还没有包含所有的常量和结构定义,不过 hutch 和我一直在不断加入新的内容。

Copyright © 2016-2025 www.1681989.com 推火网 版权所有 Power by