WinLogon事件通知包编程

2007年5月18日,21:18:55| yexiaozhou2003[AT]hotmail.com(cooldog)

今天看到CSDN中有网友问道如何获取用户按Ctrl+Alt+Del锁定桌面的事件。回帖后大致整理了一下,希望对大家有帮助。
首先我们要了解一下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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择国外虚拟主机空间服务商

如何选择国外虚拟主机空间服务商 几经辛苦,终于把自己的主页给设计完成好了,那么下一步就是得为自己的网站在网上找一个家了。现在的互联网上的免费午餐似乎已经被大家吃过了头,做互联网已经很艰难了,更何况是更花钱的免费&#x…

bat函数调用 带返回值

bat 脚本之 使用函数 摘自:https://blog.csdn.net/peng_cao/article/details/73999076 综述bat函数写法bat函数调用bat函数返回值综述 Windows bat脚本是一种解释性的脚本语言,可以拿到做很多事情。对于稍简单的问题:比如通过注册表判断下档期…

[置顶] 读取pdf并且在web页面中显示

读取pdf并且在web页面中显示 if (System.IO.File.Exists(f)) { Response.ContentType "applicationpdf"; System.IO.FileStream reader System.IO.File.OpenRead(f); byte[] data new byte[reader.Length]; reader.Read(data, 0, (int)reader.Length); read…

实现路由器无线接收另一个路由器无线信号搭建网络

设置如下即可。 1,主副路由SSID设置成相同; 2,在主路由的BSSID中写上副路由的MAC; 3,在副路由的BSSID中写上主路由的MAC; 4,信道、模式、频道带宽、速率均设置成一致; 5,…

配置 jvisualvm 监控Java虚拟机

配置JMX远程连接 1. 配置启动参数 启动jar时,添加如下配置-Dcom.sun.management.jmxremote.port5050 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -Djava.rmi.server.hostname192.168.94.23 启动参数说明 -Dcom.sun…

所有排序算法

---恢复内容开始--- 先看看复杂度大小吧 冒泡排序 直接上代码,? # 冒泡排序def bubble_sort(alist): for j in range(len(alist) - 1, 0, -1): for i in range(j): if alist[i] > alist[i 1]: alist[i], alist[i 1] ali…

亲身经历之微信支付沙箱环境扫码支付遇到的那些坑

很多用户在调用微信支付扫码支付沙箱环境都一脸迷茫,废话不多说,遇到很多坑,为了让大家少走弯路下面直接说说我开发微信支付遇到坑,微信沙箱不是一般的坑,是很大的坑。 1.首先下载的官方demo,不能直接用,里…

Microsoft .NET Pet Shop 4.0 学习之旅(二) - 项目的引用关系1

Microsoft .NET Pet Shop 4.0 学习之旅&#xff08;二&#xff09; 项目的引用关系1 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />初看到Pet Shop 4.0的源代码觉得结构很复杂&#xff0c;今天我只讨论业务逻辑层&#xff08;…

Java api在线

地址&#xff1a;http://dlc-cdn.sun.com/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html/zh_CN/api/点击打开链接 转载于:https://www.cnblogs.com/dengshiwei/p/4258607.html

SQL Server检索存储过程的结果集

目的&#xff1a;检索过滤执行存储过程的结果集 如下介绍两个常用的方法&#xff0c;但是都需要申明表结构&#xff1b;不知道是否有更简便的方法&#xff0c;如有更好的方法&#xff0c;请不吝赐教。 以系统存储过程sp_who2为例&#xff1a; 方法1&#xff1a;使用临时表 1 --…

zsh of termux

termux-ohmyzsh script :sh -c "$(curl -fsSL https://github.com/Cabbagec/termux-ohmyzsh/raw/master/install.sh)" one step in place recommend style ; gentoo 转载于:https://www.cnblogs.com/jiujue/p/11272706.html

zsh of kali

首先安装zsh&#xff1a; # apt-get update # apt-get install zsh -y然后直接使用仓库脚本&#xff1a; # sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" 作者&#xff1a;NextStack链接&#xff1a;htt…

python的zip()函数

zip() 函数用于将可迭代对象作为参数&#xff0c;将对象中对应的元素打包成一个个元组&#xff0c;然后返回由这些元组组成的对象。 如果各个可迭代对象的元素个数不一致&#xff0c;则返回的对象长度与最短的可迭代对象相同。 利用 * 号操作符&#xff0c;与zip相反&#xff0…

django小知识

def __str__:return self.name 在显示的时候&#xff0c;将原来显示的额object对象&#xff0c;显示成这个类的名字 转载于:https://www.cnblogs.com/one-tom/p/11275894.html

RT-Thread中如何预编译一个.c文件

本文介绍在RT-Thread系统&#xff0c;使用scons&#xff0c;如何预编译一个.c文件 首先新建一个测试文件test.c #include "rtthread.h"void test(void) { rt_kprintf("Hello RT-Thread\n"); } 使用下面的命令导出编译过程到1.txt文件 scons -j7 --verbose …

vs.net各版本解决方案相互转换工具

感谢Arthur Liberman, 感谢zu14.cn三角猫 工具下载转载于:https://www.cnblogs.com/JoinZhang/archive/2010/07/09/1774617.html

杂谈杂想!

a) 在Live Write 实施插入地图 b) 金山词霸为什么总是把“音乐(YUE)”念成“音乐&#xff08;LE&#xff09;”&#xff1f;这个bug好多年&#xff01; c) 养的基瘦了&#xff0c;人却变胖了&#xff01; 转载于:https://www.cnblogs.com/jeffersyuan/archive/2007/11/10/95528…

链接Mysql的api mysqli和pdo

HP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved)PDO (PHP Data Objects)PDO 应用在 12 种不同数据库中&#xff0c; MySQLi 只针对 MySQL 数据库。 如果你的项目需要在多种数据库中切换&#xff0c;建议使用 PDO 两者都是面向对…

Spring 实战-第一章-基本概念

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;通过第三方配置初始化对象&#xff0c;而不是把具体的实现写在对象中&#xff0c;这样程序入口与具体实现进行了解耦。比如动作定义为接口&#xff0c;具体做什么动作 由实现动作接口的类来具体描述。 面向…

C# Types Type Members

http://blog.tangcs.com/2008/03/04/csharp-types-and-type-members/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/03/04/1089628.html