1 /*
2  * PROJECT:     ReactOS Services
3  * LICENSE:     GPL - See COPYING in the top level directory
4  * FILE:        base/applications/mscutils/servman/create.c
5  * PURPOSE:     Create a new service
6  * COPYRIGHT:   Copyright 2006-2007 Ged Murphy <gedmurphy@reactos.org>
7  *
8  */
9 
10 #include "precomp.h"
11 
12 typedef struct _CREATE_DATA
13 {
14     HWND hSelf;
15     LPWSTR ServiceName;
16     LPWSTR DisplayName;
17     LPWSTR BinPath;
18     LPWSTR Description;
19     LPWSTR Options;
20 
21 } CREATE_DATA, *PCREATE_DATA;
22 
23 static BOOL bHelpOpen = FALSE;
24 
25 static BOOL
DoCreate(PCREATE_DATA Data)26 DoCreate(PCREATE_DATA Data)
27 {
28     SC_HANDLE hSCManager;
29     SC_HANDLE hSc;
30     BOOL bRet = FALSE;
31 
32     /* open handle to the SCM */
33     hSCManager = OpenSCManagerW(NULL,
34                                 NULL,
35                                 SC_MANAGER_ALL_ACCESS);
36     if (hSCManager)
37     {
38         hSc = CreateServiceW(hSCManager,
39                              Data->ServiceName,
40                              Data->DisplayName,
41                              SERVICE_ALL_ACCESS,
42                              SERVICE_WIN32_OWN_PROCESS,
43                              SERVICE_DEMAND_START,
44                              SERVICE_ERROR_NORMAL,
45                              Data->BinPath,
46                              NULL,
47                              NULL,
48                              NULL,
49                              NULL,
50                              NULL);
51 
52         if (hSc)
53         {
54             LPWSTR lpSuccess;
55 
56             /* Set the service description as CreateService
57                does not do this for us */
58             SetServiceDescription(Data->ServiceName,
59                                   Data->Description);
60 
61             /* report success to user */
62             if (AllocAndLoadString(&lpSuccess,
63                                    hInstance,
64                                    IDS_CREATE_SUCCESS))
65             {
66                 DisplayString(lpSuccess);
67 
68                 LocalFree(lpSuccess);
69             }
70 
71             CloseServiceHandle(hSc);
72             bRet = TRUE;
73         }
74 
75         CloseServiceHandle(hSCManager);
76     }
77 
78     return bRet;
79 }
80 
81 static LPWSTR
GetStringFromDialog(PCREATE_DATA Data,UINT id)82 GetStringFromDialog(PCREATE_DATA Data,
83                     UINT id)
84 {
85     HWND hwnd;
86     LPWSTR lpString = NULL;
87     INT iLen = 0;
88 
89     hwnd = GetDlgItem(Data->hSelf,
90                       id);
91     if (hwnd)
92     {
93         iLen = GetWindowTextLengthW(hwnd);
94         if (iLen)
95         {
96             lpString = (LPWSTR)HeapAlloc(ProcessHeap,
97                                          0,
98                                          (iLen + 1) * sizeof(WCHAR));
99             if (lpString)
100             {
101                 GetWindowTextW(hwnd,
102                                lpString,
103                                iLen + 1);
104             }
105         }
106     }
107 
108     return lpString;
109 }
110 
111 static BOOL
GetDataFromDialog(PCREATE_DATA Data)112 GetDataFromDialog(PCREATE_DATA Data)
113 {
114     BOOL bRet = FALSE;
115 
116     if ((Data->ServiceName = GetStringFromDialog(Data, IDC_CREATE_SERVNAME)))
117     {
118         if ((Data->DisplayName = GetStringFromDialog(Data, IDC_CREATE_DISPNAME)))
119         {
120             if ((Data->BinPath = GetStringFromDialog(Data, IDC_CREATE_PATH)))
121             {
122                 Data->Description = GetStringFromDialog(Data, IDC_CREATE_DESC);
123                 Data->Options = GetStringFromDialog(Data, IDC_CREATE_OPTIONS);
124 
125                 bRet = TRUE;
126             }
127         }
128     }
129 
130     return bRet;
131 }
132 
133 static VOID
FreeMemory(PCREATE_DATA Data)134 FreeMemory(PCREATE_DATA Data)
135 {
136     if (Data->ServiceName != NULL)
137         HeapFree(ProcessHeap,
138                  0,
139                  Data->ServiceName);
140     if (Data->DisplayName != NULL)
141         HeapFree(ProcessHeap,
142                  0,
143                  Data->DisplayName);
144     if (Data->BinPath != NULL)
145         HeapFree(ProcessHeap,
146                  0,
147                  Data->BinPath);
148     if (Data->Description != NULL)
149         HeapFree(ProcessHeap,
150                  0,
151                  Data->Description);
152     if (Data->Options != NULL)
153         HeapFree(ProcessHeap,
154                  0,
155                  Data->Options);
156 
157     HeapFree(ProcessHeap,
158              0,
159              Data);
160 }
161 
162 INT_PTR CALLBACK
CreateHelpDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)163 CreateHelpDialogProc(HWND hDlg,
164                      UINT message,
165                      WPARAM wParam,
166                      LPARAM lParam)
167 {
168     HWND hHelp;
169     HICON hIcon = NULL;
170     WCHAR Buf[1000];
171 
172     switch (message)
173     {
174         case WM_INITDIALOG:
175         {
176             hIcon = (HICON) LoadImageW(hInstance,
177                                        MAKEINTRESOURCE(IDI_SM_ICON),
178                                        IMAGE_ICON,
179                                        16,
180                                        16,
181                                        0);
182 
183             SendMessageW(hDlg,
184                          WM_SETICON,
185                          ICON_SMALL,
186                          (LPARAM)hIcon);
187 
188             hHelp = GetDlgItem(hDlg,
189                                IDC_CREATE_HELP);
190 
191             LoadStringW(hInstance,
192                         IDS_HELP_OPTIONS,
193                         Buf,
194                         sizeof(Buf) / sizeof(WCHAR));
195 
196             SetWindowTextW(hHelp, Buf);
197 
198             return TRUE;
199         }
200 
201         case WM_COMMAND:
202         {
203             if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
204             {
205                 bHelpOpen = FALSE;
206                 DestroyIcon(hIcon);
207                 DestroyWindow(hDlg);
208                 return TRUE;
209             }
210             break;
211         }
212     }
213 
214     return FALSE;
215 }
216 
217 INT_PTR CALLBACK
CreateDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)218 CreateDialogProc(HWND hDlg,
219                  UINT message,
220                  WPARAM wParam,
221                  LPARAM lParam)
222 {
223     HICON hIcon = NULL;
224 
225     switch (message)
226     {
227         case WM_INITDIALOG:
228         {
229             hIcon = (HICON)LoadImage(hInstance,
230                                      MAKEINTRESOURCE(IDI_SM_ICON),
231                                      IMAGE_ICON,
232                                      16,
233                                      16,
234                                      0);
235             if (hIcon)
236             {
237                 SendMessage(hDlg,
238                             WM_SETICON,
239                             ICON_SMALL,
240                             (LPARAM)hIcon);
241                 DestroyIcon(hIcon);
242             }
243 
244             return TRUE;
245         }
246 
247         case WM_COMMAND:
248         {
249             switch (LOWORD(wParam))
250             {
251                 case IDOK:
252                 {
253                     PCREATE_DATA Data;
254 
255                     Data = (PCREATE_DATA)HeapAlloc(ProcessHeap,
256                                                    HEAP_ZERO_MEMORY,
257                                                    sizeof(CREATE_DATA));
258                     if (Data)
259                     {
260                         Data->hSelf = hDlg;
261 
262                         if (GetDataFromDialog(Data))
263                         {
264                             DoCreate(Data);
265                         }
266                         else
267                         {
268                             /* Something went wrong, leave the dialog
269                              * open so they can try again */
270                             FreeMemory(Data);
271                             break;
272                         }
273 
274                         FreeMemory(Data);
275                     }
276 
277                     EndDialog(hDlg,
278                               LOWORD(wParam));
279                     return TRUE;
280                 }
281 
282                 case IDCANCEL:
283                 {
284                     EndDialog(hDlg,
285                               LOWORD(wParam));
286                     return TRUE;
287                 }
288 
289                 case ID_CREATE_HELP:
290                 {
291                     HWND hHelp;
292 
293                     if (! bHelpOpen)
294                     {
295                         hHelp = CreateDialog(hInstance,
296                                              MAKEINTRESOURCE(IDD_DLG_HELP_OPTIONS),
297                                              hDlg,
298                                              CreateHelpDialogProc);
299                         if(hHelp != NULL)
300                         {
301                             bHelpOpen = TRUE;
302                         }
303                     }
304                 }
305                 break;
306             }
307         }
308     }
309 
310     return FALSE;
311 }
312