Added missing file and some hex string conversion routines. Now displays registry data.

svn path=/trunk/; revision=3288
This commit is contained in:
Robert Dickenson 2002-07-22 14:41:40 +00:00
parent 11a446cf74
commit 63850f4969
6 changed files with 396 additions and 35 deletions

View file

@ -35,6 +35,7 @@ OBJS = framewnd.o \
treeview.o \
about.o \
trace.o \
hex_str.o \
main.o
LIBS = -lgdi32 -luser32 -lkernel32 -lcomctl32

153
rosapps/regedit/hex_str.c Normal file
View file

@ -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;
}
///////////////////////////////////////////////////////////////////////////////

30
rosapps/regedit/hex_str.h Normal file
View file

@ -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__
///////////////////////////////////////////////////////////////////////////////

View 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)
@ -296,36 +341,8 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPTSTR keyPath)
}
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;

84
rosapps/regedit/trace.c Normal file
View file

@ -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
/////////////////////////////////////////////////////////////////////////////

72
rosapps/regedit/trace.h Normal file
View file

@ -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__
/////////////////////////////////////////////////////////////////////////////