;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Function: Display the Windows type
; Author:purple endurer
; Develop: MASM32 V8
;Log
;------------------------------------
; 2005-04-29 Create
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.model  flat,  stdcall
option  casemap: none
include /masm32/ include/windows.inc
include /masm32/ include/kernel32.inc
include /masm32/ include/user32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib

GetWinType  PROTO


.data
g_szWin95        db  "Windows 95", 0
g_szWin98        db  "Windows 98", 0
g_szWinMe        db  "Windows Mellinnium", 0
g_szWinNT351     db  "Windows NT 3.51", 0
g_szWinNT40      db  "Windows NT 4.0", 0
g_szWin2000      db  "Windows 2000", 0
g_szWinXP        db  "Windows XP", 0
g_szWin2003      db  "Windows Server 2003", 0
g_szUnknow       db  "Unknow", 0

.data?
g_OsVerInfo OSVERSIONINFO <>

.code
start:
     mov g_OsVerInfo.dwOSVersionInfoSize,  SIZEOF OSVERSIONINFO
     invoke  GetVersionEx,  ADDR g_OsVerInfo
     .if  eax != 0
         invoke GetWinType
         invoke  MessageBox, NULL,  eax,  eax, MB_OK
     .endif
     invoke  ExitProcess, NULL

;//
;Function: Get the Windows type
; Input: g_OsVerInfo
; Output: Pointer to the string of windows type
;//
GetWinType  proc
     push  ebx     ;用ebx作为临时变量
     mov  eax,  OFFSET g_szUnknow ;假设返回值为Unknow
     mov  ebx, g_OsVerInfo.dwPlatformId
     .if   ebx==1
         mov  ebx, g_OsVerInfo.dwMinorVersion
         .IF  ebx==0
             mov  eax,  OFFSET g_szWin95
         .ELSEIF  ebx==10
             mov  eax,  OFFSET g_szWin98
         .ELSEIF  ebx==90
             mov  eax,  OFFSET g_szWinMe
         .ENDIF
     .elseif  ebx==2
         mov  ebx, g_OsVerInfo.dwMajorVersion
         .IF  ebx==3
             mov  eax,  OFFSET g_szWinNT351
         .ELSEIF  ebx==4
             mov  eax,  OFFSET g_szWinNT40
         .ELSEIF  ebx==5
             mov  ebx, g_OsVerInfo.dwMinorVersion
             .if  ebx==0
                 mov  eax,  OFFSET g_szWin2000
             .elseif  ebx==1
                 mov  eax,  OFFSET g_szWinXP
             .elseif  ebx==2
                 mov  eax,  OFFSET g_szWin2003
             .endif
         .ENDIF
     .endif

     pop  ebx

     ret
GetWinType  endp

end start