[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    {
     IH> About detecting Windows 95, is it possible to detect
     IH> it even when the "prevent program to detect windows"
     IH> flag is set to "ON"?

    Ummm... Perhaps you could check environment for "winbootdir=" entry (note
    lowercase!). Additionally, in DPMI programs you might check DPMI provider to
    see if it's Win95.Generally, from early betas of Win95 up to now, the
    following sequence appears to be working OK:
    1.  Check DOS version, if 7.0, may be Win95.
    2.  Check "winbootdir" in environment, it's always there in Win95.
    3.  Check for long file names to see if Win95 GUI is loaded.

    If all three tests are OK, you can safely assume running under Win95, in a
    windowed or full-screen DOS session, regardless of "detect windows" setting.

    DOS version can be obtained by standard means (DOSVersion in TP/BP).
    To check environment for lovercase "winbootdir", you must be sure that your
    searching function does not convert strings to uppercase (TP's DOS unit does,
    yet BP's WinDOS does not). For BP7, the following code might be useful:
    }

    uses Strings;

    function GetAnyCaseEnv(VarName: PChar): PChar;
    var
      L: Word; P: PChar;
    begin
      L := StrLen(VarName);
      P := Ptr(Word(Ptr(PrefixSeg, $2C)^), 0);
      while P^ <> #0 do begin
        if (StrLIComp(P, VarName, L) = 0) and (P[L] = '=') then begin
          GetAnyCaseEnv := P + L + 1; Exit;
        end;
        Inc(P, StrLen(P) + 1);
      end;
      GetAnyCaseEnv := nil;
    end;
    {
    if GetAnyCaseEnv('winbootdir') returns non-NIL string, you might check for
    long names, as these are supported by Win95 in GUI mode only (not in
    DOS-mode).
    }

    function GetCurLongDir(Dir: PChar; Drive: Byte): PChar; assembler;
    asm
         mov al,Drive
         or al,al
         jne @@1
         mov ah,19h
         int 21H
         inc ax
    @@1: mov dl,al
         push ds
         lds si,Dir
         push ds
         push si
         mov byte ptr es:[si],0
         mov ax,7147h   { note AH=$71, AL=$47, not AH=$47 as in standard DOS }
         int 21h
         pop ax
         pop dx
         pop ds
    end;

    To check for long names, use e.g.:

    var p:PChar;
    ...
      GetMem(p,256);
      If StrLen(GetCurLongDir(p,0)) > 0 then { Long names supported };
      FreeMem(p,256);

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]