Windows-Server-2003/sdktools/debuggers/ntsd64/util.h

273 lines
7.9 KiB
C++

//----------------------------------------------------------------------------
//
// General utility functions.
//
// Copyright (C) Microsoft Corporation, 1997-2002.
//
//----------------------------------------------------------------------------
#ifndef _UTIL_H_
#define _UTIL_H_
// error codes
#define OVERFLOW 0x1000
#define SYNTAX 0x1001
#define BADRANGE 0x1002
#define VARDEF 0x1003
#define EXTRACHARS 0x1004
#define LISTSIZE 0x1005
#define STRINGSIZE 0x1006
#define MEMORY 0x1007
#define BADREG 0x1008
#define BADOPCODE 0x1009
#define SUFFIX 0x100a
#define OPERAND 0x100b
#define ALIGNMENT 0x100c
#define PREFIX 0x100d
#define DISPLACEMENT 0x100e
#define BPLISTFULL 0x100f
#define BPDUPLICATE 0x1010
#define BADTHREAD 0x1011
#define DIVIDE 0x1012
#define TOOFEW 0x1013
#define TOOMANY 0x1014
#define BADSIZE 0x1015
#define BADSEG 0x1016
#define RELOC 0x1017
#define BADPROCESS 0x1018
#define AMBIGUOUS 0x1019
#define FILEREAD 0x101a
#define LINENUMBER 0x101b
#define BADSEL 0x101c
#define SYMTOOSMALL 0x101d
#define BPIONOTSUP 0x101e
#define NOTFOUND 0x101f
#define SESSIONNOTSUP 0x1020
#define BADSYSTEM 0x1021
#define NOMEMORY 0x1022
#define TYPECONFLICT 0x1023
#define TYPEDATA 0x1024
#define NOTMEMBER 0x1025
#define IMPLERR 0x1026
#define ENGBUSY 0x1027
#define TARGETNOTSUP 0x1028
#define NORUNNABLE 0x1029
#define NOTSECURE 0x102a
#define UNIMPLEMENT 0x1099
extern PCSTR g_DefaultLogFileName;
extern char g_OpenLogFileName[];
extern BOOL g_OpenLogFileAppended;
extern int g_LogFile;
extern ULONG g_DisableErrorPrint;
extern char g_Blanks[];
ULONG CheckUserInterrupt(void);
BOOL PollUserInterrupt(BOOL AllowPendingBreak);
LONG MappingExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo);
void RemoveDelChar(PSTR Buffer);
ULONG64 HexValue(ULONG Size);
void HexList(PUCHAR Buffer, ULONG BufferSize,
ULONG EltSize, PULONG CountRet);
ULONG64 FloatValue(ULONG Size);
void FloatList(PUCHAR Buffer, ULONG BufferSize,
ULONG EltSize, PULONG CountRet);
void AsciiList(PSTR Buffer, ULONG BufferSize,
PULONG CountRet);
#define STRV_SPACE_IS_SEPARATOR 0x00000001
#define STRV_TRIM_TRAILING_SPACE 0x00000002
#define STRV_ALLOW_ESCAPED_CHARACTERS 0x00000004
#define STRV_COMPRESS_ESCAPED_CHARACTERS 0x00000008
#define STRV_ALLOW_EMPTY_STRING 0x00000010
#define STRV_NO_MODIFICATION 0x00000020
#define STRV_ESCAPED_CHARACTERS \
(STRV_ALLOW_ESCAPED_CHARACTERS | STRV_COMPRESS_ESCAPED_CHARACTERS)
PSTR BufferStringValue(PSTR* Buf, ULONG Flags,
PULONG Len, PCHAR Save);
PSTR StringValue(ULONG Flags, PCHAR Save);
void CompressEscapes(PSTR Str);
PCSTR ErrorString(ULONG Code);
void DECLSPEC_NORETURN ReportError(ULONG Code, PCSTR* Desc);
inline void DECLSPEC_NORETURN ErrorDesc(ULONG Code, PCSTR Desc)
{
ReportError(Code, &Desc);
}
#define error(Code) ReportError(Code, NULL)
void OpenLogFile(PCSTR File, BOOL Append);
void CloseLogFile(void);
void ParseLogOpen(BOOL Append);
void lprintf(PCSTR Str);
#define SYMADDR_FORCE 0x00000001
#define SYMADDR_LABEL 0x00000002
#define SYMADDR_SOURCE 0x00000004
#define SYMADDR_OFFSET 0x00000008
void OutputSymAddr(ULONG64 Offset,
ULONG Flags,
PCSTR Prefix);
BOOL OutputLineAddr(ULONG64 Offset,
PCSTR Format);
LPSTR FormatMachineAddr64(MachineInfo* Machine,
ULONG64 Addr);
#define FormatAddr64(Addr) \
FormatMachineAddr64(g_Target ? g_Target->m_Machine : NULL, Addr)
LPSTR FormatDisp64(ULONG64 Addr);
//
// Output that can be displayed about the current register set.
//
void OutCurInfo(ULONG Flags, ULONG AllMask, ULONG RegMask);
// Items displayed if the flag is given.
// Display symbol nearest PC.
#define OCI_SYMBOL 0x00000001
// Display disassembly at PC.
#define OCI_DISASM 0x00000002
// Items which may be displayed if the flag is given. Other global
// settings ultimately control whether information is displayed or not;
// these flags indicate whether such output is allowed or not. Each
// of these flags also has a FORCE bit to force display regardless of
// the global settings.
// Allow registers to be displayed.
#define OCI_ALLOW_REG 0x00000004
// Allow display of source code and/or source line.
#define OCI_ALLOW_SOURCE 0x00000008
// Allow EA memory to be displayed during disasm.
#define OCI_ALLOW_EA 0x00000010
// Force all output to be shown regardless of global settings.
#define OCI_FORCE_ALL 0x80000000
// Force display of registers.
#define OCI_FORCE_REG 0x40000000
// Force source output.
#define OCI_FORCE_SOURCE 0x20000000
// Force display of EA memory during disasm.
#define OCI_FORCE_EA 0x10000000
// Don't check for running state.
#define OCI_IGNORE_STATE 0x08000000
BOOL
__inline
ConvertQwordsToDwords(
PULONG64 Qwords,
PULONG Dwords,
ULONG Count
)
{
BOOL rval = TRUE;
while (Count--) {
rval = rval && (*Qwords >> 32) == 0;
*Dwords++ = (ULONG)*Qwords++;
}
return rval;
}
DWORD
NetworkPathCheck(
LPCSTR PathList
);
#define ALL_ID_LIST 0xffffffff
ULONG GetIdList(BOOL AllowMulti);
void AppendComponentsToPath(PSTR Path, PCSTR Components,
BOOL Validate);
HRESULT ChangePath(PSTR* Path, PCSTR New, BOOL Append, ULONG SymNotify);
void CheckPath(PCSTR Path);
HRESULT ChangeString(PSTR* Str, PULONG StrLen, PCSTR New);
void
ExceptionRecordTo64(PEXCEPTION_RECORD Rec,
PEXCEPTION_RECORD64 Rec64);
void
ExceptionRecord64To(PEXCEPTION_RECORD64 Rec64,
PEXCEPTION_RECORD Rec);
void
MemoryBasicInformationTo64(PMEMORY_BASIC_INFORMATION Mbi,
PMEMORY_BASIC_INFORMATION64 Mbi64);
void
MemoryBasicInformation32To64(PMEMORY_BASIC_INFORMATION32 Mbi32,
PMEMORY_BASIC_INFORMATION64 Mbi64);
void
DebugEvent32To64(LPDEBUG_EVENT32 Event32,
LPDEBUG_EVENT64 Event64);
void
WaitStateChange32ToAny(IN PDBGKD_WAIT_STATE_CHANGE32 Ws32,
IN ULONG ControlReportSize,
OUT PDBGKD_ANY_WAIT_STATE_CHANGE WsAny);
PSTR TimeToStr(ULONG TimeDateStamp);
PSTR LONG64FileTimeToStr(LONG64 UTCFileTimeStamp);
PSTR FileTimeToStr(FILETIME UTCFileTime);
PSTR DurationToStr(ULONG64 Duration);
PCSTR PathTail(PCSTR Path);
PCWSTR PathTailW(PCWSTR Path);
BOOL MatchPathTails(PCSTR Path1, PCSTR Path2, BOOL Wild);
BOOL IsValidName(PSTR String);
BOOL MakeFileNameUnique(PSTR OriginalName,
PSTR Buffer, ULONG BufferChars,
BOOL AppendTime, ProcessInfo* Pid);
BOOL GetEngineDirectory(PSTR Buffer, ULONG BufferChars);
BOOL IsInternalPackage(void);
void TranslateNtPathName(PSTR Path);
class ShellProcess
{
public:
ShellProcess(void);
~ShellProcess(void);
DWORD ReaderThread(void);
static DWORD WINAPI ReaderThreadCb(LPVOID Param);
static BOOL CreateAsyncPipePair(OUT LPHANDLE ReadPipe,
OUT LPHANDLE WritePipe,
IN LPSECURITY_ATTRIBUTES SecAttr,
IN DWORD Size,
IN DWORD ReadMode,
IN DWORD WriteMode);
HRESULT Start(PCSTR CmdString,
PCSTR InFile,
PCSTR OutFile,
PCSTR ErrFile);
void WaitForProcessExit(void);
void Close(void);
HANDLE m_IoIn, m_IoOut;
HANDLE m_ProcIn, m_ProcOut, m_ProcErr;
HANDLE m_IoSignal;
HANDLE m_ProcThread, m_Process;
HANDLE m_ReaderThread;
ULONG m_DefaultTimeout;
static ULONG s_PipeSerialNumber;
};
#endif // #ifndef _UTIL_H_