スポンサーリンク
ホーム»Qt逆引きマニュアル»Windows関連» Qt:Windows サービスのファイルパスからサービス名を取得

Qt:Windows サービスのファイルパスからサービス名を取得

当サイトは、アフィリエイト広告を利用しています

あまり用途がないかもしれません。
Windows サービスのファイルパスからサービス名を取得するコードです。

環境:QT5.5

インクルードファイル

1
#include <windows.h>

コード

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
    // ファイルパスからサービス名を取得する
 
    // ローカルコンピュータ上のサービス制御マネージャに接続
    SC_HANDLE   schSCManager;
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if ( NULL == schSCManager ) {
	qDebug().noquote() << "error:" << GetLastError();
        return false;
    }
 
    // ドライバーサービスの一覧を取得する
    LPENUM_SERVICE_STATUS lss;
    DWORD dwBytesNeeded, dwServiceCnt, cbBufSize;
    if ( !EnumServicesStatus(schSCManager,
                            SERVICE_DRIVER,
                            SERVICE_STATE_ALL,
                            NULL,
                            0,
                            &dwBytesNeeded,
                            &dwServiceCnt,
                            0) ) {
        dwRet = GetLastError();
        // Error
        if ( ERROR_MORE_DATA != dwRet ) {
	    qDebug().noquote() << "error:" << GetLastError();
            CloseServiceHandle(schSCManager);
            return false;
        }
    }
 
    // 必要な領域を確保する
    lss = (LPENUM_SERVICE_STATUS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded);
    if ( NULL == lss ) {
        CloseServiceHandle(schSCManager);
        return false;
    }
 
    cbBufSize = dwBytesNeeded;
 
    // ドライバーサービス一覧を取得する
    if ( !EnumServicesStatus(schSCManager,
                            SERVICE_DRIVER,
                            SERVICE_STATE_ALL,
                            lss,
                            cbBufSize,
                            &dwBytesNeeded,
                            &dwServiceCnt,
                            0) ) {     
	qDebug().noquote() << "error:" << GetLastError();     
        HeapFree(GetProcessHeap(), 0, lss);
        CloseServiceHandle(schSCManager);
        return false;
    }
 
    // サービス名からファイルパスを抽出、該当サービスを探す
    QString strFilePath = "C:/Program Files/test/test.exe"); // 探す対象サービスのファイル絶対パス
    QString strSrvName;
    QString strSrvFilePath;
    SC_HANDLE schService;
    for ( DWORD i=0; i<dwServiceCnt; i++ ) {
 
        // サービスを開く
        schService = OpenService(schSCManager, lss[i].lpServiceName, SERVICE_ALL_ACCESS);
        if ( NULL == schService )
        {
	    qDebug().noquote() << "error:" << GetLastError();
            HeapFree(GetProcessHeap(), 0, lss);
            CloseServiceHandle(schSCManager);
            return false;
        }
 
        // サービスの詳細情報を取得
        if ( !getSrvConfig(schService, 0, &strSrvFilePath) ) {
            HeapFree(GetProcessHeap(), 0, lss);
            CloseServiceHandle(schService);
            CloseServiceHandle(schSCManager);
            return false;
        }
 
        // ファイルパスが一致した場合は処理を終了
        if ( strSrvFilePath.compare(strSrvFile, Qt::CaseInsensitive) == 0 ) {
            strSrvName = QString::fromWCharArray(lss[i].lpServiceName);
            CloseServiceHandle(schService);
            break;
        }
 
        CloseServiceHandle(schService);
    }
 
    HeapFree(GetProcessHeap(), 0, lss);
    CloseServiceHandle(schSCManager);
}
 
 
//===========================================================
//	サービスの構成情報を取得 ※エラー処理省略してますので適時追加して下さい
//===========================================================
bool classA::getSrvConfig(SC_HANDLE hService, DWORD *dwStartType, QString *strFilePath) {
 
    DWORD   dwBytesNeeded=0, cbBufSize=0;
    DWORD   dwRet;
    LPQUERY_SERVICE_CONFIG lpsc;
 
    // 必要な領域の情報を取得
    if ( !QueryServiceConfig(hService,NULL,0,&dwBytesNeeded) ) {
        dwRet = GetLastError();
        // Error
        if ( ERROR_INSUFFICIENT_BUFFER != dwRet ) {
            return false;
        }
    }
 
    // 領域を確保
    lpsc = (LPQUERY_SERVICE_CONFIG)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, dwBytesNeeded);
    if ( NULL == lpsc  ) {
        return false;
    }
 
    cbBufSize = dwBytesNeeded;
 
    // サービス構成情報を取得
    if ( !QueryServiceConfig(hService,lpsc,cbBufSize,&dwBytesNeeded) ) {
        HeapFree(GetProcessHeap(), 0, lpsc);
        return false;
    }
 
    // Start Type を取得
    if ( dwStartType != 0 ) {
        *dwStartType = lpsc->dwStartType;
    }
 
    // File Path
    if ( strFilePath != NULL ) {
        *strFilePath = QString::fromWCharArray(lpsc->lpBinaryPathName);
    }
 
    HeapFree(GetProcessHeap(), 0, lpsc);
 
    return true;
}

コメント

タイトルとURLをコピーしました