Added missing file and some hex string conversion routines. Now displays registry...
authorRobert Dickenson <robd@reactos.org>
Mon, 22 Jul 2002 14:41:40 +0000 (14:41 +0000)
committerRobert Dickenson <robd@reactos.org>
Mon, 22 Jul 2002 14:41:40 +0000 (14:41 +0000)
svn path=/trunk/; revision=3288

rosapps/regedit/Makefile
rosapps/regedit/hex_str.c [new file with mode: 0644]
rosapps/regedit/hex_str.h [new file with mode: 0644]
rosapps/regedit/listview.c
rosapps/regedit/trace.c [new file with mode: 0644]
rosapps/regedit/trace.h [new file with mode: 0644]

index 111fb0c..63e9f98 100644 (file)
@@ -35,6 +35,7 @@ OBJS =        framewnd.o \
         treeview.o \
         about.o \
         trace.o \
+        hex_str.o \
         main.o
 
 LIBS = -lgdi32 -luser32 -lkernel32 -lcomctl32
diff --git a/rosapps/regedit/hex_str.c b/rosapps/regedit/hex_str.c
new file mode 100644 (file)
index 0000000..d617e6d
--- /dev/null
@@ -0,0 +1,153 @@
+///////////////////////////////////////////////////////////////////////////////
+// HEX_STR.C
+//  Copyright (c) 1995 by Robert Dickenson
+//
+#include "hex_str.h"
+
+
+#define LOBYTE(w)   ((unsigned char)(w))
+#define HIBYTE(w)   ((unsigned char)((unsigned short)(w) >> 8))
+
+
+unsigned char AsciiTable[256][3] = {
+ "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
+ "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F",
+ "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
+ "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
+ "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F",
+ "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
+ "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F",
+ "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
+ "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
+ "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
+ "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF",
+ "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
+ "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
+ "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF",
+ "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
+ "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
+};
+
+unsigned char HexTable[24] = {
+0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16
+};
+
+unsigned long BinaryNibbles[] = {
+  (unsigned long)"0000",
+  (unsigned long)"0001",
+  (unsigned long)"0010",
+  (unsigned long)"0011",
+  (unsigned long)"0100",
+  (unsigned long)"0101",
+  (unsigned long)"0110",
+  (unsigned long)"0111",
+  (unsigned long)"1000",
+  (unsigned long)"1001",
+  (unsigned long)"1010",
+  (unsigned long)"1011",
+  (unsigned long)"1100",
+  (unsigned long)"1101",
+  (unsigned long)"1110",
+  (unsigned long)"1111"
+};
+
+
+void ByteBinStr(char* dst, unsigned char num)
+{
+  *(unsigned long*)dst++ = BinaryNibbles[(num >> 4) & 0x07];
+  *(unsigned long*)dst++ = BinaryNibbles[num & 0x07];
+}
+
+void WordBinStr(char* dst, unsigned short num)
+{
+  ByteBinStr(dst, HIBYTE(num));
+  ByteBinStr(dst+4, LOBYTE(num));
+}
+
+unsigned short Byte2Hex(unsigned char data)
+{
+  register unsigned short result;
+
+  result  = AsciiTable[data][1] << 8;
+  result += AsciiTable[data][0];
+  return result;
+}
+
+unsigned long Word2Hex(unsigned short data)
+{
+  register unsigned long result;
+
+  result  = (unsigned long)Byte2Hex(LOBYTE(data)) << 16;
+  result += Byte2Hex(HIBYTE(data));
+  return result;
+}
+
+unsigned char HexByte(char* str)
+{
+  register unsigned char result;
+
+  result  = HexTable[*str++ - '0'] * 16;
+  result += HexTable[*str++ - '0'];
+  return result;
+}
+
+unsigned int HexWord(char* str)
+{
+  register unsigned int result;
+
+  result  = HexByte(str) << 8;
+  result += HexByte(str+2);
+  return result;
+}
+
+unsigned long HexLong(char* str)
+{
+  register unsigned long result;
+
+  result  = HexByte(str++) << 24;
+  result += HexByte(str++) << 16;
+  result += HexByte(str++) << 8;
+  result += HexByte(str);
+  return result;
+}
+
+unsigned long HexString(char* str)
+{
+  unsigned long temp = 0;
+
+  while ( *str )
+  {
+    temp <<= 4;
+    switch ( *str++ )
+    {
+      case '0':  break;
+      case '1':  temp += 1;   break;
+      case '2':  temp += 2;   break;
+      case '3':  temp += 3;   break;
+      case '4':  temp += 4;   break;
+      case '5':  temp += 5;   break;
+      case '6':  temp += 6;   break;
+      case '7':  temp += 7;   break;
+      case '8':  temp += 8;   break;
+      case '9':  temp += 9;   break;
+      case 'A':  temp += 10;  break;
+      case 'B':  temp += 11;  break;
+      case 'C':  temp += 12;  break;
+      case 'D':  temp += 13;  break;
+      case 'E':  temp += 14;  break;
+      case 'F':  temp += 15;  break;
+      case 'a':  temp += 10;  break;
+      case 'b':  temp += 11;  break;
+      case 'c':  temp += 12;  break;
+      case 'd':  temp += 13;  break;
+      case 'e':  temp += 14;  break;
+      case 'f':  temp += 15;  break;
+      case 'X':  temp = 0;  break;
+      case 'x':  temp = 0;  break;
+      default:   return temp;
+    }
+  }
+  return temp;
+}
+
+///////////////////////////////////////////////////////////////////////////////
diff --git a/rosapps/regedit/hex_str.h b/rosapps/regedit/hex_str.h
new file mode 100644 (file)
index 0000000..b98c710
--- /dev/null
@@ -0,0 +1,30 @@
+///////////////////////////////////////////////////////////////////////////////
+// HEX_STR.H
+//  Copyright (c) 1995 by Robert Dickenson
+//
+#ifndef __HEX_STR_H__
+#define __HEX_STR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+unsigned short Byte2Hex(unsigned char);
+unsigned long Word2Hex(unsigned short);
+unsigned char HexByte(char*);
+unsigned int HexWord(char*);
+unsigned long HexLong(char*);
+unsigned long HexString(char*);
+
+void ByteBinStr(char*, unsigned char);
+void WordBinStr(char*, unsigned short);
+unsigned long HexString(char*);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __HEX_STR_H__
+///////////////////////////////////////////////////////////////////////////////
index 681471d..b33ccac 100644 (file)
@@ -53,10 +53,12 @@ static int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCF
 ////////////////////////////////////////////////////////////////////////////////
 // Local module support methods
 //
+extern unsigned char AsciiTable[256][3];
 
 static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValBuf, DWORD dwCount)
 { 
     LVITEM item;
+    int index;
 
     item.mask = LVIF_TEXT | LVIF_PARAM; 
     item.iItem = 0;//idx; 
@@ -65,6 +67,8 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB
     item.stateMask = 0; 
     item.pszText = Name; 
     item.cchTextMax = _tcslen(item.pszText); 
+    if (item.cchTextMax == 0)
+        item.pszText = LPSTR_TEXTCALLBACK; 
     item.cchTextMax = 0; 
     item.iImage = 0; 
     item.lParam = (LPARAM)dwValType;
@@ -72,7 +76,48 @@ static void AddEntryToList(HWND hwndLV, LPTSTR Name, DWORD dwValType, void* ValB
 #if (_WIN32_IE >= 0x0300)
     item.iIndent = 0;
 #endif
-    ListView_InsertItem(hwndLV, &item);
+
+    index = ListView_InsertItem(hwndLV, &item);
+    if (index != -1) {
+//        LPTSTR pszText = NULL;
+        LPTSTR pszText = _T("value");
+        switch (dwValType) {
+        case REG_SZ:
+        case REG_EXPAND_SZ:
+            ListView_SetItemText(hwndLV, index, 2, ValBuf);
+            break;
+        case REG_DWORD:
+            {
+                TCHAR buf[64];
+                wsprintf(buf, "0x%08X (%d)", *(DWORD*)ValBuf, *(DWORD*)ValBuf);
+                ListView_SetItemText(hwndLV, index, 2, buf);
+            }
+//            lpsRes = convertHexToDWORDStr(lpbData, dwLen);
+            break;
+        case REG_BINARY:
+            {
+                int i;
+                LPTSTR pData = (LPTSTR)ValBuf;
+                LPTSTR strBinary = malloc(dwCount * sizeof(TCHAR) * 3 + 1);
+                memset(strBinary, _T(' '), dwCount * sizeof(TCHAR) * 3);
+                strBinary[dwCount * sizeof(TCHAR) * 3] = _T('\0');
+                for (i = 0; i < dwCount; i++) {
+                    unsigned short* pShort;
+                    pShort = &(strBinary[i*3]);
+//                    strBinary[i*3] = Byte2Hex((LPTSTR)ValBuf+i);
+//                    *pShort++ = Byte2Hex(*(pData+i));
+                    *pShort = Byte2Hex(*(pData+i));
+                }
+                ListView_SetItemText(hwndLV, index, 2, strBinary);
+                free(strBinary);
+            }
+            break;
+        default:
+//            lpsRes = convertHexToHexCSV(lpbData, dwLen);
+            ListView_SetItemText(hwndLV, index, 2, pszText);
+            break;
+        }
+    }
 }
 
 static void CreateListColumns(HWND hWndListView)
@@ -291,41 +336,13 @@ HWND CreateListView(HWND hwndParent, int id)
 
 BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPTSTR keyPath)
 { 
-        if (hwndLV != NULL) {
-            ListView_DeleteAllItems(hwndLV);
-        }
+    if (hwndLV != NULL) {
+        ListView_DeleteAllItems(hwndLV);
+    }
 
     if (hKey != NULL) {
-        LONG errCode;
         HKEY hNewKey;
-
-
-            DWORD max_sub_key_len;
-            DWORD max_val_name_len;
-            DWORD max_val_size;
-            DWORD val_count;
-            errCode = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL,
-                        &max_sub_key_len, NULL, &val_count, &max_val_name_len, &max_val_size, NULL, NULL);
-            if (errCode == ERROR_SUCCESS) {
-                TCHAR* ValName = malloc(++max_val_name_len * sizeof(TCHAR));
-                DWORD dwValNameLen = max_val_name_len;
-                BYTE* ValBuf = malloc(++max_val_size);
-                DWORD dwValSize = max_val_size;
-                DWORD dwIndex = 0L;
-                DWORD dwValType;
-                while (RegEnumValue(hKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) {
-                    AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwIndex);
-                    dwValNameLen = max_val_name_len;
-                    dwValSize = max_val_size;
-                    dwValType = 0L;
-                    ++dwIndex;
-                }
-                free(ValBuf);
-                free(ValName);
-            }
-
-
-        errCode = RegOpenKeyEx(hKey, keyPath, 0, KEY_READ, &hNewKey);
+        LONG errCode = RegOpenKeyEx(hKey, keyPath, 0, KEY_READ, &hNewKey);
         if (errCode == ERROR_SUCCESS) {
             DWORD max_sub_key_len;
             DWORD max_val_name_len;
@@ -342,9 +359,13 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPTSTR keyPath)
                 DWORD dwValSize = max_val_size;
                 DWORD dwIndex = 0L;
                 DWORD dwValType;
+//                if (RegQueryValueEx(hNewKey, NULL, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) {
+//                    AddEntryToList(hwndLV, _T("(Default)"), dwValType, ValBuf, dwValSize);
+//                }
+//                dwValSize = max_val_size;
                 while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) {
-                //while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, NULL, NULL) == ERROR_SUCCESS) {
-                    AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwIndex);
+                    ValBuf[dwValSize] = NULL;
+                    AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwValSize);
                     dwValNameLen = max_val_name_len;
                     dwValSize = max_val_size;
                     dwValType = 0L;
diff --git a/rosapps/regedit/trace.c b/rosapps/regedit/trace.c
new file mode 100644 (file)
index 0000000..894408d
--- /dev/null
@@ -0,0 +1,84 @@
+/////////////////////////////////////////////////////////////////////////////
+// Diagnostic Trace
+//
+#include <stdio.h> 
+#include <stdarg.h>
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+#include "trace.h"
+
+DeclAssertFile;  // Should be added at the begining of each .C/.CPP
+
+
+#ifdef _DEBUG
+
+#ifdef WIN32
+//#define WIN32_LEAN_AND_MEAN          // Exclude rarely-used stuff from Windows headers
+//#include <windows.h>
+//#include <assert.h>
+//WINBASEAPI VOID WINAPI DebugBreak(VOID);
+//WINBASEAPI VOID WINAPI OutputDebugStringA(LPCSTR lpOutputString);
+//WINBASEAPI VOID WINAPI OutputDebugStringW(LPCWSTR lpOutputString);
+//void __stdcall DebugBreak(void);
+//void __stdcall OutputDebugStringA(char* lpOutputString);
+//void __stdcall OutputDebugStringW(wchar_t* lpOutputString);
+#ifdef UNICODE
+#define OutputDebugString  OutputDebugStringW
+#else
+#define OutputDebugString  OutputDebugStringA
+#endif // !UNICODE
+
+#else
+#include "hardware.h"
+#endif // WIN32
+
+
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+
+void _DebugBreak(void)
+{
+    DebugBreak();
+}
+
+void Trace(TCHAR* lpszFormat, ...)
+{
+    va_list args;
+    int nBuf;
+    TCHAR szBuffer[512];
+
+    va_start(args, lpszFormat);
+//  nBuf = vsprintf(szBuffer, lpszFormat, args);
+//  nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);
+#ifdef _UNICODE
+    nBuf = _vsnwprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
+#else
+    nBuf = _vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
+#endif
+    OutputDebugString(szBuffer);
+    // was there an error? was the expanded string too long?
+//    ASSERT(nBuf >= 0);
+    va_end(args);
+}
+
+void Assert(void* assert, TCHAR* file, int line, void* msg)
+{
+    if (msg == NULL) {
+        printf("ASSERT -- %s occured on line %u of file %s.\n",
+               assert, line, file);
+    } else {
+        printf("ASSERT -- %s occured on line %u of file %s: Message = %s.\n",
+               assert, line, file, msg);
+    }
+}
+
+
+#else
+
+//inline void Trace(TCHAR* lpszFormat, ...) { };
+//inline void Assert(void* assert, TCHAR* file, int line, void* msg) { };
+void Trace(TCHAR* lpszFormat, ...) { };
+void Assert(void* assert, TCHAR* file, int line, void* msg) { };
+
+#endif //_DEBUG
+/////////////////////////////////////////////////////////////////////////////
diff --git a/rosapps/regedit/trace.h b/rosapps/regedit/trace.h
new file mode 100644 (file)
index 0000000..bbd863a
--- /dev/null
@@ -0,0 +1,72 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+#ifndef __TRACE_H__
+#define __TRACE_H__
+
+#ifdef _DEBUG
+
+//=============================================================================
+//  BreakPoint() macro.
+//=============================================================================
+
+#ifdef _X86_
+#define BreakPoint()        _asm { int 3h }
+#else
+#define BreakPoint()        _DebugBreak()
+#endif
+
+//=============================================================================
+//  MACRO: ASSERT()
+//=============================================================================
+
+#ifndef ASSERT
+#define ASSERT(exp)                                 \
+{                                                   \
+    if ( !(exp) )                                   \
+    {                                               \
+        Assert(#exp, __FILE__, __LINE__, NULL);   \
+        BreakPoint();                               \
+    }                                               \
+}                                                   \
+
+#define ASSERTMSG(exp, msg)                         \
+{                                                   \
+    if ( !(exp) )                                   \
+    {                                               \
+        Assert(#exp, __FILE__, __LINE__, msg);    \
+        BreakPoint();                               \
+    }                                               \
+}
+#endif
+
+//=============================================================================
+//  MACRO: TRACE()
+//=============================================================================
+
+void Assert(void* assert, TCHAR* file, int line, void* msg);
+void Trace(TCHAR* lpszFormat, ...);
+void Trace1(int code, TCHAR* lpszFormat, ...);
+
+#define TRACE  Trace
+#define TRACE0 Trace
+
+#else   // _DEBUG
+
+#ifndef ASSERT
+#define ASSERT(exp)
+#define ASSERTMSG(exp, msg)
+#endif
+
+//#define TRACE0 TRACE
+//#define TRACE1 TRACE
+
+void Assert(void* assert, TCHAR* file, int line, void* msg);
+void Trace(TCHAR* lpszFormat, ...);
+
+#define TRACE 0 ? (void)0 : Trace
+
+
+#endif // !_DEBUG
+
+#endif // __TRACE_H__
+/////////////////////////////////////////////////////////////////////////////