Archive: Registry data changing type?


Registry data changing type?
I have the following slightly modified OS detection function from the NSIS archive.

I run it, compiles fine but when checking the value of $R0 (I use a MessageBox) it reports 603. Now this is on a Windows XP system and checking manually in the registry it's "5.1" as it should be.

Something is going wrong yet my eyes can't spot it. If it's reading a string into a string then how come it turns numerical?

Script below:

;**************************************************************************************************
;FUNCTION - GETWINDOWSVERSION
;**************************************************************************************************

Function GetWindowsVersion

Push $R0
Push $R1

ClearErrors

ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"

IfErrors 0 lbl_winnt

; we are not NT
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion" "VersionNumber"

StrCpy $R1 $R0 1
StrCmp $R1 '4' 0 lbl_error

StrCpy $R1 $R0 3

StrCmp $R1 '4.0' lbl_win32_95
StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98



;*****////Windows 95
lbl_win32_95:
StrCpy $R0 '95'
Goto lbl_done

;*****////Windows 98
lbl_win32_98:
StrCpy $R0 '98'
Goto lbl_done

;*****////Windows Me
lbl_win32_ME:
StrCpy $R0 'ME'
Goto lbl_done



lbl_winnt:

StrCpy $R1 $R0 1

StrCmp $R1 '3' lbl_winnt_x
StrCmp $R1 '4' lbl_winnt_x

StrCpy $R1 $R0 3

StrCmp $R1 '5.0' lbl_winnt_2000
StrCmp $R1 '5.1' lbl_winnt_XP
StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error



;*****////Windows NT 3 or 4
lbl_winnt_x:
StrCpy $R0 "NT $R0" 6
Goto lbl_done

;*****////Windows 2000
lbl_winnt_2000:
Strcpy $R0 '2000'
Goto lbl_done

;*****////Windows XP
lbl_winnt_XP:
Strcpy $R0 'XP'
Goto lbl_done

;*****////Windows 2003
lbl_winnt_2003:
Strcpy $R0 '2003'
Goto lbl_done

;*****////Windows "unknown"
lbl_error:
Strcpy $R0 ''
lbl_done:

Pop $R1
Exch $R0

FunctionEnd


What's the value of $R0 before the final exch? Don't forget that function is designed to have the result popped off the stack, not read from a variable.


Make sure you Pop $R0 after you call the Function.

-Stu


Originally posted by Afrow UK
Make sure you Pop $R0 after you call the Function.

-Stu
I added Pop $R0 just before the MessageBox. Works this way.

Odd but if I remove Exch $R0 it will just report 'XP' correctly instead of "603".