首页
社区
课程
招聘
[求助]postquitmessage错误!
发表于: 2010-3-2 17:13 5237

[求助]postquitmessage错误!

2010-3-2 17:13
5237
N久木有整ASM了,都快丢光了,现在想捡起来,结果杯具了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
            .386
            .model  flat,stdcall
            option  casemap:none
             
             
    include     windows.inc
    include     kernel32.inc
    include     user32.inc
    include     gdi32.inc
     
    includelib  kernel32.lib
    includelib  user32.lib
    includelib  gdi32.lib
     
     
            .data
             
    szFormat    db      '%d * %d',0
    szCaption   db      'Caption',0
    szClass     db      'MyClass',0
     
    szMenu1     db      'File',0
    szMenu11    db      'Open',0
    szMenu12    db      'Save',0
    szMenu13    db      'Exit',0
     
            .data?
    hInstance   dd      ?
    hMenu       dd      ?
    hSubMenu    dd      ?
     
     
            .code
             
MsgLoop:
        push    ebp
        mov ebp,esp
         
        push    ebx
        push    edi
        push    esi
         
        sub esp,sizeof PAINTSTRUCT + sizeof RECT + 4 + 16
        mov edi,esp
        mov ecx,sizeof PAINTSTRUCT + sizeof RECT + 4 + 16
        xor eax,eax
        cld
        rep stosb
         
        ;buff:dword ptr [ebp - 12 - 16]
        ;hdc:dword ptr [ebp - 12 - 16 - 4]
        ;rect:dword ptr [ebp - 12 - 16 - 4 - sizeof RECT]
        ;paintstruct:dword ptr [ebp - 12 - 16 - 4 - sizeof RECT - sizeof PAINTSTRUCT]
        ;hWnd:dword ptr [ebp + 8]
        ;uMsg:dword ptr [ebp + 12]
        ;wParam:dword ptr [ebp + 16]
        ;lParam:dword ptr [ebp + 20]
         
        mov eax,dword ptr [ebp + 12]
        cmp eax,WM_CLOSE
        jz  wmClose
        cmp eax,WM_PAINT
        jz  wmPaint
         
    wmDefault:
         
        invoke  DefWindowProc,dword ptr [ebp + 8],dword ptr [ebp + 12],dword ptr [ebp + 16],dword ptr [ebp + 20]
        jmp wmEnd
         
         
    wmPaint:
         
        lea eax,dword ptr [ebp - 12 - 16 - 4 - sizeof RECT - sizeof PAINTSTRUCT]
        invoke  BeginPaint,dword ptr [ebp + 8],eax
        mov dword ptr [ebp - 12 - 16 - 4],eax
         
        lea eax,dword ptr [ebp - 12 - 16 - 4 - sizeof RECT]
        invoke  GetClientRect,dword ptr [ebp + 8],eax
         
        lea ebx,dword ptr [ebp - 12 - 16]
        mov ecx,dword ptr [ebp - 12 - 16 - 4 - 4 -4]
        mov eax,dword ptr [ebp - 12 - 16 - 4 - 4]
        invoke  wsprintf,ebx,offset szFormat,ecx,eax
         
        lea ebx,dword ptr [ebp - 12 - 16]
        lea eax,dword ptr [ebp - 12 - 16 - 4 - sizeof RECT]
        invoke  DrawText,dword ptr [ebp - 12 - 16 - 4],ebx,-1,eax,DT_SINGLELINE or DT_CENTER or DT_VCENTER
         
        lea eax,dword ptr [ebp - 12 - 16 - 4 -sizeof RECT - sizeof PAINTSTRUCT]
        invoke  EndPaint,dword ptr [ebp + 8],eax
         
        xor eax,eax
        jmp wmEnd
         
    wmClose:
        invoke  DestroyWindow,dword ptr [ebp + 8]
        invoke  PostQuitMessage,0
        xor eax,eax
 
    wmEnd:
        mov esp,ebp
        sub esp,12
        pop esi
        pop edi
        pop ebx
         
        mov esp,ebp
        pop ebp
         
        pop ecx
        add esp,16
        push    ecx
         
        ret
main:
        push    ebp
        mov ebp,esp
         
        sub esp,sizeof WNDCLASSEX + sizeof MSG + 4
        mov ecx,sizeof WNDCLASSEX + sizeof MSG + 4
        xor eax,eax
        mov edi,esp
        cld
        rep stosb
         
        ;wndclassex:dword ptr [ebp - 4 - sizeof MSG - sizeof WNDCLASSEX]
        ;msg:dword ptr [ebp - 4 - sizeof MSG]
        ;hWnd:dword ptr [ebp - 4]
         
        invoke  GetModuleHandle,NULL
        mov hInstance,eax
        lea ebx,dword ptr [ebp - 4 - sizeof MSG - sizeof WNDCLASSEX]
        assume  ebx:ptr WNDCLASSEX
        mov [ebx].hInstance,eax
        invoke  LoadIcon,NULL,IDI_APPLICATION
        mov [ebx].hIcon,eax
        invoke  LoadCursor,NULL,IDC_ARROW
        mov [ebx].hCursor,eax
        mov [ebx].cbSize,sizeof WNDCLASSEX
        mov [ebx].lpfnWndProc,offset MsgLoop
        mov [ebx].lpszClassName,offset szClass
        mov [ebx].hbrBackground,COLOR_WINDOW + 1
        mov [ebx].style,CS_HREDRAW or CS_VREDRAW
         
        invoke  RegisterClassEx,ebx
        invoke  GetSystemMetrics,SM_CXSCREEN
        sub eax,400
        shr eax,1
        push    eax
        invoke  GetSystemMetrics,SM_CYSCREEN
        sub eax,300
        shr eax,1
        pop ecx
         
        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,\
                    offset szClass,\
                    offset szCaption,\
                    WS_VISIBLE or WS_OVERLAPPEDWINDOW,\
                    ecx,eax,400,300,0,0,0,0
        mov dword ptr [ebp - 4],eax
         
        invoke  UpdateWindow,eax
        ;invoke ShowWindow,dword ptr [ebp - 4],SW_SHOW
        add ebx,sizeof WNDCLASSEX
         
    @@:
        invoke  GetMessage,ebx,dword ptr [ebp - 4],0,0
        test    eax,eax
        jz  @f
        invoke  TranslateMessage,ebx
        invoke  DispatchMessage,ebx
        jmp @b
    @@:
        xor eax,eax
        mov esp,ebp
        pop ebp
        ret
         
start: 
        call    main
        invoke  ExitProcess,0
end start

运行一切正常,只是关闭后窗口被销毁,process却不能退出。
请大大帮我see一see哪儿有毛病。

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (9)
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
2
这个是编译后的东东: abc.rar
上传的附件:
2010-3-2 17:22
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
消息处理有错呗
      invoke  GetMessage,ebx,dword ptr [ebp - 4],0,0
      test  eax,eax
      jz  @f    ---- 改成jb就好了,不过还是认真把消息处理好吧
2010-3-2 17:30
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
4
[QUOTE=iiii;769216]消息处理有错呗
      invoke  GetMessage,ebx,dword ptr [ebp - 4],0,0
      test  eax,eax
      jz  @f    ---- 改成jb就好了,不过还是认真把消息处理好吧[/QUOTE]

jz改jb一样报错。
而且CPU占用一下就100%了。


也许休息一晚明天看就好了吧。
希望今天有大大能替我解惑,谢大大了。
2010-3-2 17:34
0
雪    币: 2293
活跃值: (543)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
5
自己测试了下,不是.打酱油
2010-3-2 17:47
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
我的电脑没有报错。
之前的修改确实蠢了,- -

改成下面这样就好了。
00401170 |> /6A 00 /push 0 ; /MsgFilterMax = 0
00401172 |. |6A 00 |push 0 ; |MsgFilterMin = 0
00401174 |. |FF75 FC |push dword ptr [ebp-4] ; |hWnd
00401177 |. |53 |push ebx ; |pMsg
00401178 |. |E8 67000000 |call <jmp.&user32.GetMessageA> ; \GetMessageA
0040117D |. |40 |inc eax ----------这里
0040117E |. |90 |nop -----------这里
0040117F |. |74 0E |je short 0040118F
2010-3-2 18:54
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
7
谢谢LS的大大,虽然可以结束process,但是getmessage返回-1应该是错误吧,用od看了一下,hWnd和pMsg都没有错误,但就是在消息循环里面出不来。
仔细看了一下getmessage的说明:
函数功能:该函数从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。

函数原型:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilteMax

参数:

lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。

hWnd:取得其消息的窗口的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。

wMsgFilterMin:指定被检索的最小消息值的整数。

wMsgFilterMax:指定被检索的最大消息值的整数。

返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是_1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。

娘的,原来hWnd应该使用NULL,修改成:
@@:
invoke GetMessage,ebx,NULL,0,0
test eax,eax
je @f
invoke TranslateMessage,ebx
invoke DispatchMessage,ebx
jmp @b
@@:

就OK了。
之前一直怕是msgloop中有问题,用od跟进postqiutmessage就杯具了,所以一直在msgloop中找原因,思路太狭隘了,谢谢LS的大大。
2010-3-3 09:12
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
编译好后用OD跟一下吧,下载附件好像要分的
2010-3-4 15:27
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我跟了一下,发现你在DESTROYWINDOW后就直接调用PostQueryMessage了
2010-3-4 15:45
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
PostQueryMessage必须放在WM_DESTROY事件中
2010-3-4 15:46
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册