[NTOS:IO]
[reactos.git] / reactos / base / applications / mscutils / servman / delete.c
1 /*
2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/mscutils/servman/delete.c
5 * PURPOSE: Delete an existing service
6 * COPYRIGHT: Copyright 2006-2007 Ged Murphy <gedmurphy@reactos.org>
7 *
8 */
9
10 #include "precomp.h"
11
12 static BOOL
13 DoDeleteService(PMAIN_WND_INFO Info,
14 HWND hDlg)
15 {
16 SC_HANDLE hSCManager;
17 SC_HANDLE hSc;
18 BOOL bRet = FALSE;
19
20 hSCManager = OpenSCManager(NULL,
21 NULL,
22 SC_MANAGER_ALL_ACCESS);
23 if (hSCManager)
24 {
25 hSc = OpenService(hSCManager,
26 Info->pCurrentService->lpServiceName,
27 DELETE);
28 if (hSc)
29 {
30 if (DeleteService(hSc))
31 {
32 LPTSTR lpSuccess;
33
34 /* report success to user */
35 if (AllocAndLoadString(&lpSuccess,
36 hInstance,
37 IDS_DELETE_SUCCESS))
38 {
39 DisplayString(lpSuccess);
40
41 LocalFree(lpSuccess);
42 }
43
44 bRet = TRUE;
45 }
46
47 CloseServiceHandle(hSc);
48 }
49
50 CloseServiceHandle(hSCManager);
51 }
52
53 return bRet;
54 }
55
56 INT_PTR CALLBACK
57 DeleteDialogProc(HWND hDlg,
58 UINT message,
59 WPARAM wParam,
60 LPARAM lParam)
61 {
62 PMAIN_WND_INFO Info = NULL;
63 HICON hIcon = NULL;
64
65 /* Get the window context */
66 Info = (PMAIN_WND_INFO)GetWindowLongPtr(hDlg,
67 GWLP_USERDATA);
68 if (Info == NULL && message != WM_INITDIALOG)
69 {
70 return FALSE;
71 }
72
73 switch (message)
74 {
75 case WM_INITDIALOG:
76 {
77 LPTSTR lpDescription;
78
79 Info = (PMAIN_WND_INFO)lParam;
80 if (Info != NULL)
81 {
82 SetWindowLongPtr(hDlg,
83 GWLP_USERDATA,
84 (LONG_PTR)Info);
85
86 hIcon = (HICON)LoadImage(hInstance,
87 MAKEINTRESOURCE(IDI_SM_ICON),
88 IMAGE_ICON,
89 16,
90 16,
91 0);
92 if (hIcon)
93 {
94 SendMessage(hDlg,
95 WM_SETICON,
96 ICON_SMALL,
97 (LPARAM)hIcon);
98 DestroyIcon(hIcon);
99 }
100
101 SendDlgItemMessage(hDlg,
102 IDC_DEL_NAME,
103 WM_SETTEXT,
104 0,
105 (LPARAM)Info->pCurrentService->lpDisplayName);
106
107 lpDescription = GetServiceDescription(Info->pCurrentService->lpServiceName);
108 if (lpDescription)
109 {
110 SendDlgItemMessage(hDlg,
111 IDC_DEL_DESC,
112 WM_SETTEXT,
113 0,
114 (LPARAM)lpDescription);
115 HeapFree(ProcessHeap,
116 0,
117 lpDescription);
118 }
119
120 return TRUE;
121 }
122
123 return FALSE;
124 }
125
126 case WM_COMMAND:
127 {
128 switch (LOWORD(wParam))
129 {
130 case IDOK:
131 {
132 if (DoDeleteService(Info, hDlg))
133 {
134 (void)ListView_DeleteItem(Info->hListView,
135 Info->SelectedItem);
136 UpdateServiceCount(Info);
137 }
138 EndDialog(hDlg,
139 LOWORD(wParam));
140 return TRUE;
141 }
142
143 case IDCANCEL:
144 {
145 EndDialog(hDlg,
146 LOWORD(wParam));
147 return TRUE;
148 }
149 }
150 }
151 }
152
153 return FALSE;
154 }