Win32API システム情報を取得する GetSystemInfo

システム情報を取得するには、GetSystemInfo関数を用いる。

GetSystemInfoのプロトタイプ

VOID GetSystemInfo(
  LPSYSTEM_INFO lpSystemInfo  // システム情報
);


SYSTEM_INFO構造体の定義(winbase.h)

typedef struct _SYSTEM_INFO {
    union {
        DWORD dwOemId;          // Obsolete field...do not use
        struct {
            WORD wProcessorArchitecture;
            WORD wReserved;
        };
    };
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD_PTR dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;


使用例

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

const char *GetProcessorTypeAsString(DWORD dwProcessorType)
{
	switch (dwProcessorType) {
		case PROCESSOR_INTEL_386:
			return "PROCESSOR_INTEL_386";

		case PROCESSOR_INTEL_486:
			return "PROCESSOR_INTEL_486";

		case PROCESSOR_INTEL_PENTIUM:
			return "PROCESSOR_INTEL_PENTIUM";

		case PROCESSOR_INTEL_IA64:
			return "PROCESSOR_INTEL_IA64";

		case PROCESSOR_AMD_X8664:
			return "PROCESSOR_AMD_X8664";

		case PROCESSOR_MIPS_R4000:// incl R4101 & R3910 for Windows CE
			return "PROCESSOR_MIPS_R4000";

		case PROCESSOR_ALPHA_21064:
			return "PROCESSOR_ALPHA_21064";
			
		case PROCESSOR_PPC_601:
			return "PROCESSOR_PPC_601";
			
		case PROCESSOR_PPC_603:
			return "PROCESSOR_PPC_603";

		case PROCESSOR_PPC_604:
			return "PROCESSOR_PPC_604";

		case PROCESSOR_PPC_620:
			return "PROCESSOR_PPC_620";

		case PROCESSOR_HITACHI_SH3:   // Windows CE
			return "PROCESSOR_HITACHI_SH3";

		case PROCESSOR_HITACHI_SH3E:   // Windows CE
			return "PROCESSOR_HITACHI_SH3E";
			
		case PROCESSOR_HITACHI_SH4: // Windows CE
			return "PROCESSOR_HITACHI_SH4";

		case PROCESSOR_MOTOROLA_821:     // Windows CE
			return "PROCESSOR_MOTOROLA_821";

		case PROCESSOR_SHx_SH3:     // Windows CE
			return "PROCESSOR_SHx_SH3";

		case PROCESSOR_SHx_SH4:     // Windows CE
			return "PROCESSOR_SHx_SH4";

		case PROCESSOR_STRONGARM:    // Windows CE - 0xA11
			return "PROCESSOR_STRONGARM";

		case PROCESSOR_ARM720:    // Windows CE - 0x720
			return "PROCESSOR_ARM720";

		case PROCESSOR_ARM820:    // Windows CE - 0x820
			return "PROCESSOR_ARM820";

		case PROCESSOR_ARM920:    // Windows CE - 0x920
			return "PROCESSOR_ARM920";

		case PROCESSOR_ARM_7TDMI:   // Windows CE
			return "PROCESSOR_ARM_7TDMI";

		case PROCESSOR_OPTIL:  // MSIL
			return "PROCESSOR_OPTIL";

		default:
			return "Unknown";
	}
}

const char *GetProcessorArchitechtureAsString(WORD wProcessorArchitecture)
{
	switch (wProcessorArchitecture) {
		case PROCESSOR_ARCHITECTURE_INTEL:
			return "PROCESSOR_ARCHITECTURE_INTEL";

		case PROCESSOR_ARCHITECTURE_MIPS:
			return "PROCESSOR_ARCHITECTURE_MIPS";

		case PROCESSOR_ARCHITECTURE_ALPHA:
			return "PROCESSOR_ARCHITECTURE_ALPHA";

		case PROCESSOR_ARCHITECTURE_PPC:
			return "PROCESSOR_ARCHITECTURE_PPC";

		case PROCESSOR_ARCHITECTURE_SHX:
			return "PROCESSOR_ARCHITECTURE_SHX";

		case PROCESSOR_ARCHITECTURE_ARM:
			return "PROCESSOR_ARCHITECTURE_ARM";

		case PROCESSOR_ARCHITECTURE_IA64:
			return "PROCESSOR_ARCHITECTURE_IA64";

		case PROCESSOR_ARCHITECTURE_ALPHA64:
			return "PROCESSOR_ARCHITECTURE_ALPHA64"; 

		case PROCESSOR_ARCHITECTURE_MSIL:
			return "PROCESSOR_ARCHITECTURE_MSIL";

		case PROCESSOR_ARCHITECTURE_AMD64:
			return "PROCESSOR_ARCHITECTURE_AMD64";

		case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
			return "PROCESSOR_ARCHITECTURE_IA32_ON_WIN64";

		case PROCESSOR_ARCHITECTURE_UNKNOWN:
			return "PROCESSOR_ARCHITECTURE_UNKNOWN";

		default:
			return "Unknown";
		
	}
}

const char *GetProcessorLevelAsString(WORD wProcessorArchitecture, 
                                      WORD wProcessorLevel)
{
	if (wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {

		switch (wProcessorLevel) {
			case 3:
			    return "80386";

			case 4:
			    return "i486";

			case 5:
			    return "Pentium";

			case 6:
			    return "Intel Pentium Pro, II, III or 4";

			default:
			    return "Unknown";
		}

	} else if (wProcessorArchitecture == PROCESSOR_ARCHITECTURE_MIPS) {
		
		if (wProcessorLevel & 0x0004) {
			return "MIPS R4000";
		} else {
			return "Unknown";
		}

	} else if (wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA) {
		
		switch (wProcessorLevel) {
			case 21064:
			    return "Alpha 21064";

			case 21066:
			    return "Alpha 21066";

			case 21164:
			    return "Alpha 21164";

			default:
			    return "Unknown";
		}

	} else if (wProcessorArchitecture == PROCESSOR_ARCHITECTURE_PPC) {

		switch (wProcessorLevel) {
			case 1:
			    return "PPC 601";

			case 3:
			    return "PPC 603";

			case 4:
			    return "PPC 604";

			case 6:
			    return "PPC 603+";

			case 9:
			    return "PPC 604+";

			case 20:
			    return "PPC 620";

			default:
			    return "Unknown";
		}

	} else {
		return "Unkown";
	}
}

int main()
{
	SYSTEM_INFO systemInfo;
	GetSystemInfo(&systemInfo);

	printf("dwActiveProcessorMask = %u\n", 
		systemInfo.dwActiveProcessorMask);
	
	printf("dwAllocationGranularity = %u\n", 
		systemInfo.dwAllocationGranularity);
	
	printf("dwNumberOfProcessors = %u\n", 
		systemInfo.dwNumberOfProcessors);
	
	printf("dwOemId = %u\n", 
		systemInfo.dwOemId);
	
	printf("dwPageSize = %u\n", 
		systemInfo.dwPageSize);
	
	printf("dwProcessorType = %s\n", 
		GetProcessorTypeAsString(systemInfo.dwProcessorType));
	
	printf("lpMaximumApplicationAddress = %p\n", 
		systemInfo.lpMaximumApplicationAddress);
	
	printf("lpMinimumApplicationAddress = %p\n", 
		systemInfo.lpMinimumApplicationAddress);
	
	printf("wProcessorArchitecture = %s\n", 
		GetProcessorArchitechtureAsString(systemInfo.wProcessorArchitecture));
	
	printf("wProcessorLevel = %s\n", 
		GetProcessorLevelAsString(
			systemInfo.wProcessorArchitecture,
			systemInfo.wProcessorLevel));
	
	printf("wProcessorRevision = %u\n", 
		systemInfo.wProcessorRevision);

	return 0;
}


参考
http://msdn.microsoft.com/ja-jp/library/cc429808.aspx