罗的32位汇编书,第五章第一个例子菜单,在RadASM中,程序是照书上抄的,
可以构建运行,但就是菜单的快捷键做不出来,不知道怎么样在资源文件中定义?
我把程序都贴出来,各位大哥,帮我看下,是哪里错了?
用的是RadASM集成环境
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;包含头文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_MAIN equ 2000
IDM_OPEN equ 4101
IDM_OPTION equ 4102
IDM_EXIT equ 4103
IDM_SETFONT equ 4201
IDM_SETCOLOR equ 4202
IDM_INACT equ 4203
IDM_GRAY equ 4204
IDM_BIG equ 4205
IDM_SMALL equ 4206
IDM_LIST equ 4207
IDM_DETAIL equ 4208
IDM_TOOLBAR equ 4209
IDM_TOOLBARTEXT equ 4210
IDM_INPUTBAR equ 4211
IDM_STATUSBAR equ 4212
IDM_HELP equ 4301
IDM_ABOUT equ 4302
ID_ICO equ 2000
IDA_MAIN equ 2000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hMenu dd ?
hSubMenu dd ?
hAccelerator dd ?
.const
szClassName db 'Menu Example',0
szCaptionMain db '一个菜单例子程序',0
szMenuHelp db '帮助主题(&H)',0
szMenuAbout db '关于本程序(&A)',0
szCaption db '菜单选择',0
szFormat db '您选择了菜单命令:%08d',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
_DisplayMenuItem proc _dwCommandID
LOCAL @szBuffer[256]:byte
pushad
invoke wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
invoke MessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OK
popad
ret
_DisplayMenuItem endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit proc
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
ret
_Quit endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
LOCAL @stPos:POINT
LOCAL @hSysMenu
mov eax,uMsg
.if eax==WM_CREATE ;>>>>>>>创建窗口所发的消息>>>>>>>>>>>>>>>>>>>>
invoke GetSubMenu,hMenu,1
mov hSubMenu,eax
;>>>>>>>>>>>在系统菜单中添加菜单项>>>>>>>>>>>>>>>>>>>>
invoke GetSystemMenu,hWnd,FALSE
mov @hSysMenu,eax
invoke AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
invoke AppendMenu,@hSysMenu,0,IDM_HELP,offset szMenuHelp
invoke AppendMenu,@hSysMenu,0,IDM_ABOUT,offset szMenuAbout
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.elseif eax == WM_COMMAND ;>>>>>命令消息>>>>>>>
invoke _DisplayMenuItem,wParam
mov eax,wParam
movzx eax,ax
.if eax == IDM_EXIT
call _Quit
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>处理打钩>>>>>>>>
.elseif eax >= IDM_TOOLBAR && eax <= IDM_STATUSBAR
mov ebx,eax
;>>>>>>>>>>>>>>>得到菜单的状态函数>>>>>>>>>>>>>>>
invoke GetMenuState,hMenu,ebx,MF_BYCOMMAND ;
.if eax == MF_CHECKED
mov eax,MF_UNCHECKED
.else
mov eax,MF_CHECKED
.endif
invoke CheckMenuItem,hMenu,ebx,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>处理打点>>>>>>>>>>>>>>
.elseif eax >= IDM_BIG && eax <= IDM_DETAIL
invoke CheckMenuRadioItem,hMenu,IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND
.endif
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>处理系统菜单消息>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.elseif eax == WM_SYSCOMMAND
mov eax , wParam
movzx eax,ax
.if eax == IDM_HELP || eax == IDM_ABOUT
invoke _DisplayMenuItem,wParam
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;>>>>>>>>>>>>>>>>>>>>>处理右击时弹出的菜单>>>>>>>
.elseif eax == WM_RBUTTONDOWN
invoke GetCursorPos,addr @stPos
invoke TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.elseif eax == WM_CLOSE
call _Quit
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret ;>>>>>>>>>>>>在这个函数后要有ret>>>>>>>>>>
.endif
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
LOCAL @stWndClass:WNDCLASSEX
LOCAL @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke LoadMenu,hInstance,IDM_MAIN
mov hMenu,eax
invoke LoadAccelerators,hInstance,IDA_MAIN
mov hAccelerator,eax
;>>>>>>>>>>>>>>>注册窗口类>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadIcon,hInstance,ID_ICO
mov @stWndClass.hIcon,eax
mov @stWndClass.hIconSm,eax
mov @stWndClass.hInstance,offset hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>建立并显示窗口>>>>>>>>>>>>>>
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,100,100,400,300,NULL,hMenu,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>消息循环>>>>>>>>>>>>>>>>>>
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateAccelerator,hWinMain,hAccelerator,addr @stMsg
.if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endif
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
资源文件是
#include "Res/munMnu.rc"
#define ID_ICO 2000
ID_ICO ICON "Tyrian.ICO"
那个菜单文件是:
#define IDM_MAIN 2000
#define IDM_OPEN 4101
#define IDM_OPTION 4102
#define IDM_EXIT 4103
#define IDM_SETFONT 4201
#define IDM_SETCOLOR 4202
#define IDM_INACT 4203
#define IDM_GRAY 4204
#define IDM_BIG 4205
#define IDM_SMALL 4206
#define IDM_LIST 4207
#define IDM_DETAIL 4208
#define IDM_TOOLBAR 4209
#define IDM_TOOLBARTEXT 4210
#define IDM_INPUTBAR 4211
#define IDM_STATUSBAR 4212
#define IDM_HELP 4301
#define IDM_ABOUT 4302
IDM_MAIN MENUEX
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "打开文件(&O)...",IDM_OPEN
MENUITEM "关闭文件(&C)...",IDM_OPTION
MENUITEM "",,0x00000800
MENUITEM "退出(&X)",IDM_EXIT
END
POPUP "查看(&V)"
BEGIN
MENUITEM "字体(&F)\tAlt+F",IDM_SETFONT
MENUITEM "背景色(&B)\tAlt+Ctrl+B",IDM_SETCOLOR
MENUITEM "",,0x00000800
MENUITEM "被禁用的菜单项",IDM_INACT,,0x00000002
MENUITEM "被灰化的菜单项",IDM_GRAY,,0x00000001
MENUITEM "",,0x00000800
MENUITEM "大图标(&G)",IDM_BIG
MENUITEM "小图标(&M)",IDM_SMALL
MENUITEM "列表(&L)",IDM_LIST
MENUITEM "详细资料(&D)",IDM_DETAIL
MENUITEM "",,0x00000800
POPUP "工具栏(&T)"
BEGIN
MENUITEM "标准按钮(S&)",IDM_TOOLBAR
MENUITEM "文字标签(&C)",IDM_TOOLBARTEXT
MENUITEM "命令栏(&I)",IDM_INPUTBAR
END
MENUITEM "状态栏(&U)",IDM_STATUSBAR
END
POPUP "帮助(&H)",,0x00004000
BEGIN
MENUITEM "帮助主题(&H)\tF1",IDM_HELP
MENUITEM "",,0x00000800
MENUITEM "关于本程序(&A)",IDM_ABOUT
END
END
问题是编出来的程序不能用快捷键?
用OD反汇编后,看到是根本没有得到快捷键句柄!
[课程]Linux pwn 探索篇!