mirror of
https://github.com/reactos/reactos.git
synced 2024-11-07 15:10:53 +00:00
311 lines
8 KiB
C
311 lines
8 KiB
C
/*
|
|
* PROJECT: ReactOS Services
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* FILE: base/applications/mscutils/servman/create.c
|
|
* PURPOSE: Create a new service
|
|
* COPYRIGHT: Copyright 2006-2007 Ged Murphy <gedmurphy@reactos.org>
|
|
*
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
typedef struct _CREATE_DATA
|
|
{
|
|
HWND hSelf;
|
|
LPWSTR ServiceName;
|
|
LPWSTR DisplayName;
|
|
LPWSTR BinPath;
|
|
LPWSTR Description;
|
|
LPWSTR Options;
|
|
|
|
} CREATE_DATA, *PCREATE_DATA;
|
|
|
|
static BOOL bHelpOpen = FALSE;
|
|
|
|
static BOOL
|
|
DoCreate(PCREATE_DATA Data)
|
|
{
|
|
SC_HANDLE hSCManager;
|
|
SC_HANDLE hSc;
|
|
BOOL bRet = FALSE;
|
|
|
|
/* open handle to the SCM */
|
|
hSCManager = OpenSCManagerW(NULL,
|
|
NULL,
|
|
SC_MANAGER_ALL_ACCESS);
|
|
if (hSCManager)
|
|
{
|
|
hSc = CreateServiceW(hSCManager,
|
|
Data->ServiceName,
|
|
Data->DisplayName,
|
|
SERVICE_ALL_ACCESS,
|
|
SERVICE_WIN32_OWN_PROCESS,
|
|
SERVICE_DEMAND_START,
|
|
SERVICE_ERROR_NORMAL,
|
|
Data->BinPath,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (hSc)
|
|
{
|
|
LPWSTR lpSuccess;
|
|
|
|
/* Set the service description as CreateService
|
|
does not do this for us */
|
|
SetServiceDescription(Data->ServiceName,
|
|
Data->Description);
|
|
|
|
/* report success to user */
|
|
if (AllocAndLoadString(&lpSuccess,
|
|
hInstance,
|
|
IDS_CREATE_SUCCESS))
|
|
{
|
|
DisplayString(lpSuccess);
|
|
|
|
LocalFree(lpSuccess);
|
|
}
|
|
|
|
CloseServiceHandle(hSc);
|
|
bRet = TRUE;
|
|
}
|
|
|
|
CloseServiceHandle(hSCManager);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
static LPWSTR
|
|
GetStringFromDialog(PCREATE_DATA Data,
|
|
UINT id)
|
|
{
|
|
HWND hwnd;
|
|
LPWSTR lpString = NULL;
|
|
INT iLen = 0;
|
|
|
|
hwnd = GetDlgItem(Data->hSelf,
|
|
id);
|
|
if (hwnd)
|
|
{
|
|
iLen = GetWindowTextLengthW(hwnd);
|
|
if (iLen)
|
|
{
|
|
lpString = (LPWSTR)HeapAlloc(ProcessHeap,
|
|
0,
|
|
(iLen + 1) * sizeof(WCHAR));
|
|
if (lpString)
|
|
{
|
|
GetWindowTextW(hwnd,
|
|
lpString,
|
|
iLen + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
return lpString;
|
|
}
|
|
|
|
static BOOL
|
|
GetDataFromDialog(PCREATE_DATA Data)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
if ((Data->ServiceName = GetStringFromDialog(Data, IDC_CREATE_SERVNAME)))
|
|
{
|
|
if ((Data->DisplayName = GetStringFromDialog(Data, IDC_CREATE_DISPNAME)))
|
|
{
|
|
if ((Data->BinPath = GetStringFromDialog(Data, IDC_CREATE_PATH)))
|
|
{
|
|
Data->Description = GetStringFromDialog(Data, IDC_CREATE_DESC);
|
|
Data->Options = GetStringFromDialog(Data, IDC_CREATE_OPTIONS);
|
|
|
|
bRet = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
static VOID
|
|
FreeMemory(PCREATE_DATA Data)
|
|
{
|
|
if (Data->ServiceName != NULL)
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
Data->ServiceName);
|
|
if (Data->DisplayName != NULL)
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
Data->DisplayName);
|
|
if (Data->BinPath != NULL)
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
Data->BinPath);
|
|
if (Data->Description != NULL)
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
Data->Description);
|
|
if (Data->Options != NULL)
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
Data->Options);
|
|
|
|
HeapFree(ProcessHeap,
|
|
0,
|
|
Data);
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
CreateHelpDialogProc(HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
HWND hHelp;
|
|
HICON hIcon = NULL;
|
|
WCHAR Buf[1000];
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
hIcon = (HICON) LoadImageW(hInstance,
|
|
MAKEINTRESOURCE(IDI_SM_ICON),
|
|
IMAGE_ICON,
|
|
16,
|
|
16,
|
|
0);
|
|
|
|
SendMessageW(hDlg,
|
|
WM_SETICON,
|
|
ICON_SMALL,
|
|
(LPARAM)hIcon);
|
|
|
|
hHelp = GetDlgItem(hDlg,
|
|
IDC_CREATE_HELP);
|
|
|
|
LoadStringW(hInstance,
|
|
IDS_HELP_OPTIONS,
|
|
Buf,
|
|
sizeof(Buf) / sizeof(WCHAR));
|
|
|
|
SetWindowTextW(hHelp, Buf);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
if ((LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL))
|
|
{
|
|
bHelpOpen = FALSE;
|
|
DestroyIcon(hIcon);
|
|
DestroyWindow(hDlg);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
CreateDialogProc(HWND hDlg,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
HICON hIcon = NULL;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
hIcon = (HICON)LoadImage(hInstance,
|
|
MAKEINTRESOURCE(IDI_SM_ICON),
|
|
IMAGE_ICON,
|
|
16,
|
|
16,
|
|
0);
|
|
if (hIcon)
|
|
{
|
|
SendMessage(hDlg,
|
|
WM_SETICON,
|
|
ICON_SMALL,
|
|
(LPARAM)hIcon);
|
|
DestroyIcon(hIcon);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
{
|
|
PCREATE_DATA Data;
|
|
|
|
Data = (PCREATE_DATA)HeapAlloc(ProcessHeap,
|
|
HEAP_ZERO_MEMORY,
|
|
sizeof(CREATE_DATA));
|
|
if (Data)
|
|
{
|
|
Data->hSelf = hDlg;
|
|
|
|
if (GetDataFromDialog(Data))
|
|
{
|
|
DoCreate(Data);
|
|
}
|
|
else
|
|
{
|
|
/* Something went wrong, leave the dialog
|
|
* open so they can try again */
|
|
FreeMemory(Data);
|
|
break;
|
|
}
|
|
|
|
FreeMemory(Data);
|
|
}
|
|
|
|
EndDialog(hDlg,
|
|
LOWORD(wParam));
|
|
return TRUE;
|
|
}
|
|
|
|
case IDCANCEL:
|
|
{
|
|
EndDialog(hDlg,
|
|
LOWORD(wParam));
|
|
return TRUE;
|
|
}
|
|
|
|
case ID_CREATE_HELP:
|
|
{
|
|
HWND hHelp;
|
|
|
|
if (! bHelpOpen)
|
|
{
|
|
hHelp = CreateDialog(hInstance,
|
|
MAKEINTRESOURCE(IDD_DLG_HELP_OPTIONS),
|
|
hDlg,
|
|
CreateHelpDialogProc);
|
|
if(hHelp != NULL)
|
|
{
|
|
bHelpOpen = TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|