汇编源代码之获得操作系统版本

dos下可以调用DOS中断服务程序,

WINDOWS下可以调用 API 函数GetVersionEx()

这是我测试PE格式的STUB的源代码, 可以在DOS和WINDOWS下运行,其功能是报告当前OS信息.

; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; FileName: os_type.asm
; function: Reports current operation system type
; Author : Purple Endurer
; Version : 0.1
;
; OS Name   Offset of INT 08h  Offset of INT 43h
; -------------------------------------------------------
; MS DOS 7.00 001Fh        5710h
; MS DOS 7.10 18DEh        6EE5h
; UCDOS    1AF3h
; UCDOS98   1AEBh        6E20h
; MSDOS mode  0000h
; PDOS95    0A50h        6E20h
;
; Date     Summary
; -------------------------------------------------------
; 2002.04.07  Created from software paper 95P125
; 2002.06.11  Show version if os is MS-DOS
; 2002.08.07  Convert it to DOS EXE format to be stub
;       program in PE format execute file
; 2004.02.09  Added the condition asm var 'UseStack'
;       Question:
;       Why can this program run normally with stack segment,
;       though there is push and pop instruction in bin2dec proc?
  UseStack    equ 0
data  segment
     strMSDOS  db "MS DOS "
     cMajorVer db ' '
          db '.'
     cMinorVer db "  $"
  strUCDOS  db "UCDOS"
     cUCDOSVer db " 98特别版$"
  strPDOS95 db "Windows95中文DOS方式PDOS95$"
data ends
  if UseStack
     sseg segment stack
         db 10 dup(?)
     sseg ends
endif
code  segment
;--------------------------------------
if UseStack
    assume cs: code, ds: data, ss: sseg
else
    assume cs: code, ds: data
endif
  main proc
start:
    mov ax, data
    mov ds, ax
  if UseStack
    mov ax, sseg
    mov ss, ax
endif
   mov ah, 30h ; Get Version
    int 21h
    add al, '0'
    mov cMajorVer, al
    mov bx, offset cMinorVer
    call bin2dec
   mov ax, 3508h
    int 21h
   mov dx, offset strMSDOS
    mov ah, 09h
    int 21h
   cmp bx, 1fh
    je  @end ;Here is DOS 7.00 only
    cmp bx, 18deh
    je  @End ;Here is DOS 7.10 only
   mov dx, offset strUCDOS
    cmp bx, 1aebh
    je  @Report
   cmp bx, 1af3h
    jne @next2
    mov cUCDOSVer, '$'
    jmp @report
  @next2:
   mov dx, offset strPDOS95
    cmp bx, 0a50h
    jne  @End
@Report:
    ;mov ah, 09h
    int 21h
@End:
    mov ax, 4c00h
    int 21h
main endp
  ; ========================================================
; Input : AH = the Binary will be translated)
;     BX = First offset of memory us to store the result
; Output: BX = First offset of memory stored the result
; --------------------------------------------------------
bin2dec proc
    push dx
    mov dl, 10
@LoopDiv:
    mov al, ah
    xor ah, ah
    div dl   ; (AL) <- (AX) / (DL)  (AH) <- (AX) % (DL)
    add al, '0'
    mov [bx], al
    inc bx
    cmp ah, 10
    jg @LoopDiv
  add ah, '0'
    mov [bx], ah
    pop dx
    ret
bin2dec endp
;=========================================
code ends
    end main
  ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;FileName: StubDemo.asm
; Fuction: Demo how to use the custome stub of PE exe files.
; Author: Purple Endurer
stub
;The command line refered cursom STUB program:
;\masm32\bin\link /stub:<filename.exe> /subsystem:windows <objectname.obj>
;Example:
;D:\masm32v6\WORKS\my_stub>\masm32\bin\link /stub:stub.exe /subsystem:windows stubdemo.obj
;Microsoft (R) Incremental Linker Version 5.12.8078
;Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
  ;stub.exe : warning LNK4060: stub file missing full MS-DOS header; rebuild stub with /KNOWEAS 16-bit LINK option
  ; Date     Summary
; -------------------------------------------------------
; 2002.04.07  Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  .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
  bDetailInfo     equ 0
  .data
szMsgBoxTitle    db "当前操作系统",0
if  bDetailInfo   ;?????? bDetailInfo
   szWin31       db "Win32s on Windows 3.1 ", 0
   szWin9x       db "Win32 on Windows 95 ", 0
else
   szWin31       db "Windows 3.1 ", 0
   szWin9x       db "Windows 95 ", 0
endif          ;?????? bDetailInfo
  szWinNT       db "Windows NT ", 0
  szFormat4OsVer   db "%lu.%lu.%lu", 0
szGetOsInfoFail   db "取操作系统信息失败!", 0
  .data?
OsVer        OSVERSIONINFO <>
szOsVerInfo     db  255 dup (?)
szOsVerInfoTmp   db  255 dup (?)
  .code
start:
       mov  OsVer.dwOSVersionInfoSize, SIZEOF OSVERSIONINFO
       invoke GetVersionEx, ADDR OsVer

       .if  eax
          mov eax, OsVer.dwPlatformId

          ;Identifies the build number of the operating
          ;system in the low-order word For Win9X
   .if eax == VER_PLATFORM_WIN32s
            mov esi, OFFSET szWin31
            and OsVer.dwBuildNumber, 0FFFFh

          .elseif eax == VER_PLATFORM_WIN32_WINDOWS
            mov esi, OFFSET szWin9x
            and OsVer.dwBuildNumber, 0FFFFh
   .else ; eax ==VER_PLATFORM_WIN32_NT
            mov esi, OFFSET szWinNT
          .endif
   invoke lstrcpy, ADDR szOsVerInfo, esi
   invoke wsprintf, ADDR szOsVerInfoTmp,\
              ADDR szFormat4OsVer, OsVer.dwMajorVersion,\
              OsVer.dwMinorVersion, OsVer.dwBuildNumber
   invoke lstrcat, ADDR szOsVerInfo, ADDR szOsVerInfoTmp
          invoke lstrcat, ADDR szOsVerInfo, ADDR OsVer.szCSDVersion
          mov  edi, OFFSET szOsVerInfo
          mov  esi, MB_OK OR MB_ICONINFORMATION
       .else
          mov  edi, OFFSET szGetOsInfoFail
          mov  esi, MB_OK OR MB_ICONWARNING
       .endif
   invoke MessageBox, NULL, edi, addr szMsgBoxTitle, esi

     invoke ExitProcess,NULL
end start

时间: 2024-09-22 22:29:12

汇编源代码之获得操作系统版本的相关文章

《Linux从入门到精通(第2版)》——第1章 Linux操作系统 1.1 Linux操作系统版本

第1章 Linux操作系统 Linux原本只是内核的名称,但现在人们已经习惯将其视为一个操作系统.它最初是由芬兰的在校学生Linus Torvalds从Minix上开发出来的,并不断得到发展. Linux系统诞生时以开源的方式出现,从而引起爱好者不断地加入,这使得Linux系统在不断发展的同时,网络功能也越来越健全.随着Linux系统不断发展,使得商业操作系统长期垄断市场的模式被打破,为计算机技术做出了不可磨灭的贡献. 1.1 Linux操作系统版本 作为开放源代码的Linux操作系统(图1-1

支持完整Aero特效的操作系统版本汇总

故障现象: 完整支持Aero特效的操作系统版本汇总 完整的Aero特效包括: 1.透明(Aero Glass)玻璃效果 2.Windows Flip 3D窗口切换 3.Aero Peek桌面预览 4.任务栏缩略图及预览 解决方案: 完整支持Aero 的Windows版本: Windows Vista Home Premium(Vista家庭高级版) Windows Vista Business(Vista商业版) Windows Vista Enterprise(Vista企业版) Window

JS获得浏览器版本和操作系统版本的例子_javascript技巧

于是,我们可以写出下面的代码: 复制代码 代码如下: <script type="text/javascript"> var Sys = {}; var ua = navigator.userAgent.toLowerCase(); var s;  (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :  (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :  (s

Oracle安装检查操作系统版本必须是5.0 5.1的解决办法

我在 oracle 10g R2 for windows 7 64bit 的安装时候发现了这个问题.经过验证可以解决问题. 这算是oracle的一个小bug 在检查操作系统版本的时候 windows-6.1 没有维护进去. 找到oracle安装文件中的 "oraparam.ini" 文件在里面 合适位置添加以下一段 (里面有一段和以下文字类似就是6.1换成6.0 放在6.0的后面即可) [Windows-6.1-required] #Minimum display colours fo

JavaScript 获取用户客户端操作系统版本_javascript技巧

下午去了趟用户现场,感觉此问题确实比较蹊跷,最后发现出问题的电脑是WIN 2000的操作系统,感觉问题症结可能就在此处,上网google一下,发现原来Media Player 11不支持Win2000系统,需要针对用户操作系统版本判断用户下载播放器版本,让Win2000用户下载Media Player 9即可. 好了,问题原因找到了,解决问题就是很简单的事情了. 下面主要说一下用JavaScript如何判断用户操作系统及版本. 关键部分: window.navigator.userAgent :

错误报告包括:问题出现时 .exe的状态信息;正在使用的操作系统版本及计算机硬件;

问题描述 用c#做的数据采集系统,在一个客户那儿用了一段时间就会出这样的问题:请高手们帮帮忙,问题如下:错误报告包括:问题出现时.exe的状态信息:正在使用的操作系统版本及计算机硬件:您的数字ProductID,该标识号可用于识别您的许可证:以及您的计算机的Internet协议(IP)地址. 解决方案 解决方案二:markup解决方案三:顶解决方案四:是不是用了socket连接断了?解决方案五:顶...解决方案六:应该不是,重新启动程序,还是会出这个错误,我把安装的文件都换了,就可以用了,但十几

NSIS:使用WinVer.nsh头文件判断操作系统版本

原文 NSIS:使用WinVer.nsh头文件判断操作系统版本 AtLeastWin<version> 检测是否高于指定版本 IsWin<version> 检测指定版本(唯一限定版本) AtMostWin<version> 检测是否低于指定版本 <version> 允许的值: 95.98.ME.NT4.2000.XP.2003.Vista.2008.7.2008R2   示例1:   01 name    "使用头文件判断操作系统"  0

如何在网页读取用户IP,操作系统版本等数据demo

我们浏览网页的时候,会不经意间看到,有些地方(如个人的签名档)显示出了个人的IP,操作系统等数据.借助第三方API和请求报头useragent是很容易实现的. <html> <head> <title>Sherry</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type=&qu

.NET获取客户端的操作系统版本、浏览器版本和IP地址_实用技巧

我们在使用.NET做网站的时候,很多情况下需要需要知道客户端的操作系统版本和浏览器版本,怎样获取客户端的操作系统和浏览器版本呢?我们可以通过分析UserAgent来获取. .NET 获取客户端的操作系统 请看下面的代码,我们首先创建一个通过分析UserAgent来获取操作系统的方法 /// <summary> /// 获取操作系统的名字 /// </summary> /// <param name="userAgent"></param>