version.asm

来自「windows下汇编语言 学习汇编语言好助手」· 汇编 代码 · 共 116 行

ASM
116
字号
;*************************
;文件:Version.asm       *
;作用:检测Windows版本   *
;*************************
.386p
.model flat,stdcall
extrn GetVersion:proc
extrn GetVersionExA:proc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn _wsprintfA:proc

;常量定义
NULL  = 0
MB_OK = 0
VER_PLATFORM_WIN32s           =  0
VER_PLATFORM_WIN32_WINDOWS    =  1
VER_PLATFORM_WIN32_NT         =  2

;结构定义
OSVERSIONINFO	struc
    dwOSVersionInfoSize	dd ?
    dwMajorVersion	dd ?
    dwMinorVersion	dd ?
    dwBuildNumber	dd ?
    dwPlatformId	dd ?
    szCSDVersion 	db 128 dup (?)
ends

OSVERSIONINFOEXA	struc
    dwOSVersionInfoSize	dd ?
    dwMajorVersion	dd ?
    dwMinorVersion	dd ?
    dwBuildNumber	dd ?
    dwPlatformId	dd ?
    szCSDVersion 	db 128 dup (?)
    wServicePackMajor	dw ?
    wServicePackMinor	dw ?
    wReserved		dw 2 dup (?)
ends

.data	;数据
	OSVI	OSVERSIONINFO<>
	OSVIEX	OSVERSIONINFOEXA<>
	Caption db 'GetVersion sample',0
	Text	db 500 dup (?)
	Param   db '主版本号:%d',13,10
			db '次版本号:%d',13,10
			db '建立号:%d',13,10
			db '平台:%s',13,10
			db '附加串:%s'
	zero	db 0,13,10
			db 'ServicePack主版本%d',13,10
			db 'ServicePack次版本%d',13,10
			db 0
		
	PF_31	db 'Win32s on Windows 3.1',0
	PF_9X	db 'Win32 on Windows 95 or Windows 98',0
	PF_NT	db 'Win32 on Windows NT',0
	UNKNOW	dd '未知',0
	
	ErrorText	db '发生错误',0

.code	;代码
main:
	mov		OSVI.dwOSVersionInfoSize,size OSVERSIONINFO
	call	GetVersionExA,offset OSVI		;取版本信息
	or		eax,eax
	jz		Error
	
	mov		ebx,OSVI.dwPlatformId
	cmp		ebx,VER_PLATFORM_WIN32s			;Win32s平台?
	jnz		@1
	lea		ebx,PF_31
	jmp		MakeText
@1:
	cmp		ebx,VER_PLATFORM_WIN32_WINDOWS	;Windows 9X ?
	jnz		@2
	lea		ebx,PF_9X
	jmp		MakeText
@2:
	cmp		ebx,VER_PLATFORM_WIN32_NT		;Windows NT ?
	jnz		@3
	lea		ebx,PF_NT
	jmp		NT5GetExt
@3:
	lea		ebx,UNKNOW
MakeText:
	call	_wsprintfA,offset Text,offset Param,OSVI.dwMajorVersion,OSVI.dwMinorVersion,OSVI.dwBuildNumber,ebx,offset OSVI.szCSDVersion
	add		esp,7*4
	jmp		Show
	
NT5GetExt:
	cmp		OSVI.dwMajorVersion,5			;Windows NT版本号>=5 ?
	jb		MakeText
	mov		OSVIEX.dwOSVersionInfoSize,size OSVERSIONINFOEXA
	call	GetVersionExA,offset OSVIEX
	or		eax,eax
	jz		Error
	lea		ebx,PF_NT
	mov		byte ptr [zero],' '
	mov		cx,OSVIEX.wServicePackMajor 
	mov		dx,OSVIEX.wServicePackMinor
	movzx	ecx,cx
	movzx	edx,dx
	call	_wsprintfA,offset Text,offset Param,OSVIEX.dwMajorVersion,OSVIEX.dwMinorVersion,OSVIEX.dwBuildNumber,ebx,offset OSVIEX.szCSDVersion,ecx,edx
	add esp,9*4
Show:
	call	MessageBoxA,NULL,offset Text,offset Caption,MB_OK
Exit:
	call	ExitProcess,0
Error:
	call	MessageBoxA,NULL,offset ErrorText,offset Caption,MB_OK
	jmp		Exit
	end main

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?