首页
社区
课程
招聘
[求助]关于ExitWindowsEx大法关360的疑问
发表于: 2009-10-13 22:40 7809

[求助]关于ExitWindowsEx大法关360的疑问

2009-10-13 22:40
7809
在<玩玩360——ExitWindowsEx大法>(http://bbs.pediy.com/showthread.php?t=97539&highlight=360)这篇文章中提到了一种在R3下结束进程的方法。看了源码,有个不解之处,请高手解答:

MSDN上说处理wm_queryendsession消息是return 0阻止关机。

关于WM_QUERYENDSESSION,MSDN上有明确的讲解,摘录如下,
The WM_QUERYENDSESSION message is sent when the user chooses to end the session or when an application calls the ExitWindows function. If any application returns zero, the session is not ended. The system stops sending      WM_QUERYENDSESSION messages as soon as one application returns zero.

在 Windows NT 4.0 服务包 6 (SP6) 或 Windows NT 4.0 SP6a 基于系统上,任何应用程序调用 ExitWindowsEx 函数时系统将 WM_QUERYENDSESSION 消息发送给所有顶级窗口。 如果任何窗口的接收该消息返回 FALSE,关机进程停止,不管多少窗口返回 TRUE。

但是作者源码却是return true阻止关机(我试了return true是对的,而return faulse就直接关机了)。作者源码:
switch (message)
        {
        case WM_INITDIALOG:
                SendMessage(hDlg,WM_SETICON,ICON_BIG,LPARAM(LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON)))); //设置图标
               
                OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
        EnablePrivilege (hToken, SE_SHUTDOWN_NAME, TRUE);
                break;        

        case WM_QUERYENDSESSION:
                        return true;
                        break;

               case  WM_CLOSE:
                    SendMessage(hDlg, WM_CLOSE, 0, 0);
                        DestroyWindow(hDlg);
                        break;

        case WM_COMMAND:
                switch (LOWORD (wParam))
                {
                       
                    case IDC_OK:
                        ShowWindow(hDlg,SW_HIDE);
                          do
                          {
                         temp=ExitWindowsEx (EWX_SHUTDOWN ,0XFFFFFFFF);
                          } while (!temp);
                                    
                                break;
                       
                }
          break;
               
        }
           return  FALSE;

}

不知道问题出在哪,还请高手不啬赐教?(昨天一直顶原帖,无奈没人看到,只好发帖求助了)

(一直都是用手机上网,可能问题没受清楚。现在补充一下,希望高手解答!!!! ---20091113 10:08)

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下,等待解答中……
2009-10-14 12:35
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
同问 一直没有理解WM_QUERYENDSESSION和WM_ENDSESSION
2009-10-14 13:44
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
再等,继续期待解答…
2009-10-17 19:11
0
雪    币: 306
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
DialogBox的消息处理机制,最终进入到win的处理。。关键是欺骗噶。。
2009-10-18 10:12
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
(一直都是用手机上网,问题可能说的不清楚。还见谅!!!)
不解之处:
msdn:在 Windows NT 4.0 服务包 6 (SP6) 或 Windows NT 4.0 SP6a 基于系统上,任何应用程序调用 ExitWindowsEx 函数时系统将 WM_QUERYENDSESSION 消息发送给所有顶级窗口。 如果任何窗口的接收该消息返回 FALSE,关机进程停止,不管多少窗口返回 TRUE。
而你的源码里是:
case WM_QUERYENDSESSION:
        return true;
        break;

不知道为什么,希望解答???
2009-11-13 09:59
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
7
楼主试一下不用dlg,而直接用标准的win32窗口。
看一下dlg proc的说明!
2009-11-13 12:29
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
8
要注意,在程序中这个return true的返回值,表示的并不是通常窗口例程对消息响应的返回值,而是表示程序自定义的窗口例程已经自己处理了这个消息,不需要系统再调用DefWindowProc进行处理。

因为这个对话框是由DialogBoxParam创建的,调用DialogBoxParam的时候,系统自动为这个窗口维护一个消息循环。

调用DialogBoxParam时的参数
lpDialogFunc
[in] Pointer to the dialog box procedure.


这个窗口例程的原型:
INT_PTR CALLBACK DialogProc( HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);


看起来它跟一般程序自己调用CreateWindowEx创建的对话框的窗口例程的原型一样,但是其返回值代表的意义是完全不一样的:

Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.

If the dialog box procedure processes a message that requires a specific return value, the dialog box procedure should set the desired return value by calling SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) immediately before returning TRUE. Note that you must call SetWindowLong immediately before returning TRUE; doing so earlier may result in the DWL_MSGRESULT value being overwritten by a nested dialog box message.

The following messages are exceptions to the general rules stated above....


显然,这里return true并不是对WM_QUERYENDSESSION这个消息的处理结果是TRUE,而是告诉系统用户的窗口例程已经自己处理了WM_QUERYENDSESSION消息,这样当这次调用返回时,系统就不会再调用DefWindowProc去处理WM_QUERYENDSESSION消息了。严格来说,由于这个消息是要求一个确定的返回值的,所以在自定义窗口过程返回TRUE之前必须调用SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult)来指定给这个消息的真正返回值。这里可能是因为如果不指定的话默认就是FALSE,所以程序里没有指定。

所以这里为什么要返回TRUE,就是因为如果返回FALSE,那么就是说明用户没有自己处理WM_QUERYENDSESSION消息,这样返回后系统会自动调用DefWindowProc来处理,而DefWindowProc对WM_QUERYENDSESSION消息是默认返回TRUE的(这个就是真正的消息返回值了),这样就会导致真正的关机。

不知道这样说楼主明白了没有,这个return TRUE跟WM_QUERYENDSESSION消息说明中的返回值为TRUE不是一回事。以上引用部分均引自MSDN。
2009-11-13 19:13
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
明白了。感谢楼上的兄弟们!可以结贴了。
此致 敬礼!
2009-11-13 19:32
0
雪    币: 306
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
可能俺真呢是吃醉啦...
2009-11-13 21:49
0
雪    币: 45
活跃值: (17)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
轩辕小聪回答的相当详尽,支持一个,望楼主好好招待一下他。
2009-11-13 21:52
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
非常感谢!但是不知道怎么表示表示?
2009-11-14 11:04
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不知牛哥醉在哪?
2009-11-14 11:14
0
游客
登录 | 注册 方可回帖
返回
//