#include <windows.h>
#include <stdio.h>

void SystemGetServices(void)
{
	ENUM_SERVICE_STATUS Services[100];
	DWORD cbBytesNeeded;
	DWORD dwServicesReturned;
	DWORD dwResumeHandle = 0;
	SC_HANDLE hSCManager;
	BOOL bSuccess;
	/* char dpName[256]; */
	DWORD dwPtr;
	
	// サービス制御マネージャを起動する。
	hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hSCManager == NULL) {
		// サービスマネージャが起動できなかった。
		printf("サービスマネージャが起動出来ませんでした。");
	}
	
	while (TRUE) {
		cbBytesNeeded = 0;
		dwServicesReturned = 0;
		
		// サービスの列挙
		bSuccess = EnumServicesStatus(
			hSCManager, // サービス制御マネージャ DBのハンドル
			SERVICE_WIN32, // 列挙するサービスの種類
			SERVICE_STATE_ALL, // 列挙するサービスの状態
			Services, // サービス状態バッファのアドレス
			sizeof(ENUM_SERVICE_STATUS) * 100, // サービス状態バッファのサイズ
			&cbBytesNeeded, // 必要なバイト数を示す変数のアドレス
			&dwServicesReturned, // 返されたバイト数を示す変数のアドレス
			&dwResumeHandle // 次のエントリを示す変数のアドレス
		);
		
		// 列挙したサービスの情報をポインタ配列に格納
		for (dwPtr = 0; dwPtr < dwServicesReturned; ++dwPtr) {
			// 列挙したサービス名の情報の処理
			// ENUM_SERVICE_STATUS構造体(Services配列)の
			// lpServiceNameメンバがサービス名、
			// lpDisplayNameが管理ツールの「サービス」で表示される名称。
			printf("サービス名: %s\n", Services->lpServiceName);
			printf("「サービス」: %s\n", Services->lpDisplayName);
		}
		
		if (!bSuccess) {
			// まだあるか?
			switch (GetLastError()) {
				case ERROR_MORE_DATA:
					continue;
				default:
					CloseServiceHandle(hSCManager);
			}
		} else {
			// 正常終了の場合は、ループから抜ける。
			break;
		}
	}
	CloseServiceHandle(hSCManager);
}

int main(void)
{
	SystemGetServices();
	
	return 0;
}