WinLogon事件通知包编程
今天看到CSDN中有網友問道如何獲取用戶按Ctrl+Alt+Del鎖定桌面的事件?;靥蟠笾抡砹艘幌?#xff0c;希望對大家有幫助。
首先我們要了解一下WinLogon,他是負責提供給用戶交互式界面的一個程序。
WinLogon初始化時會創建3個桌面:
(1)、winlogon桌面:主要顯示window 安全等界面,如你按下CTRL+ALT+DEL,登陸的界面等
(2)、應用程序桌面:我們平時見到的那個有我的電腦的界面(這個大家都見過了吧,呵呵)
(3)、屏幕保護桌面:屏幕保護顯示界面。
到這里,仿佛我們找到了方法,就是編寫Hook程序,截獲CTRL+ALT+DEL,按下的消息,這樣不就可以判斷用戶是否要鎖定桌面了嗎?其實不然,在WinLogon初始化時,就向系統注冊截獲CTRL+ALT+DEL消息,所以其他程序就無法得到CTRL+ALT+DEL的消息。
WinLogon會和GINA DLL進行交互,缺省是MSGINA.DLL(在System32目錄下)。微軟同時也為我們提供的接口,自己可以編GINA DLL來代替MSGINA.DLL。
到這里,我們還能想到的方法,就是采用建立遠程線程的方式,注入到WinLogon.exe中,這樣也可以截獲到Ctrl+Alt+Del的按下的事件。不過寫遠程線程比較麻煩,而且調試起來也不方便。
其實WinLogin還為我們提供了另外一種方式,就是WinLogin通知包的方式。
Winlogon通知包(Winlogon Notification Package)”就是處理winlogon在切換狀態時發出的事件的DLL。你可以通過“Winlogon Notification Package”來監視winlogon事件的響應。你可以注冊這些DLL,那么winlogon.exe會在啟動時加載它們,并且會在系統狀態切換時來調用注冊DLL的事件處理函數。
其實說簡單一點,就是我們可以自己編寫處理winlogon的事件的邏輯,將其作為函數導出,把它編譯為Win32 Dll,然后添加信息到注冊表。接下來的工作,我們就不用操心了,Winlogon會根據不同的事件,自己來調用我們DLL提供的函數進行處理。
為了注冊你的“Winlogon Notification Package”,必須在“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify”下創建你的“notification package”子鍵。在“Notify”項下,可以根據需要創建如下鍵值:
Asynchronous[REG_DWORD]:表明是否異步處理winlogon事件,如設為 1,winlogon將啟動一個新線程來處理。
DllName[REG_EXPAND_SZ]:指定要加載的DLL名。
Impersonate[REG_DWORD]:表明是否以登陸用戶的權限來處理事件。
Lock[REG_SZ]:鎖定桌面事件。
Logoff[REG_SZ]:注銷事件。
Logon[REG_SZ]:登陸事件。
Shutdown[REG_SZ]:關機事件。
StartScreenSaver[REG_SZ]:啟動屏保事件。
StartShell[REG_SZ]:啟動shell(一般指explorer.exe)事件。
Startup[REG_SZ]:系統開機事件。
StopScreenSaver[REG_SZ]:停止屏保事件。
Unlock[REG_SZ]:解除桌面鎖定事件。
其中每個事件對應DLL中的一個導出函數,即每當有事件發生時,winlogon.exe便調用相應的函數。
譬如:DllName的值為“test.dll”,Lock的值為“testLock”,那么系統鎖定時,winlogon.exe將調用test.dll中導出的“testLock”函數。
關于DLL的實現非常地簡單:只要導出處理事件是要調用的函數就行,其他和別的DLL無異。以下是代碼的簡單實現:
// WinLogonNotify.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "WinLogonNotify.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
?????????????????????? DWORD? ul_reason_for_call,
?????????????????????? LPVOID lpReserved
????? )
{
?switch (ul_reason_for_call)
?{
?case DLL_PROCESS_ATTACH:
?case DLL_THREAD_ATTACH:
?case DLL_THREAD_DETACH:
?case DLL_PROCESS_DETACH:
??break;
?}
??? return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
// This is an example of an exported function.
WINLOGONNOTIFY_API void _stdcall testLock(DWORD param)
{
?MessageBox(NULL,L"Lock!",L"Tips",MB_OK);
?return;
}
以上代碼在Visual Studio 2005 開發平臺上編譯通過。
大家可以大包下載代碼參考。
點擊下載此文件
這個帖子的源地址如下:
標題:如何獲取鎖定計算機事件
http://community.csdn.net/Expert/topic/5536/5536030.xml?temp=6.365603E-02
轉載于:https://www.cnblogs.com/MaxWoods/archive/2008/06/13/1219892.html
總結
以上是生活随笔為你收集整理的WinLogon事件通知包编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS中定位(带你实操代码掌握固定定位、
- 下一篇: JMeter 入门脚本以发送百度请求为例