diff --git a/if1632/user.spec b/if1632/user.spec index e4721fc3c7d..6edf61d778e 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -485,7 +485,7 @@ file user.exe 602 stub SetCheckCursorTimer 604 stub BroadcastSystemMessage 605 stub HackTaskMonitor -606 pascal FormatMessage(long ptr word word ptr word ptr) FormatMessage16 +606 pascal16 FormatMessage(long segptr word word ptr word ptr) FormatMessage16 608 pascal16 GetForegroundWindow() GetForegroundWindow16 609 pascal16 SetForegroundWindow(word) SetForegroundWindow16 610 pascal16 DestroyIcon32(word word) CURSORICON_Destroy diff --git a/include/wine/winuser16.h b/include/wine/winuser16.h index abf25fcb6dc..2d36fc3c481 100644 --- a/include/wine/winuser16.h +++ b/include/wine/winuser16.h @@ -712,7 +712,7 @@ INT16 WINAPI FillRect16(HDC16,const RECT16*,HBRUSH16); HWND16 WINAPI FindWindow16(SEGPTR,LPCSTR); HWND16 WINAPI FindWindowEx16(HWND16,HWND16,SEGPTR,LPCSTR); BOOL16 WINAPI FlashWindow16(HWND16,BOOL16); -DWORD WINAPI FormatMessage16(DWORD,LPCVOID,WORD,WORD,LPSTR,WORD,LPDWORD); +DWORD WINAPI FormatMessage16(DWORD,SEGPTR,WORD,WORD,LPSTR,WORD,LPDWORD); INT16 WINAPI FrameRect16(HDC16,const RECT16*,HBRUSH16); HWND16 WINAPI GetActiveWindow16(void); WORD WINAPI GetAsyncKeyState16(INT16); diff --git a/misc/lstr.c b/misc/lstr.c index 8df86fb3b70..10e8bc8eec4 100644 --- a/misc/lstr.c +++ b/misc/lstr.c @@ -489,10 +489,10 @@ BOOL WINAPI IsCharUpperW(WCHAR x) */ DWORD WINAPI FormatMessage16( DWORD dwFlags, - LPCVOID lpSource, + SEGPTR lpSource, /*not always a valid pointer*/ WORD dwMessageId, WORD dwLanguageId, - LPSTR lpBuffer, + LPSTR lpBuffer, /* *((HLOCAL16*)) for FORMAT_MESSAGE_ALLOCATE_BUFFER*/ WORD nSize, LPDWORD args /* va_list *args */ ) { @@ -503,26 +503,28 @@ DWORD WINAPI FormatMessage16( LPSTR from,f; DWORD width = dwFlags & FORMAT_MESSAGE_MAX_WIDTH_MASK; DWORD nolinefeed = 0; + LPSTR allocstring; - TRACE("(0x%lx,%p,%d,0x%x,%p,%d,%p)\n", + TRACE("(0x%lx,%lx,%d,0x%x,%p,%d,%p)\n", dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); if (width) FIXME("line wrapping not supported.\n"); from = NULL; if (dwFlags & FORMAT_MESSAGE_FROM_STRING) - from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource); + from = HEAP_strdupA( GetProcessHeap(), 0, PTR_SEG_TO_LIN(lpSource)); if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) { from = HeapAlloc( GetProcessHeap(),0,200 ); sprintf(from,"Systemmessage, messageid = 0x%08x\n",dwMessageId); } if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) { - INT bufsize; + INT16 bufsize; + HINSTANCE16 hinst16 = ((HMODULE)lpSource & 0xffff); dwMessageId &= 0xFFFF; - bufsize=LoadMessageA((HMODULE)lpSource,dwMessageId,dwLanguageId,NULL,100); + bufsize=LoadString16(hinst16,dwMessageId,NULL,0); if (bufsize) { - from = HeapAlloc( GetProcessHeap(), 0, bufsize + 1 ); - LoadMessageA((HMODULE)lpSource,dwMessageId,dwLanguageId,from,bufsize+1); + from = HeapAlloc( GetProcessHeap(), 0, bufsize +1); + LoadString16(hinst16,dwMessageId,from,bufsize+1); } } target = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 100); @@ -642,14 +644,15 @@ DWORD WINAPI FormatMessage16( TRACE("-- %s\n",debugstr_a(target)); if (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) { /* nSize is the MINIMUM size */ - *((LPVOID*)lpBuffer) = (LPVOID)LocalAlloc(GMEM_ZEROINIT,talloced); - memcpy(*(LPSTR*)lpBuffer,target,talloced); + *((HLOCAL16*)lpBuffer)= LocalAlloc16(LPTR,talloced); + allocstring=PTR_SEG_OFF_TO_LIN(CURRENT_DS,*((HLOCAL16*)lpBuffer)); + memcpy( allocstring,target,talloced); } else strncpy(lpBuffer,target,nSize); HeapFree(GetProcessHeap(),0,target); if (from) HeapFree(GetProcessHeap(),0,from); return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? - strlen(*(LPSTR*)lpBuffer): + strlen(allocstring): strlen(lpBuffer); #else return 0;