windows-nt/Source/XPSP1/NT/public/internal/windows/inc/stdexts.h
2020-09-26 16:20:57 +08:00

123 lines
4.1 KiB
C

/****************************** Module Header ******************************\
* Module Name: stdexts.h
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
* This module contains standard routines for creating sane debuging extensions.
*
* History:
* 11-Apr-1995 Sanfords Created
\***************************************************************************/
#ifdef NOEXTAPI
#undef NOEXTAPI
#endif // !NOEXTAPI
#define NOEXTAPI
#include <wdbgexts.h>
/*
* Preceeding this header the following must have been defined:
* PSTR pszExtName;
*
* This module includes "exts.h" which defines what exported functions are
* supported by each extension and contains all help text and legal option
* information. At a minimum exts.h must have:
DOIT( help
,"help -v [cmd] - Displays this list or gives details on command\n"
," help - To dump short help text on all commands.\n"
" help -v - To dump long help text on all commands.\n"
" help cmd - To dump long help on given command.\n"
,"v"
,CUSTOM)
*/
extern HANDLE hCurrentProcess;
extern HANDLE hCurrentThread;
extern DWORD dwCurrentPc;
extern WINDBG_EXTENSION_APIS *lpExtensionApis;
#ifdef KERNEL
extern DWORD dwProcessor;
extern WINDBG_EXTENSION_APIS ExtensionApis;
#endif // KERNEL
#define Print (lpExtensionApis->lpOutputRoutine)
#define OUTAHERE() RtlRaiseStatus(STATUS_NONCONTINUABLE_EXCEPTION);
#define GetSym (lpExtensionApis->lpGetSymbolRoutine)
#define ReadMem (lpExtensionApis->lpReadProcessMemoryRoutine)
#define IsWinDbg() (lpExtensionApis->nSize >= sizeof(WINDBG_EXTENSION_APIS))
#define SAFEWHILE(exp) while (!IsCtrlCHit() && (exp))
extern PSTR pszAccessViolation;
extern PSTR pszMoveException;
extern PSTR pszReadFailure;
#define OPTS_ERROR 0xFFFFFFFF
#define OFLAG(l) (1L << ((DWORD)#@l - (DWORD)'a'))
#define move(dst, src) moveBlock(&(dst), src, sizeof(dst))
#define tryMove(dst, src) tryMoveBlock(&(dst), src, sizeof(dst))
#define tryDword(pdst, src) tryMoveBlock(pdst, src, sizeof(DWORD))
//#define DEBUGPRINT Print // set this when debuging your extensions
#define DEBUGPRINT
VOID moveBlock(PVOID pdst, PVOID src, DWORD size);
BOOL tryMoveBlock(PVOID pdst, PVOID src, DWORD size);
VOID moveExp(PVOID pdst, LPSTR pszExp);
BOOL tryMoveExp(PVOID pdst, LPSTR pszExp);
VOID moveExpValue(PVOID pdst, LPSTR pszExp);
BOOL tryMoveExpValue(PVOID pdst, LPSTR pszExp);
BOOL tryMoveExpPtr(PVOID pdst, LPSTR pszExp);
VOID moveExpValuePtr(PVOID pdst, LPSTR pszExp);
BOOL IsCtrlCHit(VOID);
PVOID OptEvalExp(LPSTR psz);
PVOID OptEvalExp2(LPSTR *ppsz);
DWORD StringToOpts(LPSTR psz);
DWORD GetOpts(LPSTR *ppszArgs, LPSTR pszLegalArgs);
VOID PrintHuge(LPSTR psz);
PVOID EvalExp(LPSTR psz);
/*
* entrypoint function type values
*/
#define NOARGS 0
#define STDARGS0 1
#define STDARGS1 2
#define STDARGS2 3
#define STDARGS3 4
#define STDARGS4 5
#define CUSTOM 9
/*
* worker function prototype types
*/
typedef BOOL (* TYPE_NOARGS)(VOID);
typedef BOOL (* TYPE_STDARGS0)(DWORD);
typedef BOOL (* TYPE_STDARGS1)(DWORD, PVOID);
typedef BOOL (* TYPE_STDARGS2)(DWORD, PVOID, PVOID);
typedef BOOL (* TYPE_STDARGS3)(DWORD, PVOID, PVOID, PVOID);
typedef BOOL (* TYPE_STDARGS4)(DWORD, PVOID, PVOID, PVOID, PVOID);
typedef BOOL (* TYPE_CUSTOM)(DWORD, LPSTR);
/*
* worker function proto-prototypes
*/
#define PROTO_NOARGS(name, opts) BOOL I##name(VOID)
#define PROTO_STDARGS0(name, opts) BOOL I##name(DWORD options)
#define PROTO_STDARGS1(name, opts) BOOL I##name(DWORD options, PVOID param1)
#define PROTO_STDARGS2(name, opts) BOOL I##name(DWORD options, PVOID param1, PVOID param2)
#define PROTO_STDARGS3(name, opts) BOOL I##name(DWORD options, PVOID param1, PVOID param2, PVOID param3)
#define PROTO_STDARGS4(name, opts) BOOL I##name(DWORD options, PVOID param1, PVOID param2, PVOID param3, PVOID param4)
#define PROTO_CUSTOM(name, opts) BOOL I##name(DWORD options, LPSTR pszArg)
/*
* worker function prototypes (generated from exts.h)
*/
#define DOIT(name, h1, h2, opts, type) PROTO_##type(name, opts);
#include "exts.h"
#undef DOIT