273 lines
7.9 KiB
C++
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_
|