Конференция "WinAPI" » Узнать разрядность платформы в Runtime [D7, Win2k, WinXP]
 
  • Артем (27.12.11 20:34) [0]
    Собственно можно как-то в Runtime узнать разрядность ОС?

    Мне это нужно для того, чтобы в зависимости от разрядности ОС загружать соответствующий драйвер.
  • Артем (27.12.11 20:44) [1]
    Пробовал GetVersion, GetVersionEx, GetNativeSystemInfo.

    При запуске программы под Windows 7 x64 выдает что платформа 32-разрядная.
  • sniknik © (27.12.11 20:57) [2]
    > в зависимости от разрядности ОС загружать соответствующий драйвер.
    а программа у тебя сколькиразрядная? "на лету" меняется?
  • megavoid © (27.12.11 21:28) [3]
    16-разрядная ОС вряд ли уже попадётся, а про 64-разрядную из 32-битной программы можно узнать, например, так:
    function Is64BitWindows: Boolean;
    var
     IsWow64Process: function(hProcess: THandle; out Wow64Process: Bool): Bool; stdcall;
     Wow64Process: Bool;
    begin
     {$IF Defined(CPU64)}
     Result := True;
     {$ELSEIF Defined(CPU16)}
     Result := False;
     {$ELSE}
     @IsWow64Process := GetProcAddress(GetModuleHandle('Kernel32.dll'), PAnsiChar('IsWow64Process'));
     Wow64Process := False;
     if Assigned(IsWow64Process) then
       Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process) and Wow64Process;
     Result := Wow64Process;
     {$IFEND}
    end;

  • Артем (27.12.11 21:54) [4]

    > 16-разрядная ОС вряд ли уже попадётся, а про 64-разрядную
    > из 32-битной программы можно узнать, например, так:function
    > Is64BitWindows: Boolean;var  IsWow64Process: function(hProcess:
    >  THandle; out Wow64Process: Bool): Bool; stdcall;  Wow64Process:
    >  Bool;begin  {$IF Defined(CPU64)}  Result := True;  {$ELSEIF
    > Defined(CPU16)}  Result := False;  {$ELSE}  @IsWow64Process
    > := GetProcAddress(GetModuleHandle('Kernel32.dll'), PAnsiChar('IsWow64Process'));
    >   Wow64Process := False;  if Assigned(IsWow64Process) then
    >    Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process)
    > and Wow64Process;  Result := Wow64Process;  {$IFEND}end;
    >


    Спасибо
  • Артем (27.12.11 21:56) [5]

    > > в зависимости от разрядности ОС загружать соответствующий
    > драйвер.а программа у тебя сколькиразрядная? "на лету" меняется?
    >


    Сама программа 32х. Драйвер может быть или 32х или 64х. Если попытаться загрузить 32х-разрядный в 64-разрядной ОС, то ничего не получиться.
  • DVM © (27.12.11 22:10) [6]
    http://www.transl-gunsmoker.ru/2010/02/64-windows.html


    > Если попытаться загрузить 32х-разрядный в 64-разрядной ОС,
    >  то ничего не получиться.

    Это не libpcap ли драйвер часом?
    А чего 32 разрядный драйвер вообще делает в 64 разрядной ОС? Драйверам положено лежать в папке drivers и попадать туда с инсталлятором.
  • Артем (27.12.11 22:16) [7]
    Нет, это не libpcap.
  • Артем (28.12.11 14:02) [8]

    > 16-разрядная ОС вряд ли уже попадётся, а про 64-разрядную
    > из 32-битной программы можно узнать, например, так:function
    > Is64BitWindows: Boolean;var  IsWow64Process: function(hProcess:
    >  THandle; out Wow64Process: Bool): Bool; stdcall;  Wow64Process:
    >  Bool;begin  {$IF Defined(CPU64)}  Result := True;  {$ELSEIF
    > Defined(CPU16)}  Result := False;  {$ELSE}  @IsWow64Process
    > := GetProcAddress(GetModuleHandle('Kernel32.dll'), PAnsiChar('IsWow64Process'));
    >   Wow64Process := False;  if Assigned(IsWow64Process) then
    >    Wow64Process := IsWow64Process(GetCurrentProcess, Wow64Process)
    > and Wow64Process;  Result := Wow64Process;  {$IFEND}end;
    >


    Попробовал. Процедура всегда выдает False. Проверено на Windows XP SP3 x86, Windows Vista x86 и x64, Windows 7 x86 и x64.
  • Rouse_ © (28.12.11 14:35) [9]
    Неофициальный способ:
    function IsWow64FS: BOOL;
    asm
     xor eax, eax
     cmp fs:[$C0], 0
     setne al
    end;



    Официальный способ:
    function IsWow64: BOOL;
    type
     TIsWow64Process = function(hProcess: THandle;
       var Wow64Process: BOOL): BOOL; stdcall;
    var
     IsWow64Process: TIsWow64Process;
    begin
     Result := False;
     @IsWow64Process := GetProcAddress(GetModuleHandle(kernel32),
       'IsWow64Process');
     if Assigned(@IsWow64Process) then
       IsWow64Process(GetCurrentProcess, Result);
    end;

  • CRLF (28.12.11 17:28) [10]

    > Rouse_ ©   (28.12.11 14:35) [9]
    Нет проверки, что IsWow...(...) выполнилась успешно. И что в неофициальном способе в LongBool пишем единицу, а не стандартный TRUE = -1, тоже не очень хорошо.
  • Rouse_ © (28.12.11 19:37) [11]

    > Нет проверки, что IsWow...(...) выполнилась успешно.

    Есть, но с ньюансом :)
    Если посмотреть реализацию IsWow то значение параметра в случае неуспеха не изменится и стало быть как и в данном случае
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=VS.85%29.aspx


    вернется False


    > И что в неофициальном способе в LongBool пишем единицу,
    > а не стандартный TRUE = -1, тоже не очень хорошо.

    Стандартный TRUE это не FALSE, с учетом что FALSE равен нулю :)
    Ну или дай пруфлинк на спецификацию, возможно что я чейто и подзабыл )
  • CRLF (29.12.11 11:22) [12]
    Были ситуёвины, когда B1 = TRUE, B2 = TRUE, но
    if B1 = B2 then ...

    не выполнялось, потому что
    Byte(B1) <> Byte(B2)

    :-\ С тех пор стараюсь обращать внимание на такие нюансы.
  • Rouse_ © (29.12.11 12:09) [13]

    > не выполнялось, потому что

    Ну логично, в дан6ном случае, правда я не могу себе представить алгоритм в котором будет выполнятся код по условию как True=True, так и False=False

    Ну и на -1 переделать конечно легко:

    function IsWow64FS: BOOL;
    asm
     xor eax, eax
     cmp fs:[$C0], 0
     sete al
     dec eax
    end;



    но только я все-же категорически не уверен что -1 это правильно, ибо декларация TRUE и FALSE в WinDef.h из SDK выглядит так:

    #ifndef FALSE
    #define FALSE               0
    #endif

    #ifndef TRUE
    #define TRUE                1
    #endif

  • CRLF (29.12.11 12:30) [14]

    > не уверен что -1 это правильно
    ХЗ... Boolean(True) = 1, ByteBool(True) = WordBool(True) = LongBool(True) = -1. В древней книжке по паскалю говорилось, что "для совместимости с С". Видимо, WinSDK ушёл вперёд, а совместимость в Паскалем осталась. :-)
  • Rouse_ © (29.12.11 12:39) [15]

    > ByteBool(True) = WordBool(True) = LongBool(True) = -1

    А, вот ты про что... Ну тогда да...
 
Конференция "WinAPI" » Узнать разрядность платформы в Runtime [D7, Win2k, WinXP]
Есть новые Нет новых   [134430   +4][b:0][p:0.003]