Detecting Windows Version?

BlitzPlus Forums/BlitzPlus Programming/Detecting Windows Version?

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!

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!

James Boyd wrote a userlib some time ago for this, I think....

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. =)

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!

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.

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 =]

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


Wow, thanks for all the extras! I really appreciate the support!

Glad you like the XP tips... :)

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?

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.