mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 00:54:40 +00:00
Added missing file and some hex string conversion routines. Now displays registry data.
svn path=/trunk/; revision=3288
This commit is contained in:
parent
11a446cf74
commit
63850f4969
6 changed files with 396 additions and 35 deletions
|
@ -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
153
rosapps/regedit/hex_str.c
Normal 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
30
rosapps/regedit/hex_str.h
Normal 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__
|
||||
///////////////////////////////////////////////////////////////////////////////
|
|
@ -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;
|
||||
|
|
84
rosapps/regedit/trace.c
Normal file
84
rosapps/regedit/trace.c
Normal 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
72
rosapps/regedit/trace.h
Normal 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__
|
||||
/////////////////////////////////////////////////////////////////////////////
|
Loading…
Reference in a new issue