如何在Windows2000中动态禁用/启用Ctrl-Alt-Delete

在Windows2000中Ctrl-Alt-Delete组合键的处理如下:
Winlogon初始化的时候,在系统中注册了CTRL ALT DEL Secure Attention Sequence(SAS)热键,并且在WinSta0 Windows 系统中创建三个桌面 。SAS热键的注册使得Winlogon成为第一个处理CTRL ALT DEL的进程,所以保证了没有其他应用程序能够处理这个热键 。
在 Windows;NT/Windows;2000/Windows;XP中,WinSta0 是表示物理屏幕、鼠标和键盘的Windows系统对象的名字 。Winlogon在WinSta0 Windows系统中创建了SAS窗口(窗口标题是"SAS Window")和如下三个桌面 。Winlogon 桌面 应用程序 桌面 屏幕保护 桌面当用户按下Ctrl-Alt-Delete组合键时,Winlogon桌面上的SAS窗口收到它注册的系统热键消息(WM_HOTKEY) SAS Window窗口处理这个消息调用Graphical Identification and Authentication(GINA)动态连接库中的相关函数要中断Ctrl-Alt-Delete组合键的处理,可以有以下方式
从键盘驱动层捕获Ctrl-Alt-Delete 替换Winlogon 替换GINA Hook Winlogon 上SAS窗口的窗口过程(需要当前登录用户有调试权限) Hook; GINA里边的函数WlxLoggedOnSAS,然后返回WLX_SAS_ACTION_NONE(未研究)更多信息鉴于系统的更新可能造成我们替换的系统文件和其他系统文件不兼容(著名的DLL地狱),所以不推荐替换Winlogon.exe和GINA的方法 。这里我们讨论Hook Winlogon 上的SAS窗口的窗口过程的方法 。因为SAS窗口和我们的程序内存地址空间不同,所以要写一个动态连接库,加载到SAS窗口的内存空间中 。下面是动态连接库的源代码 。//---------------------------------------------------------------------------
//作者 :韦覃武
//网上呢称:BCB_FANS(四大名捕之追杀令)(此为CSDN和www.driverdevelop.com之帐号)
//E-Mail :slwqw@163.com
//日期 :2002-10-20
//
//功能 :在2000下屏蔽CtrlAltDel组合键 。(在Windows 2000 Professional SP3
// 中文版平台下面测试通过)
//原理 :采用远程线程注入技术,装载一个DLL到Winlogon进程,然后截获SAS窗口的窗
// 口过程,接管WM_HOTKEY消息,以达到屏蔽CtrlAltDel之目的 。
//开发语言:Borland CBuilder 5.0 Patch2
//技术比较:关于在2000下面如何屏蔽CtrlAltDel组合键,一种常被提到的解决方法就
// 是使用自己写的GINA去替换MSGINA.DLL,然后在WlxLoggedOnSAS里边直接返回
// WLX_SAS_ACTION_NONE 。嘿嘿,说到底这并不是真正地屏蔽了这个组合键,只是
// 直接返回WLX_SAS_ACTION_NONE时,Winlogon进程又自动从"Winlogon"桌面切换
// 回原来的"Default"桌面了,而不是显示安全对话框,所以看起来被屏蔽了:),
// 使用那种方法明显地看到桌面在闪烁!但是使用本文的方法时,你不会看到任
// 何闪烁!
//鸣谢 :www.driverdevelop.com上的icube和lu0 。
//版权 :转载请注明原作者:)

//---------------------------------------------------------------------------

#include "stdafx.h"

#include

using namespace std;

//---------------------------------------------------------------------------

HWND hSASWnd;
FARPROC FOldProc;

LRESULT CALLBACK SASWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

//---------------------------------------------------------------------------

HANDLE hThread = NULL;
DWord dwThreadId;

DWORD WINAPI ThreadFunc();

//---------------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH :

hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
break;
case DLL_PROCESS_DETACH :
if(FOldProc != NULL)
{
SetWindowLong(hSASWnd,GWL_WNDPROC,long(FOldProc));

推荐阅读