• 1029阅读
  • 2回复

通过关键系统文件判断正确的操作系统版本 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-15



[cpp] view plain copy

  1. typedef struct tagTRANSLATION  
  2. {  
  3.     WORD langID;            // language ID  
  4.     WORD charset;            // character set (code page)  
  5. } TRANSLATION;  
  6.   
  7. #define  KeyFILENAMECHECK  "\\kernel32.dll"  
  8.   
  9. DWORD GetVersionExFromFile(OSVERSIONINFOEX &osvi)  
  10. {  
  11.     BOOL bOsVersionInfoEx;  
  12.     TCHAR szSysDir[MAX_PATH] = {0};  
  13.     TCHAR szFileName[MAX_PATH+sizeof(KeyFILENAMECHECK)] = {0};  
  14.   
  15.     TRANSLATION translation;  
  16.   
  17.     DWORD dwDummyHandle;  
  18.     DWORD len = 0;  
  19.     BYTE *pVerBuf = NULL;  
  20.     LPVOID pInfoVal;  
  21.     unsigned int dwInfoValSize;  
  22.     char INFO[MAX_PATH] = {0};  
  23.     int iMajorVer, iMinorVer;  
  24.   
  25.     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));  
  26.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  
  27.   
  28.     if ((bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&osvi)) == 0)  
  29.     {  
  30.         // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.  
  31.         osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);  
  32.   
  33.         if (!GetVersionEx((OSVERSIONINFO *)&osvi))  
  34.         {  
  35.             return FALSE;  
  36.         }  
  37.     }  
  38.   
  39.     // 通过关键系统文件判断正确的操作系统版本  
  40.     GetSystemDirectory(szSysDir, MAX_PATH);  
  41.     _snprintf(szFileName, sizeof(szFileName) - 1, "%s%s", szSysDir, KeyFILENAMECHECK);  
  42.   
  43.     //将版本信息资源读入缓冲区  
  44.     len = GetFileVersionInfoSize(szFileName, &dwDummyHandle);  
  45.   
  46.     if (len > 0)  
  47.     {  
  48.         pVerBuf = (BYTE *)LocalAlloc(LHND, len);  
  49.     }  
  50.   
  51.     if (pVerBuf  
  52.         && GetFileVersionInfo(szFileName, 0, len, pVerBuf))  
  53.     {  
  54.         translation.langID = MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);  
  55.   
  56.         if (VerQueryValue(pVerBuf,  
  57.             TEXT("\\VarFileInfo\\Translation"),  
  58.             &pInfoVal, &dwInfoValSize)  
  59.             && dwInfoValSize >= 4)  
  60.         {  
  61.             translation = *(TRANSLATION*)pInfoVal;  
  62.         }  
  63.   
  64.         _snprintf(INFO,  
  65.             sizeof(INFO) - 1,  
  66.             "\\StringFileInfo\\%04x%04x\\FileVersion",  
  67.             translation.langID,  
  68.             translation.charset);  
  69.   
  70.         //获得具体的版本号  
  71.         VerQueryValue(pVerBuf, (LPSTR)INFO, &pInfoVal, &dwInfoValSize);  
  72.   
  73.         iMajorVer = *((char*)pInfoVal) - '0';  
  74.         iMinorVer = *((char*)pInfoVal + 2) - '0';  
  75.   
  76.         // 取文件版本成功则使用文件版本,此处也可判断是否运行在兼容模式下  
  77.         osvi.dwMajorVersion = iMajorVer;  
  78.         osvi.dwMinorVersion = iMinorVer;  
  79.   
  80.     }  
  81.   
  82.     if (pVerBuf)  
  83.     {  
  84.         memset(pVerBuf, 0, len);  
  85.         LocalFree(pVerBuf);  
  86.     }  
  87.   
  88.     return TRUE;  
  89.   
  90. }  
  91.   
  92. int main()  
  93. {  
  94.     OSVERSIONINFOEX osvi;  
  95.     GetVersionExFromFile(osvi);  
  96.   
  97.     return 0;  
  98. }  

善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线im86165507

只看该作者 沙发  发表于: 2016-02-15
离线v2680267313

只看该作者 板凳  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个