Code archives/Miscellaneous/CPU & Video System Information

This code has been declared by its author to be Public Domain code.

Download source code

CPU & Video System Information by xlsior2007
Win32 only, the appropriate information is read from the Windows Registry.

This will return the CPU make and model, number of cores, speed in MHz.
Will also show information about ATI video adapters: Make/model, manfucaturer, graphic card drivers, memory.

Sample output:

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)
' Registry routines by gman
' keys by xlsior

Framework BRL.StandardIO
Import BRL.Bank
Import BRL.Retro 

Import "-ladvapi32" 
'Private 
Extern "win32" 
   Function RegOpenKey:Int(hKeyParent:Int,SubKey$z,phkResult:Byte Ptr)="RegOpenKeyA@12" 
   Function RegCloseKey:Int(hKey:Int)="RegCloseKey@4" 
   Function RegEnumKey:Int(hKey:Int,idx:Int,Key:Byte Ptr,size:Int)="RegEnumKeyA@16" 
   Function RegEnumValue:Int(hKey:Int,idx:Int,ValueName:Byte Ptr,NameSize:Byte Ptr,Reserved:Int,nType:Byte Ptr,ValueBytes:Byte Ptr,ValueSize:Byte Ptr)="RegEnumValueA@32" 
   Function RegQueryValueEx:Int(hKey:Int,ValueName$z,Reserved:Int,nType:Byte Ptr,ValueBytes:Byte Ptr,ValueSize:Byte Ptr)="RegQueryValueExA@24" 
EndExtern 
'Public 

Const HKEY_CLASSES_ROOT:Int      = -2147483648 
Const HKEY_CURRENT_USER:Int      = -2147483647 
Const HKEY_LOCAL_MACHINE:Int   = -2147483646 
Const HKEY_USERS:Int         = -2147483645 
Const REG_ERROR_SUCCESS:Int    = 0 
Const REG_ERROR_EOF:Int         = 259     ' no more entries in key 
Const REG_SZ:Int            = 1      ' Data String 
Const REG_BINARY:Int         = 3      ' Binary Data in any form. 
Const REG_DWORD:Int            = 4    ' A 32-bit number. 
' Temporary Variables:
temp:Int=0
maxcpu:Int=0


' Cycle through to find how many CPU cores are present in the system:
For temp=0 To 1024
	If reg_iskey(HKEY_LOCAL_MACHINE,"hardware\description\system\centralprocessor\"+temp)=False Then
		maxcpu=temp
		Exit	' We found how many CPU's/Cores are present, so exit the loop
	End If
Next

Print ""
Print "Number of CPUs/cores: "+(maxcpu)
Print "CPU Speed in MHz    : "+reg_getvalue(HKEY_LOCAL_MACHINE,"hardware\description\system\centralprocessor\0\","~~MHz","none",types:Int=True) 
Print "CPU Name String     : "+reg_getvalue(HKEY_LOCAL_MACHINE,"hardware\description\system\centralprocessor\0\","processornamestring","none",types:Int=True) 
Print "CPU Identifier      : "+reg_getvalue(HKEY_LOCAL_MACHINE,"hardware\description\system\centralprocessor\0\","identifier","none",types:Int=True) 
Print "Vendor Identifier   : "+reg_getvalue(HKEY_LOCAL_MACHINE,"hardware\description\system\centralprocessor\0\","vendoridentifier","none",types:Int=True) 
Print ""

If reg_iskey(HKEY_LOCAL_MACHINE,"software\ATI Technologies\CDS\0000\0")=True Then 
	Print "ATI Video Adapter   : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\Driver\","Description","unknown",types:Int=True) 
	Print "Board Manufacturer  : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\ASIC\","Graphics Card Manufacturer","unknown",types:Int=True) 
	Print "ATI Device ID       : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\PCI Config\","Device ID","unknown",types:Int=True) 
	Print "ATI BIOS Date       : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\BIOS\","Date","unknown",types:Int=True) 
	Print "ATI Chip ID         : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\ASIC\","chip ID","unknown",types:Int=True) 
	Print "ATI 2D Driver       : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\Driver\","2D Driver Version","unknown",types:Int=True) 
	Print "ATI D3D Driver      : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\Driver\","D3D Driver Version","unknown",types:Int=True) 
	Print "ATI OGL Driver      : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\Driver\","OGL Driver Version","unknown",types:Int=True) 
	Print "ATI Bus Type        : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\ASIC\","Bus Type","unknown",types:Int=True) 
	Print "ATI Memory Size     : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\Memory\","size","unknown",types:Int=True) 
	Print "ATI Memory Type     : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\0000\0\Memory\","type","unknown",types:Int=True) 
	Print "DirectX Version     : "+reg_getvalue(HKEY_LOCAL_MACHINE,"SOFTWARE\ATI Technologies\CDS\system\0\","directx version","unknown",types:Int=True) 

End If 

Global reg_lasterr:Int      = REG_ERROR_SUCCESS 
Function reg_enumvalues:String(RegKey:Int,SubKey:String,delim:String="|",types:Int=False) 
   Local cRetVal:String="",key:String="",val:String="" 
   Local keybank:TBank=CreateBank(100),keybanksize:TBank=CreateBank(4),valbank:TBank=CreateBank(100),valbanksize:TBank=CreateBank(4),typebank:TBank=CreateBank(4) 
   Local char:Int=0,nIdx:Int=0,nType:Int=0 

   ' open the key 
   Local hKey:Int=reg_openkey(RegKey,SubKey:String) 
   If hKey<>-1    
    
      ' read in the values 
      Repeat 
         ' init the banks 
         PokeInt(typebank,0,0) 
         PokeInt(valbanksize,0,100) 
         PokeInt(keybanksize,0,100) 
      
         ' clear out the temp values 
         key:String="" 
         val:String="" 
          
         If RegEnumValue(hKey,nIdx,BankBuf(keybank),BankBuf(keybanksize),0,BankBuf(typebank),BankBuf(valbank),BankBuf(valbanksize))<>REG_ERROR_EOF 
            nType=PeekInt(typebank,0) 
            
            ' tack on the delimiter 
            If cRetVal:String<>"" 
               cRetVal:String=cRetVal:String+delim:String 
            EndIf 

            ' build the key name 
            For char=0 To PeekInt(keybanksize,0)-1 
               If PeekByte(keybank,char)=0 Then Exit 
               key:String=key:String+Chr(PeekByte(keybank,char)) 
            Next 

            Select nType 
               ' read in a String Or binary value 
               Case REG_SZ, REG_BINARY 
                  ' build the value 
                  For char=0 To PeekInt(valbanksize,0)-1 
                     If PeekByte(valbank,char)=0 Then Exit 
                     val:String=val:String+Chr(PeekByte(valbank,char)) 
                  Next 
               ' read in an integer 
               Case REG_DWORD 
                  val:String=PeekInt(valbank,0)                  
            End Select 

            If types 
               cRetVal:String=(cRetVal:String+PeekInt(typebank,0)+"'"+key:String+"="+val:String) 
            Else 
               cRetVal:String=(cRetVal:String+key:String+"="+val:String) 
            EndIf 
         Else 
            Exit 
         EndIf          
          
         nIdx=nIdx+1 
      Forever 
      reg_closekey(hKey) 
   EndIf 
    
   typebank = Null 
   valbank = Null 
   valbanksize = Null 
   keybank = Null 
   keybanksize = Null 
    
   Return cRetVal:String 
End Function 

Rem 
bbdoc: Enumerates the keys contained in the passed subkey And returns them as a delimited String in the format:<br>KEY|KEY|KEY 
EndRem 
Function reg_enumkeys:String(RegKey:Int,SubKey:String,delim:String="|") 
   Local cRetVal:String="" 
   Local keybank:TBank=CreateBank(100) 
   Local nIdx:Int=0,char:Int 

   ' open the key first    
   Local hKey:Int=reg_openkey(RegKey,SubKey:String) 
   If hKey<>-1    
      Repeat          
         If RegEnumKey(hKey,nIdx,BankBuf(keybank),BankSize(keybank))<>REG_ERROR_EOF          
            ' tack on the delimiter 
            If cRetVal:String<>"" 
               cRetVal:String=cRetVal:String+delim:String 
            EndIf 
            
            For char=0 To BankSize(keybank)-1 
               If PeekByte(keybank,char)=0 Then Exit 
               cRetVal:String=cRetVal:String+Chr(PeekByte(keybank,char)) 
            Next 
         Else 
            Exit 
         EndIf 
          
         nIdx=nIdx+1 
      Forever 
      reg_closekey(hKey) 
   EndIf 

   keybank = Null 
   Return cRetVal:String 
End Function 

Function reg_getvalue:String(RegKey:Int,SubKey:String,ValueName:String,Dflt:String="",types:Int=False) 
   Local cRetVal:String=Dflt:String 
   Local hKey:Int=reg_openkey(RegKey,SubKey:String) 
   Local char:Int=0,nType:Int=0 
    
   ' open the key 
   If hKey<>-1 
      Local valbank:TBank=CreateBank(100),valbanksize:TBank=CreateBank(4),typebank:TBank=CreateBank(4) 
    
      ' init the banks 
      PokeInt(typebank,0,0) 
      PokeInt(valbanksize,0,100) 
    
      Local nRslt:Int=RegQueryValueEx(hKey,ValueName:String,0,BankBuf(typebank),BankBuf(valbank),BankBuf(valbanksize)) 
      If (nRslt=REG_ERROR_SUCCESS) 
         cRetVal:String="" 
      
         nType=PeekInt(typebank,0) 
          
         ' build the value 
         Select nType 
            ' read in a String Or binary value 
            Case REG_SZ, REG_BINARY 
               ' build the value 
               For char=0 To PeekInt(valbanksize,0)-1 
                  If PeekByte(valbank,char)=0 Then Exit 
                  cRetVal:String=cRetVal:String+Chr(PeekByte(valbank,char)) 
               Next 
            ' read in an integer 
            Case REG_DWORD 
               cRetVal:String=PeekInt(valbank,0)                  
         End Select 
          
         ' tack on the Type If requested 
         If types 
            cRetVal:String=nType+"'"+cRetVal:String 
         EndIf 
      Else 
         reg_lasterr=nRslt 
      EndIf 
      reg_closekey(hKey) 
   EndIf 
   Return cRetVal:String 
End Function 

Rem 
bbdoc: Returns the registry handle Or -1 If failed 
EndRem 
Function reg_openkey:Int(RegKey:Int,KeyName:String) 
   reg_lasterr=REG_ERROR_SUCCESS 
   Local regbank:TBank=CreateBank(4) 
   Local hKey:Int=-1 

   Local nRslt:Int=RegOpenKey(RegKey:Int,KeyName:String,BankBuf(regbank)) 

   If (nRslt=REG_ERROR_SUCCESS) 
      hKey=PeekInt(regbank,0) 
   Else 
      reg_lasterr=nRslt 
   EndIf 

   regbank = Null 
   Return hKey 
End Function 

Rem 
bbdoc: Closes the registry key. 
returns: #True / #False 
EndRem 
Function reg_closekey:Int(RegKey:Int) 
   reg_lasterr=REG_ERROR_SUCCESS 
   Local nRslt:Int=RegCloseKey(RegKey) 
    
   If nRslt<>REG_ERROR_SUCCESS 
      reg_lasterr=nRslt 
   EndIf 
    
   Return (nRslt=REG_ERROR_SUCCESS) 
End Function 

Rem 
bbdoc: Returns True If the key exists. 
EndRem 
Function reg_iskey:Int(RegKey:Int,KeyName:String) 
   Local hKey:Int=reg_openkey(RegKey,KeyName:String) 
   Local lRetVal:Int=False 

   If hKey<>-1 
      reg_closekey(hKey) 
      lRetVal=True 
   EndIf 
    
   Return lRetVal 
End Function

Comments

None.

Code Archives Forum