728x90
반응형
HKLM\SYSTEM\CurrentControlSet\Services에 등록된 서비스의 이름 가져오는 방법
본인 서비스의 이름을 가져오고 싶은 경우 MSDN에서는 GetServiceKeyName을 소개하고있다. 이 api는 서비스의 display name을 가지고 key name을 가져오는 기능을 하지만 특정 경우 이름 값을 못하는 상황이 발생한다. 만약 위 레지스트리 경로 밑에 ServiceA, ServiceB 라는 이름의 키가 있고 ImagePath, DisplayName 값의 데이터가 동일하다면 GetServiceKeyName 으로는 ServiceA 뿐만 얻을 수 있다. ServiceB를 얻으려면(ServiceB에 의해 트리거된 프로세스에서) 시스템의 서비스를 나열한 후 프로세스 ID를 비교하는 방법을 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | BOOL GetCurrentServiceKeyName(_Out_ TCHAR* szServiceName) { DWORD dwBufferSize = 0; DWORD dwBytesNeeded = 0; DWORD dwServicesCount = 0; DWORD dwCurrentProcessId = GetCurrentProcessId(); SC_HANDLE hScManager = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT); EnumServicesStatusEx(hScManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, nullptr, dwBufferSize, &dwBytesNeeded, &dwServicesCount, nullptr, nullptr); std::vector<BYTE> buffer(dwBytesNeeded); EnumServicesStatusEx(hScManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, buffer.data(), buffer.size(), &dwBytesNeeded, &dwServicesCount, nullptr, nullptr); LPENUM_SERVICE_STATUS_PROCESS pServices = reinterpret_cast<LPENUM_SERVICE_STATUS_PROCESS>(buffer.data()); for (DWORD i = 0; i < dwServicesCount; i++) { ENUM_SERVICE_STATUS_PROCESS service = pServices[i]; if (service.ServiceStatusProcess.dwProcessId == dwCurrentProcessId) { _stprintf(szServiceName, TEXT("%s"), service.lpServiceName); } } return TRUE; } |
예외처리는 각자 알아서
반응형
'dev > windows' 카테고리의 다른 글
[windows] 외부에서 서비스 제어 못하게 하기 (0) | 2017.05.23 |
---|---|
[windows] DISM을 이용한 SNMP 기능 켜기 (0) | 2017.05.23 |
[windows] 함수 동적 링크하기 (Run-Time Dynamic Linking) (0) | 2017.05.23 |
[windows] 느린 윈도우 빠르게 만들기(애니메이션 효과 제거, 성능 향상) (2) | 2016.05.09 |
[windows] 윈도우에서 프로세스 강제 종료하기 (0) | 2016.03.16 |
댓글