开发学院软件开发C++ Win2K/NT下屏蔽Ctrl+Alt+Del的响应(VC) 阅读

Win2K/NT下屏蔽Ctrl+Alt+Del的响应(VC)

 2008-03-08 12:41:02 来源:WEB开发网   
核心提示:作者姓名 陆其明文章原始出处 http://hqtech.nease.net介绍:改文发表于《程序员》2001年11期正文大家知道,Ctrl+Alt+Del是Win2k/NT操作系统默认的系统登录/注销组合键序列,Win2K/NT下屏蔽Ctrl+Alt+Del的响应(VC),系统级别很高,在应用程序中,如下:typed

  作者姓名 陆其明
文章原始出处 http://hqtech.nease.net
介绍:改文发表于《程序员》2001年11期

正文
大家知道,Ctrl+Alt+Del是Win2k/NT操作系统默认的系统登录/注销组合键序列,系统级别很高。在应用程序中,想要屏蔽掉该键序列的响应或得到这个“按下”事件,难度是相当大的。本文介绍了一种简单易行的方法,实现在用户登录成功后,按下Ctrl+Alt+Del不再弹出“Windows安全”对话框。

要害词:GINA(Graphical Identification aNd Authentication)
SAS(Secure Attention Sequence)

一.  开发原理
首先介绍一下Winlogon。windows 2000/NT有三种系统状态:没有用户登录状态、用户成功登录状态以及工作站锁定状态。Winlogon是Windows 2000/NT操作系统提供交互式登录支持的组件。Winlogon有三个组成部分:可执行文件winlogon.exe,提供图形界面认证功能的动态库Gina Dll,以及一些网络服务提供动态库Network PRovider Dll。参考模型如下:

winlogon.exe处理一些下层导出的接口函数,而认证策略是在Gina Dll中是独立设计的。在系统启动时,Gina Dll被winlogon.exe装载。Microsoft提供了一个默认的Gina Dll——Winnt\system32\msgina.dll,提供了标准的用户名、密码认证模式。Gina Dll是可替换的,用户可以设计自己的Gina Dll,以提供其他如智能卡、视网膜、指纹或其他一些认证机制。
开发自定义的Gina Dll。必须实现并导出与winlogon.exe交互的18个标准函数接口,包括WlxNegotiate、WlxInitialize、WlxLoggedOnSAS等(其他函数接口请参考Msdn)。其中WlxNegotiate是winlogon.exe调用的第一个接口函数,进行必要的版本判定,随后调用的是WlxInitialize,主要完成winlogon.exe特定版本的函数分派表向Gina Dll的传递。笔者还要说明的是WlxLoggedOnSAS函数,这个函数主要的功能是,当winlogon在登录成功状态下,接收到SAS事件,于是调用这个函数进行SAS事件的识别以及进行各事件的相应处理。
自定义Gina Dll的使用。比如开发的Gina Dll文件名为MyGina.dll。将该文件放到以下路径:Winnt\system32。并修改注册表,如下:
Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon
Value Name: GinaDLL
Value Type: [REG_SZ]
Value: MyGina.dll
重新启动计算机MyGina.dll即投入使用。

二.  应用实例
应用要求:在用户登录成功状态下,按下Ctrl+Alt+Del时系统不再弹出“Widows安全”对话框。由于并不需要改变用户名、密码这种标准的认证模式,所以可以仍然使用msgina.dll中导出的函数接口,而对WlxLoggedOnSAS函数的实现进行必要的改变。
开发环境:Windows 2000,PII 400
开发工具:Microsoft Visual C++ 6.0
开发步骤:
1.新建项目,选择MFC AppWizard(dll),项目名输入为MyGina。按下“OK”后,选择Regular DLL with MFC statically linked,按下“Finish”。
2.使用View->ClassWizard为CmyGinaApp增加InitInstance和ExitInstance两个函数的覆盖。注重在Stdafx.h中加入#include <Winwlx.h>。
3.由于要导入msgina.dll的接口函数,所以在MyGina.h中定义接口函数变量类型,如下:
typedef (WINAPI * NEGOTIATE)    (DWord,PDWORD);
typedef (WINAPI * IN99vIALIZE)   (LPWSTR,HANDLE,PVOID,PVOID,PVOID *);

typedef (WINAPI * ACTIVATE_USHELL) (PVOID,PWSTR,PWSTR,PVOID);
typedef (WINAPI * PARAM_PVOID)   (PVOID);
typedef (WINAPI * DISP_STATUS)   (PVOID,HDESK,DWORD,PWSTR,PWSTR);
typedef (WINAPI * GET_STATUS)   (PVOID,DWORD *,PWSTR,DWORD);
typedef (WINAPI * LOGON_SAS)    (PVOID,DWORD,PVOID);
typedef (WINAPI * LOGOUT_SAS)   (PVOID,DWORD,PLUID,PSID,PDWORD, PHANDLE,WLX_MPR_NOTIFY_INFO,PVOID *);
typedef (WINAPI * NETWORK_LOAD)  (PVOID,PWLX_MPR_NOTIFY_INFO);
typedef (WINAPI * SCR_SAVER)    (PVOID,BOOL *);
typedef (WINAPI * SHUT_DOWN)    (PVOID,DWORD);
typedef (WINAPI * START_APP)    (PVOID,PWSTR,PVOID,PWSTR);
typedef (WINAPI * LOCKED_SAS)   (PVOID,DWORD);
并在类CmyGinaApp中定义成员变量,如下:
private:
  HMODULE  hMsDll;
public:
  NEGOTIATE     MyWlxNegotiate;
  IN99vIALIZE    MyWlxInitialize;
  ACTIVATE_USHELL  MyWlxActivateUserShell;
  PARAM_PVOID    MyWlxDisplayLockedNotice;
  PARAM_PVOID    MyWlxDisplaySASNotice;
  DISP_STATUS    MyWlxDisplayStatusMessage;
  GET_STATUS    MyWlxGetStatusMessage;
  PARAM_PVOID    MyWlxIsLockOk;
  PARAM_PVOID    MyWlxIsLogoffOk;
  LOGON_SAS     MyWlxLoggedOnSAS;
  LOGOUT_SAS    MyWlxLoggedOutSAS;
  PARAM_PVOID    MyWlxLogoff;
  NETWORK_LOAD   MyWlxNetworkProviderLoad;
  PARAM_PVOID    MyWlxRemoveStatusMessage;
  SCR_SAVER     MyWlxScreenSaverNotify;
  SHUT_DOWN     MyWlxShutdown;
  START_APP     MyWlxStartapplication;

  LOCKED_SAS    MyWlxWkstaLockedSAS;
注重在MyGina.h中说明extern CMyGinaApp theApp;以便于程序其他地方对theApp的引用。
4.在MyGina.cpp中,实现InitInstance如下:
  // 得到默认的gina dll
  if (hMsDll == NULL)
  {
    hMsDll = ::LoadLibrary("msgina.dll");
  }
  // 导入各个接口函数
  if (hMsDll != NULL)
  {
  MyWlxNegotiate = (NEGOTIATE)    GetProcAddress(hMsDll,"WlxNegotiate");
  MyWlxInitialize = (IN99vIALIZE)   GetProcAddress(hMsDll,"WlxInitialize");
  MyWlxActivateUserShell=(ACTIVATE_USHELL) GetProcAddress(hMsDll,"WlxActivateUserShell");
  MyWlxDisplayLockedNotice=(PARAM_PVOID) GetProcAddress(hMsDll,"WlxDisplayLockedNotice");
  MyWlxDisplaySASNotice = (PARAM_PVOID)   GetProcAddress(hMsDll,"WlxDisplaySASNotice");
  MyWlxDisplayStatusMessage=(DISP_STATUS)  GetProcAddress(hMsDll,"WlxDisplayStatusMessage");
  MyWlxGetStatusMessage  = (GET_STATUS)   GetProcAddress(hMsDll,"WlxGetStatusMessage");
  MyWlxIsLockOk      = (PARAM_PVOID)   GetProcAddress(hMsDll,"WlxIsLockOk");
  MyWlxIsLogoffOk&nb

Tags:Win NT 屏蔽

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接