怎么样使用GINA自定义功能?
自定义GINA
GINA通过SAS(secure attention sequences)事件与Winlogon进行交互。默认的GINA监测系统的CTRL+ALT_DEL SAS事件,并把它通知给Winlogon进行相应的处理。一个自定义的GINA必须定义自己的SAS和Winlogon进行交互。
GINA由Winlogon在系统启动时进行加载,并在系统运行过程中一直会被Winlogon调用。所以,和Winlogon 一样,GINA会一直被加载在系统中,并随时都会被调用。系统默认的GINA DLL放在%system%windows/system32(XP)目录中,名字是msgina.dll。如果你要用自定义的GINA替换掉系统的GINA可以把自定义的GINA,如mygina.dll拷贝到%system%windows/system32(XP)中,并修改注册表键值:HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/WinLogon,增加一个字符串值GinaDLL,值为自定义GINA的名字,如mygina.dll,然后重新启动计算机就可以看到效果了。如果要恢复到原来的GINA,可以删掉在上面添加了的值,然后重新启动系统即可。(注:一般地,用这种方式替换系统GINA在一安全模式登录系统时是没用的。)
在理解GINA的工作方式和过程时,了解Winlogon的各个状态之间的转换非常重要。如下图,显示了Winlogon的给各状态之间的转换和GINA的相应的调用过程。
要实现一个自定义的GINA必须实现一系列输出函数(详情见MSDN):
BOOL WlxNegotiate ( DWORD, DWORD* );
BOOL WlxInitialize ( LPWSTR, HANDLE, PVOID, PVOID, PVOID* );
VOID WlxDisplaySASNotice( PVOID );
int WlxLoggedOutSAS( PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID *);
BOOL WlxActivateUserShell( PVOID, PWSTR, PWSTR, PVOID );
int WlxLoggedOnSAS( PVOID, DWORD, PVOID );
VOID WlxDisplayLockedNotice( PVOID );
int WlxWkstaLockedSAS( PVOID, DWORD );
BOOL WlxIsLockOk( PVOID );
BOOL WlxIslogoffOk( PVOID );
VOID WlxLogoff( PVOID );
VOID WlxShutdown( PVOID, DWORD );
//
// NEW for version 1.1
//
BOOL WlxScreensaverNotify( PVOID, BOOL * );
BOOL WlxStartApplication( PVOID, PWSTR, PVOID, PWSTR );
实现这些函数是自定义一个GINA中最重要但也是最困难的一个步骤。如果你的应用要求很简单,比如只是想取得用户登录的用户名或者屏蔽CTRL+DEL+ALT等,就可以用一种简单方式实现这些函数,直接使用系统默认的msgina.dll的输出函数,方法和使用一般的dll中的输出函数一样,首先用LoadLibrary( )加载msgina.dll,然后用GetProcAddress( )得到各个默认的gina的输出函数的指针,最后要做的只是在你的自定义gina中重新输出需要实现的各个输出函数,实现时调用刚才从msgina.dll中得到的各个默认的输出函数即可,MSDN的示例程序Gina Stub使用的就是这种方法。例如你可以通过以下的方式得到登录的用户名。
Int WINAPI WlxLoggedOutSAS(
PVOID pWlxContext,
DWORD dwSasType,
PLUID pAuthenticationId,
PSID pLogonSid,
PDWORD pdwOptions,
PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
PVOID * pProfile
)
{
Int ret = fnWlxLoggedOutSAS(pWlxContext,
dwSasType,
pAuthenticationId,
pLogonSid,
pdwOptions,
phToken,
pMprNotifyInfo,
pProfile);
//在这里可以得到用户登录的用户名了,就在pMprNotifyInfo结构中
return ret;
}
要进一步详细的了解GINA和Winlogon可以参阅MSDN和以下的文章:
http://msdn.microsoft.com/msdnmag/issues/05/05/securitybriefs/
http://msdn.microsoft.com/msdnmag/issues/05/06/SecurityBriefs/
本文地址:http://www.45fan.com/dnjc/69639.html