1 /* 2 * PROJECT: ReactOS Services 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: base/applications/mscutils/servman/propsheet.c 5 * PURPOSE: Property dialog box message handler 6 * COPYRIGHT: Copyright 2006-2017 Ged Murphy <gedmurphy@reactos.org> 7 * 8 */ 9 10 #include "precomp.h" 11 12 unsigned int __stdcall PropSheetThread(void* Param); 13 14 static VOID 15 InitPropSheetPage(PROPSHEETPAGE *psp, 16 PSERVICEPROPSHEET dlgInfo, 17 WORD idDlg, 18 DLGPROC DlgProc) 19 { 20 ZeroMemory(psp, sizeof(PROPSHEETPAGE)); 21 psp->dwSize = sizeof(PROPSHEETPAGE); 22 psp->dwFlags = PSP_DEFAULT; 23 psp->hInstance = hInstance; 24 psp->pszTemplate = MAKEINTRESOURCE(idDlg); 25 psp->pfnDlgProc = DlgProc; 26 psp->lParam = (LPARAM)dlgInfo; 27 } 28 29 VOID 30 OpenPropSheet(PMAIN_WND_INFO Info) 31 { 32 PSERVICEPROPSHEET pServicePropSheet; 33 HANDLE hThread; 34 35 pServicePropSheet = HeapAlloc(ProcessHeap, 36 0, 37 sizeof(*pServicePropSheet)); 38 if (!pServicePropSheet) return; 39 40 /* Set the current service in this calling thread to avoid 41 * it being updated before the thread is up */ 42 pServicePropSheet->pService = Info->pCurrentService; 43 pServicePropSheet->Info = Info; 44 45 hThread = (HANDLE)_beginthreadex(NULL, 0, &PropSheetThread, pServicePropSheet, 0, NULL); 46 if (hThread) 47 { 48 CloseHandle(hThread); 49 } 50 } 51 52 53 unsigned int __stdcall PropSheetThread(void* Param) 54 { 55 PSERVICEPROPSHEET pServicePropSheet; 56 PROPSHEETHEADER psh; 57 PROPSHEETPAGE psp[4]; 58 HWND hDlg = NULL; 59 MSG Msg; 60 61 pServicePropSheet = (PSERVICEPROPSHEET)Param; 62 63 ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); 64 psh.dwSize = sizeof(PROPSHEETHEADER); 65 psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_MODELESS; 66 psh.hwndParent = pServicePropSheet->Info->hMainWnd; 67 psh.hInstance = hInstance; 68 psh.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SM_ICON)); 69 psh.pszCaption = pServicePropSheet->Info->pCurrentService->lpDisplayName; 70 psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); 71 psh.nStartPage = 0; 72 psh.ppsp = psp; 73 74 /* Initialize the tabs */ 75 InitPropSheetPage(&psp[0], pServicePropSheet, IDD_DLG_GENERAL, GeneralPageProc); 76 InitPropSheetPage(&psp[1], pServicePropSheet, IDD_LOGON, LogonPageProc); 77 InitPropSheetPage(&psp[2], pServicePropSheet, IDD_RECOVERY, RecoveryPageProc); 78 InitPropSheetPage(&psp[3], pServicePropSheet, IDD_DLG_DEPEND, DependenciesPageProc); 79 80 hDlg = (HWND)PropertySheetW(&psh); 81 if (hDlg) 82 { 83 /* Pump the message queue */ 84 while (GetMessageW(&Msg, NULL, 0, 0)) 85 { 86 if (!PropSheet_GetCurrentPageHwnd(hDlg)) 87 { 88 /* The user hit the ok / cancel button, pull it down */ 89 EnableWindow(pServicePropSheet->Info->hMainWnd, TRUE); 90 DestroyWindow(hDlg); 91 } 92 93 if (!PropSheet_IsDialogMessage(hDlg, &Msg)) 94 { 95 TranslateMessage(&Msg); 96 DispatchMessageW(&Msg); 97 } 98 } 99 } 100 101 HeapFree(GetProcessHeap(), 0, pServicePropSheet); 102 103 return (hDlg != NULL); 104 } 105 106