From: Robert Dickenson Date: Mon, 22 Jul 2002 14:41:40 +0000 (+0000) Subject: Added missing file and some hex string conversion routines. Now displays registry... X-Git-Tag: ReactOS-0.0.20~28 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=63850f49693c477113d3737bab5ae67820268e03 Added missing file and some hex string conversion routines. Now displays registry data. svn path=/trunk/; revision=3288 --- diff --git a/rosapps/regedit/Makefile b/rosapps/regedit/Makefile index 111fb0c4604..63e9f989f08 100644 --- a/rosapps/regedit/Makefile +++ b/rosapps/regedit/Makefile @@ -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 index 00000000000..d617e6dcf46 --- /dev/null +++ b/rosapps/regedit/hex_str.c @@ -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 index 00000000000..b98c71053d8 --- /dev/null +++ b/rosapps/regedit/hex_str.h @@ -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__ +/////////////////////////////////////////////////////////////////////////////// diff --git a/rosapps/regedit/listview.c b/rosapps/regedit/listview.c index 681471d156d..b33ccac4fb8 100644 --- a/rosapps/regedit/listview.c +++ b/rosapps/regedit/listview.c @@ -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 index 00000000000..894408dd5af --- /dev/null +++ b/rosapps/regedit/trace.c @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////// +// Diagnostic Trace +// +#include +#include +#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 +//#include +//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 index 00000000000..bbd863afc1e --- /dev/null +++ b/rosapps/regedit/trace.h @@ -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__ +/////////////////////////////////////////////////////////////////////////////