我是在Noreboot的代码基础上进行修改的,它大部分函数都是调用msgina里面的,只有loggedonsas函数用来屏蔽ctrl+alt+del键。现在碰到两个问题:
1.有时启动时出现sas winlogon.exe错误窗口,提示某内存指令引用另一个只读或只写内存。在log文件中记录到WlxInitialize,就没有了!
2.有时它能出现我的登陆界面,输入密码点登陆后,跳出错误窗口,提示某内存指向0x00000000。但是依然能启动,而且一切正常!
到底是什么错误?大家快帮帮我!!

解决方案 »

  1.   

    我修改了WlxInitialize,WlxLoggedOutSAS,WlxLoggedOnSAS,WlxActivateUserShell这四个函数,其中WlxActivateUserShell的代码考的微软的gina例子里面的!其代码如下:
      

  2.   

    WCHAR       szText[MAX_PATH];
        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);
      

  3.   

    另外我也根据gina例子修改了WlxDisplaySASNotice :
    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代码列出来,大家帮我看看:
      

  4.   

    BOOL WINAPI 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);
    */
     }
      

  5.   

    InitCommonControls();
    不知是什么意思?为什么编译时出错,提示未定义的外部参数。
      

  6.   

    InitCommonControls();加进去了,可是问题依旧!
      

  7.   

    你好,我的GINA全部是照着MSDN里的例子改的,一点儿问题也没有。
    你的WlxInitialize没问题的。另外,我的GINA输出函数都是自己写的,没有调用MSGINA里的函数,所有没碰到这种问题,你可以去问johnic,他的方法好象和你的一样,一部分是自己写,一部分是调用MSGINA的。你的可能还是PVOID * pWlxContext赋值的问题,因为系统也可用到这个指针的。
    SORRY。
      

  8.   

    谢谢!
    第一个问题我解决了。是在logoff时把pGlobals清空就可以了!
    现在是第二个问题!登录后,屏幕显示正在初始化用户界面,就跳出这个指针指向0x000000000,不能读!
    请做过gina的兄弟帮我看看啊。。
      

  9.   

    要得!
    我的mail:
    [email protected]
    谢谢!
      

  10.   

    我估计问题如mjian(红蜻蜓)所说,可能出在pGlobals变量上面。我原来采用的是微软的gina例子:
    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的,它们有关系吗?
      

  11.   

    我也遇到过这个问题!
    你的有没有初始化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("")
    我只能帮你这么多了!你试试吧!
      

  12.   

    哇哈哈,搞定了。太爽了!谢谢 slaner(佳娃),给分咯!!!