📄 windowslogon.cpp
字号:
{
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 + -