我是在Noreboot的代码基础上进行修改的,它大部分函数都是调用msgina里面的,只有loggedonsas函数用来屏蔽ctrl+alt+del键。现在碰到两个问题:
1.有时启动时出现sas winlogon.exe错误窗口,提示某内存指令引用另一个只读或只写内存。在log文件中记录到WlxInitialize,就没有了!
2.有时它能出现我的登陆界面,输入密码点登陆后,跳出错误窗口,提示某内存指向0x00000000。但是依然能启动,而且一切正常!
到底是什么错误?大家快帮帮我!!
1.有时启动时出现sas winlogon.exe错误窗口,提示某内存指令引用另一个只读或只写内存。在log文件中记录到WlxInitialize,就没有了!
2.有时它能出现我的登陆界面,输入密码点登陆后,跳出错误窗口,提示某内存指向0x00000000。但是依然能启动,而且一切正常!
到底是什么错误?大家快帮帮我!!
PWSTR pszScan;
STARTUPINFO si;
PROCESS_INFORMATION pi;
PGlobals pGlobals;
DWORD StartCount; WriteInfo("WlxActivateUserShell \r\n");
pGlobals = (PGlobals) pWlxContext;
GetProfileString(WINLOGON_APP, USERINIT, USERINIT_DEFAULT, szText, MAX_PATH);
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.dwX = si.dwY = si.dwXSize = si.dwYSize = 0;
si.dwFlags = 0;
si.wShowWindow = SW_SHOW; // at least let the guy see it
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
si.lpDesktop = pszDesktop; // DebugLog((DEB_TRACE, "Starting '%ws' as user\n", pszScan)); ImpersonateLoggedOnUser(pGlobals->hUserToken); if (CreateProcessAsUser(pGlobals->hUserToken, // 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);
} RevertToSelf(); pszScan = wcstok(NULL, TEXT(","));
} return(StartCount > 0);
WriteInfo("WlxDisplaySASNotice \r\n");
pWlxFuncs->WlxSasNotify(hGlobalWlx, GINA_SAS_1);
//GINA_SAS_1=256
用msgina的WlxDisplaySASNotice 好像不好使!
我断定第1个错误发生在WlxInitialize结束(因为return前的一句输出正常)和WlxDisplaySASNotice 开始之前(因为WriteInfo("WlxDisplaySASNotice \r\n");这句没有输出)。那么错误就肯定发生在winlogon了?难道WlxInitialize传递参数有问题?我把WlxInitialize代码列出来,大家帮我看看:
LPWSTR lpWinsta,
HANDLE hWlx,
PVOID pvReserved,
PVOID pWinlogonFunctions,
PVOID * pWlxContext)
{
PGlobals pGlobals;
WriteInfo("WlxInitialize \r\n");
pWlxFuncs = (PWLX_DISPATCH_VERSION_1_1) pWinlogonFunctions; hGlobalWlx = hWlx;
pGlobals = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(Globals)); *pWlxContext = (PVOID) pGlobals;
//
// Read from registry...
// pGlobals->fAllowNewUser = TRUE;
pWlxFuncs->WlxUseCtrlAltDel(hWlx);
// InitCommonControls();
return TRUE;
/* return prcWlxInitialize (
lpWinsta,
hWlx,
pvReserved,
pWinlogonFunctions,
pWlxContext);
*/
}
不知是什么意思?为什么编译时出错,提示未定义的外部参数。
你的WlxInitialize没问题的。另外,我的GINA输出函数都是自己写的,没有调用MSGINA里的函数,所有没碰到这种问题,你可以去问johnic,他的方法好象和你的一样,一部分是自己写,一部分是调用MSGINA的。你的可能还是PVOID * pWlxContext赋值的问题,因为系统也可用到这个指针的。
SORRY。
第一个问题我解决了。是在logoff时把pGlobals清空就可以了!
现在是第二个问题!登录后,屏幕显示正在初始化用户界面,就跳出这个指针指向0x000000000,不能读!
请做过gina的兄弟帮我看看啊。。
我的mail:
[email protected]
谢谢!
typedef struct _Globals {
BOOL fAllowNewUser;
BOOL fAutoLogonAtBoot;
BOOL fAutoLogonAlways;
HANDLE hUserToken;
// PMiniAccount pAccount;
} Globals, * PGlobals;
发现传递时跟msgina的内部结构可能有出入,然后改成了
typedef struct {
HANDLE hWlx;
LPWSTR station;
PWLX_DISPATCH_VERSION_1_1 pWlxFuncs;
HANDLE hDllInstance;
HANDLE hUserToken;
} GINA_CONTEXT, * PGINA_CONTEXT;
我在WlxInitialize里面对其进行了初始化,可是不知道hDllInstance初始化去什么值,msdn里面提到它是从dllmain获得的,但是dllmain只有一个HINSTANCE,而hDllInstance是HANDLE的,它们有关系吗?
你的有没有初始化pMini?
pMini = LocalAlloc(LMEM_FIXED, sizeof(MiniAccount));
pMini->pszUsername = LocalAlloc(LMEM_FIXED, 21*sizeof(WCHAR));
pMini->pszPassword = LocalAlloc(LMEM_FIXED, 21*sizeof(WCHAR));
pMini->pszDomain = LocalAlloc(LMEM_FIXED, 21*sizeof(WCHAR));
pMini->pszComment = LocalAlloc(LMEM_FIXED, 21*sizeof(WCHAR));
如果Domain没有的话,设成TEXT("")
我只能帮你这么多了!你试试吧!