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 + -
显示快捷键?