Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

118 lines
3.3 KiB

//----------------------------------------------------------------------------
//
// Thread abstraction.
//
// Copyright (C) Microsoft Corporation, 2001-2002.
//
//----------------------------------------------------------------------------
#ifndef __THREAD_HPP__
#define __THREAD_HPP__
// In kernel mode the index is a processor index. In user
// dumps it's the thread index in the dump.
#define VIRTUAL_THREAD_HANDLE(Index) ((ULONG64)((Index) + 1))
#define VIRTUAL_THREAD_INDEX(Handle) ((ULONG)((Handle) - 1))
#define VIRTUAL_THREAD_ID(Index) ((Index) + 1)
#define CURRENT_PROC \
(g_Thread ? VIRTUAL_THREAD_INDEX(g_Thread->m_Handle) : (ULONG)-1)
extern ThreadInfo* g_SelectedThread;
enum SELECT_EXECUTION_THREAD
{
SELTHREAD_ANY,
SELTHREAD_THREAD,
SELTHREAD_INTERNAL_THREAD,
};
extern SELECT_EXECUTION_THREAD g_SelectExecutionThread;
struct EventString
{
EventString* Next;
char String[1];
};
//----------------------------------------------------------------------------
//
// ThreadInfo.
//
//----------------------------------------------------------------------------
#define MAX_DATA_BREAKS 4
class ThreadInfo
{
public:
ThreadInfo(class ProcessInfo* Process,
ULONG SystemId,
ULONG64 DataOffset,
ULONG64 Handle,
ULONG Flags,
ULONG64 StartOffset);
~ThreadInfo(void);
class ProcessInfo* m_Process;
// Generic information.
ThreadInfo* m_Next;
ULONG m_UserId;
ULONG m_SystemId;
BOOL m_Exited;
ULONG64 m_DataOffset;
// For kernel mode and dumps the thread handle is
// a virtual handle.
ULONG64 m_Handle;
ULONG m_Flags;
// Only set by VCPP exceptions.
char m_Name[MAX_THREAD_NAME];
class Breakpoint* m_DataBreakBps[MAX_DATA_BREAKS];
ULONG m_NumDataBreaks;
EventString* m_EventStrings;
// Only partially-implemented in kd.
ULONG64 m_StartOffset;
BOOL m_Frozen;
ULONG m_SuspendCount;
ULONG m_FreezeCount;
ULONG m_InternalFreezeCount;
EventString* AllocEventString(ULONG Len);
void AppendEventString(EventString* EventStr);
HRESULT AddEventString(PSTR String);
void ClearEventStrings(void);
void OutputEventStrings(void);
void OutputTimes(void);
void PrepareForExecution(void);
HRESULT GetTlsSlotAddress(ULONG Index, PULONG64 Addr);
};
ThreadInfo* FindAnyThreadByUserId(ULONG Id);
void SetCurrentThread(ThreadInfo* Thread, BOOL Hidden);
void SetCurrentProcessorThread(TargetInfo* Target,
ULONG Processor, BOOL Hidden);
void SaveSetCurrentProcessorThread(TargetInfo* Target,
ULONG Processor);
void RestoreCurrentProcessorThread(TargetInfo* Target);
#define SPT_DEFAULT_OCI_FLAGS \
(OCI_SYMBOL | OCI_DISASM | OCI_FORCE_EA | OCI_ALLOW_SOURCE | \
OCI_ALLOW_REG)
void SetPromptThread(ThreadInfo* pThread, ULONG uOciFlags);
void ParseThreadCmds(DebugClient* Client);
BOOL IsSelectedExecutionThread(ThreadInfo* Thread,
SELECT_EXECUTION_THREAD Type);
void SelectExecutionThread(ThreadInfo* Thread,
SELECT_EXECUTION_THREAD Type);
BOOL ThreadWillResume(ThreadInfo* Thread);
#endif // #ifndef __THREAD_HPP__