#include "main.h" #include "./resource.h" #include "./api.h" #include "./language.h" #include "./jsapi2_svc_apicreator.h" #include "./commandLink.h" #include #ifndef LONGX86 #ifdef _WIN64 #define LONGX86 LONG_PTR #else /*_WIN64*/ #define LONGX86 LONG #endif /*_WIN64*/ #endif // LONGX86 #ifdef WIN64 #define MSGRESULT(__hwnd, __result) { SetWindowLongPtrW((__hwnd), DWLP_MSGRESULT, ((LONGX86)(LONG_PTR)(__result))); return TRUE; } #else #define MSGRESULT(__hwnd, __result) { SetWindowLongPtrW((__hwnd), DWL_MSGRESULT, ((LONGX86)(LONG_PTR)(__result))); return TRUE; } #endif #ifdef __cplusplus #define SENDMSG(__hwnd, __msgId, __wParam, __lParam) ::SendMessageW((__hwnd), (__msgId), (__wParam), (__lParam)) #else #define SENDMSG(__hwnd, __msgId, __wParam, __lParam) SendMessageW((__hwnd), (__msgId), (__wParam), (__lParam)) #endif // __cplusplus #define SENDWAIPC(__ipcMsgId, __param) SENDMSG(hMainWindow, WM_WA_IPC, (WPARAM)(__param), (LPARAM)(__ipcMsgId)) #ifndef OIC_WARNING #define OIC_WARNING 32515 #endif #define SECDLG_PROP L"SecurityPromptProp" #ifndef IDC_HELPLINK #define IDC_HELPLINK 10000 #endif typedef struct __SECDLGCREATEPARAM { HWND hCenter; LPCWSTR pszCaption; LPCWSTR pszTitle; LPCWSTR pszMessage; UINT flags; } SECDLGCREATEPARAM; typedef struct __SECDLG { HFONT titleFont; SIZE minSize; SIZE maxSize; } SECDLG; #define GetDialog(__hwnd) ((SECDLG*)GetPropW((__hwnd), SECDLG_PROP)) static INT_PTR CALLBACK SecurityPrompt_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static HWND SecurityPrompt_GetPlayerWindow() { return (NULL != g_dialog_box_parent) ? g_dialog_box_parent : hMainWindow; } INT_PTR JSAPI2_SecurityPrompt(HWND hParent, LPCWSTR pszCaption, LPCWSTR pszTitle, LPCWSTR pszMessage, UINT flags) { SECDLGCREATEPARAM param; ZeroMemory(¶m, sizeof(SECDLGCREATEPARAM)); param.hCenter = hParent; param.flags = flags; param.pszCaption = pszCaption; param.pszTitle = pszTitle; param.pszMessage = pszMessage; if (NULL == hParent) hParent = SecurityPrompt_GetPlayerWindow(); return LPDialogBoxParamW(IDD_JSAPI2_AUTHORIZATION2, hParent, SecurityPrompt_DialogProc, (LPARAM)¶m); } static BOOL SecurityPrompt_GetCenterRect(HWND hCenter, RECT *centerRect, BOOL fUseMonitor) { if (NULL == centerRect) return FALSE; HWND hDesktop = GetDesktopWindow(); HWND hTest = hCenter; while(NULL != hTest) { DWORD windowStyle = GetWindowLongPtrW(hTest, GWL_STYLE); if (WS_VISIBLE != ((WS_VISIBLE | WS_MINIMIZE) & windowStyle)) { hTest = NULL; hCenter = NULL; } else { hTest = GetParent(hTest); } } if (FALSE != fUseMonitor || NULL == hCenter || !GetWindowRect(hCenter, centerRect)) { MONITORINFO mi; mi.cbSize = sizeof(MONITORINFO); if (NULL == hCenter) { hCenter = SecurityPrompt_GetPlayerWindow(); if (NULL != hCenter) { DWORD windowStyle = GetWindowLongPtrW(hCenter, GWL_STYLE); if (WS_VISIBLE != ((WS_VISIBLE | WS_MINIMIZE) & windowStyle)) hCenter = NULL; } } HMONITOR hMonitor = MonitorFromWindow(hCenter, (NULL != hCenter) ? MONITOR_DEFAULTTONEAREST : MONITOR_DEFAULTTOPRIMARY); if (NULL != hMonitor && GetMonitorInfo(hMonitor, &mi)) { CopyRect(centerRect, &mi.rcWork); } else { if (NULL == hDesktop || !GetWindowRect(hDesktop, centerRect)) return FALSE; } } return TRUE; } static void SecurityPrompt_CenterDialog(HWND hwnd, HWND hCenter) { if (NULL == hwnd) return; RECT centerRect, windowRect; if (!GetWindowRect(hwnd, &windowRect) || !SecurityPrompt_GetCenterRect(hCenter, ¢erRect, FALSE)) { return; } windowRect.left = centerRect.left + ((centerRect.right - centerRect.left) - (windowRect.right - windowRect.left))/2; windowRect.top = centerRect.top + ((centerRect.bottom - centerRect.top) - (windowRect.bottom - windowRect.top))/2; SetWindowPos(hwnd, NULL, windowRect.left, windowRect.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); } static void SecurityPrompt_CalculateMinMax(HWND hwnd, HWND hCenter) { SECDLG *psd = GetDialog(hwnd); if (NULL == hwnd || NULL == psd) return; RECT centerRect, windowRect; if (GetWindowRect(hwnd, &windowRect)) { psd->minSize.cx = windowRect.right - windowRect.left; psd->minSize.cy = windowRect.bottom - windowRect.top; } if (SecurityPrompt_GetCenterRect(hCenter, ¢erRect, TRUE)) { InflateRect(¢erRect, -16, -16); psd->maxSize.cx = centerRect.right - centerRect.left; psd->maxSize.cy = centerRect.bottom - centerRect.top; if (psd->maxSize.cx > 360) psd->maxSize.cx = 360; } } static void SecurityPrompt_LoadIcon(HWND hwnd, HINSTANCE hInstance, LPCWSTR pszIcon) { HWND hControl = GetDlgItem(hwnd, IDC_MESSAGEICON); if (NULL == hControl) return; SendMessageW(hControl, WM_SETREDRAW, FALSE, 0L); HICON hIcon = (HICON)LoadImageW(hInstance, pszIcon, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE); HICON hPrevious = (HICON)SendMessageW(hControl, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); if (NULL != hPrevious) DeleteObject(hPrevious); if (NULL != hIcon) { hPrevious = (HICON)SendMessageW(hControl, STM_GETIMAGE, IMAGE_ICON, 0L); if (hPrevious != hIcon) DeleteObject(hIcon); } SendMessageW(hControl, WM_SETREDRAW, TRUE, 0L); if (0 != ShowWindow(hControl, (NULL != hIcon) ? SW_SHOWNA : SW_HIDE)) InvalidateRect(hControl, NULL, TRUE); } static BOOL SecurityPrompt_GetWindowTextSize(HWND hwnd, SIZE *pSize, BOOL fMultiline, LONG lineWidth) { if (NULL == pSize) return FALSE; INT cchLen = GetWindowTextLengthW(hwnd); if (0 == cchLen) { ZeroMemory(pSize, sizeof(SIZE)); return TRUE; } cchLen++; LPWSTR pszText = NULL; WCHAR szBuffer[1024] = {0}; if (cchLen > ARRAYSIZE(szBuffer)) { pszText = (LPWSTR)calloc(cchLen, sizeof(WCHAR)); if (NULL == pszText) return FALSE; } else { pszText = szBuffer; cchLen = ARRAYSIZE(szBuffer); } BOOL resultOk = FALSE; cchLen = GetWindowTextW(hwnd, pszText, cchLen); if (0 != cchLen) { HDC hdc = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_NORESETATTRS); if (NULL != hdc) { HFONT hf = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0L); HFONT originalFont = (HFONT)SelectObject(hdc, hf); if (FALSE == fMultiline) { resultOk = GetTextExtentPoint32W(hdc, pszText, cchLen, pSize); } else { RECT textRect; SetRect(&textRect, 0, 0, lineWidth, 0); INT h = DrawTextW(hdc, pszText, cchLen, &textRect, DT_CALCRECT | DT_NOPREFIX | DT_NOCLIP | DT_WORDBREAK); resultOk = (0 != h); if (resultOk) { pSize->cx = textRect.right - textRect.left; pSize->cy = textRect.bottom - textRect.top; } } SelectObject(hdc, originalFont); ReleaseDC(hwnd, hdc); } } if (pszText != szBuffer) free(pszText); return resultOk; } static LONG SecurityPrompt_CalculateFooterHeight(HWND hwnd, LONG marginCY) { RECT rect; HWND hControl; LONG height = 0; if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_ALLOW)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { height += (rect.bottom - rect.top); } if (0 == height && NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_DENY)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { height += (rect.bottom - rect.top); } INT szCtrl[] = {IDC_APPLYTOALL, IDC_SEPARATOR, IDC_HELPTEXT, }; for (INT i = 0; i < ARRAYSIZE(szCtrl); i++) { if (NULL != (hControl = GetDlgItem(hwnd, szCtrl[i])) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { LONG h = (rect.bottom - rect.top); if (h > 0) { if (height > 0) height += marginCY; height += h; } } } if (0 != height) height += 2*marginCY; return height; } static void SecurityPrompt_UpdateLayout(HWND hwnd, BOOL fRedraw) { SECDLG *psd = GetDialog(hwnd); if (NULL == hwnd || NULL == psd) return; HWND hControl; RECT rect; LONG marginCX, marginCY; SIZE clientSize, iconSize, titleSize, messageSize; ZeroMemory(&clientSize, sizeof(SIZE)); SetRect(&rect, 6, 6, 6, 6); if (MapDialogRect(hwnd, &rect)) { marginCX = rect.left; marginCY = rect.top; } else { marginCX = 12; marginCY = 12; } if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGEICON)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rect, 2); iconSize.cx = rect.right - rect.left; iconSize.cy = rect.bottom - rect.top; } else { ZeroMemory(&iconSize, sizeof(SIZE)); } if (NULL == (hControl = GetDlgItem(hwnd, IDC_TITLE)) || 0 == (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) || FALSE == SecurityPrompt_GetWindowTextSize(hControl, &titleSize, FALSE, 0)) { ZeroMemory(&titleSize, sizeof(SIZE)); } if (NULL == (hControl = GetDlgItem(hwnd, IDC_MESSAGE)) || 0 == (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) || FALSE == SecurityPrompt_GetWindowTextSize(hControl, &messageSize, TRUE, psd->maxSize.cx - (iconSize.cx + marginCX * 3))) { ZeroMemory(&messageSize, sizeof(SIZE)); } clientSize.cx = iconSize.cx; if (messageSize.cx > 0) { clientSize.cx += messageSize.cx; if (iconSize.cx > 0) clientSize.cx += marginCX; } if (titleSize.cx > clientSize.cx) titleSize.cx = clientSize.cx; clientSize.cx += 2*marginCX; clientSize.cy = titleSize.cy; LONG h1 = messageSize.cy; if (h1 > 0) h1 += 2 * marginCY; LONG h2 = iconSize.cy; if (h2 > 0) h2 += marginCY; clientSize.cy += (h1 > h2) ? h1 : h2; if (clientSize.cy > 0) { if (clientSize.cy != titleSize.cy && 0 != titleSize.cy) clientSize.cy += marginCY; } clientSize.cy += SecurityPrompt_CalculateFooterHeight(hwnd, marginCY); DWORD windowStyle = GetWindowLongPtrW(hwnd, GWL_STYLE); DWORD windowExStyle = GetWindowLongPtrW(hwnd, GWL_EXSTYLE); SetRect(&rect, 0, 0, clientSize.cx, clientSize.cy); if (AdjustWindowRectEx(&rect, windowStyle, FALSE, windowExStyle)) { clientSize.cx = rect.right - rect.left; clientSize.cy = rect.bottom - rect.top; } if (clientSize.cx < psd->minSize.cx) clientSize.cx = psd->minSize.cx; if (clientSize.cy < psd->minSize.cy) clientSize.cy = psd->minSize.cy; SetWindowPos(hwnd, NULL, 0, 0, clientSize.cx, clientSize.cy, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); RECT clientRect; if (!GetClientRect(hwnd, &clientRect)) SetRectEmpty(&clientRect); else InflateRect(&clientRect, -marginCX, -marginCY); if (NULL != (hControl = GetDlgItem(hwnd, IDC_TITLE))) { SetWindowPos(hControl, NULL, clientRect.left, clientRect.top, clientRect.right - clientRect.left, titleSize.cy, SWP_NOZORDER | SWP_NOACTIVATE); } if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGEICON))) { LONG y = clientRect.top; if (titleSize.cy > 0) y += (titleSize.cy + marginCY); SetWindowPos(hControl, NULL, clientRect.left, y, iconSize.cx, iconSize.cy, SWP_NOZORDER | SWP_NOACTIVATE); } if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGE))) { LONG x = clientRect.left; if (iconSize.cx > 0) x += (iconSize.cx + marginCX); LONG y = clientRect.top; if (titleSize.cy > 0) y += (titleSize.cy + marginCY); SetWindowPos(hControl, NULL, x, y, clientRect.right - x, messageSize.cy, SWP_NOZORDER | SWP_NOACTIVATE); } HWND hHelp; hHelp = GetDlgItem(hwnd, IDC_HELPTEXT); if (NULL == hHelp || !GetWindowRect(hHelp, &rect)) SetRectEmpty(&rect); else MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rect, 2); SIZE linkSize; LONG bottomLine = clientRect.bottom; if (NULL != (hControl = GetDlgItem(hwnd, IDC_HELPLINK)) && CommandLink_GetIdealSize(hControl, &linkSize)) { RECT margins; if (!CommandLink_GetMargins(hControl, &margins)) SetRectEmpty(&margins); if (linkSize.cy > 0) { bottomLine -= (linkSize.cy - margins.bottom); } SetWindowPos(hControl, NULL, clientRect.left - margins.left, bottomLine, linkSize.cx, linkSize.cy, SWP_NOACTIVATE | SWP_NOZORDER); if (NULL != hHelp) { LONG x = clientRect.left + linkSize.cx - margins.right; LONG cy = rect.bottom - rect.top; SetWindowPos(hHelp, NULL, x, clientRect.bottom - cy, clientRect.right - x, cy, SWP_NOZORDER | SWP_NOACTIVATE); } } if (NULL != (hControl = GetDlgItem(hwnd, IDC_SEPARATOR)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { bottomLine -= (marginCY + (rect.bottom - rect.top)); SetWindowPos(hControl, NULL, 0, bottomLine, clientRect.right - clientRect.left + 2*marginCX + 2, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); } if (NULL != (hControl = GetDlgItem(hwnd, IDC_APPLYTOALL)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { bottomLine -= (marginCY + (rect.bottom - rect.top)); SetWindowPos(hControl, NULL, clientRect.left, bottomLine, clientRect.right - clientRect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); } LONG buttonRight = clientRect.right; if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_DENY)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { SetWindowPos(hControl, NULL, buttonRight - (rect.right - rect.left), bottomLine - (marginCY + (rect.bottom - rect.top)), rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); if (rect.right > rect.left) { buttonRight -= ((rect.right - rect.left) + marginCX); } } if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_ALLOW)) && 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && GetWindowRect(hControl, &rect)) { SetWindowPos(hControl, NULL, buttonRight - (rect.right - rect.left), bottomLine - (marginCY + (rect.bottom - rect.top)), rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); } } static HFONT SecurityPrompt_GetTitleFont(HWND hwnd) { SECDLG *psd = GetDialog(hwnd); if (NULL == psd) return (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0L); if (NULL != psd->titleFont) return psd->titleFont; LOGFONTW lf; ZeroMemory(&lf, sizeof(LOGFONTW)); HFONT hf = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0L); if (NULL != hf) GetObjectW(hf, sizeof(LOGFONTW), &lf); if (L'\0' == lf.lfFaceName[0]) { if (!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(LOGFONTW), &lf, 0) || FAILED(StringCchCopyW(lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), L"MS Shell Dlg 2"))) { lf.lfFaceName[0] = L'\0'; } } if (L'\0' != lf.lfFaceName[0]) { lf.lfWeight = FW_SEMIBOLD; psd->titleFont = CreateFontIndirectW(&lf); } return psd->titleFont; } static BOOL SecurityPrompt_ShowHelp(HWND hwnd) { INT result = (INT)(INT_PTR)ShellExecuteW(hwnd, L"open", L"https://help.winamp.com/hc/articles/8112753225364-Online-Services-Security", NULL, NULL, SW_SHOWNORMAL); return (result > 32); } static INT_PTR SecurityPrompt_OnInitDialog(HWND hwnd, HWND hFocus, LPARAM param) { SECDLGCREATEPARAM *createParam = (SECDLGCREATEPARAM*)param; if (NULL == createParam) return 0; SECDLG *psd = (SECDLG*)calloc(1, sizeof(SECDLG)); if (NULL != psd) { if (!SetPropW(hwnd, SECDLG_PROP, psd)) { free(psd); psd = NULL; } } HMENU hMenu = GetSystemMenu(hwnd, FALSE); if (NULL != hMenu) { EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND|MF_DISABLED); DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND); DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND); } SecurityPrompt_LoadIcon(hwnd, NULL, MAKEINTRESOURCEW(OIC_WARNING)); WCHAR szBuffer[4096] = {0}; LPCWSTR pszText; HWND hControl; SecurityPrompt_CalculateMinMax(hwnd, createParam->hCenter); if (NULL != (pszText = createParam->pszCaption) && IS_INTRESOURCE(pszText)) pszText = getStringW((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer)); if (NULL != pszText && L'\0' != *pszText) SetWindowTextW(hwnd, pszText); if (NULL != (hControl = GetDlgItem(hwnd, IDC_TITLE))) { if (NULL != (pszText = createParam->pszTitle) && IS_INTRESOURCE(pszText)) pszText = getStringW((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer)); HFONT hf = SecurityPrompt_GetTitleFont(hwnd); if (NULL != hf) SendMessageW(hControl, WM_SETFONT, (WPARAM)hf, 0L); SetWindowTextW(hControl, pszText); ShowWindow(hControl, (NULL != pszText && L'\0' != *pszText) ? SW_SHOWNA : SW_HIDE); } if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGE))) { if (NULL != (pszText = createParam->pszMessage) && IS_INTRESOURCE(pszText)) pszText = getStringW((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer)); SetWindowTextW(hControl, pszText); ShowWindow(hControl, (NULL != pszText && L'\0' != *pszText) ? SW_SHOWNA : SW_HIDE); } getStringW(IDS_CLICKHERE, szBuffer, ARRAYSIZE(szBuffer)); HWND hLink = CreateWindowExW(WS_EX_NOPARENTNOTIFY, NWC_COMMANDLINKW, szBuffer, WS_VISIBLE | WS_CHILD | WS_TABSTOP | /*CLS_HOTTRACK | */CLS_DEFAULTCOLORS | CLS_ALWAYSUNDERLINE, 0, 0, 0, 0, hwnd, (HMENU)IDC_HELPLINK, hMainInstance, NULL); if (NULL != hLink) { if (NULL != (hControl = GetDlgItem(hwnd, IDC_APPLYTOALL))) SetWindowPos(hLink, hControl, 0, 0, 0, 0, SWP_NOACTIVATE |SWP_NOSIZE | SWP_NOMOVE); SendMessageW(hLink, WM_SETFONT, (WPARAM)SendMessageW(hwnd, WM_GETFONT, 0, 0L), 0L); } CheckDlgButton(hwnd, IDC_APPLYTOALL, (0 != (JSAPI2::svc_apicreator::AUTHORIZATION_FLAG_ALWAYS_FOR_SERVICE &createParam->flags)) ? BST_CHECKED : BST_UNCHECKED); SecurityPrompt_UpdateLayout(hwnd, FALSE); SecurityPrompt_CenterDialog(hwnd, createParam->hCenter); SendMessageW(hwnd, DM_REPOSITION, 0, 0L); DWORD dialogThread = GetWindowThreadProcessId(hwnd, NULL); DWORD parentThread = GetWindowThreadProcessId(GetParent(hwnd), NULL); if (dialogThread != parentThread) { AttachThreadInput(parentThread, dialogThread, TRUE); SetForegroundWindow(hwnd); } if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_DENY)) && WS_VISIBLE == ((WS_VISIBLE | WS_DISABLED) & GetWindowLongPtrW(hControl, GWL_STYLE)) && PostMessageW(hwnd, WM_NEXTDLGCTL, (WPARAM)hControl, TRUE)) { return TRUE; } return FALSE; } static void SecurityPrompt_OnDestroy(HWND hwnd) { SECDLG *psd = GetDialog(hwnd); RemovePropW(hwnd, SECDLG_PROP); DWORD dialogThread = GetWindowThreadProcessId(hwnd, NULL); DWORD parentThread = GetWindowThreadProcessId(GetParent(hwnd), NULL); if (dialogThread != parentThread) { AttachThreadInput(parentThread, dialogThread, FALSE); } if (NULL == psd) return; if (NULL != psd->titleFont) DeleteObject(psd->titleFont); free(psd); } static void SecurityPrompt_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND hControl) { switch(commandId) { case IDC_BUTTON_ALLOW: case IDC_BUTTON_DENY: if(BN_CLICKED == eventId) { INT_PTR result = (IDC_BUTTON_ALLOW == commandId) ? JSAPI2::svc_apicreator::AUTHORIZATION_ALLOW : JSAPI2::svc_apicreator::AUTHORIZATION_DENY; result |= (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_APPLYTOALL)) ? JSAPI2::svc_apicreator::AUTHORIZATION_FLAG_ALWAYS_FOR_SERVICE : JSAPI2::svc_apicreator::AUTHORIZATION_FLAG_ALWAYS; EndDialog(hwnd, result); } break; } } static LRESULT SecurityPrompt_OnNotify(HWND hwnd, INT controlId, NMHDR *pnmh) { switch(controlId) { case IDC_HELPLINK: if (NM_CLICK == pnmh->code) SecurityPrompt_ShowHelp(hwnd); return TRUE; } return 0; } static INT_PTR CALLBACK SecurityPrompt_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: return SecurityPrompt_OnInitDialog(hwnd, (HWND)wParam, lParam); case WM_DESTROY: SecurityPrompt_OnDestroy(hwnd); break; case WM_COMMAND: SecurityPrompt_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; case WM_NOTIFY: MSGRESULT(hwnd, SecurityPrompt_OnNotify(hwnd, (INT)wParam, (NMHDR*)lParam)); } return 0; }