/* * システム情報取得 * * ==== 著作権表示はじめ ==== * Copyright (c) 1998 Yutani Miki. * All rights reserved. * * このコードの著作権は著作者に存在しますが、著作者は以下に列挙した * 事項以外には一切の権利義務を積極的には主張しないことを宣言します。 * (1) このコードを利用したことによるいかなる金銭的および非金銭的な * 損害についても著作者はその責任を負いません。このコードの * 一部または全部の利用は、当該利用者の責任において行ってください。 * (2) このコードの一部または全部を利用または再配布する際には、 * すべての利用者がこの記述 ("==== 著作権表示はじめ ===="の行より * "==== 著作権表示おわり ===="の行まで) を参照できる形式に * してください。 * ==== 著作権表示おわり ==== * * 確認した環境: * Platform: * Windows NT Workstation 4.0 SP3 (Japanese) * Visual C++ 5.0 (English) * Compile: * cl -nologo -W3 -D__STDC__ -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl * -D_X86_ -DWIN32 -D_WIN32 -D_WINNT -D_WINNT32_WINNT=0x400 * -D_WIN95 -D_WIN32_WINDOWS=0x0400 -DJAPAN -DDBCS -DFE_IME * -DWINVER=0x0400 -GX -MD -Z7 -Od -DNDEBUG -D_CONSOLE -D_MBCS * -TC -c -Fo./SysVersion.obj ./SysVersion.c * Link: * link -nologo -nodefaultlib -machine:IX86 * -debug -debugtype:coff -pdb:none -map -subsystem:console,4.0 * -out:./SysVersion.exe * ./SysVersion.obj * msvcrt.lib msvcprt.lib msvcirt.lib * kernel32.lib advapi32.lib user32.lib gdi32.lib * comdlg32.lib winspool.lib */ #include #include /* * IsWindowsNT * * Description: * Windows NTか否かを判定します。オペレーティングシステムの種類を * 判定するだけであればこの方法がもっとも簡単です。 */ BOOL IsWindowsNT() { if (GetVersion() & 0x80000000) return FALSE; else return TRUE; } /* * GetProcessorInformation * * Description: * プロセッサ情報を取得します。 */ void GetProcessorInformation(LPTSTR pProcArchitecture, LPTSTR pProcLevel, LPDWORD pProcCount) { SYSTEM_INFO sys_info; /* * GetSystemInfo API を呼び出してプロセッサ情報を取得します。 */ GetSystemInfo(&sys_info); /* * Windows では Intel 以外のアーキテクチャはすべて無効ですので、 * 混乱を避けるために場合を分けてプロセッサ情報を文字列に変換します。 */ if (IsWindowsNT()) { switch (sys_info.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_INTEL: lstrcpy(pProcArchitecture, TEXT("Intel")); wsprintf(pProcLevel, TEXT("%ld86"), (DWORD)sys_info.wProcessorLevel); break; case PROCESSOR_ARCHITECTURE_MIPS: lstrcpy(pProcArchitecture, TEXT("MIPS")); wsprintf(pProcLevel, TEXT("R%ld000"), (DWORD)(sys_info.wProcessorLevel >> 8)); break; case PROCESSOR_ARCHITECTURE_ALPHA: lstrcpy(pProcArchitecture, TEXT("Alpha")); wsprintf(pProcLevel, TEXT("%ld"), (DWORD)sys_info.wProcessorLevel); break; case PROCESSOR_ARCHITECTURE_PPC: lstrcpy(pProcArchitecture, TEXT("Power PC")); if (sys_info.wProcessorLevel == 6) { wsprintf(pProcLevel, TEXT("603+")); } else if (sys_info.wProcessorLevel == 9) { wsprintf(pProcLevel, TEXT("604+")); } else { wsprintf(pProcLevel, TEXT("6%02d"), (DWORD)sys_info.wProcessorLevel); } break; default: lstrcpy(pProcArchitecture, TEXT("(Unknown Processor)")); lstrcpy(pProcLevel, TEXT("")); } } else { switch (sys_info.dwOemId) { case PROCESSOR_ARCHITECTURE_INTEL: lstrcpy(pProcArchitecture, TEXT("Intel")); wsprintf(pProcLevel, TEXT("%ld86"), (DWORD)sys_info.wProcessorLevel); break; default: lstrcpy(pProcArchitecture, TEXT("(Unknown Processor)")); lstrcpy(pProcLevel, TEXT("")); } } /* * プロセッサの個数を格納します。 */ *pProcCount = sys_info.dwNumberOfProcessors; } /* * GetOperatingSystemInformation * * Description: * オペレーティングシステム情報を取得します。 */ void GetOperatingSystemInformation(LPTSTR pOsType, LPTSTR pOsVersion) { OSVERSIONINFO os_info; /* * GetVersionEx API を呼び出してシステム情報を取得します。 */ os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&os_info); /* * オペレーティングシステムの種類とバージョンを文字列に変換します。 */ switch (os_info.dwPlatformId) { case VER_PLATFORM_WIN32s: lstrcpy(pOsType, TEXT("Win32s")); break; case VER_PLATFORM_WIN32_WINDOWS: lstrcpy(pOsType, TEXT("Windows")); wsprintf(pOsVersion, TEXT("%ld.%ld.%ld %s"), ((LPBYTE)&os_info.dwBuildNumber)[0], ((LPBYTE)&os_info.dwBuildNumber)[1], ((LPWORD)&os_info.dwBuildNumber)[1], os_info.szCSDVersion); break; case VER_PLATFORM_WIN32_NT: lstrcpy(pOsType, TEXT("Windows NT")); wsprintf(pOsVersion, TEXT("%ld.%ld.%ld %s"), os_info.dwMajorVersion, os_info.dwMinorVersion, os_info.dwBuildNumber, os_info.szCSDVersion); break; default: lstrcpy(pOsType, TEXT("(Unknown System)")); lstrcpy(pOsVersion, TEXT("")); } } /* * メインルーチン * * Usage: SysVersion.exe * コンピュータ名を表示します。 * * Example: * C:\>SysVersion.exe * Processor: Intel 686 x 1 * Platform: Windows NT 4.0.1381 Service Pack 3 */ int main() { TCHAR proc_arch[32]; TCHAR proc_level[32]; DWORD proc_count; TCHAR os_type[32]; TCHAR os_version[256]; /* * プロセッサ情報を取得して表示します。 */ GetProcessorInformation(proc_arch, proc_level, &proc_count); fprintf(stderr, TEXT("Processor: %s %s x %ld\n"), proc_arch, proc_level, proc_count); /* * オペレーティングシステム情報を取得して表示します。 */ GetOperatingSystemInformation(os_type, os_version); fprintf(stderr, TEXT("Platform: %s %s\n"), os_type, os_version); return 0; }