⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 versinfo.c

📁 全面揭示PE文件的核心机密!彻底揭开PE结构的面纱!
💻 C
字号:
#include <windows.h>

#include <malloc.h>
#include <stdio.h>


/* 
 * $Header: D:/c_kram/nt_info/RCS/versinfo.c,v 1.3 1998/11/18 00:00:59 LUEVELSMEYER Exp $
 *
 * checked in by $Author: LUEVELSMEYER $
 * checked in at $Date: 1998/11/18 00:00:59 $
 *
 * History:
 * $Log: versinfo.c,v $
 * Revision 1.3  1998/11/18 00:00:59  LUEVELSMEYER
 * run through indent
 *
 * Revision 1.2  1998/04/14 15:41:46  LUEVELSMEYER
 * added comments
 *
 * Revision 1.1  1997/06/05 11:23:42  LUEVELSMEYER
 * Initial revision
 *
 *
 */

#pragma off(unreferenced)
static const char RCSHeader[] = "$Id: versinfo.c,v 1.3 1998/11/18 00:00:59 LUEVELSMEYER Exp $";
#pragma on(unreferenced)



#include "versinfo.h"

static void ShowStrings(void *const info, const DWORD lang)
{
#define ARRAY_LEN(Array)	(sizeof(Array) / sizeof(Array[0]))
    char *stringnames[] =
    {"Comments",
     "CompanyName",
     "FileDescription",
     "FileVersion",
     "InternalName",
     "LegalCopyright",
     "LegalTrademarks",
     "OriginalFilename",
     "PrivateBuild",
     "ProductName",
     "ProductVersion",
     "SpecialBuild"
    };

    int i;

    for (i = 0; i < ARRAY_LEN(stringnames); i++)
      {
          char query[500];
          LPSTR value;
          UINT len;

          sprintf(query, "\\StringFileInfo\\%04x%04x\\%s", LOWORD(lang), HIWORD(lang), stringnames[i]);
          if (!VerQueryValue(info, query, &value, &len) || !len)
              continue;
          CharToOem(value, value);
          printf("  %-16s: %s\n", stringnames[i], value);
      }

#undef ARRAY_LEN
}


void print_version_info(char *progname)
{
    DWORD dummy, infosize;

    if (!(infosize = GetFileVersionInfoSize(progname, &dummy)))
      {
          puts("(no version info)");
          return;
      }
    else
      {
          void *info = malloc(infosize);
          VS_FIXEDFILEINFO *fixed_info;
          UINT fixed_len;

          if (!info)
            {
                puts("(error on malloc");
                return;
            }

          GetFileVersionInfo(progname, 0, infosize, info);
          VerQueryValue(info, "\\", &fixed_info, &fixed_len);

          /* File Version */
          printf("File Version:    %d.%d.%d.%d\n",
                 HIWORD(fixed_info->dwFileVersionMS),
                 LOWORD(fixed_info->dwFileVersionMS),
                 HIWORD(fixed_info->dwFileVersionLS),
                 LOWORD(fixed_info->dwFileVersionLS));

          /* Product Version */
          printf("Product Version: %d.%d.%d.%d\n",
                 HIWORD(fixed_info->dwProductVersionMS),
                 LOWORD(fixed_info->dwProductVersionMS),
                 HIWORD(fixed_info->dwProductVersionLS),
                 LOWORD(fixed_info->dwProductVersionLS));

          {                     /* File Flags */
              DWORD flags = fixed_info->dwFileFlags & fixed_info->dwFileFlagsMask;
              fputs("Flags:           ", stdout);
              if (!flags)
                  fputs("(none)", stdout);
              if (flags & VS_FF_DEBUG)
                  fputs("Debug ", stdout);
              if (flags & VS_FF_PRERELEASE)
                  fputs("Prerelease ", stdout);
              if (flags & VS_FF_PATCHED)
                  fputs("Patched ", stdout);
              if (flags & VS_FF_PRIVATEBUILD)
                  fputs("PrivateBuild ", stdout);
              if (flags & VS_FF_INFOINFERRED)
                  fputs("InfoInferred ", stdout);
              if (flags & VS_FF_SPECIALBUILD)
                  fputs("SpecialBuild ", stdout);
              putchar('\n');
          }

          {                     /* File OS. */
              fputs("OS:              ", stdout);
              switch (LOWORD(fixed_info->dwFileOS))
                {
                    case VOS__WINDOWS16:
                        fputs("16-Bit Windows", stdout);
                        break;
                    case VOS__PM16:
                        fputs("16-Bit Presentation Manager", stdout);
                        break;
                    case VOS__PM32:
                        fputs("32-Bit Presentation Manager", stdout);
                        break;
                    case VOS__WINDOWS32:
                        fputs("Win32", stdout);
                        break;
                    default:
                        fputs("(unknown)", stdout);
                        break;
                }
              fputs(" on ", stdout);
              switch (MAKELONG(0, HIWORD(fixed_info->dwFileOS)))
                {
                    case VOS_DOS:
                        puts("MS-DOS");
                        break;
                    case VOS_OS216:
                        puts("16-Bit OS/2");
                        break;
                    case VOS_OS232:
                        puts("32-Bit OS/2");
                        break;
                    case VOS_NT:
                        puts("NT");
                        break;
                    default:
                        puts("(unknown)");
                        break;
                }
          }

          /* file type */
          fputs("Type:            ", stdout);
          switch (fixed_info->dwFileType)
            {
                case VFT_APP:
                    puts("Exe");
                    break;
                case VFT_DLL:
                    puts("DLL");
                    break;
                case VFT_DRV:
                    switch (fixed_info->dwFileSubtype)
                      {
                          case VFT2_DRV_COMM:
                              puts("driver (serial)");
                              break;
                          case VFT2_DRV_PRINTER:
                              puts("driver (printer)");
                              break;
                          case VFT2_DRV_KEYBOARD:
                              puts("driver (keyboard)");
                              break;
                          case VFT2_DRV_LANGUAGE:
                              puts("driver (language)");
                              break;
                          case VFT2_DRV_DISPLAY:
                              puts("driver (screen)");
                              break;
                          case VFT2_DRV_MOUSE:
                              puts("driver (mouse)");
                              break;
                          case VFT2_DRV_NETWORK:
                              puts("driver (network)");
                              break;
                          case VFT2_DRV_SYSTEM:
                              puts("driver (system)");
                              break;
                          case VFT2_DRV_INSTALLABLE:
                              puts("driver (installable)");
                              break;
                          case VFT2_DRV_SOUND:
                              puts("driver (sound)");
                              break;
                          case VFT2_UNKNOWN:
                          default:
                              puts("driver (unknown)");
                              break;
                      }

                    break;
                case VFT_FONT:
                    switch (fixed_info->dwFileSubtype)
                      {
                          case VFT2_FONT_RASTER:
                              puts("font (raster)");
                              break;
                          case VFT2_FONT_VECTOR:
                              puts("font (vector)");
                              break;
                          case VFT2_FONT_TRUETYPE:
                              puts("font (truetype)");
                              break;
                          case VFT2_UNKNOWN:
                          default:
                              puts("font (unknown)");
                              break;
                      }

                    break;

                case VFT_VXD:
                    printf("virtual device (VxD), device id == %ld\n", fixed_info->dwFileSubtype);
                    break;
                case VFT_STATIC_LIB:
                    puts("static Lib");
                    break;
                case VFT_UNKNOWN:
                default:
                    puts("(unknown)");
                    break;
            }


          /* languages and strings */
          {
              LPDWORD langs;
              UINT len, i;
              char buffer[MAX_PATH];

              VerQueryValue(info, "\\VarFileInfo\\Translation", &langs, &len);

              for (i = 0; i < len; i += sizeof(*langs), langs++)
                {               /* Get the string name for the language number. */
                    VerLanguageName(LOWORD(*langs), buffer, sizeof(buffer));
                    fputs("- ", stdout);
                    puts(buffer);
                    ShowStrings(info, *langs);
                }
          }

          free(info);

      }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -