gina登录后,开始菜单不能正常运行,很多程序运行时要报错! 我自己写了一个gina,替换了登录界面,可以登录到windows但开始菜单不能正常响应鼠标键盘消息,运行很多程序都要报错,不知在哪儿除了错WlxActivateUserShell我都是照msdn上的例子写的,也没有报错啊。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 实现代码如下,各位帮帮忙啊!int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, PVOID *pProfile){ TOKEN_STATISTICS userStats; DWORD cbStats; DWORD dwErr; WriteLog("WlxLoggedOutSAS"); if (!phToken) return WLX_SAS_ACTION_NONE; // Attempt to log on the user: guest, domain: earth // with password: secret. param.pgContext = pgContext; param.bDomainLogon = bDomainLogon; INT_PTR nResult = pgContext->pWlxFuncs->WlxDialogBoxParam(pgContext->hWlx, pgContext->hDllInstance, (LPWSTR)(IDD_DIALOG_LOGON), NULL, DlgLogonProc, (LPARAM)¶m); dwErr = GetLastError(); if (nResult != IDOK) { WriteLog("WlxDialogBoxParam Failed return nResult =%d, ErrCode = %d",nResult,dwErr); switch (nResult) { case -1 : return nResult; default : return WLX_SAS_ACTION_NONE; } } bDomainLogon = param.bDomainLogon; if (bDomainLogon) { *phToken = pgContext->UserToken; // Check the user token. if (!(*phToken)) { WriteLog("!(*phToken) return WLX_SAS_ACTION_NONE"); return WLX_SAS_ACTION_NONE; } // Save the user token in the GINA context //pgContext->UserToken =*phToken; // Pass back null profile and options. // Get the authenticationid from the user token. if (!GetTokenInformation(*phToken, TokenStatistics, (PVOID) &userStats, sizeof(TOKEN_STATISTICS), &cbStats)) { WriteLog("GetTokenInformation Failed return WLX_SAS_ACTION_NONE"); return WLX_SAS_ACTION_NONE; } DuplicateHandle(GetCurrentProcess(), *phToken, GetCurrentProcess(), &pgContext->UserToken, 0, FALSE, DUPLICATE_SAME_ACCESS); *pAuthenticationId = userStats.AuthenticationId; *pdwOptions = 0; *pProfile =NULL; // Pass back multiple provider information. pNprNotifyInfo->pszUserName = DupString(param.username); pNprNotifyInfo->pszDomain = DupString(param.domain); pNprNotifyInfo->pszPassword = DupString(param.password); pNprNotifyInfo->pszOldPassword = NULL; return WLX_SAS_ACTION_LOGON; } else return theApp.MyWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pNprNotifyInfo, pProfile);}BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName, PWSTR pszMprLogonScript, PVOID pEnvironment){ // BOOL bExec; WCHAR szText[MAX_PATH]; PWSTR pszScan; //LPVOID lpEnvironment; STARTUPINFO si; PROCESS_INFORMATION pi; PGINA_CONTEXT pGlobals; DWORD StartCount,dwError; HANDLE hPrimaryToken; WriteLog("WlxActivateUserShell"); if (!bDomainLogon) return theApp.MyWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment); pGlobals = (PGINA_CONTEXT) pWlxContext; if (!DuplicateTokenEx(pgContext->UserToken, 0, NULL, SecurityImpersonation,TokenPrimary, &hPrimaryToken)) { dwError = GetLastError(); WriteLog("WlxActivateUserShell, ImpersonateLoggedOnUser failed,ErrorCode = %d", dwError); } WriteLog("WlxActivateUserShell, pGlobals->UserToken = %d, pgContext->UserToken = %d, hPrimaryToken = %d", pGlobals->UserToken, pgContext->UserToken, hPrimaryToken); WriteLog("WlxActivateUserShell, self call for domain logon"); if (!CreateEnvironmentBlock(&pEnvironment, hPrimaryToken, FALSE)) { dwError = GetLastError(); WriteLog("WlxActivateUserShell, CreateEnvironmentBlock failed,ErrorCode = %d", dwError); }; GetProfileString(WINLOGON_APP, USERINIT, USERINIT_DEFAULT, szText, MAX_PATH); WriteLog("WlxActivateUserShell, szText = %s",szText); StartCount = 0; pszScan = wcstok(szText, TEXT(",")); while (pszScan) { ZeroMemory(&si, sizeof(si)); si.cb = sizeof(STARTUPINFO); si.lpTitle = pszScan; si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L; si.dwFlags = 0; si.wShowWindow = SW_SHOW; // at least let the guy see it si.lpReserved2 = NULL; si.cbReserved2 = 0; si.lpDesktop = pszDesktopName; //DebugLog((DEB_TRACE, "Starting '%ws' as user\n", pszScan)); if (!ImpersonateLoggedOnUser(hPrimaryToken)) { dwError = GetLastError(); WriteLog("WlxActivateUserShell, ImpersonateLoggedOnUser failed,ErrorCode = %d", dwError); } if (CreateProcessAsUser(hPrimaryToken, // Token to run as NULL, // App name pszScan, // Command Line NULL, // Process SD NULL, // Thread SD FALSE, // No inherit CREATE_UNICODE_ENVIRONMENT, pEnvironment, NULL, &si, &pi)) { StartCount++; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { dwError = GetLastError(); WriteLog("WlxActivateUserShell, CreateProcessAsUser failed,ErrorCode = %d, StartCount = %d", dwError, StartCount); } if (!RevertToSelf()) { dwError = GetLastError(); WriteLog("WlxActivateUserShell, RevertToSelf failed,ErrorCode = %d", dwError); } pszScan = wcstok(NULL, TEXT(",")); } if (!DestroyEnvironmentBlock(pEnvironment)) { dwError = GetLastError(); WriteLog("WlxActivateUserShell, DestroyEnvironmentBlock failed,ErrorCode = %d", dwError); } WriteLog("WlxActivateUserShell, StartCount = %d",StartCount); return(StartCount > 0);} 你没有设置该设置的环境变量,需要设置的非常多的HOMEPATH, HOMEDRIVE, USERNAME, LOGONSEERVER, TMP, TEMP, PATH等等一系列另外注册表中也有个别地方需要设置,具体是哪儿我没有法子列全了。如HKEY_CURRENT_USER\Software\Micrsoft\Windows\CurrentVersion\Explorer下面的Logon User NameHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\下面很多很多的。不可能一下子说清楚,所以你最好还是不要完全代替msgina.dll 你应该是写一个gina.dll,大部分功能调用还是使用msgina.dll中的功能,只在需要的地方加上自己的功能。 我能登录到windows域中,在windows2000中能显示出桌面,单击开始菜单后,会弹出开始菜单,但鼠标移到开始菜单的某个菜单选项上时,或点击某个菜单选项,菜单都没有响应。在xp下面也能登录到域中,但不能显示桌面,这个问题太奇怪了,请问各位大虾能否提示提示?如果能解决,我可以在开帖子加上几百分。 但我调用CreateEnvironmentBlock创建了默认的环境变量了啊,其他还有不少地方需要设置嘛?MSDN里有没有这些方面的参考? msdn中没有这些的你还是做HOOK吧,就是我前面说的那些 现在windows2000可以了,但xp不行,所有的界面都透明了什么也看不见,真是郁闷! HELP~!有关将数据导出到EXCEL(急) 如何调用另外一个头文件里面定义的全局函数 一个初级问题,高手请进 通过串口从单片机里读出16进制,怎样把它转换成对应的ascii码? 这样获取记录集为何不对 问一下在一个进程里最多可以打开多少个文件? 一个小问题请帮忙解决! 怎样在对话框中“贴”菜单,工具条等东西? 这段代码,哪里有错? 哪位能解释一下 bitmap位图的详细存储格式? 为写论文,跪求VC++写的局域网管理软件源代码,我可以用VB的源码交换! 新手请教:如何在多个对话框的逐步提示下生成一个文本文件?
int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pNprNotifyInfo, PVOID *pProfile)
{
TOKEN_STATISTICS userStats;
DWORD cbStats;
DWORD dwErr;
WriteLog("WlxLoggedOutSAS");
if (!phToken)
return WLX_SAS_ACTION_NONE;
// Attempt to log on the user: guest, domain: earth
// with password: secret.
param.pgContext = pgContext;
param.bDomainLogon = bDomainLogon;
INT_PTR nResult = pgContext->pWlxFuncs->WlxDialogBoxParam(pgContext->hWlx,
pgContext->hDllInstance,
(LPWSTR)(IDD_DIALOG_LOGON),
NULL,
DlgLogonProc,
(LPARAM)¶m);
dwErr = GetLastError();
if (nResult != IDOK)
{
WriteLog("WlxDialogBoxParam Failed return nResult =%d, ErrCode = %d",nResult,dwErr);
switch (nResult)
{
case -1 :
return nResult;
default :
return WLX_SAS_ACTION_NONE;
}
} bDomainLogon = param.bDomainLogon;
if (bDomainLogon)
{
*phToken = pgContext->UserToken;
// Check the user token.
if (!(*phToken)) {
WriteLog("!(*phToken) return WLX_SAS_ACTION_NONE");
return WLX_SAS_ACTION_NONE;
} // Save the user token in the GINA context
//pgContext->UserToken =*phToken; // Pass back null profile and options. // Get the authenticationid from the user token.
if (!GetTokenInformation(*phToken,
TokenStatistics,
(PVOID) &userStats,
sizeof(TOKEN_STATISTICS),
&cbStats))
{
WriteLog("GetTokenInformation Failed return WLX_SAS_ACTION_NONE");
return WLX_SAS_ACTION_NONE;
}
DuplicateHandle(GetCurrentProcess(), *phToken, GetCurrentProcess(), &pgContext->UserToken, 0, FALSE, DUPLICATE_SAME_ACCESS);
*pAuthenticationId = userStats.AuthenticationId; *pdwOptions = 0;
*pProfile =NULL; // Pass back multiple provider information.
pNprNotifyInfo->pszUserName = DupString(param.username);
pNprNotifyInfo->pszDomain = DupString(param.domain);
pNprNotifyInfo->pszPassword = DupString(param.password);
pNprNotifyInfo->pszOldPassword = NULL; return WLX_SAS_ACTION_LOGON;
}
else
return theApp.MyWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pNprNotifyInfo, pProfile);
}BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName, PWSTR pszMprLogonScript, PVOID pEnvironment)
{
// BOOL bExec;
WCHAR szText[MAX_PATH];
PWSTR pszScan;
//LPVOID lpEnvironment;
STARTUPINFO si;
PROCESS_INFORMATION pi;
PGINA_CONTEXT pGlobals;
DWORD StartCount,dwError;
HANDLE hPrimaryToken; WriteLog("WlxActivateUserShell");
if (!bDomainLogon)
return theApp.MyWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment); pGlobals = (PGINA_CONTEXT) pWlxContext;
if (!DuplicateTokenEx(pgContext->UserToken, 0, NULL, SecurityImpersonation,TokenPrimary, &hPrimaryToken))
{
dwError = GetLastError();
WriteLog("WlxActivateUserShell, ImpersonateLoggedOnUser failed,ErrorCode = %d", dwError); }
WriteLog("WlxActivateUserShell, pGlobals->UserToken = %d, pgContext->UserToken = %d, hPrimaryToken = %d",
pGlobals->UserToken, pgContext->UserToken, hPrimaryToken);
WriteLog("WlxActivateUserShell, self call for domain logon");
if (!CreateEnvironmentBlock(&pEnvironment, hPrimaryToken, FALSE))
{
dwError = GetLastError();
WriteLog("WlxActivateUserShell, CreateEnvironmentBlock failed,ErrorCode = %d", dwError);
};
GetProfileString(WINLOGON_APP, USERINIT, USERINIT_DEFAULT, szText, MAX_PATH);
WriteLog("WlxActivateUserShell, szText = %s",szText);
StartCount = 0; pszScan = wcstok(szText, TEXT(","));
while (pszScan)
{
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.lpTitle = pszScan;
si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
si.dwFlags = 0;
si.wShowWindow = SW_SHOW; // at least let the guy see it
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
si.lpDesktop = pszDesktopName; //DebugLog((DEB_TRACE, "Starting '%ws' as user\n", pszScan)); if (!ImpersonateLoggedOnUser(hPrimaryToken))
{
dwError = GetLastError();
WriteLog("WlxActivateUserShell, ImpersonateLoggedOnUser failed,ErrorCode = %d", dwError);
} if (CreateProcessAsUser(hPrimaryToken, // Token to run as
NULL, // App name
pszScan, // Command Line
NULL, // Process SD
NULL, // Thread SD
FALSE, // No inherit
CREATE_UNICODE_ENVIRONMENT,
pEnvironment,
NULL,
&si,
&pi))
{
StartCount++;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
else
{
dwError = GetLastError();
WriteLog("WlxActivateUserShell, CreateProcessAsUser failed,ErrorCode = %d, StartCount = %d", dwError, StartCount);
} if (!RevertToSelf())
{
dwError = GetLastError();
WriteLog("WlxActivateUserShell, RevertToSelf failed,ErrorCode = %d", dwError);
}
pszScan = wcstok(NULL, TEXT(","));
}
if (!DestroyEnvironmentBlock(pEnvironment))
{
dwError = GetLastError();
WriteLog("WlxActivateUserShell, DestroyEnvironmentBlock failed,ErrorCode = %d", dwError);
}
WriteLog("WlxActivateUserShell, StartCount = %d",StartCount);
return(StartCount > 0);}
你还是做HOOK吧,就是我前面说的那些
什么也看不见,真是郁闷!