Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _TTFH_3500 en 8 Abril 2016, 02:45 am



Título: [C/C++] Detectar versión de Windows
Publicado por: _TTFH_3500 en 8 Abril 2016, 02:45 am
Quería saber como hacer para detectar la versión de Windows en C, sin importar que ejecute el programa en modo de compatibilidad, de hecho me alcanza con encontrar el primer numero en la versión (en win xp y 2000 es el 5, en win 7, 8 y 8.1 es el 6, en win 10 el 10, etc.).

Se que hay otras menares de detectar la versión como si existe "Documents and Setting", si existe d3d12.exe, pero me gustaría algo mas general.

En Batch seria asi y siempre funciona ya que 'ver' es igual en modo compatibilidad.
Código
  1. @Echo off
  2. echo La version es: && ver
  3. ver | find "5." > nul
  4. If %ERRORLEVEL% == 0 (
  5.  echo Windows 2000 o XP detectado
  6. )

En Visual Basic Script seria:
Código
  1. Set oWMI = GetObject("winmgmts:\\.\root\CIMV2")
  2. Set cWin = oWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
  3. For Each OS In cWin
  4.  message = MSGBOX(OS.Version, 16, "La version es:")
  5.  If Split(OS.Version,".")(0) = 5 Then
  6.    message = MSGBOX("Windows 2000 o XP detectado", 16, "Mensaje")
  7.  End If
  8. Next


Pero en C no me funciona, ademas de que GetVersion devuelve otro valor en win8.1 y win10.
Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. int main() {
  4.  DWORD dwVersion = GetVersion();
  5.  DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
  6.  DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
  7.  DWORD dwBuild = 0;
  8.  if (dwVersion < 0x80000000)
  9.    dwBuild = (DWORD)(HIWORD(dwVersion));
  10.  printf("La version es: %d.%d.%d\n", dwMajorVersion, dwMinorVersion, dwBuild);
  11.  if (dwMajorVersion == 5)
  12.    printf("Windows 2000 o XP detectado");
  13. }

Lo que busco es lo que en el ejemplo seria el valor de la variable dwMajorVersion


Título: Re: [C/C++] Detectar versión de Windows
Publicado por: MCKSys Argentina en 8 Abril 2016, 03:04 am
Revisaste esta (https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx) info?

Saludos!


Título: Re: [C/C++] Detectar versión de Windows
Publicado por: _TTFH_3500 en 8 Abril 2016, 04:36 am
Revisaste esta (https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx) info?

Saludos!

Si, las funciones IsWindows**OrGreater en versionhelpers.h se basan en que por ejemplo en winXP no puedo ejecutar en modo compatibilidad con Win7, entonces estaría usando WinXP o mayor, pero no funciona si es al revés porque si ejecuto en modo compatibilidad con X versión, tengo esa versión o mayor y no se exactamente cual.

Creo que podría solucionarlo con esto: https://msdn.microsoft.com/en-us/library/windows/desktop/ms725492%28v=vs.85%29.aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms725492%28v=vs.85%29.aspx), luego lo pruebo.

Usando VerifyVersionInfo y lpVersionInfo de windows.h