charon-svc: When running as service, change working directory to executable

Services get executed with system32 as current working directory. This does
not work for us, as we expect paths to be relative to the executable.
This commit is contained in:
Martin Willi
2014-06-04 15:53:09 +02:00
parent 93168c5f1d
commit fc987bea52
+30 -1
View File
@@ -215,6 +215,32 @@ static DWORD service_handler(DWORD dwControl, DWORD dwEventType,
}
}
/**
* Switch the working directory to the executable directory
*/
static bool switch_workingdir()
{
CHAR path[MAX_PATH], *pos;
HMODULE module;
module = GetModuleHandle(NULL);
if (!module)
{
return FALSE;
}
if (!GetModuleFileName(module, path, sizeof(path)))
{
return FALSE;
}
pos = strrchr(path, '\\');
if (!pos)
{
return FALSE;
}
*pos = 0;
return SetCurrentDirectory(path);
}
/**
* Service main routine when running as service
*/
@@ -228,7 +254,10 @@ static void service_main(DWORD dwArgc, LPTSTR *lpszArgv)
handle = RegisterServiceCtrlHandlerEx(SERVICE_NAME, service_handler, NULL);
if (handle)
{
init_and_run(dwArgc, lpszArgv);
if (switch_workingdir())
{
init_and_run(dwArgc, lpszArgv);
}
}
}