Detecting Windows Version?

BlitzPlus Forums/BlitzPlus Programming/Detecting Windows Version?

Darkuni(Posted 2003) [#1]
You clever API guys have a solution to this, I just know it :)

How can I get Blitz+ to poll the name of the OS (or anything that would allow me to denote what OS the program is running on)?

I basically need to know if the program is being run on Win9x or WinNT kernals (don't ask why - long story).

Anywone help a brutha out?

THANKS!


Darkuni(Posted 2003) [#2]
Doing a little research, I figure out that I can use the API by adding some Kernel32 libs action:

.lib "Kernel32.dll"
GetVersion%():"GetVersion"

Now, if I call that, I get a nice long number, but have NO idea how to get what I need out of that number. Here is the API info I looked at:

http://leb.net/wine/WinDoc/msdn/sdk/platforms/doc/sdk/win32/func/src/f42_7.htm

ZERO idea how to turn that number into something useful. I ran it on Win98 and got a NEGATIVE number, but a positive on WinXP.

Any help, much appreciated!


GfK(Posted 2003) [#3]
James Boyd wrote a userlib some time ago for this, I think....


soja(Posted 2003) [#4]
Hi Shane,

Here's a good way:
; Userlib declaration
.lib "Kernel32.dll" 
GetVersionEx%(VersionInfo*):"GetVersionExA"


; Blitz code for querying platform
Version = CreateBank(148)
PokeInt(Version, 0, BankSize(Version))
If GetVersionEx(Version) Then
	Select PeekInt(Version, 16)
		Case 0 : Notify "You are running Windows 3.1"
		Case 1 : Notify "You are running on the Windows 9x kernel"
		Case 2 : Notify "You are running on the Windows NT kernel"
		Default : Notify "Unexpected value for Platform ID.", True
	End Select
Else
	Notify "There was an error querying version info.", True
EndIf


For info, see here:
GetVersionEx
and here:
OSVERSIONINFO data structure

Ask away if you have any questions. =)


Darkuni(Posted 2003) [#5]
Thanks a bunch ...

You know, its been a long time since I've been a real active participant in the Blitz community (long live Blitz Basement, ya?) but I still find it AMAZING that the community still owns after all this time and hasn't self-destructed or gone the way of "those other languages".

Its always a pleasure to pop back in here ... and as always the answers are groovy.

Thanks guys!


soja(Posted 2003) [#6]
I'm glad you've returned and found it to your liking. I've only been around here for half a year, or so, though, so I'm still a newbie in comparison to many.


Hotcakes(Posted 2003) [#7]
Oh, I think parts of this community self-destruct from time to time, but we always seem to pull back together, like so many little pieces of the Terminator =]


EOF(Posted 2003) [#8]
Here is more Windows information. It's essentially the same as Soja's with more fruity bits:


BTW Shane, love your WinXP tips!


; Operating System Information

; userlibs
; ******************************
; .lib "Kernel32.dll"
; GetSystemInfo%(infoPTR*):"GetSystemInfo"
; GetVersionEx%(versioninfoPTR*):"GetVersionExA"
; ******************************

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 SYSinfoType
    Field wProcessorArchitecture%
    Field wReserved%
    Field dwPageSize%
    Field lpMinimumApplicationAddress%
    Field lpMaximumApplicationAddress%
    Field dwActiveProcessorMask%
    Field dwNumberOfProcessors%
    Field dwProcessorType%
    Field dwAllocationGranularity%
    Field wProcessorLevel%
    Field wProcessorRevision%
End Type
sys.SYSinfoType=New SYSinfoType

Type OSinfoType
    Field OSVersionInfoSize%
    Field MajorVersion%
    Field MinorVersion%
    Field BuildNumber%
    Field PlatformId%
    Field CSDVersion$ ; 128 in length
End Type
os.OSinfoType=New OSinfoType
os\OSVersionInfoSize=128+20

GetVersionEx(os.OSinfoType)
GetSystemInfo(sys.SYSinfoType)
rev=sys\wProcessorRevision

; TEMP
Print "processer 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
osname$="?"
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: "+ Str$(os\MajorVersion)+"."+Str$(os\MinorVersion)
Print "           Build: "+Str$(os\BuildNumber)
Print "     CSD Version: "+os\CSDVersion

; system processor details
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 And $FF00) = $FF00
				procname$=procname$ + " Model " + Str$(((rev And $F0)/$F)-10) + " Stepping " + Str$((rev And $F))
			Else
				procname$=procname$ + " Stepping " + Chr$(Asc("A") + Str$((rev And $FF)/$FF)) + " Stepping " + Str$((rev And $FF))
			End If
            Case 4
			procname$="Intel 80486"
			If (rev And $FF00) = $FF00
				procname$=procname$ + " Model " + Str$(((rev And $F0) / $F) - 10) + " Stepping " + Str$((rev And $F))
			Else
				procname$=procname$ + " Stepping " + Chr$(Asc("A")) + Str$((rev And $FF)/$FF) + " Stepping " + Str$(rev And $FF)
			End If
			Case 5
			procname$ = "Pentium Model " + Str$((rev And $FF00)/$FF) + " Stepping " + Str$((rev And $FF))
			Case 6
			procname$ = "Pentium II Model " + Str$ ((rev And $FF00)/$FF) + " Stepping " + Str$((rev And $FF))
			Case 7
			procname$ = "Pentium III Model " + Str$ ((rev And $FF00)/$FF) + " Stepping " + Str$((rev And $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" + Str$((rev And $FF00)/$FF) + " Pass " + Str$((rev And $FF))
	; PPC Architecture (only For WinNT)
	Case PROCESSOR_ARCHITECTURE_PPC
	Select sys\wProcessorLevel
		Case 1, 3, 4, 20
		procname$ = "PPC 6" + Right$(String$("0",16)+Str$(sys\wProcessorLevel),2)
		Case 6
		procname$ = "PPC 603+"
		Case 9
		procname$ = "PPC 604+"
	End Select
	procname$ = procname$ + " Processor Version " + Str$((rev And $FF00)/$FF) + "." + Str$((rev And $FF))
End Select

Print procname$

Print " ----------------------------------"
a$=Input$("Press RETURN to end ...")
End



Darkuni(Posted 2003) [#9]
Wow, thanks for all the extras! I really appreciate the support!

Glad you like the XP tips... :)


soja(Posted 2003) [#10]
Don't forget to add
GetSystemInfo(SystemInfo*):"GetSystemInfo"

to your kernel32 decls file to get that to work.

@SyntaxError:
I notice you use a string field in the OS type to match the char* in the C struct. How do you get it to work? Whenever I try to use strings as "get" members within structs, it crashes or doesn't work quite right. I assumed it had to do with the different ways the data is stored between languages. Anyway, that's why I use banks when string data is involved. What do you think?


EOF(Posted 2003) [#11]
Don't forget to add GettSystemInfo(SystemInfo*):"GetSystemInfo"
Oops, updated.

I notice you use a string field in the OS type to match the char* in the C struct. How do you get it to work?
I don't know whether this actually works. At the moment I get an empty string. It should return stuff like:

'Service Pack 1' if installed on WinXP
'A' for Win98SE
'C' for Win95 OSR2

That's why I use banks when string data is involved. What do you think?
Yep. I switched something over before to use banks. Then, I used a PeekString$ function to get at the string.