代码之家  ›  专栏  ›  技术社区  ›  ckv

下面代码中win7/Vista与WinXP/Win2k3在内存分配上的差异

  •  0
  • ckv  · 技术社区  · 16 年前

    原因是数组的大小正在溢出。我只定义了100个元素。然而,注册表中有100多个元素。

    它在从注册表获取元素时在行中崩溃

    while( RegEnumKeyEx( Key, nTimezones, tzKeyNames[nTimezones].GetBuffer( size ), &size, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS )
    

     CString    sRegKey;
        HKEY    Key;
        HKEY    subKey;
        int     nTimezones = 0;
        CArray< CString, CString >  tzKeyNames;
    
    tzOffset.SetSize( 100, 10 );
    tzKeyNames.SetSize( 100, 10 );
    tzDisplayNames.SetSize( 100, 10 );
    
    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    GetVersionEx(&osvi);
    
    if( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT )
    {
    sRegKey = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones");
    }
    else
    {
    sRegKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones");
    }
    
    if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, sRegKey, 0, KEY_READ , &Key ) == ERROR_SUCCESS )
    {
        DWORD size;
        DWORD type = REG_SZ;
        TZINFO  tz;
        _TCHAR name[ 128 ];
        BYTE data[ 128 ];
    
        size = 128;
        while( RegEnumKeyEx( Key, nTimezones, tzKeyNames[nTimezones].GetBuffer( size ), &size, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS )
        {
            tzKeyNames[nTimezones].ReleaseBuffer();
    
            if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, sRegKey + _T("\\") + (LPCTSTR)tzKeyNames[nTimezones], 0, KEY_READ , &subKey ) == ERROR_SUCCESS )
            {
                size = 128;
                if( RegQueryValueEx( subKey, _T("Display"), NULL, &type, (unsigned char*)name, &size ) == ERROR_SUCCESS )
                {
                    tzDisplayNames[nTimezones] = name;
                }
    
                size = 128;
                if( RegQueryValueEx( subKey, _T("TZI"), NULL, &type, data, &size ) == ERROR_SUCCESS )
                {
                    memcpy( &tz, data, size );
                    tzOffset[ nTimezones ] = (int)(( tz.Bias / -60.0 ) * 2.0 ) + 24;
                }
                RegCloseKey( subKey );      
            }
            nTimezones++;
        }
        RegCloseKey( Key );     
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   adf88    16 年前

    //编辑

    tzKeyNames[nTimezones].ReleaseBuffer();
    

    问题可能不是在数组结束后读取(通常在寻址空间内),而是读取了一些垃圾。当取消引用导致异常时,此垃圾用作指针。