|
// *********************************************************
// リストビューにサービス一覧を設定
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxNTService::EnumService( LboxListview *Lview )
{
SC_HANDLE hSCManager;
SC_HANDLE hService;
Lview->Initialize();
Lview->AddColumn( LVCFMT_LEFT, 100, "" );
Lview->AddColumn( LVCFMT_LEFT, 100, "ステータス" );
Lview->AddColumn( LVCFMT_LEFT, 100, "表示名" );
Lview->AddColumn( LVCFMT_LEFT, 100, "サービス名" );
Lview->AddColumn( LVCFMT_LEFT, 100, "プログラムパス" );
Lview->AddColumn( LVCFMT_LEFT, 100, "ログオン" );
Lview->AddColumn( LVCFMT_LEFT, 100, "グループ" );
Lview->AddColumn( LVCFMT_LEFT, 100, "スタートアップ" );
Lview->AddColumn( LVCFMT_LEFT, 100, "タイプ" );
Lview->AddColumn( LVCFMT_LEFT, 100, "エラーコントロール" );
hSCManager = OpenSCManager(
this->lpMachineName,
NULL,
SC_MANAGER_ALL_ACCESS
);
if ( hSCManager == NULL ) {
return false;
}
BOOL bRet;
DWORD nSize;
DWORD nNeed;
DWORD nServiceCount;
DWORD nIdx;
LPENUM_SERVICE_STATUS lss;
DWORD i;
int nCnt;
LPTSTR szBuffer,szData;
nSize = sizeof(ENUM_SERVICE_STATUS)+256*2+10;
szBuffer = new char[nSize];
szData = new char[1024];
nCnt = 0;
nIdx = 0; // サービスの読み出し位置
while( 1 ) {
bRet = EnumServicesStatus(
hSCManager,
SERVICE_WIN32,
SERVICE_STATE_ALL,
(LPENUM_SERVICE_STATUS)szBuffer,
nSize,
&nNeed,
&nServiceCount, // 読み出したエントリ数
&nIdx
);
if ( !bRet ) {
if ( GetLastError() != ERROR_MORE_DATA ) {
break;
}
}
for( i = 0; i < nServiceCount; i++ ) {
nCnt++;
Lview->AddRow();
Lview->SetColumnPrintf( 0, "%d", nCnt );
lss = (LPENUM_SERVICE_STATUS)
(szBuffer+sizeof(ENUM_SERVICE_STATUS)*i);
switch( lss->ServiceStatus.dwCurrentState ) {
case SERVICE_STOPPED:
break;
case SERVICE_START_PENDING:
Lview->SetColumnText( 1, "START_PENDING" );
break;
case SERVICE_STOP_PENDING:
Lview->SetColumnText( 1, "STOP_PENDING" );
break;
case SERVICE_RUNNING:
Lview->SetColumnText( 1, "開始" );
break;
case SERVICE_CONTINUE_PENDING:
Lview->SetColumnText( 1, "CONTINUE_PENDING" );
break;
case SERVICE_PAUSE_PENDING:
Lview->SetColumnText( 1, "PAUSE_PENDING" );
break;
case SERVICE_PAUSED:
Lview->SetColumnText( 1, "一時停止" );
break;
}
Lview->SetColumnText( 2, lss->lpDisplayName );
Lview->SetColumnText( 3, lss->lpServiceName );
hService = OpenService(
hSCManager,
lss->lpServiceName,
SERVICE_ALL_ACCESS
);
if ( hService == NULL ) {
continue;
}
nNeed = 0;
bRet = QueryServiceConfig(
hService,
(LPQUERY_SERVICE_CONFIG)szData,
1,
&nNeed
);
if ( nNeed == 0 ) {
CloseServiceHandle( hService );
continue;
}
LPTSTR szConfig;
szConfig = new char[nNeed+128];
bRet = QueryServiceConfig(
hService,
(LPQUERY_SERVICE_CONFIG)szConfig,
nNeed,
&nNeed
);
if ( !bRet ) {
delete szConfig;
CloseServiceHandle( hService );
continue;
}
LPQUERY_SERVICE_CONFIG lsc;
lsc = (LPQUERY_SERVICE_CONFIG)szConfig;
Lview->SetColumnText( 4, lsc->lpBinaryPathName );
Lview->SetColumnText( 5, lsc->lpServiceStartName );
Lview->SetColumnText( 6, lsc->lpLoadOrderGroup );
switch( lsc->dwStartType ) {
case SERVICE_BOOT_START:
Lview->SetColumnText( 7, "BOOT" );
break;
case SERVICE_SYSTEM_START:
Lview->SetColumnText( 7, "SYSTEM" );
break;
case SERVICE_AUTO_START:
Lview->SetColumnText( 7, "自動" );
break;
case SERVICE_DEMAND_START:
Lview->SetColumnText( 7, "手動" );
break;
case SERVICE_DISABLED:
Lview->SetColumnText( 7, "無効" );
break;
}
switch( lsc->dwServiceType ) {
case SERVICE_WIN32_OWN_PROCESS:
Lview->SetColumnText( 8, "WIN32_OWN" );
break;
case SERVICE_WIN32_SHARE_PROCESS:
Lview->SetColumnText( 8, "WIN32_SHARE" );
break;
case SERVICE_KERNEL_DRIVER:
Lview->SetColumnText( 8, "KERNEL_DRIVER" );
break;
case SERVICE_FILE_SYSTEM_DRIVER:
Lview->SetColumnText( 8, "FILE_SYSTEM_DRIVER" );
break;
case SERVICE_INTERACTIVE_PROCESS:
Lview->SetColumnText( 8, "INTERACTIVE" );
break;
}
switch( lsc->dwErrorControl ) {
case SERVICE_ERROR_IGNORE:
Lview->SetColumnText( 9, "IGNORE" );
break;
case SERVICE_ERROR_NORMAL:
Lview->SetColumnText( 9, "NORMAL" );
break;
case SERVICE_ERROR_SEVERE:
Lview->SetColumnText( 9, "SEVERE" );
break;
case SERVICE_ERROR_CRITICAL:
Lview->SetColumnText( 9, "CRITICAL" );
break;
}
delete szConfig;
CloseServiceHandle( hService );
}
// 0 が返るという事は、読み出すエントリが無いという事
if ( nIdx == 0 ) {
break;
}
}
delete [] szData;
delete [] szBuffer;
CloseServiceHandle( hSCManager );
Lview->Fit();
return true;
}
| |