⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 windowslogon.cpp

📁 一个WinCE6。0下的IP phone的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    {      
        ShiftValue = m_LowestYValue - InputPanelTop + 2;  //add 2 pixels worth of padding...
        m_LowestYValue = 0;
    }
    else
    {
        ShiftValue = m_LowestYValue - m_OriginalLowestYValue;
    }

    HWND Control;
    RECT Rect = {0};
    for (int i = 0; i < _countof(c_LogonControls); i++)
    {
        Control = GetDlgItem(m_hwnd, c_LogonControls[i]);
        if (! Control)
        {
            ASSERT(FALSE);
            continue;
        }

        GetWindowRect(Control, &Rect);

        Rect.top -= ShiftValue;
        Rect.bottom -= ShiftValue;

        MoveWindow(
            Control, 
            Rect.left, 
            Rect.top, 
            RECTWIDTH(Rect), 
            RECTHEIGHT(Rect), 
            TRUE
            );

        //track the lowest control
        if (Rect.bottom > m_LowestYValue)
        {
            m_LowestYValue = Rect.bottom;
        }
    }

    return;
}


HRESULT 
WindowsLogonDialog_t::InitializeEditControls(
    void
    )
{
    if (
        m_UserNameEdit == NULL ||
        m_DomainEdit   == NULL ||
        m_PasswordEdit == NULL
        )
    {
        return E_UNEXPECTED; 
    }
    
    CRED *pCredDomain    = NULL;     
    WCHAR* pUserName = NULL;
    HRESULT hr = S_OK;

    DWORD Res = CredRead(
        L"", 
        1, 
        CRED_TYPE_DOMAIN_PASSWORD, 
        CRED_FLAG_NO_DEFAULT | CRED_FLAG_NO_IMPLICIT_DEFAULT, 
        &pCredDomain
        );
    if (Res != ERROR_SUCCESS)
    {
        hr = HRESULT_FROM_WIN32(Res);
        goto exit;                         
    }

    if (pCredDomain == NULL || pCredDomain->wszUser == NULL)
    {
        hr = E_FAIL; 
        goto exit; 
    }

    pUserName = wcschr(
                pCredDomain->wszUser, 
                L'\\'
                ); 
    if (pUserName == NULL)
    {
        hr = E_FAIL; 
        goto exit; 
    }
    else
    {
        *pUserName = L'\0';
        pUserName++;
    }

exit: 
    if (pCredDomain && pCredDomain->wszUser && pUserName)
    {
        SetWindowText(m_DomainEdit, pCredDomain->wszUser);
        SetWindowText(m_UserNameEdit, pUserName);

        SetFocus(m_PasswordEdit);
    }
    else
    {
        SetFocus(m_UserNameEdit);
    }
    
    if (pCredDomain != NULL)
    {
        CredFree(reinterpret_cast<BYTE*>(pCredDomain)); 
    }

    return hr;
}

LRESULT
WindowsLogonDialog_t::OnOK(
    void
    )
{
    ce::wstring NewUserName; 
    ce::wstring NewDomain; 
    ce::wstring NewPassword; 

    HRESULT hr;

    hr = GetControlText(m_DomainEdit  , NewDomain);
    if (FAILED(hr))
    {
        return hr;
    }
    
    hr = GetControlText(m_UserNameEdit, NewUserName);
    if (FAILED(hr))
    {
        return hr;
    }

    hr = GetControlText(m_PasswordEdit, NewPassword);
    if (FAILED(hr))
    {
        return hr;
    }
        
    hr = ValidateCredentials(
                    NewDomain, 
                    NewUserName, 
                    NewPassword
                    ); 
    if (FAILED(hr))
    {
        return hr; 
    }

    hr = WriteCredentials(
            NewDomain, 
            NewUserName, 
            NewPassword
            ); 

    if (SUCCEEDED(hr))
    {
        RegistrySetString(
            SN_VOIP_LOGINUSERNAME_ROOT, 
            SN_VOIP_LOGINUSERNAME_PATH, 
            SN_VOIP_LOGINUSERNAME_VALUE, 
            NewUserName
            ); 

        //  Update the reg key to indicate that one of the exchange related settings has changed.
        RegistrySetDWORD(
            SN_VOIP_UPDATEDEXCHANGESETTINGS_ROOT,        
            SN_VOIP_UPDATEDEXCHANGESETTINGS_PATH,        
            SN_VOIP_UPDATEDEXCHANGESETTINGS_VALUE,       
            WINDOWS_CREDENTIALS
            );     

    }

    
    return hr; 
}

HRESULT
WindowsLogonDialog_t::ValidateCredentials(
    const WCHAR*    c_pDomain, 
    const WCHAR*    c_pUserName, 
    const WCHAR*    c_pPassword
    )
{
    HCURSOR CursorHandle = SetCursor(LoadCursor(NULL, IDC_WAIT));
    
    const SecurityFunctionTable *pFuncs     = NULL;
    TimeStamp                   LifeTime    = {0};
    CredHandle                  CredHandle  = {0};
    SEC_WINNT_AUTH_IDENTITY     AuthIden    = {0};
    HRESULT                     hr          = S_OK;
    PH_MESSAGE_BOX_PARAMETERS   MessageBoxParameters = {0}; 

    pFuncs = InitSecurityInterface();
    if (! pFuncs)
    {
        goto error;
    }

    AuthIden.Flags          = SEC_WINNT_AUTH_IDENTITY_UNICODE;
    AuthIden.User           = (WCHAR*)c_pUserName;
    AuthIden.UserLength     = wcslen(c_pUserName);
    AuthIden.Domain         = (WCHAR*)c_pDomain;
    AuthIden.DomainLength   = wcslen(c_pDomain);
    AuthIden.Password       = (WCHAR*)c_pPassword;
    AuthIden.PasswordLength = wcslen(c_pPassword);
    
    if (pFuncs->AcquireCredentialsHandle(
                    NULL,                   // principal
                    c_szSspiPackageName,    //sec package name
                    SECPKG_CRED_OUTBOUND,   //outbound cred's
                    NULL,                   // LOGON id
                    &AuthIden,              //Use default identity for Kerberos
                    NULL,                   // get key fn
                    NULL,                   // get key arg
                    &CredHandle,            //Cred handle
                    &LifeTime               //Timestamp for the LifeTime of the credential
                    ) != SEC_E_OK)
    {
        goto error;
    }

    goto exit; 

error:

    m_Control = GetFocus();
    MessageBoxParameters.StructSize = sizeof(MessageBoxParameters);
    MessageBoxParameters.Flags      = VDF_TYPE_MODELESS;
    MessageBoxParameters.Owner      = m_hwnd; 
    MessageBoxParameters.Instance   = GlobalData_t::s_ModuleInstance;
    MessageBoxParameters.pTitle     = (const WCHAR*)CommonUtilities_t::LoadString(GlobalData_t::s_ModuleInstance, IDS_TITLE_ERROR);
    MessageBoxParameters.pText      = (const WCHAR*)CommonUtilities_t::LoadString(GlobalData_t::s_ModuleInstance, IDS_ERROR_POPUP_INVALIDCREDENTIALS);
    MessageBoxParameters.IconId     = IDB_POPUP_ERROR;
    MessageBoxParameters.MenuId     = IDMB_MSGBOX_ERROR; 

    if (!PHMessageBox(
            &MessageBoxParameters
            ))
    {
        return E_FAIL; 
    }

    m_ErrorDialog = MessageBoxParameters.result.Dialog;    
    hr = E_FAIL;

exit: 
    
    FreeCredentialsHandle(&CredHandle);
    SetCursor(CursorHandle);
    
    return hr;

}

VOID
WindowsLogonDialog_t::UpdateMenuBar(
    void
    )
{
    WCHAR Domain[4]   = L""; 
    WCHAR Username[4] = L"";
    WCHAR Password[4] = L"";

    HWND Focus = GetFocus();
    
    GetWindowText(m_DomainEdit  , Domain  , _countof(Domain));
    GetWindowText(m_UserNameEdit, Username, _countof(Username));
    GetWindowText(m_PasswordEdit, Password, _countof(Password)); 

    bool ShowOkButton = Domain[0] && Username[0] && Password[0];

    bool ShowBackspace = (Focus == m_DomainEdit && Domain[0])     ||
                         (Focus == m_UserNameEdit && Username[0]) ||
                         (Focus == m_PasswordEdit && Password[0]);

    m_MenuBar.ShowMenuButton(IDOK, ShowOkButton);
    m_MenuBar.ShowMenuButton(IDC_BACKSPACE, ShowBackspace);

    return;
}

HRESULT
WindowsLogonDialog_t::WriteCredentials(
    const WCHAR*    c_pDomain, 
    const WCHAR*    c_pUserName, 
    const WCHAR*    c_pPassword
    )
{
    if (c_pDomain == NULL || c_pDomain[0] == L'\0' ||
        c_pUserName == NULL || c_pUserName[0] == L'\0' ||
        c_pPassword == NULL || c_pPassword[0] == L'\0')
    {
        return E_INVALIDARG; 
    }

    WCHAR DomainUserName[60] = L""; 

    StringCchPrintf(
        DomainUserName, 
        _countof(DomainUserName), 
        L"%s\\%s",
        c_pDomain,
        c_pUserName
        ); 

    CRED CredPassword = {0}; 

    CredPassword.dwVersion      = CRED_VER_1; 
    CredPassword.dwType         = CRED_TYPE_PLAINTEXT_PASSWORD; 
    CredPassword.wszUser        = DomainUserName; 
    CredPassword.dwUserLen      = wcslen(DomainUserName) + 1; 
    CredPassword.wszTarget      = L""; 
    CredPassword.dwTargetLen    = 1; 
    CredPassword.pBlob          = (BYTE*)c_pPassword; 
    CredPassword.dwBlobSize     = (wcslen(c_pPassword) + 1)*sizeof(WCHAR); 
    CredPassword.dwFlags        = CRED_FLAG_PERSIST | CRED_FLAG_TRUSTED; 

    
    DWORD Res = CredWrite(&CredPassword, 0);
    if (Res != ERROR_SUCCESS)
    {
        ASSERT(FALSE);
        return HRESULT_FROM_WIN32(Res);
    }

    CredPassword.dwType     = CRED_TYPE_DOMAIN_PASSWORD; 
    CredPassword.dwFlags    &= ~CRED_FLAG_TRUSTED; 

    Res = CredWrite(&CredPassword, 0);
    if (Res != ERROR_SUCCESS)
    {
        ASSERT(FALSE);
        return HRESULT_FROM_WIN32(Res);
    }

    return S_OK;
}

HRESULT
WindowsLogonDialog_t::OnHelp(
    void                                    
    )
{
    if (IsWindow(m_ErrorDialog) || IsWindow(m_HelpDialog))
    {
        return E_FAIL;
    }
    
    m_Control = GetFocus();

    PH_MESSAGE_BOX_PARAMETERS   Params = {0};
    Params.StructSize = sizeof(Params);
    Params.Flags      = VDF_TYPE_MODELESS;
    Params.IconId     = IDB_HELP_ICON;
    Params.Instance   = GlobalData_t::s_ModuleInstance;
    Params.Owner      = m_hwnd;
    Params.MenuId     = IDMB_MSGBOX_HELP;
    Params.pTitle     = (const WCHAR*)LoadString(GlobalData_t::s_ModuleInstance, IDS_TITLE_HELP, 0, 0);
    Params.pText = (const WCHAR*)LoadString(GlobalData_t::s_ModuleInstance, IDS_SCREENHELP_WINDOWSLOGON, 0, 0);

    if (! PHMessageBox(&Params))
    {
        ASSERT(FALSE);
        return E_FAIL;
    }

    m_HelpDialog = Params.result.Dialog;

    return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -