首页
社区
课程
招聘
一段想不通的诡异代码
发表于: 2014-2-20 02:54 5737

一段想不通的诡异代码

2014-2-20 02:54
5737
我写了一个判断操作系统是否是windows xp SP3的函数
#include <Windows.h>
#include <WinReg.h>

#pragma comment(lib, "Advapi32")

//判断操作系统是否是WINDOWS XP SP3
BOOL IsWindowsXPSP3()
{
  DWORD SPSize;
  CHAR SPNum[MAX_PATH];
  DWORD dwType;

  //读取与SP号有关的注册表键值
  HKEY hKey;
  RegOpenKeyExA(HKEY_LOCAL_MACHINE,"System\\ControlSet001\\Control\\Windows\\",NULL,KEY_ALL_ACCESS,&hKey);
  RegQueryValueExA(hKey,"CSDVersion",NULL,&dwType,(LPBYTE)SPNum,&SPSize);
  RegCloseKey(hKey);



  OSVERSIONINFOEX os;
  os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX); 
  if(GetVersionEx((OSVERSIONINFO *)&os))
  {
    CHAR temp[MAX_PATH];
    sprintf_s(temp,"%d",(long)*(short*)SPNum);
    //以上两行为诡异代码,执行以后下面判断可以正常,不执行就不正常,我也不知道怎么回事
    if (5==os.dwMajorVersion&&1==os.dwMinorVersion&&768==(long)*(short*)SPNum)
    {
      return TRUE;
    }
  }

  return FALSE;
}

if (5==os.dwMajorVersion&&1==os.dwMinorVersion&&768==(long)*(short*)SPNum)
问题出在这句代码
如果我注释掉上面的两句代码,那么判断条件会不正确(猜测是最后一个条件不成立)
如果执行上面两句,判断就会正确
请教各位大神这是什么原因.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你首先看格式化之后的内容,你这各种指针转换让人蛋疼
直接判断dwMajorVersion dwMinorVersion就足够了
上代码

//获取系统版本
TCHAR tzSystem[32];
OSVERSIONINFOEX osvi;
memset(&osvi,0,sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (!GetVersionEx((OSVERSIONINFO*)&osvi))
return FALSE;
else
{
switch (osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win 8"));
if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win 7"));
if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win Vista"));
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win 2003"));
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win XP"));
if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win 2000"));
if ( osvi.dwMajorVersion <= 4 )
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win NT"));
break;
case VER_PLATFORM_WIN32_WINDOWS:
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win 95"));
if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
_tcscpy_s(tzSystem,_countof(tzSystem),_T("Win 98"));
break;
}
}
_stprintf_s(Info.cOS,_T("%s SP%d (Build %d)"),tzSystem,osvi.wServicePackMajor,osvi.dwBuildNumber);
2014-2-20 04:57
0
雪    币: 5
活跃值: (311)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
可能是被编译器优化了,切换到反汇编看下了.
2014-2-20 08:25
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
      argument] ...
);

看懂了么? 自己把函数用错了。
2014-2-20 09:00
0
雪    币: 234
活跃值: (217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
帖汇编看看
2014-2-20 09:15
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
if (5==os.dwMajorVersion&&1==os.dwMinorVersion&&768==(long)*(short*)SPNum)
肯定是运算符优先级的问题,要不你弄清运算符的优先级(baidu),要不直接用"()"把关系表示清楚(最直接)。
2014-2-20 09:42
0
雪    币: 70
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我没看到你的问题,但我看到你熬夜了,都是凌晨的大侠啊。
2014-2-20 10:40
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CHAR和INT是(long)*(short*)SPNum这样转? 第一次发现。
2014-2-20 10:56
0
雪    币: 22
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=Addictions;1262517]CHAR和INT是(long)*(short*)SPNum这样转? 第一次发现。[/QUOTE]

我也不想这样写,但是RegQueryValueExA读取到的REG_DWORD类型的值如果不这样转死活都不正确,这种转法是我在百度上面查的,我也不知道为什么.
2014-2-20 13:16
0
雪    币: 22
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
原来还有wServicePackMajor这个成员,谢谢大侠的指点,我知道该怎么改了
2014-2-20 13:26
0
雪    币: 2664
活跃值: (3400)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
11
直接这样就行了
int GetSys_ver()
{
        OSVERSIONINFOEX osver;  
        osver.dwOSVersionInfoSize=sizeof(osver);  
        GetVersionEx((OSVERSIONINFO *)&osver);
    int t;
        if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)             //2000
        {
                t = 0;
        }
       
        else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1)        //XP
        {
                t = 1;
        }
       
        else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2)        
        {
                if (GetSystemMetrics(SM_SERVERR2) == 0) //Windows Server 2003
                {
                        t = 2;                                                  
                }
                else                                    //Windows Server 2003 R2
                {
                        t = 3;                              
                }
        }
       
    else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0)        
    {
        if(osver.wProductType ==  VER_NT_WORKSTATION)   //vista
                {
                        t = 4;
                }
                else
                {
                        t = 5;                                      //windows server 2008
                }
    }
       
        else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 1)        
        {
                if(osver.wProductType ==  VER_NT_WORKSTATION)   //windows 7
                {
                        t = 6;
                }
                else
                {
                        t = 7;                                      //windows server 2008 r2
                }
        }
       
        else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 2)        
        {
                if(osver.wProductType ==  VER_NT_WORKSTATION)   //windows 8
                {
                        t = 8;
                }
                else
                {
                        t = 9;                                      //windows server 2012
                }
        }
        else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 3)
        {
                if(osver.wProductType ==  VER_NT_WORKSTATION)   //windows 8.1
                {
                        t = 10;
                }
                else
                {
                        t = 11;                                      //windows server 2012 R2
                }
        }
        else t = 12;                                         //其他版本
       
    return t;
}
2014-2-20 13:36
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
SPSize 不初始化 你后面的代码造成SPSize的初值发生变化 所以变的诡异
2014-2-20 16:18
0
雪    币: 250
活跃值: (81)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
RegQueryValueExA(hKey,"CSDVersion",NULL,&dwType,(LPBYTE)SPNum,&SPSize);
//SPSize未初始化
2014-2-24 11:42
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
RegQueryValueExA(hKey,"CSDVersion",NULL,&dwType,(LPBYTE)SPNum,&SPSize);
//SPSize未初始化
2014-2-24 12:43
0
游客
登录 | 注册 方可回帖
返回
//