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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user