2 * PROJECT: ReactOS Services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/sc/misc.c
5 * PURPOSE: Various functions
6 * COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
7 * Roel Messiant <roelmessiant@gmail.com>
18 static const OPTION_INFO TypeOpts
[] =
20 { _T("own"), SERVICE_WIN32_OWN_PROCESS
},
21 { _T("share"), SERVICE_WIN32_SHARE_PROCESS
},
22 { _T("interact"), SERVICE_INTERACTIVE_PROCESS
},
23 { _T("kernel"), SERVICE_KERNEL_DRIVER
},
24 { _T("filesys"), SERVICE_FILE_SYSTEM_DRIVER
},
25 { _T("rec"), SERVICE_RECOGNIZER_DRIVER
}
28 static const OPTION_INFO StartOpts
[] =
30 { _T("boot"), SERVICE_BOOT_START
},
31 { _T("system"), SERVICE_SYSTEM_START
},
32 { _T("auto"), SERVICE_AUTO_START
},
33 { _T("demand"), SERVICE_DEMAND_START
},
34 { _T("disabled"), SERVICE_DISABLED
}
37 static const OPTION_INFO ErrorOpts
[] =
39 { _T("normal"), SERVICE_ERROR_NORMAL
},
40 { _T("severe"), SERVICE_ERROR_SEVERE
},
41 { _T("critical"), SERVICE_ERROR_CRITICAL
},
42 { _T("ignore"), SERVICE_ERROR_IGNORE
}
45 static const OPTION_INFO TagOpts
[] =
53 ParseCreateConfigArguments(
57 OUT LPSERVICE_CREATE_INFO lpServiceInfo
)
64 ZeroMemory(lpServiceInfo
, sizeof(SERVICE_CREATE_INFO
));
68 lpServiceInfo
->dwServiceType
= SERVICE_NO_CHANGE
;
69 lpServiceInfo
->dwStartType
= SERVICE_NO_CHANGE
;
70 lpServiceInfo
->dwErrorControl
= SERVICE_NO_CHANGE
;
73 lpServiceInfo
->lpServiceName
= ServiceArgs
[0];
79 if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("type=")))
81 for (i
= 0; i
< sizeof(TypeOpts
) / sizeof(TypeOpts
[0]); i
++)
82 if (!lstrcmpi(ServiceArgs
[ArgIndex
+ 1], TypeOpts
[i
].lpOption
))
84 if (lpServiceInfo
->dwServiceType
== SERVICE_NO_CHANGE
)
85 lpServiceInfo
->dwServiceType
= TypeOpts
[i
].dwValue
;
87 lpServiceInfo
->dwServiceType
|= TypeOpts
[i
].dwValue
;
91 if (i
== sizeof(TypeOpts
) / sizeof(TypeOpts
[0]))
94 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("start=")))
96 for (i
= 0; i
< sizeof(StartOpts
) / sizeof(StartOpts
[0]); i
++)
97 if (!lstrcmpi(ServiceArgs
[ArgIndex
+ 1], StartOpts
[i
].lpOption
))
99 lpServiceInfo
->dwStartType
= StartOpts
[i
].dwValue
;
103 if (i
== sizeof(StartOpts
) / sizeof(StartOpts
[0]))
106 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("error=")))
108 for (i
= 0; i
< sizeof(ErrorOpts
) / sizeof(ErrorOpts
[0]); i
++)
109 if (!lstrcmpi(ServiceArgs
[ArgIndex
+ 1], ErrorOpts
[i
].lpOption
))
111 lpServiceInfo
->dwErrorControl
= ErrorOpts
[i
].dwValue
;
115 if (i
== sizeof(ErrorOpts
) / sizeof(ErrorOpts
[0]))
118 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("tag=")))
120 for (i
= 0; i
< sizeof(TagOpts
) / sizeof(TagOpts
[0]); i
++)
121 if (!lstrcmpi(ServiceArgs
[ArgIndex
+ 1], TagOpts
[i
].lpOption
))
123 lpServiceInfo
->bTagId
= TagOpts
[i
].dwValue
;
127 if (i
== sizeof(TagOpts
) / sizeof(TagOpts
[0]))
130 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("binpath=")))
132 lpServiceInfo
->lpBinaryPathName
= ServiceArgs
[ArgIndex
+ 1];
134 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("group=")))
136 lpServiceInfo
->lpLoadOrderGroup
= ServiceArgs
[ArgIndex
+ 1];
138 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("depend=")))
140 lpServiceInfo
->lpDependencies
= ServiceArgs
[ArgIndex
+ 1];
142 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("obj=")))
144 lpServiceInfo
->lpServiceStartName
= ServiceArgs
[ArgIndex
+ 1];
146 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("displayname=")))
148 lpServiceInfo
->lpDisplayName
= ServiceArgs
[ArgIndex
+ 1];
150 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("password=")))
152 lpServiceInfo
->lpPassword
= ServiceArgs
[ArgIndex
+ 1];
159 return (ArgCount
== 0);
164 ParseFailureArguments(
165 IN LPCTSTR
*ServiceArgs
,
167 OUT LPCTSTR
*ppServiceName
,
168 OUT LPSERVICE_FAILURE_ACTIONS pFailureActions
)
170 INT
/*i,*/ ArgIndex
= 1;
171 LPCTSTR lpActions
= NULL
;
172 LPCTSTR lpReset
= NULL
;
177 ZeroMemory(pFailureActions
, sizeof(SERVICE_FAILURE_ACTIONS
));
179 *ppServiceName
= ServiceArgs
[0];
185 if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("actions=")))
187 lpActions
= (LPTSTR
)ServiceArgs
[ArgIndex
+ 1];
189 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("command=")))
191 pFailureActions
->lpCommand
= (LPTSTR
)ServiceArgs
[ArgIndex
+ 1];
193 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("reboot=")))
195 pFailureActions
->lpRebootMsg
= (LPTSTR
)ServiceArgs
[ArgIndex
+ 1];
197 else if (!lstrcmpi(ServiceArgs
[ArgIndex
], _T("reset=")))
199 lpReset
= (LPTSTR
)ServiceArgs
[ArgIndex
+ 1];
206 if ((lpReset
== NULL
&& lpActions
!= NULL
) ||
207 (lpReset
!= NULL
&& lpActions
== NULL
))
209 _tprintf(_T("ERROR: The reset and actions options must be used simultaneously.\n\n"));
215 if (!lstrcmpi(lpReset
, _T("infinite")))
216 pFailureActions
->dwResetPeriod
= INFINITE
;
218 pFailureActions
->dwResetPeriod
= _ttoi(lpReset
);
221 if (lpActions
!= NULL
)
226 return (ArgCount
== 0);