在很多情况下按ctrl+alt+del,都会让对话框消失。比如我锁定之后,然后ctrl+alt+del,然后进入WlxWkstaLockedSAS 等待密码验证。在等待密码验证的过程中,如果用户输入的不是密码,而是ctrl+alt+del的时候,系统就会自动跳过密码验证,直接返回系统。 又比如,在系统登陆后,ctrl+alt+del。进入WlxLoggedOnSAS ,然后继续按ctrl+alt+del。对话框会消失不见,只剩墙纸。然后再继续ctrl+alt+del 对话框会重新出现。而且这种情况下,用普通的OpenMutex无法屏蔽。例如
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
DEBUG_MSG("WlxWkstaLockedSAS");
// return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType);
HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "_ac952_z_cn_CTRL_ALT_DEL");
if (hMutex)
{
CloseHandle(hMutex);
//return WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
}
else
{
hMutex = CreateMutex(NULL,FALSE, "_ac952_z_cn_CTRL_ALT_DEL");
int Result;
Result = pgContext->pWlxFuncs->WlxDialogBoxParam( pgContext->hWlx,
hDllInstance,
(PWSTR) MAKEINTRESOURCE(IDD_DLG_UNLOCK),
NULL,
UnLockProc,
(LPARAM)pgContext);
ReleaseMutex(hMutex);
return Result;
}
//return(WLX_SAS_ACTION_LOCK_WKSTA);
}log日志为
WlxLoggedOnSAS //第一次ctrl+alt+del 进入LoggedOn
WlxDisplayLockedNotice //第二次ctrl+alt+del 进入DisplayLockedNotice 显示锁定信息 当前状态已经锁定。
WlxWkstaLockedSAS //在锁定的状态下ctrl+alt+del 要求验证密码。但是如果在里,依然ctrl+alt+del 则会跳出。然后。。返回系统。。
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
DEBUG_MSG("WlxWkstaLockedSAS");
// return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType);
HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "_ac952_z_cn_CTRL_ALT_DEL");
if (hMutex)
{
CloseHandle(hMutex);
//return WLX_SAS_ACTION_NONE; //将屏幕切换到应用程序桌面,屏蔽掉CTRL+ALT+DEL
}
else
{
hMutex = CreateMutex(NULL,FALSE, "_ac952_z_cn_CTRL_ALT_DEL");
int Result;
Result = pgContext->pWlxFuncs->WlxDialogBoxParam( pgContext->hWlx,
hDllInstance,
(PWSTR) MAKEINTRESOURCE(IDD_DLG_UNLOCK),
NULL,
UnLockProc,
(LPARAM)pgContext);
ReleaseMutex(hMutex);
return Result;
}
//return(WLX_SAS_ACTION_LOCK_WKSTA);
}log日志为
WlxLoggedOnSAS //第一次ctrl+alt+del 进入LoggedOn
WlxDisplayLockedNotice //第二次ctrl+alt+del 进入DisplayLockedNotice 显示锁定信息 当前状态已经锁定。
WlxWkstaLockedSAS //在锁定的状态下ctrl+alt+del 要求验证密码。但是如果在里,依然ctrl+alt+del 则会跳出。然后。。返回系统。。
======================================
这种情况可以在系统中设置的,具体怎么设置忘掉了。
楼主可以上网查查,好像是把guest用户停掉,
不大清楚了。
这个和系统没关系。整个gina程序是自己写的。windows系统自带的gina就没有问题
即使不加Global\\ 那个mutex也可以创建成功。
这样创建了还是不能屏蔽ctrl+alt+del.
做过gina的各位大大。。你们有碰到过这种问题吗?调用自己的密码登陆方式。
另外,有没有人知道msgina的pWlxContext 结构体?网上看到的结构体基本都是自己定义的。。和msgina不能兼容。所以当修改logout的时候就必须连带logon也一起修改了。
因为回复3篇之后不能再回复。所以拖他来给我顶一下
问题解决了。解决的办法是用
WlxSasNotify(pgContext->hWlx,WLX_SAS_TYPE_CTRL_ALT_DEL)
在GINA里,按ctrl+alt+del的时候,如果那个窗口可以被取消掉,窗口依然会返回一个值WLX_DLG_SAS (101)
所以当获得这个消息的时候,说明这个dlg被sas干掉了。然后,如果要保护这个dlg的话,就可以自己去控制gina的运行机制。我更改的机制:
int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
DEBUG_MSG("WlxWkstaLockedSAS");
Result = pgContext->pWlxFuncs->WlxDialogBoxParam( pgContext->hWlx,
hDllInstance,
(PWSTR) MAKEINTRESOURCE(IDD_DLG_UNLOCK),
NULL,
UnLockProc,
(LPARAM)pgContext);
DEBUG_MSG("%d",Result);
if (Result == WLX_DLG_SAS)
{
g_nDisableLock = 1;
pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx,WLX_SAS_TYPE_CTRL_ALT_DEL);
}
else
{
g_nDisableLock = 0;
}
return Result;
//return(WLX_SAS_ACTION_LOCK_WKSTA);
}int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
DWORD dwSasType,
PVOID pReserved)
{
DEBUG_MSG("WlxLoggedOnSAS");
// if (!pgContext->pWlxFuncs->WlxSwitchDesktopToUser(pgContext->hWlx))
// {
// DEBUG_MSG("WlxSwitchDesktopToUser success");
// }
// return theApp.MyWlxLoggedOnSAS(pWlxContext,
// dwSasType,
// pReserved); PGINA_CONTEXT pgContext = (PGINA_CONTEXT)pWlxContext;
int SasAction = WLX_SAS_ACTION_NONE;
if (g_nDisableLock == 0)
{
SasAction = pgContext->pWlxFuncs->WlxDialogBoxParam( pgContext->hWlx,
hDllInstance,
(PWSTR) MAKEINTRESOURCE(IDD_DIALOG_LOGON),
NULL,
OptionsDlgProc,
(LPARAM) pWlxContext ); }
else if (g_nDisableLock == 1)
{
SasAction = WLX_SAS_ACTION_LOCK_WKSTA;
}
return SasAction;
//return WLX_SAS_ACTION_NONE;
}
我整理了一份资料在这里。:)