in src/native/windows/apps/prunsrv/prunsrv.c [551:631]
static BOOL loadConfiguration(LPAPXCMDLINE lpCmdline)
{
APXHANDLE hRegistry;
int i = 0;
if (!lpCmdline->szApplication) {
/* Handle empty service names */
apxLogWrite(APXLOG_MARK_WARN "No service name provided.");
return FALSE;
}
SetLastError(ERROR_SUCCESS);
hRegistry = apxCreateRegistryW(gPool, KEY_READ | KREG_WOW6432,
PRG_REGROOT,
lpCmdline->szApplication,
APXREG_SOFTWARE | APXREG_SERVICE);
if (IS_INVALID_HANDLE(hRegistry)) {
if (GetLastError() == ERROR_FILE_NOT_FOUND)
apxLogWrite(APXLOG_MARK_WARN "The system cannot find the Registry key for service '%S'.",
lpCmdline->szApplication);
else
apxLogWrite(APXLOG_MARK_SYSERR);
return FALSE;
}
/* browse through options */
while (_options[i].szName) {
DWORD dwFrom;
dwFrom = (_options[i].dwType & APXCMDOPT_REG) ? APXREG_PARAMSOFTWARE : APXREG_SERVICE;
if (!(_options[i].dwType & APXCMDOPT_FOUND)) {
if (_options[i].dwType & APXCMDOPT_STR) {
_options[i].szValue = apxRegistryGetStringW(hRegistry,
dwFrom,
_options[i].szSubkey,
_options[i].szRegistry);
/* Expand environment variables */
if (_options[i].szValue && (_options[i].dwType & APXCMDOPT_STE)) {
LPWSTR exp = apxExpandStrW(gPool, _options[i].szValue);
if (exp != _options[i].szValue)
apxFree(_options[i].szValue);
_options[i].szValue = exp;
}
}
else if (_options[i].dwType & APXCMDOPT_INT) {
_options[i].dwValue = apxRegistryGetNumberW(hRegistry,
dwFrom,
_options[i].szSubkey,
_options[i].szRegistry);
}
else if (_options[i].dwType & APXCMDOPT_MSZ) {
_options[i].szValue = apxRegistryGetMzStrW(hRegistry,
dwFrom,
_options[i].szSubkey,
_options[i].szRegistry,
NULL,
&(_options[i].dwValue));
}
}
/* Merge the command line options with registry */
else if (_options[i].dwType & APXCMDOPT_ADD) {
LPWSTR cv = _options[i].szValue;
LPWSTR ov = NULL;
if (_options[i].dwType & APXCMDOPT_MSZ) {
ov = apxRegistryGetMzStrW(hRegistry, dwFrom,
_options[i].szSubkey,
_options[i].szRegistry,
NULL,
&(_options[i].dwValue));
_options[i].szValue = apxMultiSzCombine(gPool, ov, cv,
&(_options[i].dwValue));
if (ov)
apxFree(ov);
}
}
++i;
}
apxCloseHandle(hRegistry);
#ifdef _DEBUG
dumpCmdline();
#endif
return TRUE;
}