Search code examples
c++typeswindows-7registry

Convert REG_BINARY data to REG_TZI_FORMAT


I'm trying to pull time zone information out of the registry so I can perform a time conversion. The registry data type is REG_BINARY which holds information about a REG_TZI_FORMAT structure. The key is stored at: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows \CurrentVersion\Time Zones\(time_zone_name)

How do I get the REG_BINARY information to convert to the REG_TZI_FORMAT structure? C++, Windows 7 32 bit, VS 2008


Solution

  • You can do this with the following code:

    #include <Windows.h>
    #include <stdio.h>
    #include <tchar.h>
    
    // see http://msdn.microsoft.com/en-us/library/ms724253.aspx for description
    typedef struct _REG_TZI_FORMAT
    {
        LONG Bias;
        LONG StandardBias;
        LONG DaylightBias;
        SYSTEMTIME StandardDate;
        SYSTEMTIME DaylightDate;
    } REG_TZI_FORMAT;
    
    int main()
    {
        DWORD dwStatus, dwType, cbData;
        int cch;
        TCHAR szTime[128], szDate[128];
        HKEY hKey;
        REG_TZI_FORMAT tzi;
    
        dwStatus = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
            TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\E. Europe Standard Time"),
            0, KEY_QUERY_VALUE, &hKey);
        if (dwStatus != NO_ERROR)
            return GetLastError();
    
        cbData = sizeof(REG_TZI_FORMAT);
        dwStatus = RegQueryValueEx (hKey, TEXT("TZI"), NULL, &dwType, (LPBYTE)&tzi, &cbData);
        if (dwStatus != NO_ERROR)
            return GetLastError();
    
        _tprintf (TEXT("The current bias: %d\n"), tzi.Bias);
        _tprintf (TEXT("The standard bias: %d\n"), tzi.StandardBias);
        _tprintf (TEXT("The daylight bias: %d\n"), tzi.DaylightBias);
    
        // I don't use GetDateFormat and GetTimeFormat to decode
        // tzi.StandardDate and tzi.DaylightDate because wYear can be 0
        // and in this case it is not real SYSTEMTIME
        // see http://msdn.microsoft.com/en-us/library/ms725481.aspx
    
        return 0;
    }