Getting CPU and Graphics Card

Miscellaneous Forums/Win32 Discussion/Getting CPU and Graphics Card

In order to automate part of technical support, I'd like to dynamically grab the user's CPU and graphics card information.

I tried looking through the reference on MSDN but I'm afraid I am still new to Win32 programming. I could probably get what I need through WMI (e.g. Win32_Processor & Win32_VideoController) if I knew how to access that through BlitzMax.

Any help would be greatly appreciated.

Joe

BlitzMax code which gets CPU info and O/S details too
(not sure if everything here is right though):


Strict
Framework brl.standardio
Import brl.retro


Extern "Win32"
	Function GetSystemInfo%(infoPTR:Byte Ptr)
	Function GetVersionExA%(versioninfoPTR:Byte Ptr)
End Extern


Global osname$="O/S unknown"
Global procname$="Processor unknown"




' Operating System Information


Const PROCESSOR_ARCHITECTURE_ALPHA = 2
Const PROCESSOR_ARCHITECTURE_INTEL = 0
Const PROCESSOR_ARCHITECTURE_MIPS = 1
Const PROCESSOR_ARCHITECTURE_PPC = 3
Const PROCESSOR_ARCHITECTURE_UNKNOWN = $FFFF
Const PROCESSOR_INTEL_386 = 386
Const PROCESSOR_INTEL_486 = 486
Const PROCESSOR_INTEL_PENTIUM = 586
Const PROCESSOR_INTEL_PENTIUM2 = 686
Const PROCESSOR_INTEL_PENTIUM3 = 786
Const PROCESSOR_MIPS_R4000 = 4000
Const VER_PLATFORM_WIN32_NT = 2
Const VER_PLATFORM_WIN32_WINDOWS = 1


Type SystemInfo
	Field wProcessorArchitecture%
	Field wReserved%
	Field dwPageSize%
	Field lpMinimumApplicationAddress%
	Field lpMaximumApplicationAddress%
	Field dwActiveProcessorMask%
	Field dwNumberOfProcessors%
	Field dwProcessorType%
	Field dwAllocationGranularity%
	Field wProcessorLevel%
	Field wProcessorRevision%
End Type

Type OSInfo
	Field OSVersionInfoSize%
	Field MajorVersion%
	Field MinorVersion%
	Field BuildNumber%
	Field PlatformId%
	Field CSDVersion:Byte Ptr ' 128 in length
End Type


Global sys:SystemInfo=New SystemInfo
Global os:OSInfo=New OSInfo
os.OSVersionInfoSize=128+20

GetVersionExA os
GetSystemInfo sys
Local rev=sys.wProcessorRevision


' example
Print "_______________________________________________________"
Print "processor architech: "+sys.wProcessorArchitecture
Print "           reserved: "+sys.wReserved
Print "           pagesize: "+sys.dwPageSize
Print "       min app addr: "+sys.lpMinimumApplicationAddress
Print "       max app addr: "+sys.lpMaximumApplicationAddress
Print "     processor mask: "+sys.dwActiveProcessorMask
Print "     num processors: "+sys.dwNumberOfProcessors
Print "     processor type: "+sys.dwProcessorType
Print "             allocg: "+sys.dwAllocationGranularity
Print "    processor level: "+sys.wProcessorLevel
Print " processor revision: "+sys.wProcessorRevision
Print ""


' operating system information
Print "_______________________________________________________"
Select os.PlatformId
	Case 0 ; osname$="Windows 32s"
	Case VER_PLATFORM_WIN32_WINDOWS
		osname$="Windows 95"
		If os.MinorVersion>=10 osname$="Windows 98"
	Case VER_PLATFORM_WIN32_NT
		osname$="Windows NT "
End Select
Print "Operating System: "+osname$
Print "         Version: "+String(os.MajorVersion)+"."+String(os.MinorVersion)
Print "           Build: "+String(os.BuildNumber)


' system processor details
Print "_______________________________________________________"
Select sys.wProcessorArchitecture
	Case PROCESSOR_ARCHITECTURE_INTEL ' Intel
	Select os.PlatformId
		Case VER_PLATFORM_WIN32_NT
		Select sys.wProcessorLevel
			Case 3
			procname$="Intel 80386"
			If (rev & $FF00) = $FF00
				procname$=procname$ + " Model " + String(((rev & $F0)/$F)-10) + " Stepping " + String((rev & $F))
			Else
				procname$=procname$ + " Stepping " + Chr$(65+(rev & $FF)/$FF) + " Stepping " + String(rev & $FF)
			End If
			Case 4
			procname$="Intel 80486"
			If (rev & $FF00) = $FF00
				procname$=procname$ + " Model " + String(((rev & $F0) / $F) - 10) + " Stepping " + String((rev & $F))
			Else
				procname$=procname$ + " Stepping " + Chr$(Asc("A")) + String((rev & $FF)/$FF) + " Stepping " + String(rev & $FF)
			End If
			Case 5
			procname$ = "Pentium Model " + String((rev & $FF00)/$FF) + " Stepping " + String((rev & $FF))
			Case 6
			procname$ = "Pentium II Model " + String ((rev & $FF00)/$FF) + " Stepping " + String((rev & $FF))
			Case 7
			procname$ = "Pentium III Model " + String ((rev & $FF00)/$FF) + " Stepping " + String((rev & $FF))
		End Select
		Case VER_PLATFORM_WIN32_WINDOWS
		Select sys.dwProcessorType
			Case PROCESSOR_INTEL_386 ; procname$ = "Intel 80386"
			Case PROCESSOR_INTEL_486 ; procname$ = "Intel 80486"
			Case PROCESSOR_INTEL_PENTIUM ; procname$ = "Pentium"
			Case PROCESSOR_INTEL_PENTIUM2 ;	procname$ = "Pentium II"
			Case PROCESSOR_INTEL_PENTIUM3 ;	procname$ = "Pentium III"
		End Select
	End Select
	' MIPS Architecture (only For WinNT)
	Case PROCESSOR_ARCHITECTURE_MIPS
	procname$ = "MIPS R" + sys.wProcessorLevel + "000"
	' ALPHA Architecture (only For WinNT)
	Case PROCESSOR_ARCHITECTURE_ALPHA
	procname$ = "Alpha " + sys.wProcessorLevel + " Model A" + String((rev & $FF00)/$FF) + " Pass " + String(rev & $FF)
	' PPC Architecture (only For WinNT)
	Case PROCESSOR_ARCHITECTURE_PPC
	Select sys.wProcessorLevel
		Case 1, 3, 4, 20
		procname$ = "PPC 6" + Right$("0000000000000000"+String(sys.wProcessorLevel),2)
		Case 6
		procname$ = "PPC 603+"
		Case 9
		procname$ = "PPC 604+"
	End Select
	procname$ = procname$ + " Processor Version " + String((rev & $FF00)/$FF) + "." + String(rev & $FF)
End Select

Print procname$
Print "_______________________________________________________"

End



Thanks! I was originally looking at GetSystemInfo too, but I think some of the fields are mixed up in your code.

Here's my output for a P4, 2.4 GHz:


_______________________________________________________

processor architech: 0
           reserved: 4096
           pagesize: 65536
       min app addr: 2147418111
       max app addr: 1
     processor mask: 1
     num processors: 586
     processor type: 65536
             allocg: 33816591
    processor level: 0
 processor revision: 0

_______________________________________________________

Operating System: Windows NT 

         Version: 5.1
           Build: 2600
_______________________________________________________

Processor unknown
_______________________________________________________


AMD Athlon 2800+:

processor architech: 0
reserved: 4096
pagesize: 65536
min app addr: 2147418111
max app addr: 1
processor mask: 1
num processors: 586
processor type: 65536
allocg: 167772166
processor level: 0
processor revision: 0

_______________________________________________________
Operating System: Windows NT
Version: 5.1
Build: 2600
_______________________________________________________
Processor unknown


(Of course the code doesn't seem to recognize any AMD CPU's)

_______________________________________________________
processor architech: 0
reserved: 4096
pagesize: 65536
min app addr: 2147418111
max app addr: 3
processor mask: 2
num processors: 586
processor type: 65536
allocg: 252313606
processor level: 0
processor revision: 0

_______________________________________________________
Operating System: Windows NT
Version: 6.0
Build: 6000
_______________________________________________________
Processor unknown
_______________________________________________________

Core 2 duo E6750 wit 2GB Ram

Building untitled1
Compiling:untitled1.bmx
flat assembler version 1.66
4 passes, 19574 bytes.
Linking:untitled1.debug.exe
Executing:untitled1.debug.exe
_______________________________________________________
processor architech: 0
reserved: 4096
pagesize: 65536
min app addr: 2147418111
max app addr: 3
processor mask: 2
num processors: 586
processor type: 65536
allocg: 252379142
processor level: 0
processor revision: 0

_______________________________________________________
Operating System: Windows NT
Version: 5.1
Build: 2600
_______________________________________________________
Processor unknown
_______________________________________________________

Process complete

Here's a link to one that I put together a few months ago:

http://www.blitzmax.com/codearcs/codearcs.php?code=2114

It outputs the following info, although the video information only works for ATI adapters...

Number of CPUs/cores: 2
CPU Speed in MHz : 2400
CPU Name String : Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz
CPU Identifier : x86 Family 6 Model 15 Stepping 6
Vendor Identifier : GenuineIntel

ATI Video Adapter : Radeon X1650 Series (0x00000000)
Board Manufacturer : Hightech Information System Ltd. (0x000017af)
ATI Device ID : 7291 (0x00007291)
ATI BIOS Date : 01/01/07 (0x00010107)
ATI Chip ID : RV560 (0x00000171)
ATI 2D Driver : 6.14.10.6641 (0x00000000)
ATI D3D Driver : 6.14.10.440 (0x00000000)
ATI OGL Driver : 6.14.10.6120 (0x00000000)
ATI Bus Type : PCI Express x16 (0x00000010)
ATI Memory Size : 256 MB (0x00000200)
ATI Memory Type : DDR3 (0x00000000)
DirectX Version : 9.0c (0x09000000)