[SYSTEMINFO]
[reactos.git] / rosapps / applications / sysutils / systeminfo / systeminfo.c
index d641c20..4950367 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 /* Copyright (C) 2007, Dmitry Chapyshev <lentind@yandex.ru> */
+/* Copyright (C) 2011, Rafal Harabien <rafalh1992@o2.pl> */
 
+#include <wchar.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
 #include <windows.h>
-#include <io.h>
+#include <time.h>
+#include <locale.h>
+#include <lm.h>
+#include <shlwapi.h>
 
 #include "resource.h"
 
 /* Load from resource and convert to OEM */
 static
 BOOL
-GetOemStrings(UINT rcID, LPSTR OutMsg)
+GetOemStrings(UINT rcID, LPWSTR OutMsg)
 {
-       TCHAR Msg[BUFFER_SIZE];
-       if (LoadString(GetModuleHandle(NULL), rcID, (LPTSTR)Msg, BUFFER_SIZE))
-       {
-               CharToOem(Msg, OutMsg);
-               return TRUE;
-       }
-       return FALSE;
+    if (LoadStringW(GetModuleHandle(NULL), rcID, OutMsg, BUFFER_SIZE))
+        return TRUE;
+
+    return FALSE;
 }
 
 /* Load data from registry */
 static
 BOOL
-GetRegistryValue(HKEY hKeyName, LPCTSTR SubKey, LPCTSTR ValueName, LPCTSTR Buf)
+RegGetSZ(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR Buf)
+{
+    DWORD dwBytes = BUFFER_SIZE*sizeof(WCHAR), dwType;
+    BOOL bRet = TRUE;
+
+    /* If SubKy is specified open it */
+    if (lpSubKey && RegOpenKeyExW(hKey,
+                                  lpSubKey,
+                                  0,
+                                  KEY_QUERY_VALUE,
+                                  &hKey) != ERROR_SUCCESS)
+    {
+        wprintf(L"Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError());
+        return FALSE;
+    }
+
+    if (RegQueryValueExW(hKey,
+                         lpValueName,
+                         NULL,
+                         &dwType,
+                         (LPBYTE)Buf,
+                         &dwBytes) != ERROR_SUCCESS || (dwType != REG_SZ && dwType != REG_MULTI_SZ))
+    {
+        wprintf(L"Warning! Cannot query %s. Last error: %lu, type: %lu.\n", lpValueName, GetLastError(), dwType);
+        dwBytes = 0;
+        bRet = FALSE;
+    }
+
+    /* Close key if we opened it */
+    if (lpSubKey)
+        RegCloseKey(hKey);
+
+    /* NULL-terminate string */
+    Buf[min(BUFFER_SIZE-1, dwBytes/sizeof(WCHAR))] = L'\0';
+
+    return bRet;
+}
+
+static
+BOOL
+RegGetDWORD(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPDWORD lpData)
 {
-       DWORD CharCount = BUFFER_SIZE;
-       HKEY hKey;
-       LONG lRet;
-
-       CharCount = BUFFER_SIZE;
-       lRet = RegOpenKeyEx(hKeyName,
-                                               SubKey,
-                                               0,
-                                               KEY_QUERY_VALUE,
-                                               &hKey);
-       if (lRet != ERROR_SUCCESS) return FALSE;
-       lRet = RegQueryValueEx(hKey,
-                                                  ValueName,
-                                                  NULL,
-                                                  NULL,
-                                                  (LPBYTE)Buf,
-                                                  &CharCount);
-       if (lRet != ERROR_SUCCESS) return FALSE;
-       return TRUE;
+    DWORD dwBytes = sizeof(*lpData), dwType;
+    BOOL bRet = TRUE;
+
+    /* If SubKy is specified open it */
+    if (lpSubKey && RegOpenKeyExW(hKey,
+                                 lpSubKey,
+                                 0,
+                                 KEY_QUERY_VALUE,
+                                 &hKey) != ERROR_SUCCESS)
+    {
+        wprintf(L"Warning! Cannot open %s. Last error: %lu.\n", lpSubKey, GetLastError());
+        return FALSE;
+    }
+
+    if (RegQueryValueExW(hKey,
+                         lpValueName,
+                         NULL,
+                         &dwType,
+                         (LPBYTE)lpData,
+                         &dwBytes) != ERROR_SUCCESS || dwType != REG_DWORD)
+    {
+        wprintf(L"Warning! Cannot query %s. Last err: %lu, type: %lu\n", lpValueName, GetLastError(), dwType);
+        *lpData = 0;
+        bRet = FALSE;
+    }
+
+    /* Close key if we opened it */
+    if (lpSubKey)
+        RegCloseKey(hKey);
+
+    return bRet;
+}
+
+static
+void
+FormatBytes(LPWSTR Buf, unsigned cBytes)
+{
+    WCHAR szMB[32];
+    NUMBERFMTW fmt;
+
+    _itow(cBytes / (1024*1024), szMB, 10);
+
+    fmt.NumDigits = 0;
+    fmt.LeadingZero = 0;
+    fmt.Grouping = 3;
+    fmt.lpDecimalSep = L"";
+    fmt.lpThousandSep = L" ";
+    fmt.NegativeOrder = 0;
+
+    if(!GetNumberFormatW(LOCALE_SYSTEM_DEFAULT, 0, szMB, &fmt, Buf, BUFFER_SIZE))
+        wprintf(L"Error! GetNumberFormat failed.\n");
+}
+
+static
+void
+FormatDateTime(time_t Time, LPWSTR lpBuf)
+{
+    unsigned cchBuf = BUFFER_SIZE, i;
+    SYSTEMTIME SysTime;
+    const struct tm *lpTm;
+
+    lpTm = localtime(&Time);
+    SysTime.wYear = (WORD)(1900 + lpTm->tm_year);
+    SysTime.wMonth = (WORD)(1 + lpTm->tm_mon);
+    SysTime.wDayOfWeek = (WORD)lpTm->tm_wday;
+    SysTime.wDay = (WORD)lpTm->tm_mday;
+    SysTime.wHour = (WORD)lpTm->tm_hour;
+    SysTime.wMinute = (WORD)lpTm->tm_min;
+    SysTime.wSecond = (WORD)lpTm->tm_sec;
+    SysTime.wMilliseconds = 0;
+
+    /* Time first */
+    i = GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf, cchBuf);
+    if (i)
+        --i; /* don't count NULL character */
+
+    /* Time now */
+    i += swprintf(lpBuf + i, L", ");
+    GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, 0, &SysTime, NULL, lpBuf + i, cchBuf - i);
 }
 
 /* Show usage */
@@ -71,298 +171,345 @@ static
 VOID
 Usage(VOID)
 {
-       TCHAR Buf[BUFFER_SIZE];
-       if(GetOemStrings(IDS_USAGE,Buf)) printf("%s",Buf);
+    WCHAR Buf[BUFFER_SIZE];
+
+    if(GetOemStrings(IDS_USAGE, Buf))
+        wprintf(L"%s", Buf);
 }
 
 /* Print all system information */
 VOID
 AllSysInfo(VOID)
 {
-       DWORD CharCount = BUFFER_SIZE;
-       OSVERSIONINFO VersionInfo;
-       BOOL bOsVersionInfoEx;
-       SYSTEM_INFO SysInfo;
-       TCHAR Buf[BUFFER_SIZE],Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE];
-       MEMORYSTATUS memory;
-       unsigned int DIV = 1024;
-       TIME_ZONE_INFORMATION TimeZoneInfo;
-
-       GetSystemInfo(&SysInfo);
-
-       // getting computer name
-       CharCount = BUFFER_SIZE;
-       if(!GetComputerName(Buf,&CharCount)) printf("Error getting: GetComputerName");
-               if(GetOemStrings(IDS_HOST_NAME,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting OS Name
-       GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                        TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                        TEXT("ProductName"),
-                                        Buf);
-               if(GetOemStrings(IDS_OS_NAME,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting OS Version
-       ZeroMemory(&VersionInfo, sizeof(OSVERSIONINFO));
-       VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-       if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*)&VersionInfo)))
-       {
-               VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-               if (!GetVersionEx((OSVERSIONINFO*)&VersionInfo))
-               return;
-       }
-       if (VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
-       {
-               if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                        TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                                        TEXT("CSDVersion"),
-                                                        Buf))
-                        if(GetOemStrings(IDS_OS_VERSION,Msg))
-                        fprintf(stderr, Msg,
-                                       (int)VersionInfo.dwMajorVersion,
-                                       (int)VersionInfo.dwMinorVersion,
-                                       (int)VersionInfo.dwBuildNumber,
-                                       Buf);
-               if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                        TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                                        TEXT("CurrentBuildNumber"),
-                                                        Buf))
-                       if(GetOemStrings(IDS_OS_BUILD,Msg)) fprintf(stderr,Msg,Buf);
-       }
-
-       //getting OS Manufacturer
-
-       //getting OS Configuration
-
-       //getting OS Build Type
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                                TEXT("CurrentType"),
-                                                Buf))
-               if(GetOemStrings(IDS_OS_BUILD_TYPE,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Registered Owner
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                                TEXT("RegisteredOwner"),
-                                                Buf))
-               if(GetOemStrings(IDS_REG_OWNER,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Registered Organization
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                                TEXT("RegisteredOrganization"),
-                                                Buf))
-               if(GetOemStrings(IDS_REG_ORG,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Product ID
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),
-                                                TEXT("ProductId"),
-                                                Buf))
-               if(GetOemStrings(IDS_PRODUCT_ID,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Install Date
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"),
-                                                TEXT("SetupDate"),
-                                                Buf))
-               if(GetOemStrings(IDS_INST_DATE,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Install Time
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\WBEM\\CIMOM"),
-                                                TEXT("SetupTime"),
-                                                Buf))
-               if(GetOemStrings(IDS_INST_TIME,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting System Up Time
-
-       //getting System Manufacturer
-
-       //getting System Model
-
-       //getting System type
-       switch (SysInfo.wProcessorArchitecture)
-       {
-               case PROCESSOR_ARCHITECTURE_UNKNOWN:
-                       if(GetOemStrings(IDS_SYS_TYPE_UNKNOWN,Msg)) printf("%s",Msg);
-               break;
-               case PROCESSOR_ARCHITECTURE_INTEL:
-                       if(GetOemStrings(IDS_SYS_TYPE_X86,Msg)) printf("%s",Msg);
-               break;
-               case PROCESSOR_ARCHITECTURE_IA64:
-                       if(GetOemStrings(IDS_SYS_TYPE_IA64,Msg)) printf("%s",Msg);
-               break;
-               case PROCESSOR_ARCHITECTURE_AMD64:
-                       if(GetOemStrings(IDS_SYS_TYPE_AMD64,Msg)) printf("%s",Msg);
-               break;
-       }
-
-       //getting Processor(s)
-       if(GetOemStrings(IDS_PROCESSORS,Msg))
-       {
-               unsigned int i;
-               fprintf(stderr,Msg,(unsigned int)SysInfo.dwNumberOfProcessors);
-               for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++)
-               {
-                       sprintf(Tmp,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u",i);
-                       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                               (LPCTSTR)Tmp,
-                                                               TEXT("Identifier"),
-                                                               Buf))
-                               printf("                                [0%u]: %s",i+1,Buf);
-                       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                               (LPCTSTR)Tmp,
-                                                               TEXT("VendorIdentifier"),
-                                                               Buf))
-                               printf(" %s\n",Buf);
-               }
-       }
-
-       //getting BIOS Version
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("HARDWARE\\DESCRIPTION\\System"),
-                                                TEXT("SystemBiosVersion"),
-                                                Buf))
-               if(GetOemStrings(IDS_BIOS_VERSION,Msg)) fprintf(stderr,Msg,Buf);
-
-       //gettings BIOS date
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("HARDWARE\\DESCRIPTION\\System"),
-                                                TEXT("SystemBiosDate"),
-                                                Buf))
-               if(GetOemStrings(IDS_BIOS_DATE,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting ReactOS Directory
-       if(!GetWindowsDirectory(Buf,BUFFER_SIZE)) printf("Error getting: GetWindowsDirectory");
-               if(GetOemStrings(IDS_ROS_DIR,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting System Directory
-       if(!GetSystemDirectory(Buf,BUFFER_SIZE)) printf("Error getting: GetSystemDirectory");
-               if(GetOemStrings(IDS_SYS_DIR,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Boot Device
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SYSTEM\\Setup"),
-                                                TEXT("SystemPartition"),
-                                                Buf))
-               if(GetOemStrings(IDS_BOOT_DEV,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting System Locale
-       if (GetRegistryValue(HKEY_CURRENT_USER,
-                                                TEXT("Control Panel\\International"),
-                                                TEXT("Locale"),
-                                                Tmp))
-       if (GetRegistryValue(HKEY_CLASSES_ROOT,
-                                                TEXT("MIME\\Database\\Rfc1766"),
-                                                (LPTSTR)Tmp,
-                                                Buf))
-               if(GetOemStrings(IDS_SYS_LOCALE,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Input Locale
-       if (GetRegistryValue(HKEY_CURRENT_USER,
-                                                TEXT("Keyboard Layout\\Preload"),
-                                                TEXT("1"),
-                                                Buf))
-       {
-               int i,j;
-               for(j = 0, i = 4; i <= 8; j++, i++) Tmp[j] = Buf[i];
-               if (GetRegistryValue(HKEY_CLASSES_ROOT,
-                                                        TEXT("MIME\\Database\\Rfc1766"),
-                                                        (LPTSTR)Tmp,
-                                                        Buf))
-                       if(GetOemStrings(IDS_INPUT_LOCALE,Msg)) fprintf(stderr,Msg,Buf);
-       }
-
-       //getting Time Zone
-       GetTimeZoneInformation(&TimeZoneInfo);
-       sprintf(Tmp,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\%S",TimeZoneInfo.StandardName);
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                (LPCTSTR)Tmp,
-                                                TEXT("Display"),
-                                                Buf))
-               if(GetOemStrings(IDS_TIME_ZONE,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Total Physical Memory
-       GlobalMemoryStatus(&memory);
-       if(GetOemStrings(IDS_TOTAL_PHYS_MEM,Msg))
-               fprintf(stderr,
-                               Msg,
-                               memory.dwTotalPhys/(DIV*DIV),
-                               memory.dwTotalPhys/DIV);
-
-       //getting Available Physical Memory
-       if(GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg))
-               fprintf(stderr,
-                               Msg,
-                               memory.dwAvailPhys/(DIV*DIV),
-                               memory.dwAvailPhys/DIV);
-
-       //getting Virtual Memory: Max Size
-       if(GetOemStrings(IDS_VIRT_MEM_MAX,Msg))
-               fprintf(stderr,
-                               Msg,
-                               memory.dwTotalVirtual/(DIV*DIV),
-                               memory.dwTotalVirtual/DIV);
-
-       //getting Virtual Memory: Available
-       if(GetOemStrings(IDS_VIRT_MEM_AVAIL,Msg))
-               fprintf(stderr,
-                               Msg,
-                               memory.dwAvailVirtual/(DIV*DIV),
-                               memory.dwAvailVirtual/DIV);
-
-       //getting Virtual Memory: In Use
-       if(GetOemStrings(IDS_VIRT_MEM_INUSE,Msg))
-               fprintf(stderr,
-                               Msg,
-                               (memory.dwTotalVirtual-memory.dwAvailVirtual)/(DIV*DIV),
-                               (memory.dwTotalVirtual-memory.dwAvailVirtual)/DIV);
-
-       //getting Page File Location(s)
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SYSTEM\\ControlSet001\\Control\\Session Manager\\Memory Management"),
-                                                TEXT("PagingFiles"),
-                                                Buf))
-       {
-               int i;
-               for(i = 0; i < strlen((char*)Buf); i++)
-               {
-                       if (Buf[i] == ' ')
-                       {
-                               Buf[i] = '\0';
-                               break;
-                       }
-               }
-               if(GetOemStrings(IDS_PAGEFILE_LOC,Msg)) fprintf(stderr,Msg,Buf);
-       }
-
-       //getting Domain
-       if (GetRegistryValue(HKEY_LOCAL_MACHINE,
-                                                TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
-                                                TEXT("CachePrimaryDomain"),
-                                                Buf))
-               if(GetOemStrings(IDS_DOMINE,Msg)) fprintf(stderr,Msg,Buf);
-
-       //getting Logon Server
-
-       //getting NetWork Card(s)
-       if(GetOemStrings(IDS_NETWORK_CARDS,Msg))
-       {
-
-       }
+    DWORD dwCharCount = BUFFER_SIZE, dwTimestamp;
+    OSVERSIONINFOW VersionInfo;
+    SYSTEM_INFO SysInfo;
+    WCHAR Buf[BUFFER_SIZE], Tmp[BUFFER_SIZE], Msg[BUFFER_SIZE], szSystemDir[MAX_PATH];
+    const WCHAR *lpcszSysType;
+    LPWSTR lpBuffer;
+    NETSETUP_JOIN_STATUS NetJoinStatus;
+    MEMORYSTATUS MemoryStatus;
+    unsigned int cSeconds;
+    TIME_ZONE_INFORMATION TimeZoneInfo;
+    HKEY hKey;
+
+    if (!GetSystemDirectoryW(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0])))
+    {
+        wprintf(L"Error! GetSystemDirectory failed.\n");
+        return;
+    }
+
+    GetSystemInfo(&SysInfo);
+
+    // getting computer name
+    dwCharCount = BUFFER_SIZE;
+    if (!GetComputerNameW(Buf, &dwCharCount))
+        wprintf(L"Error! GetComputerName failed.\n");
+    else if (GetOemStrings(IDS_HOST_NAME, Msg))
+        wprintf(Msg, Buf);
+
+    // open CurrentVersion key
+    if(RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
+                    0,
+                    KEY_QUERY_VALUE,
+                    &hKey) != ERROR_SUCCESS)
+    {
+        wprintf(L"Error! RegOpenKeyEx failed.\n");
+        return;
+    }
+
+    //getting OS Name
+    RegGetSZ(hKey, NULL, L"ProductName", Buf);
+    if (GetOemStrings(IDS_OS_NAME, Msg))
+        wprintf(Msg, Buf);
+
+    //getting OS Version
+    ZeroMemory(&VersionInfo, sizeof(VersionInfo));
+    VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
+    GetVersionExW(&VersionInfo);
+
+    if (GetOemStrings(IDS_OS_VERSION, Msg))
+        wprintf(Msg,
+               (unsigned)VersionInfo.dwMajorVersion,
+               (unsigned)VersionInfo.dwMinorVersion,
+               (unsigned)VersionInfo.dwBuildNumber,
+               VersionInfo.szCSDVersion,
+               (unsigned)VersionInfo.dwBuildNumber);
+
+    //getting OS Manufacturer
+
+    //getting OS Configuration
+
+    //getting OS Build Type
+    RegGetSZ(hKey, NULL, L"CurrentType", Buf);
+    if (GetOemStrings(IDS_OS_BUILD_TYPE, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Registered Owner
+    RegGetSZ(hKey, NULL, L"RegisteredOwner", Buf);
+    if (GetOemStrings(IDS_REG_OWNER, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Registered Organization
+    RegGetSZ(hKey, NULL, L"RegisteredOrganization", Buf);
+    if (GetOemStrings(IDS_REG_ORG, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Product ID
+    RegGetSZ(hKey, NULL, L"ProductId", Buf);
+    if (GetOemStrings(IDS_PRODUCT_ID, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Install Date
+    RegGetDWORD(hKey, NULL, L"InstallDate", &dwTimestamp);
+    FormatDateTime((time_t)dwTimestamp, Buf);
+    if (GetOemStrings(IDS_INST_DATE, Msg))
+        wprintf(Msg, Buf);
+
+    // close Current Version key now
+    RegCloseKey(hKey);
+
+    //getting System Up Time
+    cSeconds = GetTickCount() / 1000;
+    if (GetOemStrings(IDS_UP_TIME, Msg))
+        wprintf(Msg, cSeconds / (60*60*24), (cSeconds / (60*60)) % 24, (cSeconds / 60) % 60, cSeconds % 60);
+
+    //getting System Manufacturer; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Manufacturer for Win >= 6.0
+    swprintf(Tmp, L"%s\\oeminfo.ini", szSystemDir);
+    GetPrivateProfileStringW(L"General",
+                             L"Manufacturer",
+                             L"To Be Filled By O.E.M.",
+                             Buf,
+                             sizeof(Buf)/sizeof(Buf[0]),
+                             Tmp);
+    if (GetOemStrings(IDS_SYS_MANUFACTURER, Msg))
+        wprintf(Msg, Buf);
+
+    //getting System Model; HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OEMInformation\Model for Win >= 6.0
+    GetPrivateProfileStringW(L"General",
+                             L"Model",
+                             L"To Be Filled By O.E.M.",
+                             Buf,
+                             sizeof(Buf)/sizeof(Buf[0]),
+                             Tmp);
+    if (GetOemStrings(IDS_SYS_MODEL, Msg))
+        wprintf(Msg, Buf);
+
+    //getting System type
+    switch (SysInfo.wProcessorArchitecture)
+    {
+        case PROCESSOR_ARCHITECTURE_INTEL:
+            lpcszSysType = L"X86-based PC";
+            break;
+        case PROCESSOR_ARCHITECTURE_IA64:
+            lpcszSysType = L"IA64-based PC";
+            break;
+        case PROCESSOR_ARCHITECTURE_AMD64:
+            lpcszSysType = L"AMD64-based PC";
+            break;
+        default:
+            lpcszSysType = L"Unknown";
+            break;
+    }
+    if (GetOemStrings(IDS_SYS_TYPE, Msg))
+        wprintf(Msg, lpcszSysType);
+
+    //getting Processor(s)
+    if (GetOemStrings(IDS_PROCESSORS, Msg))
+    {
+        unsigned int i;
+        wprintf(Msg, (unsigned int)SysInfo.dwNumberOfProcessors);
+        for(i = 0; i < (unsigned int)SysInfo.dwNumberOfProcessors; i++)
+        {
+            swprintf(Tmp, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%u", i);
+
+            RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"Identifier", Buf);
+            wprintf(L"                        [%02u]: %s", i+1, Buf);
+
+            RegGetSZ(HKEY_LOCAL_MACHINE, Tmp, L"VendorIdentifier", Buf);
+            wprintf(L" %s\n", Buf);
+        }
+    }
+
+    //getting BIOS Version
+    RegGetSZ(HKEY_LOCAL_MACHINE,
+             L"HARDWARE\\DESCRIPTION\\System",
+             L"SystemBiosVersion",
+             Buf);
+    if (GetOemStrings(IDS_BIOS_VERSION, Msg))
+        wprintf(Msg, Buf);
+
+    //gettings BIOS date
+    RegGetSZ(HKEY_LOCAL_MACHINE,
+             L"HARDWARE\\DESCRIPTION\\System",
+             L"SystemBiosDate",
+             Buf);
+    if (GetOemStrings(IDS_BIOS_DATE, Msg))
+        wprintf(Msg, Buf);
+
+    //getting ReactOS Directory
+    if (!GetWindowsDirectoryW(Buf, BUFFER_SIZE))
+        wprintf(L"Error! GetWindowsDirectory failed.");
+    else if (GetOemStrings(IDS_ROS_DIR, Msg))
+        wprintf(Msg, Buf);
+
+    //getting System Directory
+    if (GetOemStrings(IDS_SYS_DIR, Msg))
+        wprintf(Msg, szSystemDir);
+
+    //getting Boot Device
+    RegGetSZ(HKEY_LOCAL_MACHINE,
+             L"SYSTEM\\Setup",
+             L"SystemPartition",
+             Buf);
+    if (GetOemStrings(IDS_BOOT_DEV, Msg))
+        wprintf(Msg, Buf);
+
+    //getting System Locale
+    if (GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_ILANGUAGE, Tmp, BUFFER_SIZE))
+        if (RegGetSZ(HKEY_CLASSES_ROOT,
+                     L"MIME\\Database\\Rfc1766",
+                     Tmp,
+                     Buf))
+        {
+            /* get rid of @filename,resource */
+            lpBuffer = wcschr(Buf, L';');
+            if (lpBuffer)
+                SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL);
+
+            if (GetOemStrings(IDS_SYS_LOCALE, Msg))
+                wprintf(Msg, Buf);
+        }
+
+    //getting Input Locale
+    if (RegGetSZ(HKEY_CURRENT_USER,
+                 L"Keyboard Layout\\Preload",
+                 L"1",
+                 Tmp) && wcslen(Tmp) > 4)
+        if (RegGetSZ(HKEY_CLASSES_ROOT,
+                     L"MIME\\Database\\Rfc1766",
+                     Tmp + 4,
+                     Buf))
+        {
+            /* get rid of @filename,resource */
+            lpBuffer = wcschr(Buf, L';');
+            if (lpBuffer)
+                SHLoadIndirectString(lpBuffer+1, lpBuffer+1, BUFFER_SIZE - (lpBuffer-Buf) - 1, NULL);
+
+            if (GetOemStrings(IDS_INPUT_LOCALE, Msg))
+                wprintf(Msg, Buf);
+        }
+
+    //getting Time Zone
+    GetTimeZoneInformation(&TimeZoneInfo);
+
+    /* Open Time Zones key */
+    if(RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                     L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
+                     0,
+                     KEY_ENUMERATE_SUB_KEYS|KEY_READ,
+                     &hKey) == ERROR_SUCCESS)
+    {
+        unsigned i;
+
+        /* Find current timezone */
+        dwCharCount = 256; // Windows seems to have a bug - it doesnt accept BUFFER_SIZE here
+        for(i = 0; RegEnumKeyExW(hKey, i, Tmp, &dwCharCount, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; ++i, dwCharCount = 255)
+        {
+            RegGetSZ(hKey, Tmp, L"Std", Buf);
+
+            if(!wcscmp(Buf, TimeZoneInfo.StandardName))
+            {
+                RegGetSZ(hKey, Tmp, L"Display", Buf);
+
+                if (GetOemStrings(IDS_TIME_ZONE, Msg))
+                    wprintf(Msg, Buf);
+
+                break;
+            }
+        }
+        RegCloseKey(hKey);
+    }
+
+    //getting Total Physical Memory
+    GlobalMemoryStatus(&MemoryStatus);
+    FormatBytes(Buf, MemoryStatus.dwTotalPhys);
+    if (GetOemStrings(IDS_TOTAL_PHYS_MEM, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Available Physical Memory
+    FormatBytes(Buf, MemoryStatus.dwAvailPhys);
+    if (GetOemStrings(IDS_AVAIL_PHISICAL_MEM,Msg))
+        wprintf(Msg, Buf);
+
+    //getting Virtual Memory: Max Size
+    FormatBytes(Buf, MemoryStatus.dwTotalVirtual);
+    if (GetOemStrings(IDS_VIRT_MEM_MAX, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Virtual Memory: Available
+    FormatBytes(Buf, MemoryStatus.dwAvailVirtual);
+    if (GetOemStrings(IDS_VIRT_MEM_AVAIL, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Virtual Memory: In Use
+    FormatBytes(Buf, MemoryStatus.dwTotalVirtual-MemoryStatus.dwAvailVirtual);
+    if (GetOemStrings(IDS_VIRT_MEM_INUSE, Msg))
+        wprintf(Msg, Buf);
+
+    //getting Page File Location(s)
+    if (RegGetSZ(HKEY_LOCAL_MACHINE,
+                 L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management",
+                 L"PagingFiles",
+                 Buf))
+    {
+        int i;
+
+        for(i = 0; i < strlen((char*)Buf); i++)
+        {
+            if (Buf[i] == TEXT(' '))
+            {
+                Buf[i] = TEXT('\0');
+                break;
+            }
+        }
+
+        if(GetOemStrings(IDS_PAGEFILE_LOC, Msg))
+            wprintf(Msg, Buf);
+    }
+
+    //getting Domain
+    if (NetGetJoinInformation (NULL, &lpBuffer, &NetJoinStatus) == NERR_Success)
+    {
+        if(GetOemStrings(IDS_DOMAIN, Msg))
+            wprintf(Msg, lpBuffer);
+
+        NetApiBufferFree(lpBuffer);
+    }
+
+    //getting Logon Server
+
+    //getting NetWork Card(s)
+    if(GetOemStrings(IDS_NETWORK_CARDS, Msg))
+    {
+
+    }
 }
 
 /* Main program */
 int
 main(int argc, char *argv[])
 {
-       if (argc > 1 && !strcmp(argv[1], "/?"))
-       {
-               Usage();
-               return 0;
-       }
-       AllSysInfo();
-       return 0;
+    setlocale(LC_ALL, "");
+
+    if (argc > 1 && (!strcmp(argv[1], "/?") || !strcmp(argv[1], "-?")))
+    {
+        Usage();
+        return 0;
+    }
+
+    AllSysInfo();
+
+    return 0;
 }