windows-nt/Source/XPSP1/NT/sdktools/debuggers/windbg/wrkspace.h
2020-09-26 16:20:57 +08:00

380 lines
10 KiB
C++

//----------------------------------------------------------------------------
//
// Workspace support.
//
// Copyright (C) Microsoft Corporation, 2000-2001.
//
//----------------------------------------------------------------------------
#ifndef __WRKSPACE_H__
#define __WRKSPACE_H__
//----------------------------------------------------------------------------
//
// A workspace tag is a two-deep tag hierarchy. The group portion
// of the tag allows related items to be collected into a single group.
//
//----------------------------------------------------------------------------
typedef ULONG WSP_TAG;
// Sixteen bits for the group.
#define WSP_GROUP_MASK 0xffff0000
#define WSP_GROUP_SHIFT 16
#define WSP_GROUP_BITS 16
// Sixteen bits for the item.
#define WSP_ITEM_MASK 0x0000ffff
#define WSP_ITEM_SHIFT 0
#define WSP_ITEM_BITS 16
#define WSP_TAG_MASK (WSP_GROUP_MASK | WSP_ITEM_MASK)
#define DEF_WSP_GROUP_TAG(Tag, Group) \
((Group) << WSP_GROUP_SHIFT)
#define ADD_WSP_ITEM_TAG(Tag, Item) \
((Tag) | (Item))
#define DEF_WSP_TAG(Group, Item) \
(((Group) << WSP_GROUP_SHIFT) | (Item))
#define WSP_TAG_GROUP(Tag) \
(((Tag) & WSP_GROUP_MASK) >> WSP_GROUP_SHIFT)
#define WSP_TAG_ITEM(Tag) \
(((Tag) & WSP_ITEM_MASK) >> WSP_ITEM_SHIFT)
// Groups.
enum
{
WSP_GROUP_GLOBAL,
WSP_GROUP_WINDOW,
WSP_GROUP_COLORS,
};
// Global group items.
enum
{
WSP_ITEM_SYMBOL_PATH,
WSP_ITEM_IMAGE_PATH,
WSP_ITEM_SOURCE_PATH,
WSP_ITEM_WINDOW_OPTIONS,
WSP_ITEM_REGISTER_MAP,
WSP_ITEM_BREAKPOINTS,
WSP_ITEM_LOG_FILE,
WSP_ITEM_LOCAL_SOURCE_PATH,
WSP_ITEM_FILTERS,
WSP_ITEM_FIXED_LOGFONT,
WSP_ITEM_TAB_WIDTH,
WSP_ITEM_MRU_LIST,
WSP_ITEM_REPEAT_COMMANDS,
WSP_ITEM_COM_SETTINGS,
WSP_ITEM_1394_SETTINGS,
WSP_ITEM_DISASM_ACTIVATE_SOURCE,
WSP_ITEM_VIEW_TOOL_BAR,
WSP_ITEM_VIEW_STATUS_BAR,
WSP_ITEM_AUTO_CMD_SCROLL,
WSP_ITEM_SRC_FILE_PATH,
WSP_ITEM_EXE_COMMAND_LINE,
WSP_ITEM_EXE_CREATE_FLAGS,
WSP_ITEM_DUMP_FILE_NAME,
WSP_ITEM_ATTACH_KERNEL_FLAGS,
WSP_ITEM_TYPE_OPTIONS,
WSP_ITEM_DUMP_FILE_PATH,
WSP_ITEM_EXE_FILE_PATH,
WSP_GLOBAL_COUNT
};
// Window group items.
// The commonwin items exist largely to allow versioning of the window
// information blob. The actual content is determined
// by the implementation of COMMONWIN_DATA::SetWorkspace.
enum
{
WSP_ITEM_COMMONWIN_1,
WSP_ITEM_FRAME_PLACEMENT,
WSP_ITEM_FRAME_TITLE,
WSP_WINDOW_COUNT
};
// Color group items use the color index as the item value.
//
// Specific tags.
//
#define WSP_GLOBAL_SYMBOL_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_SYMBOL_PATH)
#define WSP_GLOBAL_IMAGE_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_IMAGE_PATH)
#define WSP_GLOBAL_SOURCE_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_SOURCE_PATH)
#define WSP_GLOBAL_WINDOW_OPTIONS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_WINDOW_OPTIONS)
#define WSP_GLOBAL_REGISTER_MAP \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_REGISTER_MAP)
#define WSP_GLOBAL_BREAKPOINTS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_BREAKPOINTS)
#define WSP_GLOBAL_LOG_FILE \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_LOG_FILE)
#define WSP_GLOBAL_LOCAL_SOURCE_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_LOCAL_SOURCE_PATH)
#define WSP_GLOBAL_FILTERS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_FILTERS)
#define WSP_GLOBAL_FIXED_LOGFONT \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_FIXED_LOGFONT)
#define WSP_GLOBAL_TAB_WIDTH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_TAB_WIDTH)
#define WSP_GLOBAL_MRU_LIST \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_MRU_LIST)
#define WSP_GLOBAL_REPEAT_COMMANDS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_REPEAT_COMMANDS)
#define WSP_GLOBAL_COM_SETTINGS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_COM_SETTINGS)
#define WSP_GLOBAL_1394_SETTINGS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_1394_SETTINGS)
#define WSP_GLOBAL_DISASM_ACTIVATE_SOURCE \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_DISASM_ACTIVATE_SOURCE)
#define WSP_GLOBAL_VIEW_TOOL_BAR \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_VIEW_TOOL_BAR)
#define WSP_GLOBAL_VIEW_STATUS_BAR \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_VIEW_STATUS_BAR)
#define WSP_GLOBAL_AUTO_CMD_SCROLL \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_AUTO_CMD_SCROLL)
#define WSP_GLOBAL_SRC_FILE_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_SRC_FILE_PATH)
#define WSP_GLOBAL_EXE_COMMAND_LINE \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_EXE_COMMAND_LINE)
#define WSP_GLOBAL_EXE_CREATE_FLAGS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_EXE_CREATE_FLAGS)
#define WSP_GLOBAL_DUMP_FILE_NAME \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_DUMP_FILE_NAME)
#define WSP_GLOBAL_ATTACH_KERNEL_FLAGS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_ATTACH_KERNEL_FLAGS)
#define WSP_GLOBAL_TYPE_OPTIONS \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_TYPE_OPTIONS)
#define WSP_GLOBAL_DUMP_FILE_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_DUMP_FILE_PATH)
#define WSP_GLOBAL_EXE_FILE_PATH \
DEF_WSP_TAG(WSP_GROUP_GLOBAL, WSP_ITEM_EXE_FILE_PATH)
#define WSP_WINDOW_COMMONWIN_1 \
DEF_WSP_TAG(WSP_GROUP_WINDOW, WSP_ITEM_COMMONWIN_1)
#define WSP_WINDOW_FRAME_PLACEMENT \
DEF_WSP_TAG(WSP_GROUP_WINDOW, WSP_ITEM_FRAME_PLACEMENT)
#define WSP_WINDOW_FRAME_TITLE \
DEF_WSP_TAG(WSP_GROUP_WINDOW, WSP_ITEM_FRAME_TITLE)
// Workspace header for window entries.
struct WSP_COMMONWIN_HEADER
{
WIN_TYPES Type;
ULONG Reserved;
};
//----------------------------------------------------------------------------
//
// A workspace is a dynamic buffer of tagged blobs. Values
// are accessed through the Get/Set methods.
//
// Entries are always eight-byte aligned.
//
// Workspaces can be saved and restored from the registry under
// the windbg workspace key.
//
//----------------------------------------------------------------------------
#define WSP_REG_KEY "Software\\Microsoft\\Windbg\\Workspaces"
enum
{
WSP_NAME_BASE,
WSP_NAME_KERNEL,
WSP_NAME_USER,
WSP_NAME_DUMP,
WSP_NAME_REMOTE,
WSP_NAME_EXPLICIT,
WSP_NAME_COUNT
};
#define MAX_WSP_NAME 256
#define WSP_SIGNATURE 'SWDW'
#define WSP_VERSION 1
struct WSP_HEADER
{
ULONG Signature;
ULONG Version;
};
struct WSP_ENTRY
{
WSP_TAG Tag;
USHORT FullSize;
USHORT DataSize;
};
#define WSP_ENTRY_DATA(Type, Entry) ((Type)((Entry) + 1))
#define WSPF_DIRTY_WRITE 0x00000001
#define WSPF_DIRTY_WINDOWS 0x00000002
#define WSPF_DIRTY_BREAKPOINTS 0x00000004
#define WSPF_DIRTY_LOG_FILE 0x00000008
#define WSPF_DIRTY_PATHS 0x00000010
#define WSPF_DIRTY_FILTERS 0x00000020
#define WSPF_DIRTY_MRU_LIST 0x00000040
#define WSPF_DIRTY_ALL 0x0000007f
#define WSP_APPLY_DEFAULT 0x00000000
#define WSP_APPLY_EXPLICIT 0x00000001
#define WSP_APPLY_AGAIN 0x00000002
class Workspace
{
public:
Workspace(void);
~Workspace(void);
WSP_ENTRY* Get(WSP_TAG Tag);
WSP_ENTRY* GetNext(WSP_ENTRY* Entry, WSP_TAG Tag, WSP_TAG TagMask);
WSP_ENTRY* GetString(WSP_TAG Tag, PSTR Str, ULONG MaxSize);
WSP_ENTRY* GetAllocString(WSP_TAG Tag, PSTR* Str);
WSP_ENTRY* GetBuffer(WSP_TAG Tag, PVOID Buf, ULONG Size);
WSP_ENTRY* GetUlong(WSP_TAG Tag, PULONG Value)
{
return GetBuffer(Tag, Value, sizeof(*Value));
}
WSP_ENTRY* Set(WSP_TAG Tag, ULONG Size);
WSP_ENTRY* SetString(WSP_TAG Tag, PSTR Str);
WSP_ENTRY* SetStrings(WSP_TAG Tag, ULONG Count, PSTR* Strs);
WSP_ENTRY* SetBuffer(WSP_TAG Tag, PVOID Buf, ULONG Size);
WSP_ENTRY* SetUlong(WSP_TAG Tag, ULONG Value)
{
WSP_ENTRY* Entry = SetBuffer(Tag, &Value, sizeof(Value));
return Entry;
}
WSP_ENTRY* Add(WSP_TAG Tag, ULONG Size);
ULONG Delete(WSP_TAG Tag, WSP_TAG TagMask);
void Empty(void);
BOOL IsEmpty(void)
{
return m_DataUsed == sizeof(WSP_HEADER);
}
WSP_HEADER* GetHeader(void)
{
return (WSP_HEADER*)m_Data;
}
BOOL ValidEntry(WSP_ENTRY* Entry)
{
return (PUCHAR)Entry >= m_Data &&
(ULONG)((PUCHAR)Entry - m_Data) < m_DataUsed;
}
WSP_ENTRY* NextEntry(WSP_ENTRY* Entry)
{
if (Entry == NULL)
{
Entry = (WSP_ENTRY*)(m_Data + sizeof(WSP_HEADER));
}
else
{
Entry = (WSP_ENTRY*)((PUCHAR)Entry + Entry->FullSize);
}
if (ValidEntry(Entry))
{
return Entry;
}
else
{
return NULL;
}
}
ULONG GetFlags(void)
{
return m_Flags;
}
void SetFlags(ULONG Flags, ULONG Mask)
{
m_Flags = (m_Flags & ~Mask) | (Flags & Mask);
}
void AddDirty(ULONG Flags)
{
m_Flags |= Flags;
}
void ClearDirty(void)
{
m_Flags &= ~WSPF_DIRTY_ALL;
}
ULONG GetKey(void)
{
return m_Key;
}
PTSTR GetValue(void)
{
return m_Value;
}
static HRESULT Create(ULONG Key, PTSTR Value,
Workspace** NewWsp);
static HRESULT Read(ULONG Key, PTSTR Value,
Workspace** NewWsp);
HRESULT ChangeName(ULONG Key, PTSTR Value, BOOL Force);
HRESULT Flush(BOOL ForceSave, BOOL Cancellable);
void UpdateBreakpointInformation(void);
void UpdateWindowInformation(void);
void UpdateLogFileInformation(void);
void UpdatePathInformation(void);
void UpdateFilterInformation(void);
void UpdateMruListInformation(void);
HRESULT WriteReg(void);
void DeleteReg(BOOL Primary);
static void DeleteRegKey(BOOL Primary, ULONG Key, PTSTR Value);
int Apply(ULONG Flags);
private:
ULONG m_Flags;
PUCHAR m_Data;
ULONG m_DataLen;
ULONG m_DataUsed;
ULONG m_Key;
PTSTR m_Value;
void PackData(PUCHAR Dst, ULONG Len)
{
PUCHAR Src = Dst + Len;
memmove(Dst, Src, m_DataUsed - (ULONG)(Src - m_Data));
m_DataUsed -= Len;
}
WSP_ENTRY* AllocateEntry(ULONG FullSize);
static void GetKeyName(ULONG Key, PSTR KeyName);
static HKEY OpenKey(BOOL Primary, ULONG Key, BOOL Create);
};
// The current workspace.
extern Workspace* g_Workspace;
extern BOOL g_ExplicitWorkspace;
extern char* g_WorkspaceKeyNames[];
extern char* g_WorkspaceDefaultName;
extern char* g_WorkspaceKeyDescriptions[];
HRESULT UiSwitchWorkspace(ULONG Key, PTSTR Value, BOOL Create,
ULONG Flags, int* SessionStarts);
HRESULT UiDelayedSwitchWorkspace(void);
void EngSwitchWorkspace(ULONG Key, PTSTR Value);
PSTR GetWspTagName(WSP_TAG Tag);
#endif // #ifndef __WRKSPACE_H__