156{
159 char ch;
165 unsigned deltapc;
167
168
170
171 TRACE(
"Enter: PC=%s Frame=%s Return=%s Stack=%s Mode=%s Count=%s cSwitch=%p nSwitch=%p\n",
179
180
181
182
183
184
185
186
187
189
191 {
192
205 }
206
208 {
210
213 {
214 WARN(
"Bad AddrPC.Mode / AddrFrame.Mode combination\n");
215 goto done_err;
216 }
217
218
220
221
222
223
226 {
229 {
230 WARN(
"Can't read TEB:SystemReserved1[0]\n");
231 goto done_err;
232 }
235 {
237 }
239 {
241 {
243 goto done_err;
244 }
251 }
252 else
253 {
259 {
260 WARN(
"Bad stack frame 0x%08x\n",
p);
261 goto done_err;
262 }
266 }
267 }
268 else
269
270
271
274
275
276
278 }
279 else
280 {
282 {
285 }
286 else
287 {
292 }
293
294 if (do_switch)
295 {
297 {
299 {
301 goto done_err;
302 }
303
310
315
321
323 {
324 WARN(
"Bad stack frame 0x%08x\n",
p);
325 goto done_err;
326 }
331 }
332 else
333 {
338
340 {
341 WARN(
"Bad stack frame 0x%08x\n",
p);
342 goto done_err;
343 }
344
345 TRACE(
"Got a 16 bit stack switch:"
346 "\n\tframe32: %p"
347 "\n\tedx:%08x ecx:%08x ebp:%08x"
348 "\n\tds:%04x es:%04x fs:%04x gs:%04x"
349 "\n\tcall_from_ip:%08x module_cs:%04x relay=%08x"
350 "\n\tentry_ip:%04x entry_point:%08x"
351 "\n\tbp:%04x ip:%04x cs:%04x\n",
354 frame16.
ds, frame16.
es, frame16.
fs, frame16.
gs,
357 frame16.
bp, frame16.
ip, frame16.
cs);
358
362
366
369
372
375 {
377 goto done_err;
378 }
383
387 }
388 }
389 else
390 {
392 {
395
398 &val16,
sizeof(
WORD)))
399 goto done_err;
401 }
402 else
403 {
405 goto done_err;
406
411 FIXME(
"new PC=%s different from Eip=%x\n",
414 }
415 }
416 }
417
419 {
421
424 goto done_err;
426
428 goto done_err;
431 else
432 {
433
434
435
437 {
439
442 {
443
444
445
447 }
448 }
449 }
451
452
453
454
456 {
459 }
461 {
462#define SET(field, seg, reg) \
463 switch (frame->field.Mode) \
464 { \
465 case AddrModeFlat: context->x86.reg = frame->field.Offset; break; \
466 case AddrMode1616: context->x86.seg = frame->field.Segment; context->x86.reg = frame->field.Offset; break; \
467 default: assert(0); \
468 }
469 SET(AddrStack, SegSs, Esp);
470 SET(AddrFrame, SegSs, Ebp);
471 SET(AddrReturn, SegCs, Eip);
472#undef SET
473 }
474 }
475 else
476 {
479
481 goto done_err;
484
486 {
489 }
490 }
491
497 else
499
501 TRACE(
"Leave: PC=%s Frame=%s Return=%s Stack=%s Mode=%s Count=%s cSwitch=%p nSwitch=%p FuncTable=%p\n",
509
511done_err:
514}
static BOOL fetch_next_frame32(struct cpu_stack_walk *csw, union ctx *pcontext, DWORD_PTR curr_pc)
#define SET(field, seg, reg)
void * sw_table_access(struct cpu_stack_walk *csw, DWORD64 addr) DECLSPEC_HIDDEN
DWORD64 sw_module_base(struct cpu_stack_walk *csw, DWORD64 addr) DECLSPEC_HIDDEN
DWORD64 sw_xlat_addr(struct cpu_stack_walk *csw, ADDRESS64 *addr) DECLSPEC_HIDDEN
#define WOW64_CONTEXT_CONTROL
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
#define WOW64_CONTEXT_SEGMENTS
const char * wine_dbgstr_addr(const ADDRESS64 *addr)
BOOL WINAPI GetThreadSelectorEntry(IN HANDLE hThread, IN DWORD dwSelector, OUT LPLDT_ENTRY lpSelectorEntry)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
union _LDT_ENTRY::@356 HighWord
struct _LDT_ENTRY::@356::@358 Bits
#define FIELD_OFFSET(t, f)