Removed uses of u_long. Use void* type for pointers where possible.
[wine] / programs / winedbg / debugger.h
1 /*
2  * Debugger definitions
3  *
4  * Copyright 1995 Alexandre Julliard
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #ifndef __WINE_DEBUGGER_H
22 #define __WINE_DEBUGGER_H
23
24 #include <assert.h>
25 #include "windef.h"
26 #include "winbase.h"
27 #include "wine/exception.h"
28
29 #ifdef __i386__
30 #define STEP_FLAG 0x00000100 /* single step flag */
31 #define V86_FLAG  0x00020000
32 #endif
33
34 #define SYM_FUNC         0x0
35 #define SYM_DATA         0x1
36 #define SYM_WIN32        0x2
37 #define SYM_WINE         0x4
38 #define SYM_INVALID      0x8
39 #define SYM_TRAMPOLINE   0x10
40 #define SYM_STEP_THROUGH 0x20
41
42 enum    debug_type {DT_BASIC, DT_POINTER, DT_ARRAY, DT_STRUCT, DT_ENUM,
43                     DT_FUNC, DT_BITFIELD};
44
45 enum    debug_type_basic {DT_BASIC_INT = 1, DT_BASIC_CHAR, DT_BASIC_LONGINT, DT_BASIC_UINT,
46                           DT_BASIC_ULONGINT, DT_BASIC_LONGLONGINT, DT_BASIC_ULONGLONGINT,
47                           DT_BASIC_SHORTINT, DT_BASIC_USHORTINT, DT_BASIC_SCHAR, DT_BASIC_UCHAR,
48                           DT_BASIC_FLOAT, DT_BASIC_LONGDOUBLE, DT_BASIC_DOUBLE,
49                           DT_BASIC_CMPLX_INT, DT_BASIC_CMPLX_FLOAT, DT_BASIC_CMPLX_DOUBLE,
50                           DT_BASIC_CMPLX_LONGDOUBLE, DT_BASIC_VOID,
51                           /* modifier on size isn't possible on current types definitions
52                            * so we need to add more types... */
53                           DT_BASIC_BOOL1, DT_BASIC_BOOL2, DT_BASIC_BOOL4,
54                           /* this is not really a basic type... */
55                           DT_BASIC_STRING,
56                           /* this is for historical reasons... should take care of it RSN */
57                           DT_BASIC_CONST_INT,
58                           /* not so basic, but handy */
59                           DT_BASIC_CONTEXT,
60                           /* to be kept as last... sentinel entry... do not use */
61                           DT_BASIC_LAST};
62
63 /*
64  * Return values for DEBUG_CheckLinenoStatus.  Used to determine
65  * what to do when the 'step' command is given.
66  */
67 #define FUNC_HAS_NO_LINES       (0)
68 #define NOT_ON_LINENUMBER       (1)
69 #define AT_LINENUMBER           (2)
70 #define FUNC_IS_TRAMPOLINE      (3)
71
72 typedef struct
73 {
74     DWORD               seg;  /* 0xffffffff means current default segment (cs or ds) */
75     DWORD               off;
76 } DBG_ADDR;
77
78 typedef struct
79 {
80    struct datatype*     type;
81    int                  cookie; /* DV_??? */
82 /* DV_TARGET references an address in debugger's address space, whereas DV_HOST
83  * references the debuggee address space
84  */
85 #       define  DV_TARGET       0xF00D
86 #       define  DV_HOST         0x50DA
87 #       define  DV_INVALID      0x0000
88
89    DBG_ADDR             addr;
90 } DBG_VALUE;
91
92 struct list_id
93 {
94     char * sourcefile;
95     int    line;
96 };
97
98 struct  wine_lines {
99   unsigned long         line_number;
100   DBG_ADDR              pc_offset;
101 };
102
103 struct symbol_info
104 {
105   struct name_hash * sym;
106   struct list_id     list;
107 };
108
109 typedef struct wine_lines WineLineNo;
110
111 /*
112  * This structure holds information about stack variables, function
113  * parameters, and register variables, which are all local to this
114  * function.
115  */
116 struct  wine_locals {
117   unsigned int          regno:8;        /* For register symbols */
118   signed int            offset:24;      /* offset from esp/ebp to symbol */
119   unsigned int          pc_start;       /* For RBRAC/LBRAC */
120   unsigned int          pc_end;         /* For RBRAC/LBRAC */
121   char                * name;           /* Name of symbol */
122   struct datatype     * type;           /* Datatype of symbol */
123 };
124
125 typedef struct wine_locals WineLocals;
126
127 enum exec_mode
128 {
129     EXEC_CONT,                  /* Continuous execution */
130     EXEC_STEP_OVER,             /* Stepping over a call to next source line */
131     EXEC_STEP_INSTR,            /* Step to next source line, stepping in if needed */
132     EXEC_STEPI_OVER,            /* Stepping over a call */
133     EXEC_STEPI_INSTR,           /* Single-stepping an instruction */
134     EXEC_FINISH,                /* Step until we exit current frame */
135     EXEC_STEP_OVER_TRAMPOLINE,  /* Step over trampoline.  Requires that
136                                  * we dig the real return value off the stack
137                                  * and set breakpoint there - not at the
138                                  * instr just after the call.
139                                  */
140 };
141
142 enum dbg_mode
143 {
144     MODE_INVALID, MODE_16, MODE_32, MODE_VM86
145 };
146
147 enum exit_mode /* of exception handling */
148 {
149     EXIT_CONTINUE,              /* continue execution */
150     EXIT_PASS,                  /* pass exception back to app (1st chance) */
151     EXIT_DETACH,                /* detach debugger */
152     EXIT_QUIT,                  /* exit debugger and kill debuggee */
153 };
154
155 #define DBG_BREAK       0
156 #define DBG_WATCH       1
157
158 typedef struct
159 {
160     DBG_ADDR      addr;
161     WORD          enabled : 1,
162                   type : 1,
163                   is32 : 1,
164                   refcount : 13;
165     WORD          skipcount;
166     union {
167        struct {
168           BYTE          opcode;
169           BOOL          (*func)(void);
170        } b;
171        struct {
172           BYTE          rw : 1,
173                         len : 2;
174           BYTE          reg;
175           DWORD         oldval;
176        } w;
177     } u;
178     struct expr * condition;
179 } DBG_BREAKPOINT;
180
181 /* Wine extension; Windows doesn't have a name for this code.  This is an
182    undocumented exception understood by MS VC debugger, allowing the program
183    to name a particular thread.  Search google.com or deja.com for "0x406d1388"
184    for more info. */
185 #define EXCEPTION_NAME_THREAD               0x406D1388
186
187 /* Helper structure */
188 typedef struct tagTHREADNAME_INFO
189 {
190    DWORD   dwType;     /* Must be 0x1000 */
191    LPCTSTR szName;     /* Pointer to name - limited to 9 bytes (8 characters + terminator) */
192    DWORD   dwThreadID; /* Thread ID (-1 = caller thread) */
193    DWORD   dwFlags;    /* Reserved for future use.  Must be zero. */
194 } THREADNAME_INFO;
195
196 typedef struct tagDBG_THREAD {
197     struct tagDBG_PROCESS*      process;
198     HANDLE                      handle;
199     DWORD                       tid;
200     LPVOID                      start;
201     LPVOID                      teb;
202     int                         wait_for_first_exception;
203     enum exec_mode              exec_mode;      /* mode the thread is run (step/run...) */
204     int                         exec_count;     /* count of mode operations */
205     enum dbg_mode               dbg_mode;       /* mode (VM86, 32bit, 16bit) */
206     DBG_BREAKPOINT              stepOverBP;
207     char                        name[9];
208     struct tagDBG_THREAD*       next;
209     struct tagDBG_THREAD*       prev;
210 } DBG_THREAD;
211
212 typedef struct tagDBG_DELAYED_BP {
213     BOOL                        is_symbol;
214     union {
215         struct {
216             int                         lineno;
217             char*                       name;
218         } symbol;
219         DBG_VALUE                       value;
220     } u;
221 } DBG_DELAYED_BP;
222
223 typedef struct tagDBG_PROCESS {
224     HANDLE                      handle;
225     DWORD                       pid;
226     const char*                 imageName;
227     DBG_THREAD*                 threads;
228     int                         num_threads;
229     unsigned                    continue_on_first_exception;
230     struct tagDBG_MODULE**      modules;
231     int                         num_modules;
232     unsigned long               dbg_hdr_addr;
233     DBG_DELAYED_BP*             delayed_bp;
234     int                         num_delayed_bp;
235     /*
236      * This is an index we use to keep track of the debug information
237      * when we have multiple sources. We use the same database to also
238      * allow us to do an 'info shared' type of deal, and we use the index
239      * to eliminate duplicates.
240      */
241     int                         next_index;
242     struct tagDBG_PROCESS*      next;
243     struct tagDBG_PROCESS*      prev;
244 } DBG_PROCESS;
245
246 extern  DBG_PROCESS*    DEBUG_CurrProcess;
247 extern  DBG_THREAD*     DEBUG_CurrThread;
248 extern  DWORD           DEBUG_CurrTid;
249 extern  DWORD           DEBUG_CurrPid;
250 extern  CONTEXT         DEBUG_context;
251 extern  BOOL            DEBUG_InteractiveP;
252 extern  enum exit_mode  DEBUG_ExitMode;
253 extern  HANDLE          DEBUG_hParserInput;
254 extern  HANDLE          DEBUG_hParserOutput;
255
256 #define DEBUG_READ_MEM(addr, buf, len) \
257       (ReadProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
258
259 #define DEBUG_WRITE_MEM(addr, buf, len) \
260       (WriteProcessMemory(DEBUG_CurrProcess->handle, (addr), (buf), (len), NULL))
261
262 #define DEBUG_READ_MEM_VERBOSE(addr, buf, len) \
263       (DEBUG_READ_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
264
265 #define DEBUG_WRITE_MEM_VERBOSE(addr, buf, len) \
266       (DEBUG_WRITE_MEM((addr), (buf), (len)) || (DEBUG_InvalLinAddr( addr ),0))
267
268 enum DbgInfoLoad {DIL_DEFERRED, DIL_LOADED, DIL_NOINFO, DIL_ERROR};
269 enum DbgModuleType {DMT_UNKNOWN, DMT_ELF, DMT_NE, DMT_PE};
270
271 typedef struct tagDBG_MODULE {
272    void*                        load_addr;
273    unsigned long                size;
274    char*                        module_name;
275    enum DbgInfoLoad             dil;
276    enum DbgModuleType           type;
277    unsigned short               main : 1;
278    short int                    dbg_index;
279    HMODULE                      handle;
280    struct tagMSC_DBG_INFO*      msc_info;
281    struct tagELF_DBG_INFO*      elf_info;
282 } DBG_MODULE;
283
284 typedef struct {
285    DWORD                val;
286    const char*          name;
287    LPDWORD              pval;
288    struct datatype*     type;
289 } DBG_INTVAR;
290
291 #define OFFSET_OF(__c,__f)              ((int)(((char*)&(((__c*)0)->__f))-((char*)0)))
292
293 enum get_sym_val {gsv_found, gsv_unknown, gsv_aborted};
294
295   /* from winelib.so */
296 extern void DEBUG_ExternalDebugger(void);
297
298   /* debugger/break.c */
299 extern void DEBUG_SetBreakpoints( BOOL set );
300 extern BOOL DEBUG_AddBreakpoint( const DBG_VALUE *addr, BOOL (*func)(void), BOOL verbose );
301 extern BOOL DEBUG_AddBreakpointFromValue( const DBG_VALUE *addr );
302 extern void DEBUG_AddBreakpointFromId( const char *name, int lineno );
303 extern void DEBUG_AddBreakpointFromLineno( int lineno );
304 extern void DEBUG_AddWatchpoint( const DBG_VALUE *addr, int is_write );
305 extern void DEBUG_AddWatchpointFromId( const char *name );
306 extern void DEBUG_CheckDelayedBP( void );
307 extern void DEBUG_DelBreakpoint( int num );
308 extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
309 extern void DEBUG_InfoBreakpoints(void);
310 extern BOOL DEBUG_HandleTrap(void);
311 extern BOOL DEBUG_ShouldContinue( DBG_ADDR* addr, DWORD code, int* count );
312 extern void DEBUG_SuspendExecution( void );
313 extern void DEBUG_RestartExecution( int count );
314 extern BOOL DEBUG_IsFctReturn(void);
315 extern int  DEBUG_AddBPCondition(int bpnum, struct expr * exp);
316
317   /* debugger/db_disasm.c */
318 extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
319
320   /* debugger/dbg.y */
321 extern void DEBUG_Parser(LPCSTR);
322 extern void DEBUG_Exit(DWORD);
323
324   /* debugger/debug.l */
325 extern void DEBUG_FlushSymbols(void);
326 extern char*DEBUG_MakeSymbol(const char*);
327 extern int  DEBUG_ReadLine(const char* pfx, char* buffer, int size);
328
329   /* debugger/display.c */
330 extern int DEBUG_DoDisplay(void);
331 extern int DEBUG_AddDisplay(struct expr * exp, int count, char format);
332 extern int DEBUG_DelDisplay(int displaynum);
333 extern int DEBUG_InfoDisplay(void);
334
335   /* debugger/expr.c */
336 extern void DEBUG_FreeExprMem(void);
337 struct expr * DEBUG_IntVarExpr(const char* name);
338 struct expr * DEBUG_SymbolExpr(const char * name);
339 struct expr * DEBUG_ConstExpr(int val);
340 struct expr * DEBUG_StringExpr(const char * str);
341 struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
342 struct expr * DEBUG_USConstExpr(unsigned int val);
343 struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
344 struct expr * DEBUG_UnopExpr(int oper, struct expr *);
345 struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
346 struct expr * DEBUG_StructExpr(struct expr *, const char * element);
347 struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
348 struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
349 struct expr * DEBUG_TypeCastExpr(struct datatype *, struct expr *);
350 extern DBG_VALUE DEBUG_EvalExpr(struct expr *);
351 extern int DEBUG_DelDisplay(int displaynum);
352 extern struct expr * DEBUG_CloneExpr(const struct expr * exp);
353 extern int DEBUG_FreeExpr(struct expr * exp);
354 extern int DEBUG_DisplayExpr(const struct expr * exp);
355
356   /* debugger/hash.c */
357 extern struct name_hash * DEBUG_AddSymbol( const char *name,
358                                            const DBG_VALUE *addr,
359                                            const char *sourcefile,
360                                            int flags);
361 extern enum get_sym_val DEBUG_GetSymbolValue( const char * name, const int lineno, DBG_VALUE *addr, int );
362 extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
363                                              struct name_hash ** rtn,
364                                              unsigned int ebp,
365                                              struct list_id * source);
366 extern void DEBUG_ReadSymbolTable( const char * filename, unsigned long offset );
367 extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
368                                  unsigned long offset );
369 extern struct wine_locals *
370             DEBUG_AddLocal( struct name_hash * func, int regno,
371                             int offset,
372                             int pc_start,
373                             int pc_end,
374                             char * name);
375 extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
376 extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file,
377                               const char * func);
378 extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
379 extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
380 extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
381 extern int DEBUG_cmp_sym(const void * p1, const void * p2);
382 extern BOOL DEBUG_GetLineNumberAddr( const struct name_hash *, const int lineno,
383                                      DBG_ADDR *addr, int bp_flag );
384
385 extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
386                                     struct datatype * type);
387 extern BOOL DEBUG_Normalize(struct name_hash * nh );
388 void DEBUG_InfoSymbols(const char* str);
389
390   /* debugger/info.c */
391 extern void DEBUG_PrintBasic( const DBG_VALUE* value, int count, char format );
392 extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
393                                               enum dbg_mode mode, int flag );
394 extern void DEBUG_Help(void);
395 extern void DEBUG_HelpInfo(void);
396 extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
397                                                      enum dbg_mode mode,
398                                                      unsigned int ebp,
399                                                      int flag );
400 extern void DEBUG_InfoClass(const char* clsName);
401 extern void DEBUG_WalkClasses(void);
402 extern void DEBUG_DumpModule(DWORD mod);
403 extern void DEBUG_WalkModules(void);
404 extern void DEBUG_WalkProcess(void);
405 extern void DEBUG_WalkThreads(void);
406 extern void DEBUG_WalkExceptions(DWORD tid);
407 extern void DEBUG_InfoSegments(DWORD s, int v);
408 extern void DEBUG_InfoVirtual(DWORD pid);
409 extern void DEBUG_InfoWindow(HWND hWnd);
410 extern void DEBUG_WalkWindows(HWND hWnd, int indent);
411 extern void DEBUG_DbgChannel(BOOL add, const char* chnl, const char* name);
412
413   /* debugger/memory.c */
414 extern int  DEBUG_ReadMemory( const DBG_VALUE* value );
415 extern void DEBUG_WriteMemory( const DBG_VALUE* val, int value );
416 extern void DEBUG_ExamineMemory( const DBG_VALUE *addr, int count, char format);
417 extern void DEBUG_InvalAddr( const DBG_ADDR* addr );
418 extern void DEBUG_InvalLinAddr( void* addr );
419 extern DWORD DEBUG_ToLinear( const DBG_ADDR *address );
420 extern void DEBUG_GetCurrentAddress( DBG_ADDR * );
421 extern BOOL DEBUG_GrabAddress( DBG_VALUE* value, BOOL fromCode );
422 extern enum dbg_mode DEBUG_GetSelectorType( WORD sel );
423 #ifdef __i386__
424 extern void DEBUG_FixAddress( DBG_ADDR *address, DWORD def );
425 extern int  DEBUG_IsSelectorSystem( WORD sel );
426 #endif
427 extern int  DEBUG_PrintStringA( int chnl, const DBG_ADDR* address, int len );
428 extern int  DEBUG_PrintStringW( int chnl, const DBG_ADDR* address, int len );
429
430   /* debugger/module.c */
431 extern int  DEBUG_LoadEntryPoints( const char * prefix );
432 extern void DEBUG_LoadModule32( const char* name, HANDLE hFile, void *base );
433 extern DBG_MODULE* DEBUG_FindModuleByName(const char* name, enum DbgModuleType type);
434 extern DBG_MODULE* DEBUG_FindModuleByHandle(HANDLE handle, enum DbgModuleType type);
435 extern DBG_MODULE* DEBUG_FindModuleByAddr(void* addr, enum DbgModuleType type);
436 extern DBG_MODULE* DEBUG_GetProcessMainModule(DBG_PROCESS* process);
437 extern DBG_MODULE* DEBUG_RegisterELFModule(void *load_addr, unsigned long size,
438                                            const char* name);
439 extern enum DbgInfoLoad DEBUG_RegisterPEDebugInfo(DBG_MODULE* wmod, HANDLE hFile,
440                                                   void* _nth, unsigned long nth_ofs);
441 extern void DEBUG_ReportDIL(enum DbgInfoLoad dil, const char* pfx,
442                             const char* filename, void *load_addr);
443 extern void DEBUG_InfoShare(void);
444
445   /* debugger/msc.c */
446 extern enum DbgInfoLoad DEBUG_RegisterMSCDebugInfo(DBG_MODULE* module, HANDLE hFile,
447                                                    void* nth, unsigned long nth_ofs);
448 extern enum DbgInfoLoad DEBUG_RegisterStabsDebugInfo(DBG_MODULE* module,
449                                                      HANDLE hFile, void* nth,
450                                                      unsigned long nth_ofs);
451 extern void DEBUG_InitCVDataTypes(void);
452
453   /* debugger/registers.c */
454 extern void DEBUG_InfoRegisters(const CONTEXT* ctx);
455 extern BOOL DEBUG_ValidateRegisters(void);
456
457   /* debugger/source.c */
458 extern void DEBUG_ShowDir(void);
459 extern void DEBUG_AddPath(const char * path);
460 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
461                        int delta);
462 extern void DEBUG_NukePath(void);
463 extern void DEBUG_Disassemble(const DBG_VALUE *, const DBG_VALUE*, int offset);
464 extern BOOL DEBUG_DisassembleInstruction(DBG_ADDR *addr);
465
466   /* debugger/stack.c */
467 extern void DEBUG_InfoStack(void);
468 extern void DEBUG_BackTrace(DWORD threadID, BOOL noisy);
469 extern int  DEBUG_InfoLocals(void);
470 extern int  DEBUG_SetFrame(int newframe);
471 extern int  DEBUG_GetCurrentFrame(struct name_hash ** name,
472                                   unsigned int * eip,
473                                   unsigned int * ebp);
474
475   /* debugger/stabs.c */
476 extern enum DbgInfoLoad DEBUG_ReadExecutableDbgInfo(const char* exe_name);
477 extern enum DbgInfoLoad DEBUG_ParseStabs(char * addr, void *load_offset,
478                                          unsigned int staboff, int stablen,
479                                          unsigned int strtaboff, int strtablen);
480
481   /* debugger/types.c */
482 extern int DEBUG_nchar;
483 extern void DEBUG_InitTypes(void);
484 extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
485                                            const char * typename);
486 extern unsigned int DEBUG_TypeDerefPointer(const DBG_VALUE *value,
487                                            struct datatype ** newtype);
488 extern int DEBUG_AddStructElement(struct datatype * dt,
489                                   char * name, struct datatype * type,
490                                   int offset, int size);
491 extern int DEBUG_SetStructSize(struct datatype * dt, int size);
492 extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
493 extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
494                                 struct datatype * dt2);
495 extern void DEBUG_Print( const DBG_VALUE *addr, int count, char format, int level );
496 extern unsigned int DEBUG_FindStructElement(DBG_VALUE * addr,
497                                             const char * ele_name, int * tmpbuf);
498 extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
499 extern int DEBUG_GetObjectSize(struct datatype * dt);
500 extern unsigned int DEBUG_ArrayIndex(const DBG_VALUE * addr, DBG_VALUE * result,
501                                      int index);
502 extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
503 extern long long int DEBUG_GetExprValue(const DBG_VALUE * addr, char ** format);
504 extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
505                                    int nbits, struct datatype * dt2);
506 extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
507 extern const char* DEBUG_GetName(struct datatype * dt);
508 extern enum debug_type DEBUG_GetType(struct datatype * dt);
509 extern struct datatype * DEBUG_TypeCast(enum debug_type, const char *);
510 extern int DEBUG_PrintTypeCast(const struct datatype *);
511 extern int DEBUG_PrintType( const DBG_VALUE* addr );
512 extern struct datatype * DEBUG_GetBasicType(enum debug_type_basic);
513 extern int DEBUG_DumpTypes(void);
514
515   /* debugger/winedbg.c */
516 #define DBG_CHN_MESG    1
517 #define DBG_CHN_ERR     2
518 #define DBG_CHN_WARN    4
519 #define DBG_CHN_FIXME   8
520 #define DBG_CHN_TRACE   16
521 extern void             DEBUG_OutputA(int chn, const char* buffer, int len);
522 extern void             DEBUG_OutputW(int chn, const WCHAR* buffer, int len);
523 #ifdef __GNUC__
524 extern int              DEBUG_Printf(int chn, const char* format, ...) __attribute__((format (printf,2,3)));
525 #else
526 extern int              DEBUG_Printf(int chn, const char* format, ...);
527 #endif
528 extern DBG_INTVAR*      DEBUG_GetIntVar(const char*);
529 extern BOOL             DEBUG_Attach(DWORD pid, BOOL cofe, BOOL wfe);
530 extern BOOL             DEBUG_Detach(void);
531 extern void             DEBUG_Run(const char* args);
532 extern DBG_PROCESS*     DEBUG_AddProcess(DWORD pid, HANDLE h, const char* imageName);
533 extern DBG_PROCESS*     DEBUG_GetProcess(DWORD pid);
534 extern void             DEBUG_DelProcess(DBG_PROCESS* p);
535 extern DBG_THREAD*      DEBUG_AddThread(DBG_PROCESS* p, DWORD tid, HANDLE h, LPVOID start, LPVOID teb);
536 extern DBG_THREAD*      DEBUG_GetThread(DBG_PROCESS* p, DWORD tid);
537 extern void             DEBUG_DelThread(DBG_THREAD* t);
538 extern BOOL             DEBUG_ProcessGetString(char* buffer, int size, HANDLE hp, LPSTR addr);
539 extern BOOL             DEBUG_ProcessGetStringIndirect(char* buffer, int size, HANDLE hp, LPVOID addr);
540 extern void             DEBUG_WaitNextException(DWORD cont, int count, int mode);
541 extern BOOL             DEBUG_InterruptDebuggee(void);
542 extern int curr_frame;
543
544 /* gdbproxy.c */
545 extern BOOL DEBUG_GdbRemote(unsigned int);
546
547 /* Choose your allocator! */
548 #if 1
549 /* this one is libc's fast one */
550 extern void*    DEBUG_XMalloc(size_t size);
551 extern void*    DEBUG_XReAlloc(void *ptr, size_t size);
552 extern char*    DEBUG_XStrDup(const char *str);
553
554 #define DBG_alloc(x)            DEBUG_XMalloc(x)
555 #define DBG_realloc(x,y)        DEBUG_XReAlloc(x,y)
556 #define DBG_free(x)             free(x)
557 #define DBG_strdup(x)           DEBUG_XStrDup(x)
558 #else
559 /* this one is slow (takes 5 minutes to load the debugger on my machine),
560    if someone could make optimized routines so it wouldn't
561    take so long to load, it could be made default) */
562 #define DBG_alloc(x) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,x)
563 #define DBG_realloc(x,y) HeapReAlloc(GetProcessHeap(),0,x,y)
564 #define DBG_free(x) HeapFree(GetProcessHeap(),0,x)
565 inline static LPSTR DBG_strdup( LPCSTR str )
566 {
567     INT len = strlen(str) + 1;
568     LPSTR p = DBG_alloc( len );
569     if (p) memcpy( p, str, len );
570     return p;
571 }
572 #endif
573
574 #define DEBUG_STATUS_OFFSET             0x80003000
575 #define DEBUG_STATUS_INTERNAL_ERROR     (DEBUG_STATUS_OFFSET+0)
576 #define DEBUG_STATUS_NO_SYMBOL          (DEBUG_STATUS_OFFSET+1)
577 #define DEBUG_STATUS_DIV_BY_ZERO        (DEBUG_STATUS_OFFSET+2)
578 #define DEBUG_STATUS_BAD_TYPE           (DEBUG_STATUS_OFFSET+3)
579 #define DEBUG_STATUS_NO_FIELD           (DEBUG_STATUS_OFFSET+4)
580 #define DEBUG_STATUS_ABORT              (DEBUG_STATUS_OFFSET+5)
581
582 extern DBG_INTVAR               DEBUG_IntVars[];
583
584 #define  DBG_IVARNAME(_var)     DEBUG_IV_##_var
585 #define  DBG_IVARSTRUCT(_var)   DEBUG_IntVars[DBG_IVARNAME(_var)]
586 #define  DBG_IVAR(_var)         (*(DBG_IVARSTRUCT(_var).pval))
587 #define  INTERNAL_VAR(_var,_val,_ref,_typ) DBG_IVARNAME(_var),
588 enum debug_int_var {
589 #include "intvar.h"
590    DBG_IV_LAST
591 };
592 #undef   INTERNAL_VAR
593
594 #endif  /* __WINE_DEBUGGER_H */