[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Problems while snooping
From:       Uwe Bonnes <bon () elektron ! ikp ! physik ! tu-darmstadt ! de>
Date:       1999-07-29 21:19:44
[Download RAW message or body]

Hallo ,


I tried running win95 winhlp32,exe with native DLLs
(-dll user,user32,shell32,shell,commdlg,comdlg32,commctrl,comctl32=n).
When running with -debugmsg +relay,+snoop, I get a crash in following
code

 00425E91  6A00                 push    00000000
 00425E93  6A00                 push    00000000
 00425E95  8B1D74C84300         mov     ebx, dword ptr [USER32.CreateWindowExA]
 00425E9B  6800003040           push    40300000
 00425EA0  6A00                 push    00000000
 00425EA2  FF35EC844300         push    dword ptr [loc_004384EC]
 00425EA8  6A00                 push    00000000
 00425EAA  FFD3                 call    ebx

Ret  USER32.83: CreateWindowExA(00000200,004251f0 "MS_WINDOC",40d60cf4 \
"Windows-Hilfe",02cf0000,00000000,00000000,000 \
00000,00000000,00000000,00000000,00400000,00000000) retval = 0000008c ret=00425e45 \
fs=070f Call USER32.83: CreateWindowExA(00000000,004385d8 "MS_WINTOPIC",00000000,Call \
KERNEL32.702: UnhandledExceptionFilter( 40d3f728) ret=00435742 fs=070f
Unhandled exception: page fault on read access to 0x40300000 in 32-bit code \
(0x081735b0). Loading symbols: wine /usr/X11R6/lib/libSM.so.6 \
/usr/X11R6/lib/libICE.so.6  /usr/X11R6/lib/libXpm.so.4 /usr/lib/libMesaGL.so.3
    /usr/X11R6/lib/libXext.so.6 /usr/X11R6/lib/libX11.so.6
    /lib/libncurses.so.4 /lib/libm.so.6 /lib/libdl.so.2 /lib/libc.so.6
    /lib/ld-linux.so.2
    DDEML COMM MOUSE KEYBOARD USER GDI KERNEL WINEPS WPROCS DISPLAY SYSTEM
    WINHLP32.EXE ADVAPI32 USER32.dll GDI32 KERNEL32 NTDLL
In 32 bit mode.
Register dump:
 CS:0023 SS:002b DS:002b ES:002b FS:070f GS:0000
 EIP:081735b0 ESP:40d3fa04 EBP:40d3fa14 EFLAGS:00010207(  R- 00  I   - -P1C)
 EAX:00000041 EBX:40300000 ECX:00000000 EDX:0000004f
 ESI:00000000 EDI:08420238
Stack dump:
0x40d3fa04 (GDI32.WidenPath+0x58df58):  40300000 00000000 40300000 00000000
0x40d3fa14 (GDI32.WidenPath+0x58df68):  40d3fa4c 0823be81 40300000 00000050
0x40d3fa24 (GDI32.WidenPath+0x58df78):  00000003 0000000c 40d3fa80 40300000
0x40d3fa34 (GDI32.WidenPath+0x58df88):  40300000 0000004f 00001000 00001000
0x40d3fa44 (GDI32.WidenPath+0x58df98):  00000001 00020000 40d3fa74 0823c1bd
0x40d3fa54 (GDI32.WidenPath+0x58dfa8):  40300000 08345840 082424c9 00000000
0x40d3fa64 (GDI32.WidenPath+0x58dfb8): 

00e1: sel=070f base=4050eea8 limit=00000fff 32-bit rw-
Backtrace:
=>0 0x081735b0 (IsBadStringPtrA+0xa0 [virtual.c:1009]) (ebp=40d3fa14)
  1 0x0823be81 (SNOOP_PrintArg+0x51(x=0x40300000) [snoop.c:217]) (ebp=40d3fa4c)
  2 0x0823c1bd (__regs_SNOOP_Entry+0x23d(context=0x40d3fa80) [snoop.c:327]) \
(ebp=40d3fa74)  3 0x0823c9d2 (CALL32_Regs+0xb6 [call32.s]) (ebp=40d3fbcc)
  4 0x082424c9 (SNOOP_Entry+0x5) (ebp=40d3fee8)
  5 0x00426de3 (WINHLP32.EXE..text+0x25de3) (ebp=40d3ffbc)
  6 0x08249cb8 (PROCESS_Start+0x438 [process.c:383]) (ebp=40d3ffe4)
  7 0x0824b917 (SYSDEPS_StartThread+0x17(teb=0x4050eea8) [sysdeps.c:135]) \
(ebp=40d3fff4)  8 0x402c743e (thread_start+0x4 [sysctl.c]) (ebp=00000000)
*** Invalid address 0x00000000 (DateStyle)

0x081735b0 (IsBadStringPtrA+0xa0 [virtual.c:1009]):  movb       0x0(%ebx),%al

I have tried to case that case in SNOOP_PrintArgs with

...
	if (IsBadReadPtr(x,4)) 
	  {
		sprintf(buf,"%08lx",x);
		return buf;
	  }
	i=0;nostring=0;
	if (!IsBadStringPtrA((LPSTR)x,80)) {

but to no avail. any ideas?

Bye

Uwe Bonnes                bon@elektron.ikp.physik.tu-darmstadt.de

Free Software: If you contribute nothing, expect nothing
--

PS:
My files contain additional Debuginfo. Here the files with their linenumbers: 

snoop.c:
   217          if (!IsBadStringPtrA((LPSTR)x,80)) {
   218                  while (i<80) {
   219                          LPBYTE  s=(LPBYTE)x;
   220  
   221                          if (s[i]==0) break;
   222                          if (s[i]<0x20) {nostring=1;break;}
   223                          if (s[i]>=0x80) {nostring=1;break;}
   224                          i++;
   225                  }

   323          DPRINTF("Call %s.%ld: %s(",dll->name,ordinal,fun->name);
   324          if (fun->nrofargs>0) {
   325                  max = fun->nrofargs; if (max>16) max=16;
   326                  for (i=0;i<max;i++)
   327                          \
DPRINTF("%s%s",SNOOP_PrintArg(*(DWORD*)(ESP_reg(context)+4+sizeof(DWORD)*i)),(i<fun-  \
327  >nrofargs-1)?",":"");  328                  if (max!=fun->nrofargs)
   329                          DPRINTF(" ...");
   330          } else if (fun->nrofargs<0) {
   331                  DPRINTF("<unknown, check return>");
   332                  ret->args = HeapAlloc(SystemHeap,0,16*sizeof(DWORD));
   333                  \
memcpy(ret->args,(LPBYTE)(ESP_reg(context)+4),sizeof(DWORD)*16);  334          }
 
virtual.c:

   987  BOOL WINAPI IsBadStringPtrA(
   988                LPCSTR str, /* [in] Address of string */
   989                UINT max  /* [in] Maximum size of string */
   990  ) {
   991      FILE_VIEW *view;
   992      UINT page, count;
   993  
   994      TRACE("%p %d\n",str,max);
   995      
   996      if (!max) return FALSE;
   997      if (IsBadReadPtr(str,1)) return TRUE;
   998      if (!(view = VIRTUAL_FindView( (UINT)str ))) return TRUE;
   999      page  = ((UINT)str - view->base) >> page_shift;
  1000      count = page_mask + 1 - ((UINT)str & page_mask);
  1001  
  1002      while (max)
  1003      {
  1004          if ((view->prot[page] & (VPROT_READ | VPROT_COMMITTED)) != 
  1005                                                  (VPROT_READ | \
VPROT_COMMITTED))  1006              return TRUE;
  1007          if (count > max) count = max;
  1008          max -= count;
  1009          while (count--) if (!*str++) return FALSE;
  1010          if (++page >= view->size >> page_shift) return TRUE;
  1011          count = page_mask + 1;
  1012      }
  1013      return FALSE;
  1014  }


=========================================================================


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic