1. Windows version number

Hi,

here is some code to print what version of windows you are running:

-- winver.ex

include machine.e

sequence regs
regs = repeat(0,10)
regs[REG_AX] = #1600
regs = dos_interrupt(#2F, regs)

printf(1, "Windows version: %d.%d\n", and_bits(regs[REG_AX]/{1,#100},#FF))

-- code ends

Now could someone run this under Windows NT and tell me what numbers it
prints out?

Thanks,
 _______  ______  _______  ______
[    _  \[    _ ][ _   _ ][    _ ]
[/| [_] |[/| [_\][/ | | \][/| [_\]
  |  ___/  |  _]    | |     |  _]
[\| [/]  [\| [_/] [\| |/] [\| [_/]
[_____]  [______] [_____] [______]
xseal at harborside.com  ICQ:13466657
http://www.harborside.com/home/x/xseal/euphoria/

new topic     » topic index » view message » categorize

2. Re: Windows version number

Hi, Pete.  Under NT 3.50 it tells me I have windows version 0.22    smile

--Nick

Pete Eberlein wrote:

> Hi,
>
> here is some code to print what version of windows you are running:
>
> -- winver.ex
>
> include machine.e
>
> sequence regs
> regs = repeat(0,10)
> regs[REG_AX] = #1600
> regs = dos_interrupt(#2F, regs)
>
> printf(1, "Windows version: %d.%d\n", and_bits(regs[REG_AX]/{1,#100},#FF))
>
> -- code ends
>
> Now could someone run this under Windows NT and tell me what numbers it
> prints out?
>
> Thanks,
>  _______  ______  _______  ______
> [    _  \[    _ ][ _   _ ][    _ ]
> [/| [_] |[/| [_\][/ | | \][/| [_\]
>   |  ___/  |  _]    | |     |  _]
> [\| [/]  [\| [_/] [\| |/] [\| [_/]
> [_____]  [______] [_____] [______]
> xseal at harborside.com  ICQ:13466657
> http://www.harborside.com/home/x/xseal/euphoria/

new topic     » goto parent     » topic index » view message » categorize

3. Re: Windows version number

Pete, I got this:

Windows version: 0.22

Weird.

HTH,
ck

At 11:49 PM 4/11/99 -0700, you wrote:
>Hi,
>
>here is some code to print what version of windows you are running:

new topic     » goto parent     » topic index » view message » categorize

4. Re: Windows version number

>Hi,
>
>here is some code to print what version of windows you are running:
>
>-- winver.ex
>
>include machine.e
>
>sequence regs
>regs = repeat(0,10)
>regs[REG_AX] = #1600
>regs = dos_interrupt(#2F, regs)
>
>printf(1, "Windows version: %d.%d\n", and_bits(regs[REG_AX]/{1,#100},#FF))
>
>-- code ends
>
>Now could someone run this under Windows NT and tell me what numbers it
>prints out?


This source is as complete as I know to detect the windows-version
(including ver. 2.x and I think 1.x will return ver 0.0) and the mode
(real/standard/enhanced) it is running in. Unfortunatly the only method I
know to detect the presence of Windows NT, is reading the
environment-variable 'OS' which seems to be always present on Win NT
machines. ( At least at the machines at my university :)
I don't know how to get the version of Win NT, anybody else does? Maybe with
the Windows API?

Martin Schut

P.S. Sorry but the source is currently in Pascal. I will translate it into
Euphoria someday. However I think Pascal is easy enough to understand what
it is doing, so you can translate it by yourself.

P.P.S. Note that Pascal passes parameters BY REFERENCE so the function
returns the mode and put the major and minor version in the variables bound
to major and minor. I know this is not a 'clean' way, but it is the quickest
to get all win-version info. Euphoria sequences would have been nice here
(or a Pascal-type)


Unit WinVer;

Interface
Function WindowsMode(Var major, minor: Integer): Integer;

Const NO_WIN = $00;
Const W_386_X = $01;
Const W_REAL = $81;
Const W_STANDARD = $82;
Const W_ENHANCED = $83;
Const W_NT = $FF;

Implementation
Uses Dos;

Const MULTIPLEX = $2F;

{*** WindowsVersion *** F
*************************************************}
Function WindowsMode(Var major, minor: Integer): Integer;
Var regs: Registers;
Var mode: Integer;
Begin
  major := 0;
  minor := 0;


  regs.ax := $1600;
  Intr(MULTIPLEX,regs);
  mode := regs.ax;

  Case (Lo(mode)) Of
   $01, $FF: Begin
    major := 2;
    minor := 0;
    WindowsMode:= W_386_X;
   End;
   $00, $80: Begin
    regs.ax := $4680;
    Intr(MULTIPLEX, regs);
    If (regs.al = $80) Then
     WindowsMode := NO_WIN
    Else Begin
     regs.ax := $1605;
     regs.bx := $0000;
     regs.si := $0000;
     regs.cx := $0000;
     regs.es := $0000;
     regs.ds := $0000;
     regs.dx := $0001;
     Intr(MULTIPLEX, regs);
     If (regs.cx = $0000) Then Begin
      regs.ax := $1606;
      Intr(MULTIPLEX, regs);
      WindowsMode := W_REAL;
     End Else
      WindowsMode := W_STANDARD;
     End;
    End;
   Else Begin
    major := Lo(mode);
    minor := Hi(mode);
    WindowsMode := W_ENHANCED;
   End;
  End;

  If GetEnv('OS') = 'Windows_NT' Then WindowsMode := W_NT;
End;
End.

new topic     » goto parent     » topic index » view message » categorize

5. Re: Windows version number

> This source is as complete as I know to detect the windows-version
> (including ver. 2.x and I think 1.x will return ver 0.0) and the mode
> (real/standard/enhanced) it is running in. Unfortunatly the only method
> I know to detect the presence of Windows NT, is reading the
> environment-variable 'OS' which seems to be always present on Win NT
> machines. ( At least at the machines at my university :)
> I don't know how to get the version of Win NT, anybody else does? Maybe
> with the Windows API?
>
> Martin Schut


Thanks for the Pascal code, Martin.  I converted it to Euphoria:

-----------------------------------------------------------------
-- winmode.ex


constant NO_WIN = #00
constant W_386_X = #01
constant W_REAL = #81
constant W_STANDARD = #82
constant W_ENHANCED = #83
constant W_NT = #FF

include machine.e

constant MULTIPLEX = #2F

function WindowsMode() -- returns {mode, major, minor}
    sequence regs
    integer mode, major, minor

    major = 0
    minor = 0

    regs = repeat(0, 10)
    regs[REG_AX] = #1600
    regs = dos_interrupt(MULTIPLEX,regs)
    mode = regs[REG_AX]

    if and_bits(mode,255) = #01 or and_bits(mode,255) = #FF then
        major = 2
        minor = 0
        mode = W_386_X
    elsif and_bits(mode,255) = #00 or and_bits(mode,255) = #80 then
        regs[REG_AX] = #4680
        regs = dos_interrupt(MULTIPLEX,regs)

        if and_bits(regs[REG_AX],255) = #80 then
            mode = NO_WIN
        else
            regs[REG_AX] = #1605
            regs[REG_BX] = #0000
            regs[REG_SI] = #0000
            regs[REG_CX] = #0000
            regs[REG_ES] = #0000
            regs[REG_DI] = #0000
            regs[REG_DX] = #0001
            regs = dos_interrupt(MULTIPLEX,regs)
            if regs[REG_CX] = #0000 then
                regs[REG_AX] = #1606
                regs = dos_interrupt(MULTIPLEX,regs)
                mode = W_REAL
            else
                mode = W_STANDARD
            end if
        end if
    else
        major = and_bits(mode,255)
        minor = floor(mode / 256)
        mode = W_ENHANCED
    end if

    if equal(getenv("OS"), "Windows_NT") then mode = W_NT end if

    return {mode, major, minor}
end function


? WindowsMode()



-----------------------------------------------------------------

I didn't really need to know the version number for NT, just whether or
not it is running.  The OS environment variable should do the trick then.
So now I have to figure out exactly what is causing Neil programs to
quietly terminate under NT, and not do that when NT is detected.

Later,
 _______  ______  _______  ______
[    _  \[    _ ][ _   _ ][    _ ]
[/| [_] |[/| [_\][/ | | \][/| [_\]
  |  ___/  |  _]    | |     |  _]
[\| [/]  [\| [_/] [\| |/] [\| [_/]
[_____]  [______] [_____] [______]
xseal at harborside.com  ICQ:13466657
http://www.harborside.com/home/x/xseal/euphoria/

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu