Win2K/NT下屏蔽Ctrl+Alt+Del的响应(VC)
当前位置:以往代写 > C/C++ 教程 >Win2K/NT下屏蔽Ctrl+Alt+Del的响应(VC)
2019-06-13

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

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

副标题#e#

各人知道,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事件的识别以及举办各事件的相应处理惩罚。


#p#副标题#e#

自界说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 * INITIALIZE)   (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);

#p#副标题#e#

并在类CmyGinaApp中界说成员变量,如下:

private:
   HMODULE  hMsDll;
public:
   NEGOTIATE     MyWlxNegotiate;
   INITIALIZE    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如下:

#p#分页标题#e#

  // 获得默认的gina dll
   if (hMsDll == NULL)
   {
     hMsDll = ::LoadLibrary("msgina.dll");
   }
   // 导入各个接口函数
   if (hMsDll != NULL)
   {
   MyWlxNegotiate = (NEGOTIATE)    GetProcAddress(hMsDll,"WlxNegotiate");
   MyWlxInitialize = (INITIALIZE)   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      = (PARAM_PVOID)   GetProcAddress(hMsDll,"WlxIsLogoffOk");
   MyWlxLoggedOnSAS    = (LOGON_SAS)    GetProcAddress(hMsDll,"WlxLoggedOnSAS");
   MyWlxLoggedOutSAS    = (LOGOUT_SAS)   GetProcAddress(hMsDll,"WlxLoggedOutSAS");
   MyWlxLogoff        = (PARAM_PVOID)   GetProcAddress(hMsDll,"WlxLogoff");
   MyWlxNetworkProviderLoad=(NETWORK_LOAD)GetProcAddress(hMsDll,"WlxNetworkProviderLoad");
   MyWlxRemoveStatusMessage=(PARAM_PVOID) GetProcAddress(hMsDll,"WlxRemoveStatusMessage");
   MyWlxScreenSaverNotify = (SCR_SAVER)  GetProcAddress(hMsDll,"WlxScreenSaverNotify");
   MyWlxShutdown       = (SHUT_DOWN)    GetProcAddress(hMsDll,"WlxShutdown");
   MyWlxStartApplication   = (START_APP)    GetProcAddress(hMsDll,"WlxStartApplication");
   MyWlxWkstaLockedSAS  = (LOCKED_SAS)   GetProcAddress(hMsDll,"WlxWkstaLockedSAS");
   }

#p#副标题#e#

实现ExitInstance如下:

  // 卸载dll
   if (hMsDll != NULL)
   {
     ::FreeLibrary(hMsDll);
     hMsDll = NULL;
   }

5.实现接口函数。由于本应用仍然保持msgina.dll的大部门操纵,所以MyGina.dll的接口函数的实现较为简朴。重点需要留意的是WlxLoggedOnSAS函数的实现。当在乐成登录状态下,不管吸收到什么SAS事件,该函数直接返回WLX_SAS_ACTION_NONE而不做其他处理惩罚。由于实现的函数较多(必需的18个),笔者仅列出代表性的五个,其余的依理类推。

// Winlogon.exe挪用的gina dll中的第一个函数
// 使gina dll确认是否支持当前版本的Winlogon.exe
// 通报给winlogon.exe需要谁人版本的接口函数
BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
{
// 直接挪用从msgina.dll中导入的函数
   return theApp.MyWlxNegotiate(dwWinLogonVersion,pdwDllVersion);
}
// 初始化,winlogon.exe向gina dll通报需要版本的接口函数分派表
BOOL WINAPI WlxInitialize(LPWSTR  lpWinsta,
              HANDLE  hWlx,
              PVOID   pvReserved,
              PVOID   pWinlogonFunctions,
              PVOID *  pWlxContext
              )
{
// 直接挪用从msgina.dll中导入的函数
   return theApp.MyWlxInitialize(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext);
}
// 当系统处于锁定状态时,Winlogon.exe挪用该函数
// 显示一些信息,如锁定者、锁按时间等
VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
   theApp.MyWlxDisplayLockedNotice(pWlxContext);
}
// 在系统封锁之前,Winlogon.exe挪用该函数
// 答允gina dll处理惩罚一些系统封锁前的处理惩罚
VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
{
   theApp.MyWlxShutdown(pWlxContext,ShutdownType);
}
// 当系统处于登岸乐成,没有锁定的状态下
// Winlogon吸收到SAS事件,于是挪用该函数
// 现屏蔽所有事件,直接返回
int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
              DWORD dwSasType,
              PVOID pReserved)
{
   return WLX_SAS_ACTION_NONE;
}

6.将MyGina.dll中实现的所有接口函数,在MyGina.def中界说导出。

    关键字:

在线提交作业