巧妙解决程序运行在兼容模式下时window版本欺诈问题

   有时候,我们想获取系统的版本号,根据版本号为软件做特定的设置。
   通常情况下我们会调用系统API函数GetVersionEx来获取系统版本号,但是,如果软件是以兼容模式运行的话,将会发生window版本欺诈的问题,这个GetVersionEx不能正确获取系统版本,只能获取兼容模式下的系统版本,那么该如何解决呢?

    在系统目录C:\Windows\System32下有个程序ntoskrnl.exe,该程序的版本与系统版本一致,我们可以获取该程序的版本号,以此在我们的软件中获取系统的正确版本号,下面是Delphi的实现代码


 type
    PVerInfo = ^TVS_FIXEDFILEINFO;
    TVS_FIXEDFILEINFO = record
      dwSignature: longint;
      dwStrucVersion: longint;
      dwFileVersionMS: longint;
      dwFileVersionLS: longint;
      dwFileFlagsMask: longint;
      dwFileFlags: longint;
      dwFileOS: longint;
      dwFileType: longint;
      dwFileSubtype: longint;
      dwFileDateMS: longint;
      dwFileDateLS: longint;
    end;
  var
    ExeNames: array[0..255] of char;
    zKeyPath: array[0..255] of Char;
    VerInfo: PVerInfo;
    Buf: pointer;
    Sz: word;
    L, Len: Cardinal;
begin
   ExeNames :='C:\Windows\System32\ntoskrnl.exe';
  Sz := GetFileVersionInfoSize(ExeNames, L);
  if Sz=0 then
  begin
    WindowVerson := -1;
    Exit;
  end;
  try
    GetMem(Buf, Sz);
    try
      GetFileVersionInfo(ExeNames, 0, Sz, Buf);
      if VerQueryValue(Buf, '\', Pointer(VerInfo), Len) then
      begin
        WindowVerson:=HIWORD(VerInfo.dwFileVersionMS);
      end;
    finally
      FreeMem(Buf);
    end;
  except
    WindowVerson := -1;
  end


end;

你可能感兴趣的:(IT技术杂项)