MCPcopy Create free account
hub / github.com/RGAA-Software/GoDesk / GetServiceExecutablePath

Method GetServiceExecutablePath

src/service/service_manager.cpp:417–475  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

415 }
416
417 std::optional<std::string> ServiceManager::GetServiceExecutablePath() {
418 SC_HANDLE hSCManager = nullptr;
419 SC_HANDLE hService = nullptr;
420 QString executablePath;
421
422 std::wstring serv_namew = QString::fromStdString(srv_name_).toStdWString();
423
424 // 打开服务控制管理器
425 hSCManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CONNECT);
426 if (!hSCManager) {
427 LOGE("Failed to open service manager: {}", GetLastError());
428 return {};
429 }
430
431 // 打开指定的服务
432 hService = OpenServiceW(hSCManager, serv_namew.c_str(), SERVICE_QUERY_CONFIG);
433 if (!hService) {
434 LOGE("Failed to open service: {}", GetLastError());
435 CloseServiceHandle(hSCManager);
436 return {};
437 }
438
439 // 查询服务配置以获取二进制路径信息
440 DWORD bytesNeeded = 0;
441 if (!QueryServiceConfigW(hService, nullptr, 0, &bytesNeeded) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
442 LOGE("Failed to query service config (buffer size): {}", GetLastError());
443 CloseServiceHandle(hService);
444 CloseServiceHandle(hSCManager);
445 return {};
446 }
447
448 // 分配缓冲区
449 LPQUERY_SERVICE_CONFIG serviceConfig = (LPQUERY_SERVICE_CONFIG)malloc(bytesNeeded);
450 if (!serviceConfig) {
451 LOGE("Failed to allocate memory for service config.");
452 CloseServiceHandle(hService);
453 CloseServiceHandle(hSCManager);
454 return {};
455 }
456
457 // 再次查询服务配置
458 if (!QueryServiceConfigW(hService, serviceConfig, bytesNeeded, &bytesNeeded)) {
459 LOGE("Failed to query service config: {}", GetLastError());
460 free(serviceConfig);
461 CloseServiceHandle(hService);
462 CloseServiceHandle(hSCManager);
463 return {};
464 }
465
466 // 获取服务的二进制路径
467 executablePath = QString::fromWCharArray(serviceConfig->lpBinaryPathName);
468
469 // 清理资源
470 free(serviceConfig);
471 CloseServiceHandle(hService);
472 CloseServiceHandle(hSCManager);
473
474 return executablePath.toStdString();

Callers 1

CheckServiceAliveMethod · 0.80

Calls

no outgoing calls

Tested by

no test coverage detected