From 4a671f098a46470645d236169d7c4ee281b7826d Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 17 Apr 2023 08:21:32 -0500 Subject: [PATCH 01/95] =?UTF-8?q?don't=20call=20setscrollinfo=20with=20an?= =?UTF-8?q?=20invalid=20range=20and=20convert=20a=20dib=20to=20a=E2=80=A6?= =?UTF-8?q?=20(#1291)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * don't call setscrollinfo with an invalid range and convert a dib to a bitmap before setting it to the clipboard if type is cf_bitmap * more checks --- user/user.c | 22 ++++++++++++++++++++++ user/window.c | 11 ++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/user/user.c b/user/user.c index e7b6cbc00a..f54da8673b 100644 --- a/user/user.c +++ b/user/user.c @@ -1044,6 +1044,28 @@ HANDLE convert_cb_data_16_32(int format, HANDLE16 data16, BOOL set_format) switch (format) { case CF_BITMAP: + { + DIBSECTION dib; + data32 = HGDIOBJ_32(data16); + if (GetObject(data32, sizeof(DIBSECTION), &dib) == sizeof(DIBSECTION)) + { + HDC hdcsrc = CreateCompatibleDC(NULL); + HDC hdcdst = CreateCompatibleDC(NULL); + HDC hdc = GetDC(NULL); + HBITMAP hbmp = CreateCompatibleBitmap(hdc, dib.dsBm.bmWidth, dib.dsBm.bmHeight); + ReleaseDC(NULL, hdc); + HBITMAP oldhbmpsrc = SelectObject(hdcsrc, data32); + HBITMAP oldhbmpdst = SelectObject(hdcdst, hbmp); + BitBlt(hdcdst, 0, 0, dib.dsBm.bmWidth, dib.dsBm.bmHeight, hdcsrc, 0, 0, SRCCOPY); + SelectObject(hdcsrc, oldhbmpsrc); + SelectObject(hdcdst, oldhbmpdst); + DeleteDC(hdcsrc); + DeleteDC(hdcdst); + DeleteObject(data32); + data32 = hbmp; + } + break; + } case CF_PALETTE: data32 = HGDIOBJ_32( data16 ); break; diff --git a/user/window.c b/user/window.c index 1ddbba7de3..5355d27d60 100644 --- a/user/window.c +++ b/user/window.c @@ -1078,9 +1078,18 @@ INT16 WINAPI GetScrollPos16( HWND16 hwnd, INT16 nBar ) */ void WINAPI SetScrollRange16( HWND16 hwnd, INT16 nBar, INT16 MinVal, INT16 MaxVal, BOOL16 redraw ) { + HWND hwnd32 = HWND_32(hwnd); /* Invalid range -> range is set to (0,0) */ if ((INT)MaxVal - (INT)MinVal > 0x7fff) MinVal = MaxVal = 0; - SetScrollRange( WIN_Handle32(hwnd), nBar, MinVal, MaxVal, redraw ); + // don't create a scrollbar if none is wanted + if (MinVal == MaxVal) + { + INT min, max; + GetScrollRange(hwnd32, nBar, &min, &max); // always returns TRUE + if (!min && !max && GetLastError() == ERROR_NO_SCROLLBARS) + return; + } + SetScrollRange(hwnd32, nBar, MinVal, MaxVal, redraw); } From 31f31dada875574a205614e1392773acf5e897bb Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 5 Jun 2023 09:21:15 -0500 Subject: [PATCH 02/95] fill in bidishape stub (#1296) --- gdi/bidi.c | 8 +++++++- gdi/gdi.exe16.spec | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gdi/bidi.c b/gdi/bidi.c index 5e665b8bfc..ded19ddfa7 100644 --- a/gdi/bidi.c +++ b/gdi/bidi.c @@ -197,7 +197,13 @@ LONG WINAPI BiDiCalcString16(WORD a1, WORD a2, LPCSTR a3, WORD a4, WORD a5, WORD /*********************************************************************** * BiDiShape (GDI.560) */ -LONG WINAPI BiDiShape16(void) { FIXME("stub (no prototype)\n"); return 0; } +LONG WINAPI BiDiShape16(WORD a1, WORD a2, WORD a3, WORD a4, WORD a5, WORD a6, WORD a7, WORD a8, WORD a9, WORD a10, + WORD a11, WORD a12, LPCSTR a13, WORD a14, WORD a15, WORD a16, WORD a17, WORD a18, WORD a19, WORD a20) +{ + FIXME("stub(%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,", a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + FIXME("%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x)\n", a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + return 0; +} /*********************************************************************** * BiDiFontComplement (GDI.561) diff --git a/gdi/gdi.exe16.spec b/gdi/gdi.exe16.spec index a43b66e443..593d41deda 100644 --- a/gdi/gdi.exe16.spec +++ b/gdi/gdi.exe16.spec @@ -396,7 +396,7 @@ 556 pascal -ret16 BiDiSetDefaults() BiDiSetDefaults16 558 pascal -ret16 BiDiGetDefaults() BiDiGetDefaults16 559 pascal -ret16 BiDiCalcString(word word ptr word word word word word) BiDiCalcString16 -560 pascal -ret16 BiDiShape() BiDiShape16 +560 pascal -ret16 BiDiShape(word word word word word word word word word word word word word word word word word word word word) BiDiShape16 561 pascal -ret16 BiDiFontComplement() BiDiFontComplement16 563 pascal -ret16 BiDiCalcTabString() BiDiCalcTabString16 564 pascal -ret16 BiDiSetKashida() BiDiSetKashida16 From fe9006eb145e7f0df723e9501c13da33db80bf1b Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 14 Jun 2023 21:03:19 -0500 Subject: [PATCH 03/95] delete mmiofile dos handle if one was needed --- mmsystem/mmio16.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mmsystem/mmio16.c b/mmsystem/mmio16.c index caa7db37a2..e9ddad71ae 100644 --- a/mmsystem/mmio16.c +++ b/mmsystem/mmio16.c @@ -381,6 +381,14 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags) { MMRESULT ret; + MMIOINFO mmioinfo; + HMMIO hmmio32 = HMMIO_32(hmmio); + + if (!(uFlags & MMIO_FHOPEN) && !mmioGetInfo(hmmio32, &mmioinfo, 0)) + { + if (mmioinfo.fccIOProc == FOURCC_DOS) + DisposeLZ32Handle(mmioinfo.adwInfo[0]); + } EnterCriticalSection(&mmio_cs); ret = mmioClose(HMMIO_32(hmmio), uFlags); From 805c4123a3cf6a109ecd702733a275cc6d987ded Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 16 Jun 2023 13:45:08 -0500 Subject: [PATCH 04/95] make disposelz32handle more generic so anything can use it to delete a dos fh --- krnl386/file.c | 7 +++---- krnl386/krnl386.def | 2 +- krnl386/krnl386.exe16.spec | 2 +- lzexpand/lzexpand.c | 7 ++++++- lzexpand/wine_lzexpand.c | 3 ++- mmsystem/mmio16.c | 16 ++++++++-------- wine/wine/winbase16.h | 2 +- 7 files changed, 22 insertions(+), 17 deletions(-) diff --git a/krnl386/file.c b/krnl386/file.c index dc859ff2c7..d1e241f440 100644 --- a/krnl386/file.c +++ b/krnl386/file.c @@ -371,7 +371,7 @@ HFILE WINAPI Win32HandleToDosFileHandle( HANDLE handle ) * this because of the way our DOS handles are implemented. * It shouldn't break anything though. */ -void WINAPI DisposeLZ32Handle( HANDLE handle ) +BOOL16 WINAPI DeleteDosFileHandle( HANDLE handle ) { int i; @@ -381,10 +381,9 @@ void WINAPI DisposeLZ32Handle( HANDLE handle ) if (dos_handles[i] == handle) { dos_handles[i] = 0; - /* lzexpand.dll16 uses wine-based lzexpand implementation. so call _lclose instead of LZClose */ - _lclose( handle ); - break; + return TRUE; } + return FALSE; } /*********************************************************************** diff --git a/krnl386/krnl386.def b/krnl386/krnl386.def index 41104b6688..9dabb9e96f 100644 --- a/krnl386/krnl386.def +++ b/krnl386/krnl386.def @@ -24,7 +24,7 @@ EXPORTS GetProcessDword @19 DosFileHandleToWin32Handle @20 Win32HandleToDosFileHandle @21 - DisposeLZ32Handle @22 + DeleteDosFileHandle @22 GlobalAlloc16 @23 GlobalLock16 @24 GlobalUnlock16 @25 diff --git a/krnl386/krnl386.exe16.spec b/krnl386/krnl386.exe16.spec index 197143a9b2..42dabf6c3e 100644 --- a/krnl386/krnl386.exe16.spec +++ b/krnl386/krnl386.exe16.spec @@ -569,7 +569,7 @@ @ stdcall -arch=win32 GetProcessDword(long long) @ stdcall -arch=win32 DosFileHandleToWin32Handle(long) @ stdcall -arch=win32 Win32HandleToDosFileHandle(long) -@ stdcall -arch=win32 DisposeLZ32Handle(long) +@ stdcall -arch=win32 DeleteDosFileHandle(long) @ stdcall -arch=win32 GlobalAlloc16(long long) @ stdcall -arch=win32 GlobalLock16(long) @ stdcall -arch=win32 GlobalUnlock16(long) diff --git a/lzexpand/lzexpand.c b/lzexpand/lzexpand.c index ce1c253d05..5e9da15a1c 100644 --- a/lzexpand/lzexpand.c +++ b/lzexpand/lzexpand.c @@ -135,7 +135,12 @@ HFILE16 WINAPI LZOpenFile16(LPSTR fn, LPOFSTRUCT ofs, UINT16 mode) void WINAPI LZClose16( HFILE16 fd ) { if (IS_LZ_HANDLE(fd)) LZClose( fd ); - else DisposeLZ32Handle( DosFileHandleToWin32Handle((HFILE)fd) ); + else + { + HANDLE fh = DosFileHandleToWin32Handle((HFILE)fd); + if (DeleteDosFileHandle(fh)) + CloseHandle(fh); + } } diff --git a/lzexpand/wine_lzexpand.c b/lzexpand/wine_lzexpand.c index 96d7a10dc1..4da44f7c2b 100644 --- a/lzexpand/wine_lzexpand.c +++ b/lzexpand/wine_lzexpand.c @@ -572,7 +572,8 @@ void WINAPI LZClose( HFILE fd ) { HeapFree( GetProcessHeap(), 0, lzs->get ); lzstates[fd - LZ_MIN_HANDLE] = NULL; - DisposeLZ32Handle(lzs->realfd); + if (DeleteDosFileHandle(lzs->realfd)) + CloseHandle(lzs->realfd); HeapFree( GetProcessHeap(), 0, lzs ); } } diff --git a/mmsystem/mmio16.c b/mmsystem/mmio16.c index e9ddad71ae..3bb320a947 100644 --- a/mmsystem/mmio16.c +++ b/mmsystem/mmio16.c @@ -381,22 +381,22 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags) { MMRESULT ret; - MMIOINFO mmioinfo; HMMIO hmmio32 = HMMIO_32(hmmio); + MMIOINFO mmioinfo = {0}; - if (!(uFlags & MMIO_FHOPEN) && !mmioGetInfo(hmmio32, &mmioinfo, 0)) - { - if (mmioinfo.fccIOProc == FOURCC_DOS) - DisposeLZ32Handle(mmioinfo.adwInfo[0]); - } + if (!(uFlags & MMIO_FHOPEN)) + mmioGetInfo(hmmio32, &mmioinfo, 0); EnterCriticalSection(&mmio_cs); - ret = mmioClose(HMMIO_32(hmmio), uFlags); + ret = mmioClose(hmmio32, uFlags); if (ret == MMSYSERR_NOERROR) { struct mmio_thunk* thunk; - if ((thunk = MMIO_HasThunk(HMMIO_32(hmmio)))) + if (mmioinfo.fccIOProc == FOURCC_DOS) + DeleteDosFileHandle(mmioinfo.adwInfo[0]); + + if ((thunk = MMIO_HasThunk(hmmio32))) { MMIO_SetSegmentedBuffer(thunk, 0, TRUE); thunk->pfn16 = NULL; diff --git a/wine/wine/winbase16.h b/wine/wine/winbase16.h index 4f7df1a285..5e65b2751f 100644 --- a/wine/wine/winbase16.h +++ b/wine/wine/winbase16.h @@ -350,7 +350,7 @@ WORD WINAPI AllocSelector16(WORD); WORD WINAPI AllocSelectorArray16(WORD); VOID WINAPI DirectedYield16(HTASK16); HGLOBAL16 WINAPI DirectResAlloc16(HINSTANCE16,WORD,UINT16); -void WINAPI DisposeLZ32Handle(HANDLE); +BOOL16 WINAPI DeleteDosFileHandle(HANDLE); HANDLE WINAPI DosFileHandleToWin32Handle(HFILE); HANDLE16 WINAPI FarGetOwner16(HGLOBAL16); VOID WINAPI FarSetOwner16(HGLOBAL16,HANDLE16); From beec22f9b2ba088d04742ad03b8fc49ee70e1667 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 11 Jul 2023 19:04:18 -0500 Subject: [PATCH 05/95] handle 0 font size (#1304) --- winhlp32/hlpfile.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/winhlp32/hlpfile.c b/winhlp32/hlpfile.c index bc291cc541..9ab6a3b6f3 100644 --- a/winhlp32/hlpfile.c +++ b/winhlp32/hlpfile.c @@ -2126,6 +2126,22 @@ static BOOL HLPFILE_ReadFont(HLPFILE* hlpfile) hlpfile->fonts[i].color = RGB(ref[dscr_offset + i * 11 + 5], ref[dscr_offset + i * 11 + 6], ref[dscr_offset + i * 11 + 7]); + if (!hlpfile->fonts[i].LogFont.lfHeight) // uses default createfont height + { + HFONT font; + if (font = CreateFontIndirectA(&hlpfile->fonts[i].LogFont)) + { + HDC hdc = CreateCompatibleDC(NULL); + HFONT oldfont = SelectObject(hdc, font); + TEXTMETRICA tm; + if (GetTextMetricsA(hdc, &tm)) + hlpfile->fonts[i].LogFont.lfHeight = (tm.tmHeight * 72 * 2) / GetDeviceCaps(hdc, LOGPIXELSY); + SelectObject(hdc, oldfont); + DeleteDC(hdc); + DeleteObject(font); + } + } + #define X(b,s) ((flag & (1 << b)) ? "-"s: "") WINE_TRACE("Font[%d]: flags=%02x%s%s%s%s%s%s pSize=%u family=%u face=%s[%u] color=%08x\n", i, flag, From 9a6b28fbb1eaafccdb38076126e1bc229bebd063 Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 2 Aug 2023 13:44:52 -0500 Subject: [PATCH 06/95] post a message in taskswitch to wake task if needed, don't yield in defframeproc if yield_event exists and add getsystemiconfont stub --- gdi/gdi.c | 7 +++++++ gdi/gdi.exe16.spec | 3 ++- krnl386/kernel.c | 1 + user/window.c | 9 ++++++--- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 2de6266739..312bfbd738 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -5296,3 +5296,10 @@ BOOL WINAPI DllEntryPoint(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, } return TRUE; } + +HFONT16 WINAPI GetSystemIconFont16() +{ + // only known to be used by Simplified Chinese progman + // uses SPI_GETICONTITLELOGFONT if this returns 0 + return 0; +} diff --git a/gdi/gdi.exe16.spec b/gdi/gdi.exe16.spec index 593d41deda..b03f8a489f 100644 --- a/gdi/gdi.exe16.spec +++ b/gdi/gdi.exe16.spec @@ -106,7 +106,8 @@ 106 pascal SetBitmapBits(word long ptr) SetBitmapBits16 # ??? (not even in W1.1) 117 pascal SetDCOrg(word s_word s_word) SetDCOrg16 -118 stub InternalCreateDC # W1.1, W2.0 +# 118 stub InternalCreateDC # W1.1, W2.0 +118 pascal -ret16 GetSystemIconFont() GetSystemIconFont16 119 pascal -ret16 AddFontResource(str) AddFontResource16 120 stub GetContinuingTextExtent # W1.1, W2.0 121 pascal -ret16 Death(word) Death16 diff --git a/krnl386/kernel.c b/krnl386/kernel.c index 6a93e04e88..b05ce62bc1 100644 --- a/krnl386/kernel.c +++ b/krnl386/kernel.c @@ -1171,6 +1171,7 @@ DWORD WINAPI TaskGetCSIP16(HTASK16 htask) BOOL WINAPI TaskSwitch16(HTASK16 htask, SEGPTR dwNewCSIP) { BOOL s = TaskSetCSIP16(htask, SELECTOROF(dwNewCSIP), OFFSETOF(dwNewCSIP)); + PostThreadMessage(HTASK_32(htask), 0, 0, 0); if (s) { DirectedYield16(htask); diff --git a/user/window.c b/user/window.c index 5355d27d60..7d5c693bf0 100644 --- a/user/window.c +++ b/user/window.c @@ -21,9 +21,9 @@ #include "wine/winuser16.h" #include "wownt32.h" #include "user_private.h" -#include "wine/server.h" #include "wine/debug.h" #include "wine/exception.h" +#include "../krnl386/kernel16_private.h" WINE_DEFAULT_DEBUG_CHANNEL(win); @@ -2970,11 +2970,14 @@ HWND16 WINAPI FindWindowEx16( HWND16 parent, HWND16 child, LPCSTR className, LPC LRESULT def_frame_proc_callback(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result, void *arg) { DWORD count; - ReleaseThunkLock(&count); + HANDLE yevent = kernel_get_thread_data()->yield_event; + if (!yevent) + ReleaseThunkLock(&count); if (hwnd == (HWND)arg) arg = NULL; *result = DefFrameProcA(hwnd, (HWND)arg, msg, wp, lp); - RestoreThunkLock(count); + if (!yevent) + RestoreThunkLock(count); return *result; } /*********************************************************************** From de30a2b8d097ec4f3b86fd0090adaa85c2b9230c Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 2 Aug 2023 13:50:32 -0500 Subject: [PATCH 07/95] use ansi --- krnl386/kernel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/krnl386/kernel.c b/krnl386/kernel.c index b05ce62bc1..274ca1c176 100644 --- a/krnl386/kernel.c +++ b/krnl386/kernel.c @@ -1171,7 +1171,7 @@ DWORD WINAPI TaskGetCSIP16(HTASK16 htask) BOOL WINAPI TaskSwitch16(HTASK16 htask, SEGPTR dwNewCSIP) { BOOL s = TaskSetCSIP16(htask, SELECTOROF(dwNewCSIP), OFFSETOF(dwNewCSIP)); - PostThreadMessage(HTASK_32(htask), 0, 0, 0); + PostThreadMessageA(HTASK_32(htask), 0, 0, 0); if (s) { DirectedYield16(htask); From 61f1f8c665bdfa83fbff98b89a4e6ca029e9f549 Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 2 Aug 2023 13:54:57 -0500 Subject: [PATCH 08/95] be safer --- krnl386/kernel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/krnl386/kernel.c b/krnl386/kernel.c index 274ca1c176..1ab1be99eb 100644 --- a/krnl386/kernel.c +++ b/krnl386/kernel.c @@ -1171,9 +1171,9 @@ DWORD WINAPI TaskGetCSIP16(HTASK16 htask) BOOL WINAPI TaskSwitch16(HTASK16 htask, SEGPTR dwNewCSIP) { BOOL s = TaskSetCSIP16(htask, SELECTOROF(dwNewCSIP), OFFSETOF(dwNewCSIP)); - PostThreadMessageA(HTASK_32(htask), 0, 0, 0); if (s) { + PostThreadMessageA(HTASK_32(htask), 0, 0, 0); DirectedYield16(htask); } return s; From b2e69311e127becf04ed84b996128301dfb6ea4f Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 4 Aug 2023 14:50:54 -0500 Subject: [PATCH 09/95] use enumfontfamiliesa --- gdi/gdi.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 312bfbd738..00c582fc93 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -3476,19 +3476,12 @@ BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes ) INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily, FONTENUMPROC16 efproc, LPARAM lpData ) { - LOGFONT16 lf, *plf; - - if (lpFamily) - { - if (!*lpFamily) return 1; - lstrcpynA( lf.lfFaceName, lpFamily, LF_FACESIZE ); - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfPitchAndFamily = 0; - plf = &lf; - } - else plf = NULL; + struct callback16_info info; - return EnumFontFamiliesEx16( hDC, plf, efproc, lpData, 0 ); + info.proc = (FARPROC16)efproc; + info.param = lpData; + info.result = 1; + return EnumFontFamiliesA(HDC_32(hDC), lpFamily, enum_font_callback, (LPARAM)&info); } From 3aa070011419bfbbb3c0f416b21f0ffd113649db Mon Sep 17 00:00:00 2001 From: otya Date: Sat, 30 Sep 2023 15:21:09 +0900 Subject: [PATCH 10/95] Load SHELL.DLL This completely fixes #515. Also fix https://m1cdq.co.uk/main/2019/06/26/winpack/ . --- otvdm/winevdm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/otvdm/winevdm.c b/otvdm/winevdm.c index 1463378bd0..ceb0d2c2b8 100644 --- a/otvdm/winevdm.c +++ b/otvdm/winevdm.c @@ -888,6 +888,7 @@ int entry_point( int argc, char *argv[] ) LoadLibrary16( "gdi.exe" ); LoadLibrary16( "user.exe" ); LoadLibrary16( "mmsystem.dll" ); + LoadLibrary16( "shell.dll" ); krnl386_set_compat_path(appname); From 41df204e1d491b0393900edbd2833f64ea9b3cfe Mon Sep 17 00:00:00 2001 From: otya Date: Sat, 30 Sep 2023 15:23:32 +0900 Subject: [PATCH 11/95] Revert "remove stray period from end of filename in loadlibrary" This reverts commit a45ac8e3c539962b8d1bd10a72a2f5e39412a0cf. Windows 3.1 and NTVDM do not remove a stray period. 3aa070011419bfbbb3c0f416b21f0ffd113649db makes this workaround unnecessary. --- krnl386/ne_module.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/krnl386/ne_module.c b/krnl386/ne_module.c index d145cfc276..d6bb8b2098 100644 --- a/krnl386/ne_module.c +++ b/krnl386/ne_module.c @@ -1125,11 +1125,6 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_ strcpy( dllname, basename ); q = strrchr( dllname, '.' ); - if (q && !q[1]) - { - *q = '\0'; - q = NULL; - } if (!q) strcat( dllname, ".dll" ); for (q = dllname; *q; q++) if (*q >= 'A' && *q <= 'Z') *q += 32; @@ -1200,11 +1195,6 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_ char *q; strcpy( dllname, basename ); q = strrchr( dllname, '.' ); - if (q && !q[1]) - { - *q = '\0'; - q = NULL; - } if (!q) strcat( dllname, (GetExeVersion16() >= 0x0300) ? ".dll" : ".exe" ); TRACE("Trying native dll '%s'\n", !q ? dllname : libname); hinst = NE_LoadModule(!q ? dllname : libname, lib_only); From f59d86824e980b30913f94689a17e90c1c8c4f1f Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 2 Nov 2023 16:31:31 -0500 Subject: [PATCH 12/95] Allow freeing of 0 size hglobal. --- krnl386/global.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/krnl386/global.c b/krnl386/global.c index 7b1d0cd938..8f163b9d19 100644 --- a/krnl386/global.c +++ b/krnl386/global.c @@ -228,11 +228,6 @@ BOOL16 GLOBAL_FreeBlock( HGLOBAL16 handle ) sel = GlobalHandleToSel16( handle ); if (!VALID_HANDLE(sel)) return FALSE; pArena = GET_ARENA_PTR(sel); - if (!pArena->size) - { - WARN( "already free %x\n", handle ); - return FALSE; - } SELECTOR_FreeBlock( sel ); clear_sel_table(sel, pArena->selCount); memset( pArena, 0, sizeof(GLOBALARENA) ); From c5a25e43f43d1c53dbd9f5ba85e498565eb598c7 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 7 Nov 2023 10:19:15 -0600 Subject: [PATCH 13/95] speed up timer to make vb sendkeys more responsive --- user/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/hook.c b/user/hook.c index d4aa19b18c..afc11eb042 100644 --- a/user/hook.c +++ b/user/hook.c @@ -879,7 +879,7 @@ void install_global_hook() if (id == WH_JOURNALPLAYBACK) { BlockInput(TRUE); - info->hhook[index] = SetTimer(NULL, 0, 100, journal_playback_cb); + info->hhook[index] = SetTimer(NULL, 0, 10, journal_playback_cb); return; } else From b5afc61a52a5ecd4a1d63d21e3b9d08afb3cc363 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 9 Nov 2023 14:49:26 -0600 Subject: [PATCH 14/95] support autosubclass and fix colored frames --- ctl3dv2/ctl3d.c | 139 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 128 insertions(+), 11 deletions(-) diff --git a/ctl3dv2/ctl3d.c b/ctl3dv2/ctl3d.c index ec8b938540..da02467d29 100644 --- a/ctl3dv2/ctl3d.c +++ b/ctl3dv2/ctl3d.c @@ -49,7 +49,13 @@ #define CTLMSGOFFSET 3569 #define CTL3D_CTLCOLOR (WM_USER + CTLMSGOFFSET) -static BOOL16 CTL3D16_is_auto_subclass = FALSE; +struct autosubclass +{ + HHOOK hook; + DWORD type; +}; + +static DWORD autosubclass_index = NULL; static WNDPROC listbox_proc; static WNDPROC button_proc; @@ -77,25 +83,123 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID lpvReserved) edit_proc = cls.lpfnWndProc; if (GetClassInfoA(hinstDLL, "#32770", &cls)) dialog_proc = cls.lpfnWndProc; + autosubclass_index = TlsAlloc(); + break; + case DLL_PROCESS_DETACH: + TlsFree(autosubclass_index); + break; + case DLL_THREAD_DETACH: + struct autosubclass *asc = TlsGetValue(autosubclass_index); + if (asc) + { + UnhookWindowsHookEx(asc->hook); + HeapFree(GetProcessHeap(), 0, asc); + } break; } return TRUE; } + +static void ctl3d_static(DWORD type, DWORD *style, DWORD *exstyle) +{ + switch (*style & 0xf) + { + case SS_BLACKFRAME: + if (type & CTL3D_STATICFRAMES) + { + *style &= ~SS_BLACKFRAME; + *exstyle |= WS_EX_CLIENTEDGE; + } + break; + case SS_GRAYFRAME: + if (type & CTL3D_STATICFRAMES) + { + *style &= ~SS_GRAYFRAME; + *style |= SS_ETCHEDFRAME; + } + break; + case SS_WHITEFRAME: + if (type & CTL3D_STATICFRAMES) + { + *style &= ~SS_WHITEFRAME; + *exstyle |= WS_EX_DLGMODALFRAME; + } + break; + case SS_BLACKRECT: + if (type & CTL3D_STATICTEXTS) + { + *style &= ~SS_BLACKRECT; + *exstyle |= WS_EX_CLIENTEDGE; + } + break; + case SS_GRAYRECT: + if (type & CTL3D_STATICTEXTS) + { + *style &= ~SS_GRAYRECT; + *style |= SS_ETCHEDFRAME; + } + break; + case SS_WHITERECT: + if (type & CTL3D_STATICTEXTS) + { + *style &= ~SS_WHITERECT; + *exstyle |= WS_EX_DLGMODALFRAME; + } + break; + } +} + +static LRESULT CALLBACK subclassproc(INT code, WPARAM wp, LPARAM lp) +{ + struct autosubclass *asc = TlsGetValue(autosubclass_index); + if (code == HCBT_CREATEWND) + { + CBT_CREATEWNDA *cbt_cw = (CBT_CREATEWNDA *)lp; + char *cls = cbt_cw->lpcs->lpszClass; + if ((DWORD)cls & 0xffff0000) + { + if ((asc->type & CTL3D_EDITS) && (!strcmpi(cls, "EDIT")) || ((asc->type & CTL3D_LISTBOXES) && !strcmpi(cls, "LISTBOX"))) + { + DWORD exstyle = cbt_cw->lpcs->dwExStyle | WS_EX_CLIENTEDGE; + SetWindowLongA(wp, GWL_EXSTYLE, exstyle); + } + if (!strcmpi(cls, "STATIC")) + { + DWORD style = cbt_cw->lpcs->style; + DWORD exstyle = cbt_cw->lpcs->dwExStyle; + ctl3d_static(asc->type, &style, &exstyle); + cbt_cw->lpcs->style = style; + cbt_cw->lpcs->dwExStyle = style; + SetWindowLongA(wp, GWL_STYLE, style); + SetWindowLongA(wp, GWL_EXSTYLE, exstyle); + } + } + } + return CallNextHookEx(asc->hook, code, wp, lp); +} + /*********************************************************************** - * Ctl3dAutoSubclass (CTL3DV2.16) + * Ctl3dAutoSubclassEx (CTL3DV2.27) */ -BOOL16 WINAPI Ctl3dAutoSubclass16(HINSTANCE16 hInst) +BOOL16 WINAPI Ctl3dAutoSubclassEx16(HINSTANCE16 hInst, DWORD type) { - CTL3D16_is_auto_subclass = TRUE; + struct autosubclass *asc = TlsGetValue(autosubclass_index); + if (!asc) + { + asc = (struct autosubclass *)HeapAlloc(GetProcessHeap(), 0, sizeof(struct autosubclass)); + asc->hook = SetWindowsHookExA(WH_CBT, subclassproc, NULL, GetCurrentThreadId()); + TlsSetValue(autosubclass_index, asc); + } + asc->type = type; return TRUE; } /*********************************************************************** - * Ctl3dAutoSubclassEx (CTL3DV2.27) + * Ctl3dAutoSubclass (CTL3DV2.16) */ -BOOL16 WINAPI Ctl3dAutoSubclassEx16(HINSTANCE16 hInst, DWORD type) +BOOL16 WINAPI Ctl3dAutoSubclass16(HINSTANCE16 hInst) { - CTL3D16_is_auto_subclass = TRUE; + Ctl3dAutoSubclassEx16(hInst, CTL3D_ALL); return TRUE; } @@ -152,7 +256,7 @@ WORD WINAPI Ctl3dGetVer16(void) */ BOOL16 WINAPI Ctl3dIsAutoSubclass16(void) { - return CTL3D16_is_auto_subclass; + return TlsGetValue(autosubclass_index) ? TRUE : FALSE; } /*********************************************************************** @@ -174,9 +278,17 @@ BOOL16 WINAPI Ctl3dSubclassCtlEx16(HWND16 hwnd, INT16 type) GetClassNameA(hwnd32, buf, sizeof(buf)); if ((type & CTL3D_EDITS) && (!strcmpi(buf, "EDIT")) || ((type & CTL3D_LISTBOXES) && !strcmpi(buf, "LISTBOX"))) { - SetWindowLongA(hwnd32, GWL_EXSTYLE, GetWindowLongA(HWND_32(hwnd), GWL_EXSTYLE) | WS_EX_CLIENTEDGE); + SetWindowLongA(hwnd32, GWL_EXSTYLE, GetWindowLongA(hwnd32, GWL_EXSTYLE) | WS_EX_CLIENTEDGE); SetWindowPos(hwnd32, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_DRAWFRAME); } + else if (!strcmpi(buf, "STATIC")) + { + DWORD style = GetWindowLongA(hwnd32, GWL_STYLE); + DWORD exstyle = GetWindowLongA(hwnd32, GWL_EXSTYLE); + ctl3d_static(type, &style, &exstyle); + SetWindowLongA(hwnd32, GWL_STYLE, style); + SetWindowLongA(hwnd32, GWL_EXSTYLE, exstyle); + } return TRUE; } @@ -225,7 +337,12 @@ BOOL16 WINAPI Ctl3dSubclassDlg16(HWND16 hwnd, WORD types) */ BOOL16 WINAPI Ctl3dUnAutoSubclass16(void) { - CTL3D16_is_auto_subclass = FALSE; + struct autosubclass *asc = TlsGetValue(autosubclass_index); + if (asc) + { + UnhookWindowsHookEx(asc->hook); + HeapFree(GetProcessHeap(), 0, asc); + } return FALSE; } @@ -234,7 +351,7 @@ BOOL16 WINAPI Ctl3dUnAutoSubclass16(void) */ BOOL16 WINAPI Ctl3dUnregister16(HINSTANCE16 hInst) { - CTL3D16_is_auto_subclass = FALSE; + Ctl3dUnAutoSubclass16(); return TRUE; } From 74ce47fad33a23cd8d503dc6c746e86af8815919 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 9 Nov 2023 14:54:55 -0600 Subject: [PATCH 15/95] forget to clear pointer --- ctl3dv2/ctl3d.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ctl3dv2/ctl3d.c b/ctl3dv2/ctl3d.c index da02467d29..e11eecf752 100644 --- a/ctl3dv2/ctl3d.c +++ b/ctl3dv2/ctl3d.c @@ -342,6 +342,7 @@ BOOL16 WINAPI Ctl3dUnAutoSubclass16(void) { UnhookWindowsHookEx(asc->hook); HeapFree(GetProcessHeap(), 0, asc); + TlsSetValue(autosubclass_index, 0); } return FALSE; } From 6710b418a5fb6f114afb429325af87c207f12c0a Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 9 Nov 2023 16:20:47 -0600 Subject: [PATCH 16/95] fix build --- ctl3dv2/ctl3d.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ctl3dv2/ctl3d.c b/ctl3dv2/ctl3d.c index e11eecf752..2ba56f0de2 100644 --- a/ctl3dv2/ctl3d.c +++ b/ctl3dv2/ctl3d.c @@ -89,6 +89,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID lpvReserved) TlsFree(autosubclass_index); break; case DLL_THREAD_DETACH: + { struct autosubclass *asc = TlsGetValue(autosubclass_index); if (asc) { @@ -97,6 +98,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID lpvReserved) } break; } + } return TRUE; } From 34c912c400a73a89aaa7f297e35d910f4ddfb6a8 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 9 Nov 2023 17:08:39 -0600 Subject: [PATCH 17/95] oops --- ctl3dv2/ctl3d.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctl3dv2/ctl3d.c b/ctl3dv2/ctl3d.c index 2ba56f0de2..843c8d08bf 100644 --- a/ctl3dv2/ctl3d.c +++ b/ctl3dv2/ctl3d.c @@ -171,7 +171,7 @@ static LRESULT CALLBACK subclassproc(INT code, WPARAM wp, LPARAM lp) DWORD exstyle = cbt_cw->lpcs->dwExStyle; ctl3d_static(asc->type, &style, &exstyle); cbt_cw->lpcs->style = style; - cbt_cw->lpcs->dwExStyle = style; + cbt_cw->lpcs->dwExStyle = exstyle; SetWindowLongA(wp, GWL_STYLE, style); SetWindowLongA(wp, GWL_EXSTYLE, exstyle); } From 98384ab0c1d3f656e26e872013c6c85ce7fd0cd1 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 9 Nov 2023 19:39:04 -0600 Subject: [PATCH 18/95] make journalplayback account for key press timing also if time is 0 send key without delay --- user/hook.c | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/user/hook.c b/user/hook.c index afc11eb042..6284e1a3c5 100644 --- a/user/hook.c +++ b/user/hook.c @@ -797,6 +797,11 @@ static LRESULT CALLBACK global_call_WH_SHELL(INT code, WPARAM wp, LPARAM lp) return call_WH_SHELL(code, wp, lp, TRUE); } +struct journal_pb +{ + UINT_PTR timer; + EVENTMSG16 emsg; +}; // TODO: key delay and mouse messages static void WINAPI journal_playback_cb( HWND hwnd, UINT msg, UINT_PTR id, DWORD sysTime ) @@ -804,12 +809,24 @@ static void WINAPI journal_playback_cb( HWND hwnd, UINT msg, UINT_PTR id, DWORD EVENTMSG16 emsg; LPARAM lp; INPUT input; - lp = MapLS( &emsg ); - call_hook_16( WH_JOURNALPLAYBACK, HC_GETNEXT, 0, lp, TRUE ); - UnMapLS( lp ); - TRACE("WH_JOURNALPLAYBACK message: %x paramL: %x paramH: %x\n", emsg.message, emsg.paramL, emsg.paramH); - switch( emsg.message ) - { + LRESULT time = 0; + struct hook16_queue_info *info = get_hook_info(FALSE, 0); + struct journal_pb *jp = info->global_hhook[WH_JOURNALPLAYBACK - WH_MINHOOK]; + BOOL msg_rdy = jp->emsg.message ? TRUE : FALSE; + if (msg_rdy) + memcpy(&emsg, &jp->emsg, sizeof(EVENTMSG16)); +start: + if (!msg_rdy) + { + lp = MapLS( &emsg ); + time = call_hook_16( WH_JOURNALPLAYBACK, HC_GETNEXT, 0, lp, TRUE ); + UnMapLS( lp ); + } + if (!time) + { + TRACE("WH_JOURNALPLAYBACK message: %x paramL: %x paramH: %x\n", emsg.message, emsg.paramL, emsg.paramH); + switch( emsg.message ) + { case WM_QUEUESYNC: if (GetActiveWindow16()) PostMessage16(GetActiveWindow16(), WM_QUEUESYNC, 0, NULL); @@ -837,7 +854,13 @@ static void WINAPI journal_playback_cb( HWND hwnd, UINT msg, UINT_PTR id, DWORD SendInput( 1, &input, sizeof(input) ); break; } - call_hook_16( WH_JOURNALPLAYBACK, HC_SKIP, 0, 0, TRUE ); + if (!info->global_hhook[WH_JOURNALPLAYBACK - WH_MINHOOK]) return; + call_hook_16( WH_JOURNALPLAYBACK, HC_SKIP, 0, 0, TRUE ); + msg_rdy = FALSE; + goto start; + } + if (!info->global_hhook[WH_JOURNALPLAYBACK - WH_MINHOOK]) return; + memcpy(&jp->emsg, &emsg, sizeof(EVENTMSG16)); } @@ -879,7 +902,9 @@ void install_global_hook() if (id == WH_JOURNALPLAYBACK) { BlockInput(TRUE); - info->hhook[index] = SetTimer(NULL, 0, 10, journal_playback_cb); + struct journal_pb *jp = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct journal_pb)); + jp->timer = SetTimer(NULL, 0, 10, journal_playback_cb); + info->global_hhook[index] = jp; return; } else @@ -1083,7 +1108,9 @@ BOOL16 WINAPI UnhookWindowsHookEx16(HHOOK hhook) SendInput(1, &input, sizeof(INPUT)); } BlockInput(FALSE); - KillTimer(NULL, (UINT_PTR)info->hhook[index]); + KillTimer(NULL, ((struct journal_pb *)info->global_hhook[index])->timer); + HeapFree(GetProcessHeap(), 0, (UINT_PTR)info->global_hhook[index]); + info->global_hhook[index] = NULL; } else { From f8563186b07abcd45b78c6f5d28a302aa3a6546d Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 10 Nov 2023 09:37:32 -0600 Subject: [PATCH 19/95] try actually resetting the timer --- user/hook.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/hook.c b/user/hook.c index 6284e1a3c5..3aafd20398 100644 --- a/user/hook.c +++ b/user/hook.c @@ -803,7 +803,7 @@ struct journal_pb EVENTMSG16 emsg; }; -// TODO: key delay and mouse messages +// TODO: mouse messages static void WINAPI journal_playback_cb( HWND hwnd, UINT msg, UINT_PTR id, DWORD sysTime ) { EVENTMSG16 emsg; @@ -861,6 +861,7 @@ static void WINAPI journal_playback_cb( HWND hwnd, UINT msg, UINT_PTR id, DWORD } if (!info->global_hhook[WH_JOURNALPLAYBACK - WH_MINHOOK]) return; memcpy(&jp->emsg, &emsg, sizeof(EVENTMSG16)); + SetTimer(NULL, jp->timer, time, journal_playback_cb); } From a36fc1936d66dfcb558568c4d1688abd5571a912 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 12 Dec 2023 15:15:00 -0600 Subject: [PATCH 20/95] add int31 allocate specific descriptor, pass cmdline to libmain, fix dde additem for files in the winevdm windows directory, fix cpu bug with prefixes --- krnl386/int31.c | 27 ++++++++++++++++++++++++--- krnl386/kernel16_private.h | 2 +- krnl386/ne_module.c | 18 +++++++++--------- krnl386/ne_segment.c | 18 ++++++++++++------ krnl386/task.c | 2 +- user/dde.c | 31 +++++++++++++++++++++++-------- user/window.c | 6 +++++- vm86/mame/emu/cpu/i386/i386ops.c | 14 +++++++++++--- 8 files changed, 86 insertions(+), 32 deletions(-) diff --git a/krnl386/int31.c b/krnl386/int31.c index 56243a61e4..45790ac941 100644 --- a/krnl386/int31.c +++ b/krnl386/int31.c @@ -1122,9 +1122,30 @@ void WINAPI DOSVM_Int31Handler( CONTEXT *context ) break; case 0x000d: /* Allocate specific LDT descriptor */ - FIXME( "allocate descriptor (0x%04x), stub!\n", BX_reg(context) ); - SET_AX( context, 0x8011 ); /* descriptor unavailable */ - SET_CFLAG( context ); + TRACE( "allocate descriptor (0x%04x)\n", BX_reg(context) ); + if (!(BX_reg(context) & 4)) + { + SET_AX( context, 0x8022 ); /* gdt descriptor */ + SET_CFLAG( context ); + } + else + { + LDT_ENTRY entry; + WORD sel = BX_reg(context); + wine_ldt_get_entry(sel, &entry); + if (wine_ldt_get_flags(&entry) & WINE_LDT_FLAGS_ALLOCATED) + { + SET_AX( context, 0x8011 ); /* descriptor unavailable */ + SET_CFLAG( context ); + } + else + { + wine_ldt_set_flags(&entry, WINE_LDT_FLAGS_DATA); + wine_ldt_set_base(&entry, 0); + wine_ldt_set_limit(&entry, 0); + wine_ldt_set_entry(sel, &entry); + } + } break; case 0x000e: /* Get Multiple Descriptors (1.0) */ diff --git a/krnl386/kernel16_private.h b/krnl386/kernel16_private.h index 4fe6edabf7..5b273753d0 100644 --- a/krnl386/kernel16_private.h +++ b/krnl386/kernel16_private.h @@ -685,7 +685,7 @@ extern BOOL NE_LoadAllSegments( NE_MODULE *pModule ) DECLSPEC_HIDDEN; extern BOOL NE_CreateSegment( NE_MODULE *pModule, int segnum, WORD sel ) DECLSPEC_HIDDEN; extern BOOL NE_CreateAllSegments( NE_MODULE *pModule ) DECLSPEC_HIDDEN; extern HINSTANCE16 NE_GetInstance( NE_MODULE *pModule ) DECLSPEC_HIDDEN; -extern void NE_InitializeDLLs( HMODULE16 hModule ) DECLSPEC_HIDDEN; +extern void NE_InitializeDLLs( HMODULE16 hModule, SEGPTR cmdline ) DECLSPEC_HIDDEN; extern void NE_DllProcessAttach( HMODULE16 hModule ) DECLSPEC_HIDDEN; extern void NE_CallUserSignalProc( HMODULE16 hModule, UINT16 code, WORD arg1, WORD arg2, WORD arg3 ) DECLSPEC_HIDDEN; diff --git a/krnl386/ne_module.c b/krnl386/ne_module.c index d6bb8b2098..6cfc76b271 100644 --- a/krnl386/ne_module.c +++ b/krnl386/ne_module.c @@ -75,7 +75,7 @@ struct ne_segment_table_entry_s static HINSTANCE16 NE_LoadModule( LPCSTR name, BOOL lib_only ); static BOOL16 NE_FreeModule( HMODULE16 hModule, BOOL call_wep, BOOL cleanup ); -static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_only ); +static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_only, SEGPTR cmdline ); static HMODULE16 NE_GetModuleByFilename( LPCSTR name ); @@ -869,13 +869,13 @@ static BOOL NE_LoadDLLs( NE_MODULE *pModule ) { LPSTR buf = buffer + strlen(buffer); without_ext = TRUE; - hDLL = MODULE_LoadModule16(buffer, TRUE, TRUE); + hDLL = MODULE_LoadModule16(buffer, TRUE, TRUE, NULL); if (hDLL < 32) { HMODULE16 exe; buf[0] = 0; strcat(buffer, ".EXE"); - exe = MODULE_LoadModule16(buffer, TRUE, TRUE); + exe = MODULE_LoadModule16(buffer, TRUE, TRUE, NULL); if (exe >= 32) { hDLL = exe; @@ -889,7 +889,7 @@ static BOOL NE_LoadDLLs( NE_MODULE *pModule ) } else { - hDLL = MODULE_LoadModule16(buffer, TRUE, TRUE); + hDLL = MODULE_LoadModule16(buffer, TRUE, TRUE, NULL); } if (hDLL < 32) @@ -1098,7 +1098,7 @@ LPCSTR krnl386_search_executable_file(LPCSTR lpFile, LPSTR buf, SIZE_T size, BOO * The caller is responsible that the module is not loaded already. * */ -static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_only ) +static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_only, SEGPTR cmdline ) { HINSTANCE16 hinst = 2; HMODULE16 hModule; @@ -1227,7 +1227,7 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_ */ if(pModule->ne_flags & NE_FFLAGS_LIBMODULE) { - NE_InitializeDLLs(hModule); + NE_InitializeDLLs(hModule, cmdline); NE_DllProcessAttach(hModule); } else DOSMEM_InitDosMemory(); /* we will be running a 16-bit task, setup DOS memory */ @@ -1407,12 +1407,12 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock ) else { /* Main case: load first instance of NE module */ - - if ((hModule = MODULE_LoadModule16(name, FALSE, lib_only)) < 32) + params = paramBlock; + SEGPTR cmdline = IsBadReadPtr(params, 8) ? NULL : params->cmdLine; + if ((hModule = MODULE_LoadModule16(name, FALSE, lib_only, cmdline)) < 32) { if (hModule == 21/* win32 */) { - params = paramBlock; LOADPARMS32 paramBlock32; if (lib_only) { diff --git a/krnl386/ne_segment.c b/krnl386/ne_segment.c index 8a0faf25e6..29ff8f178f 100644 --- a/krnl386/ne_segment.c +++ b/krnl386/ne_segment.c @@ -680,7 +680,7 @@ static VOID NE_GetDLLInitParams( NE_MODULE *pModule, * * Call the DLL initialization code */ -static BOOL NE_InitDLL( NE_MODULE *pModule ) +static BOOL NE_InitDLL( NE_MODULE *pModule, SEGPTR cmdline ) { SEGTABLEENTRY *pSegTable; WORD hInst, ds, heap; @@ -708,7 +708,7 @@ static BOOL NE_InitDLL( NE_MODULE *pModule ) * cx heap size * di library instance * ds data segment if any - * es:si command line (always 0) + * es:si command line */ memset( &context, 0, sizeof(context) ); @@ -718,7 +718,13 @@ static BOOL NE_InitDLL( NE_MODULE *pModule ) context.Ecx = heap; context.Edi = hInst; context.SegDs = ds; - context.SegEs = ds; /* who knows ... */ + if (cmdline) + { + context.SegEs = HIWORD(cmdline); + context.Esi = LOWORD(cmdline); + } + else + context.SegEs = ds; /* who knows ... */ context.SegFs = wine_get_fs(); context.SegGs = wine_get_gs(); context.SegCs = SEL(pSegTable[SELECTOROF(pModule->ne_csip)-1].hSeg); @@ -753,7 +759,7 @@ static BOOL NE_InitDLL( NE_MODULE *pModule ) * Recursively initialize all DLLs (according to the order in which * they where loaded). */ -void NE_InitializeDLLs( HMODULE16 hModule ) +void NE_InitializeDLLs( HMODULE16 hModule, SEGPTR cmdline ) { NE_MODULE *pModule; HMODULE16 *pDLL; @@ -767,11 +773,11 @@ void NE_InitializeDLLs( HMODULE16 hModule ) pModule->dlls_to_init = 0; for (pDLL = GlobalLock16( to_init ); *pDLL; pDLL++) { - NE_InitializeDLLs( *pDLL ); + NE_InitializeDLLs( *pDLL, NULL ); } GlobalFree16( to_init ); } - NE_InitDLL( pModule ); + NE_InitDLL( pModule, cmdline ); } diff --git a/krnl386/task.c b/krnl386/task.c index f736be9e87..8b78e3fa06 100644 --- a/krnl386/task.c +++ b/krnl386/task.c @@ -865,7 +865,7 @@ void WINAPI InitTask16( CONTEXT *context ) LocalInit16( GlobalHandleToSel16(pTask->hInstance), 0, LOWORD(context->Ecx) ); /* Initialize implicitly loaded DLLs */ - NE_InitializeDLLs( pTask->hModule ); + NE_InitializeDLLs( pTask->hModule, NULL ); NE_DllProcessAttach( pTask->hModule ); /* Registers on return are: diff --git a/user/dde.c b/user/dde.c index b66389d318..72679385bd 100644 --- a/user/dde.c +++ b/user/dde.c @@ -465,6 +465,7 @@ static void seticon(IShellLinkW *link, WCHAR *path, int iconidx) IShellLinkW_SetIconLocation(link, path, iconidx); } +__declspec(dllimport) LPCSTR RedirectSystemDir(LPCSTR path, LPSTR to, size_t max_len); static DWORD PROGMAN_OnExecute(WCHAR *command, int argc, WCHAR **argv) { static const WCHAR create_groupW[] = {'C','r','e','a','t','e','G','r','o','u','p',0}; @@ -547,7 +548,8 @@ static DWORD PROGMAN_OnExecute(WCHAR *command, int argc, WCHAR **argv) int cmd_argc; WCHAR **cmd_argv; WCHAR *prg_name, *dirend; - BOOL defdirpath = FALSE; + WCHAR *dirpath = NULL; + WCHAR windirW[MAX_PATH]; if (argc < 1) return DDE_FNOTPROCESSED; @@ -569,8 +571,8 @@ static DWORD PROGMAN_OnExecute(WCHAR *command, int argc, WCHAR **argv) { if (argc >= 7) { - defdirpath = TRUE; - len = SearchPathW(argv[6], prg_name, dotexeW, 0, NULL, NULL); + dirpath = argv[6]; + len = SearchPathW(dirpath, prg_name, dotexeW, 0, NULL, NULL); } if (!wcsicmp(prg_name, winhelpW)) { @@ -579,14 +581,25 @@ static DWORD PROGMAN_OnExecute(WCHAR *command, int argc, WCHAR **argv) } if (len == 0) { - LocalFree(cmd_argv); - IShellLinkW_Release(link); - return DDE_FNOTPROCESSED; + char windirA[MAX_PATH]; + RedirectSystemDir("C:\\windows", windirA, MAX_PATH); + int res = MultiByteToWideChar(CP_ACP, 0, windirA, -1, windirW, MAX_PATH); + if (res) + { + dirpath = windirW; + len = SearchPathW(windirW, prg_name, dotexeW, 0, NULL, NULL); + } + if (len == 0) + { + LocalFree(cmd_argv); + IShellLinkW_Release(link); + return DDE_FNOTPROCESSED; + } } } path = heap_alloc(len * sizeof(WCHAR)); - if (defdirpath) - SearchPathW(argv[6], prg_name, dotexeW, len, path, &dirend); + if (dirpath) + SearchPathW(dirpath, prg_name, dotexeW, len, path, &dirend); else SearchPathW(NULL, prg_name, dotexeW, len, path, &dirend); IShellLinkW_SetPath(link, path); @@ -604,6 +617,8 @@ static DWORD PROGMAN_OnExecute(WCHAR *command, int argc, WCHAR **argv) seticon(link, path, 0); if ((argc >= 7) && strlen(argv[6])) IShellLinkW_SetWorkingDirectory(link, argv[6]); + else if (dirpath) + IShellLinkW_SetWorkingDirectory(link, dirpath); else { *dirend = 0; diff --git a/user/window.c b/user/window.c index 7d5c693bf0..82f3e6c96b 100644 --- a/user/window.c +++ b/user/window.c @@ -2530,7 +2530,11 @@ BOOL16 WINAPI SetWindowPlacement16( HWND16 hwnd, const WINDOWPLACEMENT16 *wp16 ) wpl.rcNormalPosition.top = wp16->rcNormalPosition.top; wpl.rcNormalPosition.right = wp16->rcNormalPosition.right; wpl.rcNormalPosition.bottom = wp16->rcNormalPosition.bottom; - return SetWindowPlacement( WIN_Handle32(hwnd), &wpl ); + DWORD count; + ReleaseThunkLock(&count); + BOOL ret = SetWindowPlacement( WIN_Handle32(hwnd), &wpl ); + RestoreThunkLock(count); + return ret; } struct WNDCLASS16Info WNDCLASS16Info[65536]; diff --git a/vm86/mame/emu/cpu/i386/i386ops.c b/vm86/mame/emu/cpu/i386/i386ops.c index 21d36d83aa..a30ba80f43 100644 --- a/vm86/mame/emu/cpu/i386/i386ops.c +++ b/vm86/mame/emu/cpu/i386/i386ops.c @@ -1137,11 +1137,19 @@ static void I386OP(repeat)(int invert_flag) m_segment_prefix=1; break; case 0x66: - m_operand_size ^= 1; - m_xmm_operand_size ^= 1; + if(!m_operand_prefix) + { + m_operand_size ^= 1; + m_xmm_operand_size ^= 1; + m_operand_prefix = 1; + } break; case 0x67: - m_address_size ^= 1; + if(!m_address_prefix) + { + m_address_size ^= 1; + m_address_prefix = 1; + } break; default: prefix_flag=0; From 452b8eebc75cb4204ec8d4392bef4f7365171cb6 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 12 Dec 2023 16:30:18 -0600 Subject: [PATCH 21/95] permit modification of system entries and fix selector allocation --- krnl386/int31.c | 3 ++- wine/ldt2.c | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/krnl386/int31.c b/krnl386/int31.c index 45790ac941..4d0e28e86b 100644 --- a/krnl386/int31.c +++ b/krnl386/int31.c @@ -1133,13 +1133,14 @@ void WINAPI DOSVM_Int31Handler( CONTEXT *context ) LDT_ENTRY entry; WORD sel = BX_reg(context); wine_ldt_get_entry(sel, &entry); - if (wine_ldt_get_flags(&entry) & WINE_LDT_FLAGS_ALLOCATED) + if (wine_ldt_copy.flags[sel >> __AHSHIFT] & WINE_LDT_FLAGS_ALLOCATED) { SET_AX( context, 0x8011 ); /* descriptor unavailable */ SET_CFLAG( context ); } else { + wine_ldt_copy.flags[sel >> __AHSHIFT] |= WINE_LDT_FLAGS_ALLOCATED; wine_ldt_set_flags(&entry, WINE_LDT_FLAGS_DATA); wine_ldt_set_base(&entry, 0); wine_ldt_set_limit(&entry, 0); diff --git a/wine/ldt2.c b/wine/ldt2.c index 5573d6e27a..39c8f9a2c4 100644 --- a/wine/ldt2.c +++ b/wine/ldt2.c @@ -67,7 +67,6 @@ int wine_ldt_set_entry(unsigned short sel, const LDT_ENTRY *entry) { int ret = 0, index = sel >> 3; ret = TRUE; - if (index < LDT_FIRST_ENTRY) return 0; /* cannot modify reserved entries */ if (ret >= 0) { wine_ldt[index] = *entry; @@ -215,8 +214,6 @@ static int internal_set_entry(unsigned short sel, const LDT_ENTRY *entry) { int ret = 0, index = sel >> 3; - if (index < LDT_FIRST_ENTRY) return 0; /* cannot modify reserved entries */ - if (ret >= 0) { wine_ldt[index] = *entry; From 32d9d87236ee0babcacfbd3cfc7c885c0b195748 Mon Sep 17 00:00:00 2001 From: roytam1 Date: Wed, 13 Dec 2023 23:56:33 +0800 Subject: [PATCH 22/95] winhlp32: set PSAPI_VERSION=1 and link to psapi --- winhlp32/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winhlp32/CMakeLists.txt b/winhlp32/CMakeLists.txt index f5fb498cb2..21c6fee401 100644 --- a/winhlp32/CMakeLists.txt +++ b/winhlp32/CMakeLists.txt @@ -1,5 +1,5 @@ include_directories(../wine ./) -add_definitions(-D_X86_ -D__WINESRC__ -D__i386__ -DHAVE_STRNCASECMP -DHAVE__STRNICMP -D_WINTERNL_ -DNtCurrentTeb=NtCurrentTeb__ -DDECLSPEC_HIDDEN=) +add_definitions(-D_X86_ -D__WINESRC__ -D__i386__ -DHAVE_STRNCASECMP -DHAVE__STRNICMP -D_WINTERNL_ -DNtCurrentTeb=NtCurrentTeb__ -DDECLSPEC_HIDDEN= -DPSAPI_VERSION=1) flex_target(winhlp_scanner macro.lex.l ${CMAKE_CURRENT_BINARY_DIR}/lex.yy.c COMPILE_FLAGS) add_executable(winhlp32 WIN32 callback.c hlpfile.c macro.c string.c winhelp.c winhlp32.rc ${FLEX_winhlp_scanner_OUTPUTS}) -target_link_libraries(winhlp32 libwine comctl32.lib) +target_link_libraries(winhlp32 libwine comctl32.lib psapi.lib) From ddf05fe4b0122904dc429d82a03074d17bbe8f84 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 14 Dec 2023 15:07:11 -0600 Subject: [PATCH 23/95] make sure selector is ldt in mapsl --- krnl386/selector.c | 1 + 1 file changed, 1 insertion(+) diff --git a/krnl386/selector.c b/krnl386/selector.c index b10a9e5d22..e804861174 100644 --- a/krnl386/selector.c +++ b/krnl386/selector.c @@ -532,6 +532,7 @@ void WINAPI UnMapLS( SEGPTR sptr ) */ LPVOID WINAPI MapSL( SEGPTR sptr ) { + if (!(SELECTOROF(sptr) & 4)) return OFFSETOF(sptr); return (char *)wine_ldt_copy.base[SELECTOROF(sptr) >> __AHSHIFT] + OFFSETOF(sptr); } From d83e8a034e5ec73a2a1172e963de6ebff7acfc49 Mon Sep 17 00:00:00 2001 From: roytam1 Date: Thu, 14 Dec 2023 14:27:03 +0800 Subject: [PATCH 24/95] winhlp32: check if lpszTitle is not null before checking its content --- winhlp32/winhelp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winhlp32/winhelp.c b/winhlp32/winhelp.c index 9b7ba4cb18..a8a445e099 100644 --- a/winhlp32/winhelp.c +++ b/winhlp32/winhelp.c @@ -419,7 +419,7 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name) { strcpy(mwi.type, "primary"); strcpy(mwi.name, "main"); - if (hlpfile && hlpfile->lpszTitle[0]) + if (hlpfile && hlpfile->lpszTitle && hlpfile->lpszTitle[0]) { char tmp[128]; LoadStringA(Globals.hInstance, STID_WINE_HELP, tmp, sizeof(tmp)); From 432be7237a91b219486f4f0b59e8483134188609 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 16 Dec 2023 17:29:16 -0600 Subject: [PATCH 25/95] make file handles per-task and fix hinstance if task exits but there is another instance still running --- krnl386/file.c | 30 +++++++++++++++++++++++++++++- krnl386/task.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/krnl386/file.c b/krnl386/file.c index d1e241f440..2e330eee43 100644 --- a/krnl386/file.c +++ b/krnl386/file.c @@ -280,7 +280,30 @@ static LPCSTR strdupWtoOEM(LPCWSTR str) #define DOS_TABLE_SIZE 256 -static HANDLE dos_handles[DOS_TABLE_SIZE]; +static HANDLE *FILE_GetTable() +{ + static DWORD dos_handles_index = NULL; + if (!dos_handles_index) dos_handles_index = TlsAlloc(); + HANDLE *dos_handles = TlsGetValue(dos_handles_index); + if (!dos_handles) + { + dos_handles = (HANDLE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HANDLE)*256); + TlsSetValue(dos_handles_index, dos_handles); + } + return dos_handles; +} + +// only call at task exit +void FILE_CloseAll() +{ + HANDLE *dos_handles = FILE_GetTable(); + for (int i = 0; i < 256; i++) + { + if (dos_handles[i]) + CloseHandle(dos_handles[i]); + } + HeapFree(GetProcessHeap(), 0, dos_handles); +} /*********************************************************************** * FILE_InitProcessDosHandles @@ -295,6 +318,7 @@ static void FILE_InitProcessDosHandles( void ) HANDLE cp = GetCurrentProcess(); if (init_done) return; + HANDLE *dos_handles = FILE_GetTable(); init_done = TRUE; hStdInput = GetStdHandle(STD_INPUT_HANDLE); hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); @@ -325,6 +349,7 @@ HANDLE WINAPI DosFileHandleToWin32Handle( HFILE handle ) { HFILE16 hfile = (HFILE16)handle; if (hfile < 5) FILE_InitProcessDosHandles(); + HANDLE *dos_handles = FILE_GetTable(); if ((hfile >= DOS_TABLE_SIZE) || !dos_handles[hfile]) { SetLastError( ERROR_INVALID_HANDLE ); @@ -349,6 +374,7 @@ HFILE WINAPI Win32HandleToDosFileHandle( HANDLE handle ) if (!handle || (handle == INVALID_HANDLE_VALUE)) return HFILE_ERROR; + HANDLE *dos_handles = FILE_GetTable(); for (i = 5; i < DOS_TABLE_SIZE; i++) if (dos_handles[i] == handle) return (HFILE)i; for (i = 5; i < DOS_TABLE_SIZE; i++) @@ -377,6 +403,7 @@ BOOL16 WINAPI DeleteDosFileHandle( HANDLE handle ) if (!handle || (handle == INVALID_HANDLE_VALUE)) return; + HANDLE *dos_handles = FILE_GetTable(); for (i = 5; i < DOS_TABLE_SIZE; i++) if (dos_handles[i] == handle) { @@ -883,6 +910,7 @@ HFILE16 WINAPI OpenFile16( LPCSTR name, OFSTRUCT *ofs, UINT16 mode ) */ HFILE16 WINAPI _lclose16( HFILE16 hFile ) { + HANDLE *dos_handles = FILE_GetTable(); if ((hFile >= DOS_TABLE_SIZE) || !dos_handles[hFile]) { SetLastError( ERROR_INVALID_HANDLE ); diff --git a/krnl386/task.c b/krnl386/task.c index 8b78e3fa06..485b4b4be0 100644 --- a/krnl386/task.c +++ b/krnl386/task.c @@ -458,7 +458,32 @@ static void TASK_DeleteTask( HTASK16 hTask ) /* Free the task module */ - FreeModule16( pTask->hModule ); + HMODULE16 hmod = pTask->hModule; + FreeModule16( hmod ); + + /* Is the module still loaded? if so update hinstance if needed */ + NE_MODULE *pmod = NE_GetPtr(hmod); + if (pmod) + { + HTASK16 prev = hFirstTask; + TDB *prevTDB; + while (prev) + { + prevTDB = TASK_GetPtr(prev); + if (prevTDB->hModule == hmod) + { + if (!pmod->ne_autodata) + pmod->self = prevTDB->hInstance; + else + { + SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pmod ) + pmod->ne_autodata - 1; + pSeg->hSeg = prevTDB->hInstance; + } + break; + } + prev = prevTDB->hNext; + } + } /* Free the task structure itself */ @@ -760,6 +785,8 @@ static void exit_toolhelp() InterruptUnRegister16(0); NotifyUnRegister16(0); } + +void FILE_CloseAll(); /*********************************************************************** * TASK_ExitTask */ @@ -793,6 +820,7 @@ void TASK_ExitTask(void) TASK_UnlinkTask( pTask->hSelf ); SetEvent(kernel_get_thread_data()->idle_event); CloseHandle(kernel_get_thread_data()->idle_event); + FILE_CloseAll(); if (!nTaskCount || (nTaskCount == 1 && hFirstTask == initial_task)) { From 0c8d74215f439a36e768267a129e94c6bfa6b99e Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 22 Dec 2023 21:41:59 -0600 Subject: [PATCH 26/95] fix default window title --- winhlp32/hlpfile.c | 2 ++ winhlp32/winhelp.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/winhlp32/hlpfile.c b/winhlp32/hlpfile.c index 9ab6a3b6f3..d34c5410c3 100644 --- a/winhlp32/hlpfile.c +++ b/winhlp32/hlpfile.c @@ -2455,6 +2455,8 @@ static BOOL HLPFILE_SystemCommands(HLPFILE* hlpfile) hlpfile->lpszCntPath[len-1] = 'T'; WINE_TRACE("CNT not found, assuming '%s'\n", hlpfile->lpszCntPath); } + if (!hlpfile->lpszTitle) + hlpfile->lpszTitle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 128); return TRUE; } diff --git a/winhlp32/winhelp.c b/winhlp32/winhelp.c index a8a445e099..dce81f3b62 100644 --- a/winhlp32/winhelp.c +++ b/winhlp32/winhelp.c @@ -415,11 +415,13 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name) assert(0); return NULL; } + if (hlpfile && !hlpfile->lpszTitle[0]) + LoadStringA(Globals.hInstance, STID_WINE_HELP, hlpfile->lpszTitle, 128); if (!mwi.name[0]) { strcpy(mwi.type, "primary"); strcpy(mwi.name, "main"); - if (hlpfile && hlpfile->lpszTitle && hlpfile->lpszTitle[0]) + if (hlpfile) { char tmp[128]; LoadStringA(Globals.hInstance, STID_WINE_HELP, tmp, sizeof(tmp)); From cf4c32bca3e1bd2d3e12198532e604b4249e5ce5 Mon Sep 17 00:00:00 2001 From: otya Date: Fri, 29 Dec 2023 17:15:37 +0900 Subject: [PATCH 27/95] krnl386.exe16: Fix handling of DBCS characters in FINDNEXT. Fixes: 6e22d1243d30809eae4d4eda418a9ed547e42bcd --- krnl386/int21.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/krnl386/int21.c b/krnl386/int21.c index f4e73e4bf1..54f843edf5 100644 --- a/krnl386/int21.c +++ b/krnl386/int21.c @@ -4067,13 +4067,20 @@ static BOOL INT21_FindNext( CONTEXT *context ) FileTimeToDosDateTime( entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? &entry.ftCreationTime : &entry.ftLastWriteTime, &dta->filedate, &dta->filetime ); memset(dta->filename, 0, 13); if (entry.cAlternateFileName[0]) + { + /* shoud be UPPER CASE */ + for (int i = 0; i < 13; i++) + entry.cAlternateFileName[i] = toupperW(entry.cAlternateFileName[i]); WideCharToMultiByte(CP_OEMCP, 0, entry.cAlternateFileName, -1, dta->filename, 13, NULL, NULL); + } else + { + /* shoud be UPPER CASE */ + for (int i = 0; i < 13; i++) + entry.cFileName[i] = toupperW(entry.cFileName[i]); WideCharToMultiByte(CP_OEMCP, 0, entry.cFileName, -1, dta->filename, 13, NULL, NULL); - /* shoud be UPPER CASE */ - for (int i = 0; i < 13; i++) - dta->filename[i] = toupper(dta->filename[i]); + } if (!memchr(dta->mask,'?',11)) { From ad57e7f27461d3f918b1fbcb5e79b87cad64a0b6 Mon Sep 17 00:00:00 2001 From: otya Date: Tue, 2 Jan 2024 21:53:24 +0900 Subject: [PATCH 28/95] user.exe16: Fix TranslateAccelerator16 to handle directly assigned HACCEL16. --- user/message.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/user/message.c b/user/message.c index ba016c7fec..41f1441ad2 100644 --- a/user/message.c +++ b/user/message.c @@ -3647,12 +3647,61 @@ BOOL16 WINAPI GetInputState16(void) INT16 WINAPI TranslateAccelerator16( HWND16 hwnd, HACCEL16 hAccel, LPMSG16 msg ) { MSG msg32; + ACCEL16 *accel; if (!msg) return 0; + + switch (msg->message) + { + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + case WM_KEYUP: + case WM_SYSKEYUP: + case WM_CHAR: + case WM_SYSCHAR: + break; + default: + return 0; + } + msg32.message = msg->message; /* msg32.hwnd not used */ msg32.wParam = msg->wParam; msg32.lParam = msg->lParam; + + /* Some programs allocate the HACCEL directly instead of loading the HACCEL by LoadAccelerators. */ + accel = (hAccel & 6) == 6 ? (ACCEL16*)GlobalLock16(hAccel) : 0; + if (accel) + { + int i; + int count = GlobalSize16(hAccel) / sizeof(ACCEL16); + ACCEL accel32[100]; + HACCEL haccel32; + int ret; + ACCEL *table32 = accel32; + if (count * sizeof(ACCEL) > sizeof(accel32)) + table32 = HeapAlloc(GetProcessHeap(), 0, count * sizeof(ACCEL)); + if (!table32) + return 0; + for (i = 0; i < count; i++) + { + table32[i].cmd = accel[i].cmd; + table32[i].key = accel[i].key; + table32[i].fVirt = accel[i].fVirt & ~0x80; + if (accel[i].fVirt & 0x80) + { + count = i + 1; + break; + } + } + haccel32 = CreateAcceleratorTableW(table32, count); + GlobalUnlock16(hAccel); + if (table32 != accel32) + HeapFree(GetProcessHeap(), 0, table32); + ret = TranslateAcceleratorW(WIN_Handle32(hwnd), haccel32, &msg32); + DestroyAcceleratorTable(haccel32); + return ret; + } return TranslateAcceleratorW( WIN_Handle32(hwnd), HACCEL_32(hAccel), &msg32 ); } From 899d9ad401a92cc65149a4d7adc93570c97b41c3 Mon Sep 17 00:00:00 2001 From: otya Date: Wed, 3 Jan 2024 01:44:25 +0900 Subject: [PATCH 29/95] user.exe16: Disable ad57e7f27461d3f918b1fbcb5e79b87cad64a0b6. This implementation may cause HACCEL to be incorrectly determined as HGLOBAL. Separate handle table or LoadAccelerators16 should return HGLOBAL. --- user/message.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/message.c b/user/message.c index 41f1441ad2..5678e5a2b2 100644 --- a/user/message.c +++ b/user/message.c @@ -3669,6 +3669,7 @@ INT16 WINAPI TranslateAccelerator16( HWND16 hwnd, HACCEL16 hAccel, LPMSG16 msg ) msg32.wParam = msg->wParam; msg32.lParam = msg->lParam; +#if 0 /* Some programs allocate the HACCEL directly instead of loading the HACCEL by LoadAccelerators. */ accel = (hAccel & 6) == 6 ? (ACCEL16*)GlobalLock16(hAccel) : 0; if (accel) @@ -3702,6 +3703,7 @@ INT16 WINAPI TranslateAccelerator16( HWND16 hwnd, HACCEL16 hAccel, LPMSG16 msg ) DestroyAcceleratorTable(haccel32); return ret; } +#endif return TranslateAcceleratorW( WIN_Handle32(hwnd), HACCEL_32(hAccel), &msg32 ); } From 935f259d2292c1c2cf4bcc150ffe26f6c0bc346c Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 13 Jan 2024 18:36:38 -0600 Subject: [PATCH 30/95] fix dialog create for windows 11 22h2 which removed some ntvdm support code --- krnl386/compat.c | 12 ++++++++++++ krnl386/krnl386.def | 1 + krnl386/krnl386.exe16.spec | 1 + user/message.c | 24 +++++++++++++++++++----- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/krnl386/compat.c b/krnl386/compat.c index e9de34805e..ff7bf79d30 100644 --- a/krnl386/compat.c +++ b/krnl386/compat.c @@ -1,4 +1,5 @@ #include +#include "kernel16_private.h" // this only currently will get the flags for the first task // it might be work on a per-task basis @@ -79,3 +80,14 @@ void WINAPI krnl386_set_compat_path(const LPCSTR path) modes[i] = tolower(modes[i]); return; } + +ULONG WINAPI get_windows_build() +{ + static ULONG build = 0; + if (build) return build; + RTL_OSVERSIONINFOEXW winver; + if (RtlGetVersion(&winver)) + return 0; + build = winver.dwBuildNumber; + return build; +} diff --git a/krnl386/krnl386.def b/krnl386/krnl386.def index 9dabb9e96f..70aa8ace08 100644 --- a/krnl386/krnl386.def +++ b/krnl386/krnl386.def @@ -244,3 +244,4 @@ EXPORTS vm_inject set_vm_inject_cb get_idle_event + get_windows_build diff --git a/krnl386/krnl386.exe16.spec b/krnl386/krnl386.exe16.spec index 42dabf6c3e..4e0c41e316 100644 --- a/krnl386/krnl386.exe16.spec +++ b/krnl386/krnl386.exe16.spec @@ -799,3 +799,4 @@ @ stdcall -arch=win32 set_vm_inject_cb(long) @ stdcall -arch=win32 vm_inject(long long long long long) @ stdcall -arch=win32 get_idle_event() +@ stdcall -arch=win32 get_windows_build() diff --git a/user/message.c b/user/message.c index ba016c7fec..a4a26e5a5d 100644 --- a/user/message.c +++ b/user/message.c @@ -2038,6 +2038,7 @@ static HICON16 get_default_icon(HINSTANCE16 inst) #include "../mmsystem/winemm16.h" void InitWndProc16(HWND hWnd, HWND16 hWnd16); +ULONG WINAPI get_windows_build(); /********************************************************************** * WINPROC_CallProc32ATo16 * @@ -2124,12 +2125,25 @@ LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT mdi_cs16.szClass = MapLS( win16classname(mdi_cs->szClass) ); cs.lpCreateParams = MapLS( &mdi_cs16 ); } - else if (cs32->lpCreateParams && (GetModuleHandleA("comdlg32.dll") == cs32->hInstance)) + else if (cs32->lpCreateParams) { - // if a window hinstance lower 16 bits are nonzero which is not true for 32bit dlls - // user32 will put the dword in the dialog item extra bytes in lpcreateparams - // so fix things up for commdlg since comdlg32 uses it's own hinstance - cs.lpCreateParams = *(SEGPTR *)((BYTE *)cs32->lpCreateParams + 2); + if (get_windows_build() >= 22621) + { + // Windows 11 22H2 removed much ntvdm support from user32 including the + // lpcreateparams fixup for the dialog item extra bytes + char class[10]; + HWND roothwnd = GetAncestor(hwnd, GA_ROOT); + int ret = GetClassName(roothwnd, &class, 10); + if (ret && !strcmp(class, "#32770")) + cs.lpCreateParams = *(SEGPTR *)((BYTE *)cs32->lpCreateParams + 2); + } + else if (GetModuleHandleA("comdlg32.dll") == cs32->hInstance) + { + // if a window hinstance lower 16 bits are nonzero which is not true for 32bit dlls + // user32 will put the dword in the dialog item extra bytes in lpcreateparams + // so fix things up for commdlg since comdlg32 uses it's own hinstance + cs.lpCreateParams = *(SEGPTR *)((BYTE *)cs32->lpCreateParams + 2); + } } lParam = MapLS( &cs ); ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg ); From 29e61b17620f518605ff9c4534832f833e8d5374 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 18 Jan 2024 21:20:58 -0600 Subject: [PATCH 31/95] fix hang in olecreate and correct display size in 640x480 compat mode --- gdi/gdi.c | 6 ++++++ olecli/olecli.c | 3 +++ 2 files changed, 9 insertions(+) diff --git a/gdi/gdi.c b/gdi/gdi.c index 00c582fc93..34c6b9647b 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -2290,6 +2290,12 @@ INT16 WINAPI GetDeviceCaps16( HDC16 hdc, INT16 cap ) case VERTRES: ret = 480; break; + case HORZSIZE: + ret = 169; + break; + case VERTSIZE: + ret = 127; + break; } } return ret; diff --git a/olecli/olecli.c b/olecli/olecli.c index 81fb69717b..2ac5c2464e 100644 --- a/olecli/olecli.c +++ b/olecli/olecli.c @@ -434,7 +434,10 @@ OLESTATUS WINAPI OleCreate16(LPCSTR name, SEGPTR client, LPCSTR xname, LHCLIENTD { LPOLECLIENT client32 = get_ole_client32(client); LPOLEOBJECT obj32 = 0; + DWORD count; + ReleaseThunkLock(&count); OLESTATUS status = OleCreate(name, client32, xname, hclientdoc, xxname, &obj32, render, format); + RestoreThunkLock(count); *oleobject = OLEOBJ16(obj32); return status; } From 86b534cba4de78c73972d1ff02086c3b47906eb2 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 21 Jan 2024 15:23:25 -0600 Subject: [PATCH 32/95] don't memset in mscdex get drive letters as the buffer may not be large enough --- krnl386/int2f.c | 1 - 1 file changed, 1 deletion(-) diff --git a/krnl386/int2f.c b/krnl386/int2f.c index 94e7e0bf3d..0c5dbcb5b4 100644 --- a/krnl386/int2f.c +++ b/krnl386/int2f.c @@ -1027,7 +1027,6 @@ static void MSCDEX_Handler(CONTEXT* context) case 0x0D: /* get drive letters */ p = CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Ebx); - memset(p, 0, 26); for (drive = 0; drive < 26; drive++) { if (is_cdrom(drive)) *p++ = drive; } From 18660e7585cab27af995a526eaa6575ea9b66bba Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 22 Jan 2024 19:23:34 -0600 Subject: [PATCH 33/95] win31 registry file lines can end in \ and skip spaces at start of commandline --- regedit/regedit.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/regedit/regedit.c b/regedit/regedit.c index a447d78aff..7a0e31047f 100644 --- a/regedit/regedit.c +++ b/regedit/regedit.c @@ -147,21 +147,6 @@ static void processRegLinesA(FILE *in) continue; } - /* If there is a concatenating '\\', go around again */ - if (*(s_eol - 1) == '\\') { - char *next_line = s_eol + 1; - - if (*s_eol == '\r' && *(s_eol + 1) == '\n') - next_line++; - - while (*(next_line + 1) == ' ' || *(next_line + 1) == '\t') - next_line++; - - MoveMemory(s_eol - 1, next_line, chars_in_buf - (next_line - s) + 1); - chars_in_buf -= next_line - s_eol + 1; - continue; - } - /* Remove any line feed. Leave s_eol on the last \0 */ if (*s_eol == '\r' && *(s_eol + 1) == '\n') *s_eol++ = '\0'; @@ -247,7 +232,13 @@ int WINAPI WinMain16(HINSTANCE hInstance, HINSTANCE hPrevInstance, { LPSTR s = lpCmdLine; /* command line pointer */ CHAR ch = *s; /* current character */ - + + while (isspace(ch)) + { + s++; + ch = *s; + } + while (ch && ((ch == '-') || (ch == '/'))) { char chu; From 92f10108c6802ed6670115f0df06575590d0c5cc Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 24 Jan 2024 13:03:32 -0600 Subject: [PATCH 34/95] check the windows dir for registry files since that would be the default regedit start dir --- regedit/regedit.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/regedit/regedit.c b/regedit/regedit.c index 7a0e31047f..5e0a2d5edf 100644 --- a/regedit/regedit.c +++ b/regedit/regedit.c @@ -34,6 +34,7 @@ #define REG_VAL_BUF_SIZE 4096 DWORD WINAPI RegSetValue16(HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count); +LPCSTR RedirectSystemDir(LPCSTR path, LPSTR to, size_t max_len); /* version for Windows 3.1 */ static void processRegEntry31(char *line) @@ -300,6 +301,14 @@ int WINAPI WinMain16(HINSTANCE hInstance, HINSTANCE hPrevInstance, while(filename[0]) { reg_file = fopen(filename, "r"); + if (!reg_file) // start dir for regedit should be the windows dir + { + char regdir[MAX_PATH]; + RedirectSystemDir("C:\\WINDOWS", regdir, MAX_PATH); + strcat(regdir, "\\"); + strcat(regdir, filename); + reg_file = fopen(regdir, "r"); + } if (reg_file) { processRegLinesA(reg_file); From 9924e7ea88ff328a50552abfc4137a7b06683081 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 26 Jan 2024 15:17:04 -0600 Subject: [PATCH 35/95] Don't call a toolhelp notifier in a dead task context and release lock in ddeinitialize which creates a window --- ddeml/ddeml.c | 3 +++ toolhelp/toolhelp.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/ddeml/ddeml.c b/ddeml/ddeml.c index 90370a275d..192b8c95e5 100644 --- a/ddeml/ddeml.c +++ b/ddeml/ddeml.c @@ -264,6 +264,7 @@ UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback, DWORD afCmd, DWORD ulRes) { UINT16 ret; + DWORD count; struct ddeml_thunk* thunk; // Undocumented 0x800 causes DdeClientTransaction to call DdeUninitialize which will likely // create a deadlock with XTYP_EXECUTE if the client and server are in the same process @@ -271,6 +272,7 @@ UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback, // MF_POSTMSGS causes also deadlocks in DdeDisconnect in the client thread afCmd &= ~MF_POSTMSGS; + ReleaseThunkLock(&count); EnterCriticalSection(&ddeml_cs); if ((thunk = DDEML_AddThunk(*pidInst, (DWORD)pfnCallback))) { @@ -279,6 +281,7 @@ UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback, } else ret = DMLERR_SYS_ERROR; LeaveCriticalSection(&ddeml_cs); + RestoreThunkLock(count); return ret; } diff --git a/toolhelp/toolhelp.c b/toolhelp/toolhelp.c index 8af2983a57..ecab3d3e70 100644 --- a/toolhelp/toolhelp.c +++ b/toolhelp/toolhelp.c @@ -38,6 +38,7 @@ #include "wine/winbase16.h" #include "toolhelp.h" #include "wine/debug.h" +#include "wine/exception.h" WINE_DEFAULT_DEBUG_CHANNEL(toolhelp); @@ -788,6 +789,7 @@ BOOL WINAPI TOOLHELP_CallNotify(WORD wID, DWORD dwData) { WORD args[3]; PVOID sssp; + BOOL skip = FALSE; if ((wID == NFY_TASKIN || wID == NFY_TASKOUT) && (notifys[i].wFlags & NF_TASKSWITCH) != NF_TASKSWITCH) { continue; @@ -796,6 +798,16 @@ BOOL WINAPI TOOLHELP_CallNotify(WORD wID, DWORD dwData) { continue; } + __TRY + { + // TODO: call notifiers in own thread + skip = !IsTask16(GetCurrentTask()) || ((notifys[i].htask & 3) != 3); + } + __EXCEPT_ALL + { + skip = TRUE; // task is likely dead + } + if (skip) continue; sssp = getWOW32Reserved(); args[2] = wID; args[1] = HIWORD(dwData); From 5832f2a0a422fa28d71f5a1d644af5271520db84 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 27 Jan 2024 18:28:26 -0600 Subject: [PATCH 36/95] try and deal with cross-task journal hooks --- user/hook.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/user/hook.c b/user/hook.c index 3aafd20398..565c56774d 100644 --- a/user/hook.c +++ b/user/hook.c @@ -900,16 +900,7 @@ void install_global_hook() { if (!info->global_hhook[index]) { - if (id == WH_JOURNALPLAYBACK) - { - BlockInput(TRUE); - struct journal_pb *jp = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct journal_pb)); - jp->timer = SetTimer(NULL, 0, 10, journal_playback_cb); - info->global_hhook[index] = jp; - return; - } - else - info->global_hhook[index] = SetWindowsHookExA(id, global_hook_procs[index], 0, *(LPDWORD)((LPBYTE)tdb->teb + 0x24)); + info->global_hhook[index] = SetWindowsHookExA(id, global_hook_procs[index], 0, *(LPDWORD)((LPBYTE)tdb->teb + 0x24)); } } } @@ -993,13 +984,28 @@ HHOOK WINAPI SetWindowsHookEx16(INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, HT ERR("failed to allocate hook\n"); return 0; } + if (id == WH_JOURNALPLAYBACK) + { + struct hook16_queue_info *info = get_hook_info(TRUE, 0); + if (info->global_hhook[index]) + { + ERR("journal playback hook already set\n"); + free_hook(entry); + return 0; + } + BlockInput(TRUE); + struct journal_pb *jp = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct journal_pb)); + jp->timer = SetTimer(NULL, 0, 10, journal_playback_cb); + info->global_hhook[index] = jp; + } entry->proc16 = proc; entry->hinst16 = GetExePtr(hInst); - entry->htask16 = hTask; + entry->htask16 = GetCurrentTask(); entry->type = id; entry->global = TRUE; list_add_head(&global_hook_entry[index], &entry->entry); - install_global_hook(); + if (id != WH_JOURNALPLAYBACK) + install_global_hook(); } return entry_to_hhook(entry); @@ -1109,7 +1115,7 @@ BOOL16 WINAPI UnhookWindowsHookEx16(HHOOK hhook) SendInput(1, &input, sizeof(INPUT)); } BlockInput(FALSE); - KillTimer(NULL, ((struct journal_pb *)info->global_hhook[index])->timer); + KillTimer(NULL, ((struct journal_pb *)(info->global_hhook[index]))->timer); HeapFree(GetProcessHeap(), 0, (UINT_PTR)info->global_hhook[index]); info->global_hhook[index] = NULL; } From 658391f2953f53ed364cc912455b48b006cf5dc4 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 27 Jan 2024 19:22:24 -0600 Subject: [PATCH 37/95] regqueryvalue should store partial values rather than returning error_more_data --- krnl386/registry.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/krnl386/registry.c b/krnl386/registry.c index 570b1f4397..5b01b24853 100644 --- a/krnl386/registry.c +++ b/krnl386/registry.c @@ -329,10 +329,20 @@ DWORD WINAPI RegEnumValue16( HKEY hkey, DWORD index, LPSTR value, LPDWORD val_co */ DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count ) { + DWORD incount = *count; if (!advapi32) init_func_ptrs(); fix_win16_hkey( &hkey ); if (count) *count &= 0xffff; DWORD result = pRegQueryValueA( hkey, name, data, (LONG*) count ); + if (result == ERROR_MORE_DATA) + { + DWORD realcount = *count + 1; + char *buf = HeapAlloc(GetProcessHeap(), 0, realcount); + result = pRegQueryValueA(hkey, name, buf, &realcount); + memcpy(data, buf, incount); + HeapFree(GetProcessHeap(), 0, buf); + *count = incount; + } return result; } From 0eee287c6e22e7d618449c4eab4664d2ce0637d9 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 29 Jan 2024 20:21:12 -0600 Subject: [PATCH 38/95] fix build --- toolhelp/toolhelp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/toolhelp/toolhelp.c b/toolhelp/toolhelp.c index ecab3d3e70..b668c2d0f3 100644 --- a/toolhelp/toolhelp.c +++ b/toolhelp/toolhelp.c @@ -807,6 +807,7 @@ BOOL WINAPI TOOLHELP_CallNotify(WORD wID, DWORD dwData) { skip = TRUE; // task is likely dead } + __ENDTRY if (skip) continue; sssp = getWOW32Reserved(); args[2] = wID; From 70e2f3894f35a6b3f13105309b0cfcd04b58d41a Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 31 Jan 2024 13:30:34 -0600 Subject: [PATCH 39/95] remove showwindow hack --- user/message.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/user/message.c b/user/message.c index ba016c7fec..f22b9905e9 100644 --- a/user/message.c +++ b/user/message.c @@ -4857,11 +4857,7 @@ LRESULT CALLBACK WndProcHook(int code, WPARAM wParam, LPARAM lParam) if (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x30a) SendMessageA(pcwp->hwnd, WM_SETVISIBLE, pcwp->wParam, 0); if (aero_diasble) - { SetWindowTheme(pcwp->hwnd, L"", L""); - if (GetMenu(pcwp->hwnd) && !(GetWindowLongA(pcwp->hwnd, GWL_STYLE) & WS_CHILD)) - SetWindowPos(pcwp->hwnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE); - } } } } From 263636acefe9dffaa787d43bba2586cbc5e697a1 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 5 Feb 2024 21:15:56 -0600 Subject: [PATCH 40/95] release thunk lock in startdoc and work around issue where startdoc can fail showing a dialog in print-to-file mode --- gdi/gdi.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 34c6b9647b..a0b2928275 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -3821,15 +3821,16 @@ HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODEA *devmode ) return HDC_16( ResetDCA( HDC_32(hdc), &dma ) ); } - /****************************************************************** * StartDoc (GDI.377) */ INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc ) { DOCINFOA docA; + DWORD count; + INT16 ret; - docA.cbSize = lpdoc->cbSize; + docA.cbSize = sizeof(DOCINFOA); docA.lpszDocName = MapSL(lpdoc->lpszDocName); docA.lpszOutput = MapSL(lpdoc->lpszOutput); if(lpdoc->cbSize > offsetof(DOCINFO16,lpszDatatype)) @@ -3840,7 +3841,14 @@ INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc ) docA.fwType = lpdoc->fwType; else docA.fwType = 0; - return StartDocA( HDC_32(hdc), &docA ); + ReleaseThunkLock(&count); + ret = StartDocA( HDC_32(hdc), &docA ); + // if startdoc tries to show a save file dialog but the active window + // disappears then it'll fail, try again and it should find a new window + if ((ret < 0) && (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)) + ret = StartDocA( HDC_32(hdc), &docA ); + RestoreThunkLock(count); + return ret; } From aef19eef0fb6fb1f7973fa86e6d87d745e3e3dcf Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 7 Feb 2024 22:37:38 -0600 Subject: [PATCH 41/95] make is_old_app check for only win30 programs --- user/message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/message.c b/user/message.c index f61026894a..fbc9fc1c90 100644 --- a/user/message.c +++ b/user/message.c @@ -701,7 +701,7 @@ static HANDLE16 convert_handle_32_to_16(UINT_PTR src, unsigned int flags) static BOOL is_old_app( HWND hwnd ) { HINSTANCE inst = (HINSTANCE)GetWindowLongPtrW( hwnd, GWLP_HINSTANCE ); - return inst && !((ULONG_PTR)inst >> 16) && (GetExpWinVer16(LOWORD(inst)) & 0xFF00) == 0x0300; + return inst && !((ULONG_PTR)inst >> 16) && (GetExpWinVer16(LOWORD(inst)) & 0xFFFF) == 0x0300; } static int find_sub_menu( HMENU *hmenu, HMENU16 target ) From a36e3a41192c26bca2f9a4b0c0ddb5ea2b60bf18 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 8 Feb 2024 19:10:52 -0600 Subject: [PATCH 42/95] change animatepalette a bit --- gdi/gdi.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 34c6b9647b..911d01c959 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -3692,11 +3692,11 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, UINT16 NumEntries, const PALETTEENTRY* PaletteColors) { HPALETTE hpal32 = HPALETTE_32(hpalette); - BOOL done = FALSE; if (GetObjectType(hpal32) != OBJ_PAL) return; if (GetPtr16(hpalette, 1)) { DWORD *dclist = GetPtr16(hpalette, 1); + AnimatePalette(hpal32, StartIndex + 10, NumEntries, PaletteColors); for (int i = 0; i < 20; i++) { if (dclist[i]) @@ -3712,12 +3712,6 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, HWND hwnd = WindowFromDC(hdc32); InvalidateRect(hwnd, NULL, FALSE); UpdateWindow(hwnd); - if ((dclist[i] & ~0xffff) && !done && krnl386_get_config_int("otvdm", "DIBPalette", FALSE)) - { - done = TRUE; - // foreground palettes are identity while background are mapped into the nonstatic area 10-245 - AnimatePalette( hpal32, StartIndex + 10, NumEntries, PaletteColors ); - } } else if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE)) { @@ -3730,8 +3724,8 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, } } } - if (!done) - AnimatePalette( hpal32, StartIndex, NumEntries, PaletteColors ); + else + AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); } From e0244bdfa0f0f6762e107376061428da0bd838f0 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 2 Mar 2024 21:30:39 -0600 Subject: [PATCH 43/95] only allocate an mmio buffer for FOURCC_MEM if pchbuffer is null --- mmsystem/mmio16.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmsystem/mmio16.c b/mmsystem/mmio16.c index 3bb320a947..a2f2e666e4 100644 --- a/mmsystem/mmio16.c +++ b/mmsystem/mmio16.c @@ -331,7 +331,7 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo16->pchBuffer); mmioinfo.adwInfo[0] = lpmmioinfo16->adwInfo[0]; /* if we don't have a file name, it's likely a passed open file descriptor */ - if (!szFileName) + if (!szFileName && (mmioinfo.fccIOProc != FOURCC_MEM)) mmioinfo.adwInfo[0] = (DWORD)DosFileHandleToWin32Handle(mmioinfo.adwInfo[0]); mmioinfo.adwInfo[1] = lpmmioinfo16->adwInfo[1]; mmioinfo.adwInfo[2] = lpmmioinfo16->adwInfo[2]; @@ -343,7 +343,7 @@ HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, thunk->hMmio = NULL; } else thunk->hMmio = ret; - if (ret && (dwOpenFlags & MMIO_ALLOCBUF)) + if (ret && (dwOpenFlags & MMIO_ALLOCBUF) && !lpmmioinfo16->pchBuffer) { if (lpmmioinfo16->pchBuffer) FIXME("ooch\n"); /* FIXME: check whether mmioOpen should set pchBuffer */ From 18890733741ca992ac192c96b2f3efff6e399faf Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 3 Mar 2024 11:15:06 -0600 Subject: [PATCH 44/95] add ini option to change dpi value returned from getdevicecaps --- gdi/gdi.c | 14 ++++++++++++++ otvdm.ini | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/gdi/gdi.c b/gdi/gdi.c index 21f3eb31b6..659c9fa8ec 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -2298,6 +2298,20 @@ INT16 WINAPI GetDeviceCaps16( HDC16 hdc, INT16 cap ) break; } } + int newdpi = krnl386_get_config_int("otvdm", "AdjustDPI", FALSE); + if (newdpi) + { + switch (cap) + { + case LOGPIXELSX: + ret = newdpi; + break; + case LOGPIXELSY: + ret = newdpi; + break; + } + } + return ret; } diff --git a/otvdm.ini b/otvdm.ini index c8f5433ab4..b30bc313ce 100644 --- a/otvdm.ini +++ b/otvdm.ini @@ -116,3 +116,8 @@ ; isfixload will shim installshield which calls sendmessagea(HWND_BROADCAST) which can hang if there ; is a process not servicing it's message queue ;ElevationShim=isfixload.exe + +; Adjust the dpi for programs, especially visual basic, which use dpi for calculating +; font and window sizes but can get an integer overflow on large displays, can also +; make text larger in some cases +;AdjustDPI=120 From e3622f9488ed1e68de34ac1e892de96d2561bace Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 20 Mar 2024 19:59:00 -0500 Subject: [PATCH 45/95] enable loading of win16 video codecs and fix the wait delay in mcisendstring --- krnl386/krnl386.def | 1 + krnl386/krnl386.exe16.spec | 1 + mmsystem/mci16.c | 59 ++++++++++++ msvideo/msvideo16.c | 189 +++++++++++++++++++++++++++++++++++-- 4 files changed, 240 insertions(+), 10 deletions(-) diff --git a/krnl386/krnl386.def b/krnl386/krnl386.def index 70aa8ace08..a017b5e692 100644 --- a/krnl386/krnl386.def +++ b/krnl386/krnl386.def @@ -245,3 +245,4 @@ EXPORTS set_vm_inject_cb get_idle_event get_windows_build + GetSelectorLimit16 diff --git a/krnl386/krnl386.exe16.spec b/krnl386/krnl386.exe16.spec index 4e0c41e316..be194775bd 100644 --- a/krnl386/krnl386.exe16.spec +++ b/krnl386/krnl386.exe16.spec @@ -728,6 +728,7 @@ @ stdcall -arch=win32 LockResource16(long) @ stdcall -arch=win32 SetSelectorBase(long long) @ stdcall -arch=win32 SetSelectorLimit16(long long) +@ stdcall -arch=win32 GetSelectorLimit16(long) @ stdcall -arch=win32 SizeofResource16(long long) @ stdcall -arch=win32 WinExec16(str long) diff --git a/mmsystem/mci16.c b/mmsystem/mci16.c index 0eea4376c8..82a2141193 100644 --- a/mmsystem/mci16.c +++ b/mmsystem/mci16.c @@ -129,6 +129,56 @@ static void xlate_stat_handle(const char *cmdstr, char *retstr) } } +// handle the wait ourselves so to prevent the thread from being blocked for 300ms +static DWORD fix_play_wait(const char *cmdstr, char *retstr, int retlen, char *waitpos) +{ + char newstr[128]; + HWND wndwait = NULL; + DWORD devid; + if (waitpos && !waitpos[5]) + { + char sid[20]; + sscanf(cmdstr + 5, "%s", &sid); + devid = mciGetDeviceIDA(sid); + MCI_GETDEVCAPS_PARMS devcaps = {0}; + devcaps.dwItem = MCI_GETDEVCAPS_DEVICE_TYPE; + mciSendCommandA(devid, MCI_GETDEVCAPS, MCI_GETDEVCAPS_ITEM, &devcaps); + // handle the wait ourselves so to prevent the thread from being blocked for 300ms + if (devcaps.dwReturn == MCI_DEVTYPE_DIGITAL_VIDEO) + { + wndwait = CreateWindowA("STATIC", "mcimsgwnd", 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0); + if (wndwait) + { + int len = (INT_PTR)waitpos - (INT_PTR)cmdstr; + sprintf(newstr, "%.*s notify", len, cmdstr, wndwait); + cmdstr = newstr; + } + } + } + DWORD ret = mciSendStringA(cmdstr, retstr, retlen, wndwait); + if (!ret && wndwait) + { + DWORD count; + ReleaseThunkLock(&count); + while (1) + { + MCI_GENERIC_PARMS genparm = {0}; + MSG msg; + DWORD test; + if (mciDriverYield(devid)) + mciSendCommandA(devid, MCI_STOP, 0, &genparm); + MsgWaitForMultipleObjects(0, 0, FALSE, 300, QS_POSTMESSAGE | QS_SENDMESSAGE); + if (PeekMessageA(&msg, wndwait, MM_MCINOTIFY, MM_MCINOTIFY, PM_REMOVE)) + break; + } + RestoreThunkLock(count); + } + if (wndwait) + DestroyWindow(wndwait); + return ret; +} + + /************************************************************************** * MCI_MessageToString [internal] */ @@ -1060,7 +1110,16 @@ DWORD WINAPI mciSendString16(LPCSTR lpstrCommand, LPSTR lpstrRet, UINT16 uRetLen, HWND16 hwndCallback) { char newstr[128]; + if (!strncmp(lpstrCommand, "play ", 5)) + { + char *waitpos = strstr(lpstrCommand, " wait"); + if (waitpos) + return fix_play_wait(lpstrCommand, lpstrRet, uRetLen, waitpos); + } + DWORD count; + ReleaseThunkLock(&count); DWORD ret = mciSendStringA(xlate_str_handle(lpstrCommand, newstr), lpstrRet, uRetLen, HWND_32(hwndCallback)); + RestoreThunkLock(count); if (!ret && lpstrRet && !strncmp(lpstrCommand, "status ", 7)) xlate_stat_handle(lpstrCommand, lpstrRet); return ret; diff --git a/msvideo/msvideo16.c b/msvideo/msvideo16.c index b508eb2b09..b38a9338f5 100644 --- a/msvideo/msvideo16.c +++ b/msvideo/msvideo16.c @@ -152,12 +152,25 @@ BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd) return DrawDibStop(HDRAWDIB_32(hdd)); } +BOOL16 WINAPI ICInstall16(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT16 wFlags); /*********************************************************************** * ICOpen [MSVIDEO.203] */ HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode) { - return HIC_16(ICOpen(fccType, fccHandler, wMode)); + HIC16 ret = HIC_16(ICOpen(fccType, fccHandler, wMode)); + if (!ret) + { + char key[10], sysini[MAX_PATH], drvfile[MAX_PATH]; + sprintf(key, "%4.4s.%4.4s", (char *)&fccType, (char *)&fccHandler); + DWORD size = GetPrivateProfileStringA("drivers", key, NULL, drvfile, MAX_PATH, RedirectSystemDir("c:\\windows\\system.ini", sysini, MAX_PATH)); + if (size) + { + if (ICInstall16(fccType, fccHandler, drvfile, NULL, ICINSTALL_DRIVER)) + ret = HIC_16(ICOpen(fccType, fccHandler, wMode)); + } + } + return ret; } /*********************************************************************** @@ -724,9 +737,6 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT lp2 = sizeof(ICINFO16); break; } - case ICM_DRAW_QUERY: - lp1 = MapLS(lp1); - break; case ICM_DRAW_BEGIN: { ICDRAWBEGIN16 *icdb16 = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN16)); @@ -769,6 +779,8 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT lp2 = sizeof(ICDRAWSUGGEST16) - 4; break; } + case ICM_DRAW_QUERY: + case ICM_SETSTATE: case ICM_DRAW_WINDOW: lp1 = (LPARAM)(MapLS(lp1)); break; @@ -799,6 +811,47 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT case ICM_DRAW_REALIZE: lp1 = (LPARAM)(HDC_16(lp1)); break; + case ICM_DECOMPRESS_QUERY: + case ICM_DECOMPRESS_GET_FORMAT: + case ICM_DECOMPRESS_GET_PALETTE: + case ICM_DECOMPRESS_BEGIN: + lp1 = (LPARAM)(MapLS(lp1)); + lp2 = (LPARAM)(MapLS(lp2)); + break; + case ICM_DECOMPRESS: + ICDECOMPRESS *icdec16 = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); + ICDECOMPRESS *icdec = lp1; + + DWORD size = icdec->lpbiInput->biSizeImage; + int count = (size + 0xffff) / 0x10000; + WORD insel = AllocSelectorArray16(count); + for (int i = 0; i < count; i++) + { + SetSelectorBase(insel + (i << __AHSHIFT), (DWORD)icdec->lpInput + i * 0x10000); + SetSelectorLimit16(insel + (i << __AHSHIFT), size - 1); + size -= 0x10000; + } + size = icdec->lpbiOutput->biSizeImage; + count = (size + 0xffff) / 0x10000; + WORD outsel = AllocSelectorArray16(count); + for (int i = 0; i < count; i++) + { + SetSelectorBase(outsel + (i << __AHSHIFT), (DWORD)icdec->lpOutput + i * 0x10000); + SetSelectorLimit16(outsel + (i << __AHSHIFT), size - 1); + size -= 0x10000; + } + + icdec16->dwFlags = icdec->dwFlags; + icdec16->lpbiInput = MapLS(icdec->lpbiInput); + icdec16->lpInput = insel << 16; + icdec16->lpbiOutput = MapLS(icdec->lpbiOutput); + icdec16->lpOutput = outsel << 16; + icdec16->ckid = icdec->ckid; + + lp1 = (LPARAM)(MapLS(icdec16)); + lp2 = sizeof(ICDECOMPRESS); + break; + } args[7] = HIWORD(hic); args[6] = LOWORD(hic); @@ -832,9 +885,6 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT HeapFree(GetProcessHeap(), 0, ici16); break; } - case ICM_DRAW_QUERY: - UnMapLS(lp1); - break; case ICM_DRAW_BEGIN: { ICDRAWBEGIN16 *icdb16 = MapSL(lp1); @@ -852,13 +902,32 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT HeapFree(GetProcessHeap(), 0, icds16); break; } + case ICM_DRAW_QUERY: + case ICM_SETSTATE: case ICM_DRAW_WINDOW: UnMapLS(lp1); break; + case ICM_DECOMPRESS: + { + ICDECOMPRESS *icdec16 = MapSL(lp1); + WORD sel = SELECTOROF(icdec16->lpInput); + int count = (GetSelectorLimit16(sel) + 0xffff) / 0x10000; + for (int i = 0; i < count; i++) + FreeSelector16(sel + (i << __AHSHIFT)); + sel = SELECTOROF(icdec16->lpOutput); + count = (GetSelectorLimit16(sel) + 0xffff) / 0x10000; + for (int i = 0; i < count; i++) + FreeSelector16(sel + (i << __AHSHIFT)); + UnMapLS(lp1); + UnMapLS(icdec16->lpbiInput); + UnMapLS(icdec16->lpbiOutput); + HeapFree(GetProcessHeap(), 0, icdec16); + break; + } case ICM_DRAW: { ICDRAW *icd16 = MapSL(lp1); - int count = (lp2 + 0xffff) / 0x10000; + int count = (icd16->cbData + 0xffff) / 0x10000; WORD sel = SELECTOROF(icd16->lpData); for (int i = 0; i < count; i++) FreeSelector16(sel + (i << __AHSHIFT)); @@ -867,6 +936,13 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT HeapFree(GetProcessHeap(), 0, icd16); break; } + case ICM_DECOMPRESS_QUERY: + case ICM_DECOMPRESS_GET_FORMAT: + case ICM_DECOMPRESS_GET_PALETTE: + case ICM_DECOMPRESS_BEGIN: + UnMapLS(lp1); + UnMapLS(lp2); + break; } return ret; } @@ -955,6 +1031,60 @@ void *get_video_thunk(DWORD pfn16) return (void *)MSVIDEO_AddThunk(pfn16); } +#define MAX_DRIVERS 10 + +static struct msvideo_drv +{ + DWORD fccType; + DWORD fccHandler; + HMODULE16 hmod; +} *MSVIDEO_drv = {0}; + +BOOL add_module(DWORD fccType, DWORD fccHandler, HMODULE16 hmod) +{ + int i; + if (!MSVIDEO_drv) + MSVIDEO_drv = (struct msvideo_drv *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct msvideo_drv) * 10); + for (i = 0; i < 10; i++) + { + if (!MSVIDEO_drv[i].hmod) break; + } + if (i == 10) return FALSE; + MSVIDEO_drv[i].fccType = fccType; + MSVIDEO_drv[i].fccHandler = fccHandler; + MSVIDEO_drv[i].hmod = hmod; + return TRUE; +} + +void remove_module(DWORD fccType, DWORD fccHandler, BOOL unload) +{ + HMODULE16 hmod; + for (int i = 0; i < 10; i++) + { + if ((MSVIDEO_drv[i].fccType == fccType) && (MSVIDEO_drv[i].fccHandler == fccHandler)) + { + if (unload) + { + ICRemove(fccType, fccHandler, 0); + FreeLibrary16(MSVIDEO_drv[i].hmod); + } + MSVIDEO_drv[i].fccType = 0; + MSVIDEO_drv[i].fccHandler = 0; + MSVIDEO_drv[i].hmod = 0; + } + } +} + +void remove_all_modules() +{ + for (int i = 0; i < 10; i++) + { + if (MSVIDEO_drv[i].hmod) + FreeLibrary(MSVIDEO_drv[i].hmod); + } + HeapFree(GetProcessHeap(), 0, MSVIDEO_drv); +} + /*********************************************************************** * ICOpenFunction [MSVIDEO.206] */ @@ -1153,6 +1283,7 @@ BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: + remove_all_modules(); DeleteCriticalSection(&msvideo_cs); break; } @@ -1382,10 +1513,48 @@ BOOL16 WINAPI ICInstall16(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR LeaveCriticalSection(&msvideo_cs); return ret; } - return ICInstall(fccType, fccHandler, lParam, szDesc, wFlags); + BOOL16 ret = ICInstall(fccType, fccHandler, lParam, szDesc, wFlags); + if (ret && (wFlags == ICINSTALL_DRIVER)) + { + HMODULE16 driver = LoadLibrary16((char *)lParam); + if (driver) + { + FARPROC driverproc = GetProcAddress16(driver, "DRIVERPROC"); + if (driverproc) + { + BOOL ret; + struct msvideo_thunk* thunk; + + EnterCriticalSection(&msvideo_cs); + if (!(thunk = MSVIDEO_AddThunk((DWORD)driverproc))) + { + FreeLibrary16(driver); + LeaveCriticalSection(&msvideo_cs); + return 0; + } + if (!add_module(fccType, fccHandler, driver)) + { + thunk->pfn16 = 0; + FreeLibrary16(driver); + LeaveCriticalSection(&msvideo_cs); + return 0; + } + if (!(ret = ICInstall(fccType, fccHandler, thunk, szDesc, ICINSTALL_FUNCTION))) + { + thunk->pfn16 = 0; + remove_module(fccType, fccHandler, TRUE); + } + LeaveCriticalSection(&msvideo_cs); + } + } + } + return ret; } BOOL16 WINAPI ICRemove16(DWORD fccType, DWORD fccHandler, UINT16 wFlags) { - return ICRemove(fccType, fccHandler, wFlags); + BOOL16 ret = ICRemove(fccType, fccHandler, wFlags); + if (ret) + remove_module(fccType, fccHandler, TRUE); + return ret; } From 1d301c31a8fd83182dbedcd99b825fcafc00d375 Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 20 Mar 2024 21:06:33 -0500 Subject: [PATCH 46/95] fix build --- msvideo/msvideo16.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/msvideo/msvideo16.c b/msvideo/msvideo16.c index b38a9338f5..7714487534 100644 --- a/msvideo/msvideo16.c +++ b/msvideo/msvideo16.c @@ -819,6 +819,7 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT lp2 = (LPARAM)(MapLS(lp2)); break; case ICM_DECOMPRESS: + { ICDECOMPRESS *icdec16 = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); ICDECOMPRESS *icdec = lp1; @@ -851,7 +852,7 @@ static LRESULT CALLBACK IC_Callback3216(DWORD pfn16, HIC hic, HDRVR hdrv, UINT lp1 = (LPARAM)(MapLS(icdec16)); lp2 = sizeof(ICDECOMPRESS); break; - + } } args[7] = HIWORD(hic); args[6] = LOWORD(hic); From 3ef372470736622bbe1e1574965396e3d43088f4 Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 20 Mar 2024 22:11:44 -0500 Subject: [PATCH 47/95] clamp world transform coordinates to 16 bits. --- gdi/gdi.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 21f3eb31b6..5766beac39 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -4998,8 +4998,12 @@ BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count ) { for (i = 0; i < count; i++) { - points[i].x = pt32[i].x; - points[i].y = pt32[i].y; + if (pt32[i].x >= 0x8000) points[i].x = 0x7fff; + else if (pt32[i].x < (LONG)0xffff8000) points[i].x = 0x8000; + else points[i].x = pt32[i].x; + if (pt32[i].y >= 0x8000) points[i].y = 0x7fff; + else if (pt32[i].y < (LONG)0xffff8000) points[i].y = 0x8000; + else points[i].y = pt32[i].y; } } if (pt32 != points32) HeapFree( GetProcessHeap(), 0, pt32 ); @@ -5029,8 +5033,12 @@ BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count ) { for (i = 0; i < count; i++) { - points[i].x = pt32[i].x; - points[i].y = pt32[i].y; + if (pt32[i].x >= 0x8000) points[i].x = 0x7fff; + else if (pt32[i].x < (LONG)0xffff8000) points[i].x = 0x8000; + else points[i].x = pt32[i].x; + if (pt32[i].y >= 0x8000) points[i].y = 0x7fff; + else if (pt32[i].y < (LONG)0xffff8000) points[i].y = 0x8000; + else points[i].y = pt32[i].y; } } if (pt32 != points32) HeapFree( GetProcessHeap(), 0, pt32 ); From 3b0bef9e661c7e9b9d08f75b05aa4a0e9d755e67 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 7 Apr 2024 09:50:24 -0500 Subject: [PATCH 48/95] fix broken check --- toolhelp/toolhelp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolhelp/toolhelp.c b/toolhelp/toolhelp.c index b668c2d0f3..625c6c09d8 100644 --- a/toolhelp/toolhelp.c +++ b/toolhelp/toolhelp.c @@ -801,7 +801,7 @@ BOOL WINAPI TOOLHELP_CallNotify(WORD wID, DWORD dwData) __TRY { // TODO: call notifiers in own thread - skip = !IsTask16(GetCurrentTask()) || ((notifys[i].htask & 3) != 3); + skip = ((notifys[i].htask & 3) == 3) && !IsTask16(GetCurrentTask()); } __EXCEPT_ALL { From a2d932068daf8398d579f817a60c2f15862f8cff Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 7 Apr 2024 20:16:54 -0500 Subject: [PATCH 49/95] handle case where window is created outside of dialogcreate --- user/message.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/user/message.c b/user/message.c index fbc9fc1c90..a3f918678d 100644 --- a/user/message.c +++ b/user/message.c @@ -2134,8 +2134,16 @@ LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT char class[10]; HWND roothwnd = GetAncestor(hwnd, GA_ROOT); int ret = GetClassName(roothwnd, &class, 10); - if (ret && !strcmp(class, "#32770")) - cs.lpCreateParams = *(SEGPTR *)((BYTE *)cs32->lpCreateParams + 2); + // if a window is created with a dialog as it's parent lpCreateParams can still be a SEGPTR + __TRY + { + if (ret && !strcmp(class, "#32770") && (*(WORD *)cs32->lpCreateParams == 4)) + cs.lpCreateParams = *(SEGPTR *)((BYTE *)cs32->lpCreateParams + 2); + } + __EXCEPT_ALL + { + } + __ENDTRY } else if (GetModuleHandleA("comdlg32.dll") == cs32->hInstance) { From 3bdea49f49b9f33656be91651c2bdc357eb4ccfa Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 17 Apr 2024 19:55:37 -0500 Subject: [PATCH 50/95] clear carry in vtd gettime and restore fs on function return --- krnl386/vxd.c | 1 + vm86/msdos.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/krnl386/vxd.c b/krnl386/vxd.c index b32153fc0f..009b565339 100644 --- a/krnl386/vxd.c +++ b/krnl386/vxd.c @@ -644,6 +644,7 @@ void WINAPI __wine_vxd_timer( CONTEXT *context ) context->Edx = context->Eax >> 22; context->Eax <<= 10; /* not very precise */ + RESET_CFLAG(context); break; case 0x0101: /* current Windows time, msecs */ diff --git a/vm86/msdos.cpp b/vm86/msdos.cpp index 90660819db..8acd493689 100644 --- a/vm86/msdos.cpp +++ b/vm86/msdos.cpp @@ -1718,8 +1718,8 @@ extern "C" /* Some programs expect that gs is not a valid selector! */ /* Some programs expect that fs is not a valid selector! */ /* win16 sets 0? */ - SREG(FS) = 0;//(WORD)context.SegFs == reg_fs ? 0 : context.SegFs; - SREG(GS) = 0;//(WORD)context.SegGs == reg_gs ? 0 : context.SegGs; + SREG(FS) = (WORD)context.SegFs == reg_fs ? 0 : context.SegFs; + SREG(GS) = (WORD)context.SegGs == reg_gs ? 0 : context.SegGs; if (reg) { if (!(ip19 != context.Eip || cs16 != context.SegCs)) From 42bb82666356f04cdc3597f28131354dc1ceff53 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 11 May 2024 15:45:53 -0500 Subject: [PATCH 51/95] make pointer in callproc32w16 null if invalid and special case nul in openfile16 --- krnl386/file.c | 15 ++++++++++----- krnl386/thunk.c | 5 ++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/krnl386/file.c b/krnl386/file.c index 2e330eee43..6b2935d1b6 100644 --- a/krnl386/file.c +++ b/krnl386/file.c @@ -804,11 +804,16 @@ HFILE16 WINAPI OpenFile16( LPCSTR name, OFSTRUCT *ofs, UINT16 mode ) } goto error; } - pathw = strdupAtoW(path); - found = SearchPathW( pathw, filename, NULL, sizeof(ofs->szPathName), - pathname, NULL ); - HeapFree( GetProcessHeap(), 0, path ); - HeapFree( GetProcessHeap(), 0, pathw ); + if (!wcsicmp(pathname, L"\\\\.\\nul")) + found = TRUE; + else + { + pathw = strdupAtoW(path); + found = SearchPathW( pathw, filename, NULL, sizeof(ofs->szPathName), + pathname, NULL ); + HeapFree( GetProcessHeap(), 0, path ); + HeapFree( GetProcessHeap(), 0, pathw ); + } if (!found) { RtlInitUnicodeString(&uni, pathname); diff --git a/krnl386/thunk.c b/krnl386/thunk.c index cf1e880661..ce083fd0ae 100644 --- a/krnl386/thunk.c +++ b/krnl386/thunk.c @@ -2531,7 +2531,10 @@ DWORD WINAPIV CallProc32W16( DWORD nrofargs, DWORD argconvmask, FARPROC proc32, { SEGPTR ptr = VA_ARG16( valist, SEGPTR ); /* pascal convention, have to reverse the arguments order */ - args[nrofargs - i - 1] = (DWORD)MapSL(ptr); + DWORD arg = (DWORD)MapSL(ptr); + if (!HIWORD(arg)) + arg = 0; + args[nrofargs - i - 1] = arg; TRACE("%08x(%p),",ptr,MapSL(ptr)); } else From a3654d3d18eb8b8f92bf7bce1e42312de6cfcd50 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 10 May 2024 22:00:56 -0500 Subject: [PATCH 52/95] add spoolfile --- gdi/gdi.exe16.spec | 2 +- gdi/printdrv.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/gdi/gdi.exe16.spec b/gdi/gdi.exe16.spec index b03f8a489f..eff7d0afb0 100644 --- a/gdi/gdi.exe16.spec +++ b/gdi/gdi.exe16.spec @@ -216,7 +216,7 @@ 248 stub QueryJob 250 pascal -ret16 Copy(ptr ptr word) Copy16 253 stub DeleteSpoolPage -254 stub SpoolFile +254 pascal -ret16 SpoolFile(ptr ptr ptr ptr) SpoolFile16 267 stub StartDocPrintEra 268 stub StartPagePrinter 269 stub WritePrinter diff --git a/gdi/printdrv.c b/gdi/printdrv.c index a91d1c8c76..3d0c336326 100644 --- a/gdi/printdrv.c +++ b/gdi/printdrv.c @@ -721,3 +721,41 @@ DWORD WINAPI DrvSetPrinterData16(LPSTR lpPrinter, LPSTR lpProfile, HeapFree(GetProcessHeap(), 0, RegStr_Printer); return res; } + +HANDLE16 WINAPI SpoolFile16(LPCSTR printer, LPCSTR port, LPCSTR job, LPCSTR file) +{ + HANDLE hprinter; + HANDLE16 ret = SP_ERROR; + if (!OpenPrinterA(printer, &hprinter, NULL)) + return SP_ERROR; + + DOC_INFO_1 dinfo; + dinfo.pDocName = job; + dinfo.pOutputFile = NULL; + dinfo.pDatatype = "RAW"; + + if (!StartDocPrinterA(hprinter, 1, &dinfo)) + goto outprn; + + HFILE fd = CreateFileA(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (fd == INVALID_HANDLE_VALUE) + goto outfile; + + while (1) + { + char buf[1024]; + int read, write; + if (!ReadFile(fd, &buf, 1024, &read, NULL) || !read) + break; + if (!WritePrinter(hprinter, &buf, read, &write)) + goto outfile; + } + ret = 1; +outfile: + CloseHandle(fd); + EndDocPrinter(hprinter); +outprn: + ClosePrinter(hprinter); + + return ret; +} From c2b1a270643769985f43935493f532aac5615154 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 13 Jul 2024 12:16:37 -0500 Subject: [PATCH 53/95] send cn_receive even if the count is less then the notify limit --- user/comm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user/comm.c b/user/comm.c index 25a8883b6c..41e5439929 100644 --- a/user/comm.c +++ b/user/comm.c @@ -182,7 +182,9 @@ static DWORD WINAPI eventth(LPVOID cid) break; } - if ((ptr->n_read != -1) && (ptr->n_read < stat.cbInQue) && ptr->wnd) + // send cn_receive unconditionally since win31 has a 100ms timeout after + // which it sends the notification even if the count is less than cbWriteNotify + if ((ptr->n_read != -1) && ptr->n_read && stat.cbInQue && ptr->wnd) PostMessageA(ptr->wnd, WM_COMMNOTIFY, cid, CN_RECEIVE); if ((ptr->n_write != -1) && (ptr->n_write > stat.cbOutQue) && ptr->wnd) From 0df64dd96fbbb32fcf70dc8b0e04c85a60f8f13f Mon Sep 17 00:00:00 2001 From: jgdrg <40196788+jgdrg@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:32:23 +0100 Subject: [PATCH 54/95] Add first pass of Netapi support --- netapi/CMakeLists.txt | 7 + netapi/Makefile.in | 5 + netapi/netapi.c | 139 ++++ netapi/netapi.def | 6 + netapi/netapi.dll16.asm | 642 ++++++++++++++++++ netapi/netapi.dll16.obj | Bin 0 -> 3210 bytes netapi/netapi.dll16.spec | 1 + netapi/netapi.vcxproj | 116 ++++ otvdm.sln | 1352 +++++++++++++++++++------------------- 9 files changed, 1598 insertions(+), 670 deletions(-) create mode 100644 netapi/CMakeLists.txt create mode 100644 netapi/Makefile.in create mode 100644 netapi/netapi.c create mode 100644 netapi/netapi.def create mode 100644 netapi/netapi.dll16.asm create mode 100644 netapi/netapi.dll16.obj create mode 100644 netapi/netapi.dll16.spec create mode 100644 netapi/netapi.vcxproj diff --git a/netapi/CMakeLists.txt b/netapi/CMakeLists.txt new file mode 100644 index 0000000000..c38b1a4d29 --- /dev/null +++ b/netapi/CMakeLists.txt @@ -0,0 +1,7 @@ +file(GLOB SOURCE *.c *.cpp *.rc) +add_library(netapi SHARED ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/netapi.def netapi.dll16.obj) +include_directories(../wine) +add_definitions(-D_X86_ -D__WINESRC__ -D__i386__ -DHAVE_STRNCASECMP -DHAVE__STRNICMP -D_WINTERNL_ -DNtCurrentTeb=NtCurrentTeb__ -DDECLSPEC_HIDDEN= -Dstrncasecmp=_strnicmp) +spec_build(netapi.dll16 netapi) +target_link_libraries(netapi libwine winecrt0 krnl386) +set_target_properties(netapi PROPERTIES SUFFIX ".dll16") diff --git a/netapi/Makefile.in b/netapi/Makefile.in new file mode 100644 index 0000000000..98e4484277 --- /dev/null +++ b/netapi/Makefile.in @@ -0,0 +1,5 @@ +MODULE = netapi.dll16 +IMPORTS = netapi32 +EXTRADLLFLAGS = -m16 + +C_SRCS = netapi.c diff --git a/netapi/netapi.c b/netapi/netapi.c new file mode 100644 index 0000000000..3ffe275518 --- /dev/null +++ b/netapi/netapi.c @@ -0,0 +1,139 @@ +/* + * 16-bit netapi functions + * + * Copyright (C) 2024 John Goodridge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include +#include +#include +#include "wine/winbase16.h" +#include "wownt32.h" +#include "winuser.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(netapi); + +typedef struct { + SEGPTR wki10_computername; //The unique computer name given to the workstation when it is started. + SEGPTR wki10_username; //The name of the user currently logged on to the workstation. + LPSTR wki10_langroup; //The default logon domain.The actual logon domain is stored in wkil0_logon_domain. + UCHAR wkil0_ver_major; + UCHAR wkil0_ver_minor; + LPSTR wkil0_1ogon_domain; //A pointer to a text string with the name of the workstation's logon domain. The value is NULL + LPSTR wkil0_oth_domains; //A pointer to a list of other domains that the workstation is currently browsing. + //The domains are space delimited and the list is zero +} WKSTA_INFO_10, *PWKSTA_INFO_10; + +//#include +//typedef void* HDBC; +//typedef HWND SQLHWND; +//typedef signed short RETCODE; +//typedef short SQLSMALLINT; +//SQL_DRIVER_PROMPT + +/*********************************************************************** + * NetWkstaGetInfo (WINSOCK.249) + */ +INT16 WINAPI NetWkstaGetInfo16(LPCSTR pszServer, USHORT sLevel, char* pbBuffer, USHORT cbBuffer, PUSHORT pcbTotalAvalaible) +{ + WCHAR serverW[RMLEN] = { 0 }; + MultiByteToWideChar(CP_ACP, 0, pszServer, -1, serverW, RMLEN); + //LPBYTE bufptr32 = NULL; + LPWKSTA_INFO_100 pwkstaInfo100 = NULL; + NET_API_STATUS status = NetWkstaGetInfo(serverW, 100, (LPBYTE*)&pwkstaInfo100); + + if (status == NERR_Success) + { + LPWKSTA_USER_INFO_0 pwkstaUserInfo0 = NULL; + status = NetWkstaUserGetInfo(NULL, 0, (LPBYTE*)&pwkstaUserInfo0); + + if (status == NERR_Success) + { + DWORD byteCount = 0; + NetApiBufferSize(pwkstaInfo100, &byteCount); + + switch (sLevel) { + case 10: + { + CHAR strComputerName[RMLEN]; + sprintf_s(strComputerName, RMLEN, "%S", pwkstaInfo100->wki100_computername); // convert to ansi + + CHAR strUserName[UNLEN]; + sprintf_s(strUserName, UNLEN, "%S", pwkstaUserInfo0->wkui0_username); // convert to ansi + + // NT\ds\netapi\svcdlls\wkssvc\server\wksta.c + DWORD TotalBytesNeeded = sizeof(WKSTA_INFO_10) + (strlen(strComputerName) + strlen(strUserName) + 3) * sizeof(CHAR); + LPBYTE FixedDataEnd = (LPBYTE)(pbBuffer + sizeof(WKSTA_INFO_10)); + + if (cbBuffer < TotalBytesNeeded) + { + if (pcbTotalAvalaible) + { + *pcbTotalAvalaible = (USHORT)TotalBytesNeeded; + } + + status = NERR_BufTooSmall; + } + else + { + if (pbBuffer) + { + // Copy computer name into buffer + PWKSTA_INFO_10 pwkstaInfo10 = (PWKSTA_INFO_10)pbBuffer; + memcpy(FixedDataEnd, strComputerName, strlen(strComputerName)); + SEGPTR c = MapLS(FixedDataEnd); + pwkstaInfo10->wki10_computername = c; + + // Copy user name into buffer + FixedDataEnd += strlen(strUserName) + sizeof(CHAR); + memcpy(FixedDataEnd, strUserName, strlen(strUserName)); + SEGPTR u = MapLS(FixedDataEnd); + pwkstaInfo10->wki10_username = u; + + // Fill in rest of the fields + pwkstaInfo10->wki10_langroup = NULL; + pwkstaInfo10->wkil0_ver_major = (UCHAR)pwkstaInfo100->wki100_ver_major; + pwkstaInfo10->wkil0_ver_minor = (UCHAR)pwkstaInfo100->wki100_ver_minor; + pwkstaInfo10->wkil0_1ogon_domain = NULL; + pwkstaInfo10->wkil0_oth_domains = NULL; + status = NERR_Success; + } + else + { + status = NERR_BufTooSmall; + } + } + + break; + } + + default: + FIXME("Unsupported level %d", sLevel); + status = ERROR_INVALID_LEVEL; + } + + NetApiBufferFree(pwkstaUserInfo0); + } + // Need to free buffer with NetApiBufferFree + NetApiBufferFree(pwkstaInfo100); + } + + return (INT16)status; +} diff --git a/netapi/netapi.def b/netapi/netapi.def new file mode 100644 index 0000000000..b6a7a9dbc5 --- /dev/null +++ b/netapi/netapi.def @@ -0,0 +1,6 @@ +; File generated automatically from ..\netapi\netapi.dll16.spec; do not edit! Actualy you do have to edit it as not generated!!! + +LIBRARY netapi.dll16 + +EXPORTS + _wine_spec_dos_header @1 DATA diff --git a/netapi/netapi.dll16.asm b/netapi/netapi.dll16.asm new file mode 100644 index 0000000000..7c059eaa35 --- /dev/null +++ b/netapi/netapi.dll16.asm @@ -0,0 +1,642 @@ +/* File generated automatically from netapi.dll16.spec; do not edit! */ +/* This file can be copied, modified and distributed without restriction. */ + + +/* module data */ + + .data + .align 4 +__wine_spec_dos_header: + .globl __wine_spec_dos_header +.L__wine_spec_dos_header: + .globl ___wine_spec_dos_header +.L___wine_spec_dos_header: +___wine_spec_dos_header: + .short 0x5a4d + .short 0x0040 + .short 0x0001 + .short (.L__wine_spec_ne_header-.L__wine_spec_dos_header)/16 + .short 0 + .short 0xffff + .short 0 + .short 0x00b8 + .short 0 + .short 0 + .short 0 + .short 0 + .short .L__wine_spec_ne_header-.L__wine_spec_dos_header + .short 0 + .short 0,0,0,0 + .short 0 + .short 0 + .short 0,0,0,0,0,0,0,0,0,0 + .long .L__wine_spec_ne_header-.L__wine_spec_dos_header +.L__wine_spec_ne_header: + .short 0x454e + .byte 0 + .byte 0 + .short .L__wine_spec_ne_enttab-.L__wine_spec_ne_header + .short .L__wine_spec_ne_enttab_end-.L__wine_spec_ne_enttab + .long 0 + .short 0x8001 + .short 2 + .short 0 + .short 0 + .long 0 + .short 0,2 + .short 2 + .short 0 + .short 0 + .short .L__wine_spec_ne_segtab-.L__wine_spec_ne_header + .short .L__wine_spec_ne_rsrctab-.L__wine_spec_ne_header + .short .L__wine_spec_ne_restab-.L__wine_spec_ne_header + .short .L__wine_spec_ne_modtab-.L__wine_spec_ne_header + .short .L__wine_spec_ne_imptab-.L__wine_spec_ne_header + .long 0 + .short 0 + .short 0 + .short 0 + .byte 0x02 + .byte 0x08 + .short 0 + .short 0 + .short 0 + .short 0 + +.L__wine_spec_ne_segtab: + .short .L__wine_spec_code_segment-.L__wine_spec_dos_header + .short .L__wine_spec_code_segment_end-.L__wine_spec_code_segment + .short 0x0000 + .short .L__wine_spec_code_segment_end-.L__wine_spec_code_segment + .short .L__wine_spec_data_segment-.L__wine_spec_dos_header + .short .L__wine_spec_data_segment_end-.L__wine_spec_data_segment + .short 0x0001 + .short .L__wine_spec_data_segment_end-.L__wine_spec_data_segment + +.L__wine_spec_ne_rsrctab: + .short 0 + .short 0 + .byte 0 + + .align 2 +.L__wine_spec_ne_restab: + .byte 0x06,0x4e,0x45,0x54,0x41,0x50,0x49 /* netapi */ + .short 0 + .byte 0x0f,0x4e,0x45,0x54,0x57,0x4b,0x53,0x54,0x41,0x47,0x45,0x54,0x49,0x4e,0x46,0x4f /* NetWkstaGetInfo */ + .short 249 + .byte 0 + + .align 2 +.L__wine_spec_ne_modtab: +.L__wine_spec_ne_imptab: + .byte 0,0 + +.L__wine_spec_ne_enttab: + .byte 0xf8,0x00 + .byte 0x01,0x01 + .byte 0x03 + .short .L__wine_netapi_249-.L__wine_spec_code_segment + .byte 0x00 +.L__wine_spec_ne_enttab_end: + + .align 2 +.code16 +.L__wine_spec_code_segment: +.L__wine_spec_callfrom16_p_word_twpwp_249: + pushl $.L__wine_spec_call16_p_pwpwp_249 + lcalll $0,$0 + orw %ax,%ax + lretw $16 + nop + .byte 0x8d,0xb6,0x00,0x00,0x00,0x00 + .short 0x86c7 + .long 0x0000430d,0x00000000 +.L__wine_netapi_249: + pushw %bp + pushl $_NetWkstaGetInfo16@20 + callw .L__wine_spec_callfrom16_p_word_twpwp_249 +.L__wine_spec_code_segment_end: + +.L__wine_spec_data_segment: + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +.L__wine_spec_data_segment_end: + .byte 0 + +/* relay functions */ + + .text + .align 4 + .def .L__wine_spec_call16_p_pwpwp_249; .scl 2; .type 32; .endef +.L__wine_spec_call16_p_pwpwp_249: + pushl %ebp + movl %esp,%ebp + pushl %esi + movl $__imp__wine_ldt_copy,%esi + movl 12(%ebp),%ecx + movzwl 2(%ecx),%edx + shr $3,%edx + movzwl 0(%ecx),%eax + addl (%esi,%edx,4),%eax + pushl %eax + movzwl 4(%ecx),%eax + pushl %eax + movzwl 8(%ecx),%edx + shr $3,%edx + movzwl 6(%ecx),%eax + addl (%esi,%edx,4),%eax + pushl %eax + movzwl 10(%ecx),%eax + pushl %eax + movzwl 14(%ecx),%edx + shr $3,%edx + movzwl 12(%ecx),%eax + addl (%esi,%edx,4),%eax + pushl %eax + calll *8(%ebp) + movl -4(%ebp),%esi + leave + ret + .data +wine_ldt_copy_ptr: + .long __imp__wine_ldt_copy +.code32 + + .section .rodata + .globl ___wine_spec_file_name +___wine_spec_file_name: +.L__wine_spec_file_name: + .string "netapi.dll16" + .text +___wine_spec_thunk_text_16: + + .globl ___wine_call16_start +___wine_call16_start: + + .align 4 + .def ___wine_call_from_16; .scl 2; .type 32; .endef + .globl ___wine_call_from_16 +___wine_call_from_16: + pushw %gs + pushw %fs + pushw %es + pushw %ds + pushl %ebp + pushl %ecx + pushl %edx + .byte 0x2e + movl _CallTo16_DataSelector,%edx + movw %dx, %ds + movw %dx, %es + movw _CallTo16_TebSelector, %fs + .byte 0x64 + mov (472),%gs + movw %ss, %dx + andl $0xfff8, %edx + shrl $1, %edx + movl __imp__wine_ldt_copy, %ecx + movl 0(%ecx,%edx), %edx + movzwl %sp, %ebp + leal -4(%ebp,%edx), %edx + .byte 0x64 + movl (3728), %ebp + pushl %ebp + .byte 0x64 + movw %ss, (3730) + .byte 0x64 + movw %sp, (3728) + pushl %ds + popl %ss + movl %ebp, %esp + addl $0x20,%ebp + subl $8,%esp + andl $~15,%esp + addl $8,%esp + leal 0x30(%edx),%eax + pushl %eax + pushl 0x26(%edx) + call *0x20(%edx) + .byte 0x64 + movw (3730), %ss + .byte 0x64 + movzwl (3728), %esp + .byte 0x64 + popl (3728) + popl %edx + popl %ecx + popl %ebp + popw %ds + popw %es + popw %fs + popw %gs + lret $12 + + .align 4 + .def ___wine_call_from_16_regs; .scl 2; .type 32; .endef + .globl ___wine_call_from_16_regs +___wine_call_from_16_regs: + pushw %gs + pushw %fs + pushw %es + pushw %ds + pushl %ebp + pushl %ecx + pushl %edx + pushfl + .byte 0x2e + movl _CallTo16_DataSelector,%edx + movw %dx, %ds + movw %dx, %es + movw _CallTo16_TebSelector, %fs + .byte 0x64 + mov (472),%gs + movw %ss, %dx + andl $0xfff8, %edx + shrl $1, %edx + movl __imp__wine_ldt_copy, %ecx + movl 0(%ecx,%edx), %edx + movzwl %sp, %ebp + leal 0(%ebp,%edx), %edx + popl %ecx + .byte 0x64 + movl (3728), %ebp + pushl %ebp + .byte 0x64 + movw %ss, (3730) + .byte 0x64 + movw %sp, (3728) + pushl %ds + popl %ss + movl %ebp, %esp + addl $0x20,%ebp + subl $0x2cc,%esp + movl %ecx,0xc0(%esp) + movl %eax,0xb0(%esp) + movl %ebx,0xa4(%esp) + movl %esi,0xa0(%esp) + movl %edi,0x9c(%esp) + movl 0x0c(%edx),%eax + movl %eax,0xb4(%esp) + movl 0x08(%edx),%eax + movl %eax,0xac(%esp) + movl 0x04(%edx),%eax + movl %eax,0xa8(%esp) + movzwl 0x10(%edx),%eax + movl %eax,0x98(%esp) + movzwl 0x12(%edx),%eax + movl %eax,0x94(%esp) + movzwl 0x14(%edx),%eax + movl %eax,0x90(%esp) + movzwl 0x16(%edx),%eax + movl %eax,0x8c(%esp) + movzwl 0x2e(%edx),%eax + movl %eax,0xbc(%esp) + movzwl 0x2c(%edx),%eax + movl %eax,0xb8(%esp) + .byte 0x64 + movzwl (3730), %eax + movl %eax,0xc8(%esp) + .byte 0x64 + movzwl (3728), %eax + addl $0x2c,%eax + movl %eax,0xc4(%esp) + movl %esp,%eax + andl $~15,%esp + subl $4,%esp + pushl %eax + leal 0x30(%edx),%eax + pushl %eax + pushl 0x26(%edx) + call *0x20(%edx) + leal -748(%ebp),%ebx + .byte 0x64 + movw (3730), %ss + .byte 0x64 + movzwl (3728), %esp + .byte 0x64 + popl (3728) + addw $0x14,%sp + popl %eax + popl %edx + movw 0xc8(%ebx),%ss + movl 0xc4(%ebx),%esp + addl $4, %esp + pushw 0xbc(%ebx) + pushw 0xb8(%ebx) + pushl %edx + pushl %eax + pushl 0xc0(%ebx) + pushl 0x98(%ebx) + pushl 0x94(%ebx) + popl %es + pushl 0x90(%ebx) + popl %fs + pushl 0x8c(%ebx) + popl %gs + movl 0xb4(%ebx),%ebp + movl 0xa0(%ebx),%esi + movl 0x9c(%ebx),%edi + movl 0xb0(%ebx),%eax + movl 0xa8(%ebx),%edx + movl 0xac(%ebx),%ecx + movl 0xa4(%ebx),%ebx + popl %ds + popfl + lret + + .align 4 + .def ___wine_call_from_16_thunk; .scl 2; .type 32; .endef + .globl ___wine_call_from_16_thunk +___wine_call_from_16_thunk: + pushw %gs + pushw %fs + pushw %es + pushw %ds + pushl %ebp + pushl %ecx + pushl %edx + .byte 0x2e + movl _CallTo16_DataSelector,%edx + movw %dx, %ds + movw %dx, %es + movw _CallTo16_TebSelector, %fs + .byte 0x64 + mov (472),%gs + movw %ss, %dx + andl $0xfff8, %edx + shrl $1, %edx + movl __imp__wine_ldt_copy, %ecx + movl 0(%ecx,%edx), %edx + movzwl %sp, %ebp + leal -4(%ebp,%edx), %edx + .byte 0x64 + movl (3728), %ebp + pushl %ebp + .byte 0x64 + movw %ss, (3730) + .byte 0x64 + movw %sp, (3728) + pushl %ds + popl %ss + movl %ebp, %esp + addl $0x20,%ebp + leal 0x1a(%edx),%ebx + leal -4(%esp), %ebp + call *0x26(%edx) + .byte 0x64 + movw (3730), %ss + .byte 0x64 + movzwl (3728), %esp + .byte 0x64 + popl (3728) + addl $8, %esp + popl %ebp + popw %ds + popw %es + popw %fs + popw %gs + addl $20, %esp + xorb %ch, %ch + popl %ebx + addw %cx, %sp + push %ebx + .byte 0x66 + lret + + .align 4 + .def ___wine_call_to_16; .scl 2; .type 32; .endef + .globl ___wine_call_to_16 +___wine_call_to_16: + pushl %ebp + movl %esp, %ebp + pushl %ebx + pushl %esi + pushl %edi + .byte 0x64 + mov %gs,(472) + .byte 0x64 + pushl (3728) + pushl 16(%ebp) + .byte 0x64 + pushl (0) + .byte 0x64 + movl %esp,(0) + pushl %cs + call .L__wine_call_to_16 + .byte 0x64 + popl (0) + addl $4, %esp + .byte 0x64 + popl (3728) + andl $0xffff,%eax + shll $16,%edx + orl %edx,%eax + popl %edi + popl %esi + popl %ebx + popl %ebp + ret $12 +.L__wine_call_to_16: + movl %esp,%edx + .byte 0x64 + movw (3730),%ss + .byte 0x64 + movw (3728),%sp + .byte 0x64 + movl %edx,(3728) + movzwl %sp,%ebp + leal 0x2a(%ebp),%ebp + subw 0x2c(%edx), %sp + pushl 0x28(%edx) + pushw -22(%ebp) + popw %fs + pushw -20(%ebp) + popw %gs + movw %ss,%ax + movw %ax,%ds + movw %ax,%es + .byte 0x66 + lret + + .align 4 + .def ___wine_call_to_16_regs; .scl 2; .type 32; .endef + .globl ___wine_call_to_16_regs +___wine_call_to_16_regs: + pushl %ebp + movl %esp, %ebp + pushl %ebx + pushl %esi + pushl %edi + .byte 0x64 + mov %gs,(472) + .byte 0x64 + pushl (3728) + pushl 16(%ebp) + .byte 0x64 + pushl (0) + .byte 0x64 + movl %esp,(0) + pushl %cs + call .L__wine_call_to_16_regs + .byte 0x64 + popl (0) + addl $4, %esp + .byte 0x64 + popl (3728) + movl 0x14(%esp),%edi + movl %eax,0xb0(%edi) + movl %ebx,0xa4(%edi) + movl %ecx,0xac(%edi) + movl %edx,0xa8(%edi) + movl %ebp,0xb4(%edi) + movl %esi,0xc4(%edi) + popl %edi + popl %esi + popl %ebx + popl %ebp + ret $12 +.L__wine_call_to_16_regs: + movl %esp,%edx + .byte 0x64 + movw (3730),%ss + .byte 0x64 + movw (3728),%sp + .byte 0x64 + movl %edx,(3728) + movzwl %sp,%ebp + leal 0x2a(%ebp),%ebp + subw 0x2c(%edx), %sp + movl 0x28(%edx),%edx + pushw 0xbc(%edx) + pushw 0xb8(%edx) + pushw 0x98(%edx) + pushl 0x94(%edx) + popl %es + pushl 0x90(%edx) + popl %fs + pushl 0x8c(%edx) + popl %gs + movl 0xb4(%edx),%ebp + movl 0xa0(%edx),%esi + movl 0x9c(%edx),%edi + movl 0xb0(%edx),%eax + movl 0xa4(%edx),%ebx + movl 0xac(%edx),%ecx + movl 0xa8(%edx),%edx + popw %ds + .byte 0x66 + lret + + .align 4 + .def ___wine_call_to_16_ret; .scl 2; .type 32; .endef + .globl ___wine_call_to_16_ret +___wine_call_to_16_ret: + movl %esp,%esi + .byte 0x2e + movl _CallTo16_DataSelector-___wine_call16_start,%edi + movw %di,%ds + movw %di,%es + .byte 0x2e + mov _CallTo16_TebSelector-___wine_call16_start,%fs + .byte 0x64 + mov (472),%gs + movw %di,%ss + .byte 0x64 + movl (3728),%esp + lret + + .align 4 + .def _CALL32_CBClient; .scl 2; .type 32; .endef + .globl _CALL32_CBClient +_CALL32_CBClient: + pushl %ebp + movl %esp,%ebp + pushl %edi + pushl %esi + pushl %ebx + movl 16(%ebp), %ebx + leal -8(%esp), %eax + movl %eax, -8(%ebx) + movl 20(%ebp), %esi + movl (%esi), %esi + movl 8(%ebp), %eax + movl 12(%ebp), %ebp + pushl %cs + call *%eax + movl 32(%esp), %edi + movl %esi, (%edi) + popl %ebx + popl %esi + popl %edi + popl %ebp + ret + + .align 4 + .def _CALL32_CBClient_Ret; .scl 2; .type 32; .endef + .globl _CALL32_CBClient_Ret +_CALL32_CBClient_Ret: + movzwl %sp, %ebx + lssl %ss:-16(%ebx), %esp + lret + + .align 4 + .def _CALL32_CBClientEx; .scl 2; .type 32; .endef + .globl _CALL32_CBClientEx +_CALL32_CBClientEx: + pushl %ebp + movl %esp,%ebp + pushl %edi + pushl %esi + pushl %ebx + movl 16(%ebp), %ebx + leal -8(%esp), %eax + movl %eax, 12(%ebx) + movl 20(%ebp), %esi + movl (%esi), %esi + movl 8(%ebp), %eax + movl 12(%ebp), %ebp + pushl %cs + call *%eax + movl 32(%esp), %edi + movl %esi, (%edi) + movl 36(%esp), %ebx + movl %ebp, (%ebx) + popl %ebx + popl %esi + popl %edi + popl %ebp + ret + + .align 4 + .def _CALL32_CBClientEx_Ret; .scl 2; .type 32; .endef + .globl _CALL32_CBClientEx_Ret +_CALL32_CBClientEx_Ret: + movzwl %bp, %ebx + subw %bp, %sp + movzwl %sp, %ebp + lssl %ss:-12(%ebx), %esp + lret + .globl ___wine_call16_end +___wine_call16_end: + + .data + .align 4 + .globl _CallTo16_DataSelector +_CallTo16_DataSelector: + .long 0 + .globl _CallTo16_TebSelector +_CallTo16_TebSelector: + .long 0 + .globl ___wine_call16_start_p +___wine_call16_start_p: + .long ___wine_call16_start + .globl ___wine_call16_end_p +___wine_call16_end_p: + .long ___wine_call16_end + .globl ___wine_call_to_16_ret_p +___wine_call_to_16_ret_p: + .long ___wine_call_to_16_ret + + .section .rodata +.L__wine_spec_main_module: + .string "netapi" +__end:/*?*/ diff --git a/netapi/netapi.dll16.obj b/netapi/netapi.dll16.obj new file mode 100644 index 0000000000000000000000000000000000000000..87e866a04cf1404814fc4c99b536ac5184f1e950 GIT binary patch literal 3210 zcmcImYiv|S6rOFDvY4g2m@OI;q3RYNz^0(qKN|a>AhFcarxeO%>All7-9ECtRg5Nr zOElNpT^jHegjk|6peCA@xJIiMs6i<)K#UTDk)RmT6vGccv|8q|Y=k)6*0 zK8LXp+YXQwv%-dCaC4ozg?r-b zv-pwmY(kC}p6z^%R}n68%5l9bp)JWtSKnl-bCYT~vu9g%E_m;q`sNt#=bnSyGr)8B zqPq3f0W*(budyFvM`Hy}AT_r9EC$|pX2*p|i?P$==6njy^eynjC!)1^Q>wYVKbNsO zwJ&csMwJ@{Brm$fn23CpADM7Pe!UVIbwx`HtE})6t2$qeNkdOu7^=JGkbUEZCcc=@ z<(>oFbLfPdO^<8ee-DgpxPD|iCQfECX7u?-upMKk|05dq`QM@8uz!GtVgEi1W~m!$ zDigER1@wVHPN0K8o_MJj@C^xX27E8@c0T4IisBF4ojHsC}Z2RqH{@t<~!VLgY*}3TVi^bSDYB z@I4UevWv37LdhSw;GK6$*}SposGAuV63cT_R!(Ns$;8n z0=3NhPQ}i~M)+9tDRzUg6laRXe9rGPUJ_OMmMGF)bO6TdbQs2mbW}#14*P~9HLDTn zpsb2PstQP=90p}M4BF)|XqUr#q8tVXU}=6T%Hai34tpsY^JP&EyD1vH$EXM6w}AOb zGZGs6Id(h{D+mMHUz6Ams?469lZN^lv&kD><)1XlCe2=-S!9;G%no<1bqc%AHy+x! zS!p_k{CVQ%iadkOS2E0VXPRej^81aYVs^hL{u94<0tZDNu8#GuYb?g6&WU*GkZJ$2 z6(_)TMzX0aXG~`YACd#$QIZ<=;`IiVLQ<;5Ga;J?*d8f?f9FJ+PjnJ zQ6Q`jRpG3a{N$qK@OKG)TdXw?+61nWSh!Caljd9-!* zSGI%B+YOXz={Fvc4F}zMWCjve>9-xqRyH}C(b8`^Vs!__F}uyT=h9mAFy^1dJZv-M zN7~eYNt}*kTFC}a%FpwV=;o4QUWG(E#$fw72uKx_viTAcooR~s4iZ&Vin$Ca(TGI` z)kij*Eb7^WbQui7rit8h)P(L!3Y-UZi5x>nno zV(s)(jxmGYjr6o9oGRTjX;{u6m1MR^QK{(-?FeX%rmyYfh^BaDA$+uTblWQ?s(}3q D(ait` literal 0 HcmV?d00001 diff --git a/netapi/netapi.dll16.spec b/netapi/netapi.dll16.spec new file mode 100644 index 0000000000..adf71d46c5 --- /dev/null +++ b/netapi/netapi.dll16.spec @@ -0,0 +1 @@ +249 pascal -ret16 NetWkstaGetInfo(str word ptr word ptr) NetWkstaGetInfo16 diff --git a/netapi/netapi.vcxproj b/netapi/netapi.vcxproj new file mode 100644 index 0000000000..8b054f66d5 --- /dev/null +++ b/netapi/netapi.vcxproj @@ -0,0 +1,116 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + Win32Proj + 10.0 + netapi + {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770} + + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + true + .dll16 + + + false + Release + .dll16 + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;_X86_;__WINESRC__;__i386__;USE_COMPILER_EXCEPTIONS;HAVE_STRNCASECMP;HAVE__STRNICMP;_WINTERNL_;NtCurrentTeb=NtCurrentTeb__;inline=__inline;%(PreprocessorDefinitions) + ../wine + + + Windows + true + $(OutDir)winecrt0.lib;$(OutDir)libwine.lib;$(OutDir)krnl386.lib; +netapi32.lib;%(AdditionalDependencies) + true + +netapi.def + + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;_X86_;__WINESRC__;__i386__;USE_COMPILER_EXCEPTIONS;HAVE_STRNCASECMP;HAVE__STRNICMP;_WINTERNL_;NtCurrentTeb=NtCurrentTeb__;inline=__inline;DECLSPEC_HIDDEN=;%(PreprocessorDefinitions) + ../wine + + + Windows + true + true + true + false + +netapi.def + + $(OutDir)winecrt0.lib;$(OutDir)libwine.lib;$(OutDir)krnl386.lib; +netapi32.lib;%(AdditionalDependencies) + + + + + + + + + + + Document + "$(OutDir)convspec" "%(Filename).spec" netapi > "%(Filename).asm" && "$(AsmPath)as" --32 -o "%(Filename).obj" "%(Filename).asm" + %(Filename).obj + + + + + + + + + \ No newline at end of file diff --git a/otvdm.sln b/otvdm.sln index f51153545b..fd07d17eae 100644 --- a/otvdm.sln +++ b/otvdm.sln @@ -1,670 +1,682 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2000 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "otvdm", "otvdm\otvdm.vcxproj", "{9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}" - ProjectSection(ProjectDependencies) = postProject - {E4950E01-C995-49A5-9FED-5EF03155FD65} = {E4950E01-C995-49A5-9FED-5EF03155FD65} - {258FD007-046D-4625-BB5A-B7934B71934F} = {258FD007-046D-4625-BB5A-B7934B71934F} - {F234FA09-76BC-4154-8420-737CD7FA4EF7} = {F234FA09-76BC-4154-8420-737CD7FA4EF7} - {7F73550E-724D-4F7A-B192-35A764AC24D6} = {7F73550E-724D-4F7A-B192-35A764AC24D6} - {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} = {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} - {CB9C6113-15AB-4DB9-A323-C2094A9A6E92} = {CB9C6113-15AB-4DB9-A323-C2094A9A6E92} - {7B417913-AE01-41E5-BFEA-AB971B779F63} = {7B417913-AE01-41E5-BFEA-AB971B779F63} - {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} = {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2} = {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2} - {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF} = {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F10EEF26-6451-4988-84D4-D193A4D2BF8C} = {F10EEF26-6451-4988-84D4-D193A4D2BF8C} - {F10EEF26-6451-4988-84D4-D193A4D2BF8D} = {F10EEF26-6451-4988-84D4-D193A4D2BF8D} - {B3496128-1B1F-4D55-8F7F-7E39A53ABE75} = {B3496128-1B1F-4D55-8F7F-7E39A53ABE75} - {BD91A02B-907B-4512-A963-1166D1EBC5C4} = {BD91A02B-907B-4512-A963-1166D1EBC5C4} - {1AAA3531-513D-4A96-9795-D48CF33BF516} = {1AAA3531-513D-4A96-9795-D48CF33BF516} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {3D889B37-09C8-4030-B815-830566CD57A3} = {3D889B37-09C8-4030-B815-830566CD57A3} - {3D889B37-09C8-4030-B815-830566CD57A4} = {3D889B37-09C8-4030-B815-830566CD57A4} - {3D889B37-09C8-4030-B815-830566CD57A5} = {3D889B37-09C8-4030-B815-830566CD57A5} - {72482539-7702-455E-81E0-F3AF237CF57F} = {72482539-7702-455E-81E0-F3AF237CF57F} - {2D769A3B-881A-4307-B6C9-02EBC61211A4} = {2D769A3B-881A-4307-B6C9-02EBC61211A4} - {96925A3C-9DD9-418E-A772-A112FFE93DC2} = {96925A3C-9DD9-418E-A772-A112FFE93DC2} - {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A} = {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A} - {8914D84A-84BD-4F85-99AC-723F8AEABAEB} = {8914D84A-84BD-4F85-99AC-723F8AEABAEB} - {6139024B-2348-440D-9192-3A40C3CE31B5} = {6139024B-2348-440D-9192-3A40C3CE31B5} - {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58} = {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58} - {09EF1555-CA21-47F8-8830-04A53295F8B6} = {09EF1555-CA21-47F8-8830-04A53295F8B6} - {0EBCFB5B-3092-4E06-A007-CA50B1DA3298} = {0EBCFB5B-3092-4E06-A007-CA50B1DA3298} - {0DCF5163-4049-4850-92BE-5D6A2444C51D} = {0DCF5163-4049-4850-92BE-5D6A2444C51D} - {7C04956D-FEBE-410F-ABB1-945695CDDFE5} = {7C04956D-FEBE-410F-ABB1-945695CDDFE5} - {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF} = {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF} - {E0AF9E72-F364-481A-A6E5-63EA88DF684E} = {E0AF9E72-F364-481A-A6E5-63EA88DF684E} - {3825B17A-681F-48CF-B9AD-5337B1F521C8} = {3825B17A-681F-48CF-B9AD-5337B1F521C8} - {C8F4997D-B814-43BB-A71B-507B2E956F55} = {C8F4997D-B814-43BB-A71B-507B2E956F55} - {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A} = {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A} - {3A10E48B-E88F-46C6-8A01-7A62112D0E05} = {3A10E48B-E88F-46C6-8A01-7A62112D0E05} - {90402A90-8D53-4843-BF11-7AE93361ED13} = {90402A90-8D53-4843-BF11-7AE93361ED13} - {08AEBC9F-464E-41DD-B4CB-F2921F69B591} = {08AEBC9F-464E-41DD-B4CB-F2921F69B591} - {D4EED8A5-2B15-4299-9F65-D56383AC7848} = {D4EED8A5-2B15-4299-9F65-D56383AC7848} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2} = {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2} - {FA7FFBC0-45A5-4419-B18C-DEC8363C2413} = {FA7FFBC0-45A5-4419-B18C-DEC8363C2413} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - {504CC4CA-612C-4681-AD9A-90E51785A5D2} = {504CC4CA-612C-4681-AD9A-90E51785A5D2} - {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C} = {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C} - {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4} = {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4} - {249FBAE5-EC5D-4988-87AC-A4371D827BA4} = {249FBAE5-EC5D-4988-87AC-A4371D827BA4} - {B76406F9-E89B-4791-ACDE-CD23813F764B} = {B76406F9-E89B-4791-ACDE-CD23813F764B} - {F1DEC3F9-706B-410D-91D5-0381BB9BA22A} = {F1DEC3F9-706B-410D-91D5-0381BB9BA22A} - {4A75E3F9-856A-4854-8AA2-34C06F7415BD} = {4A75E3F9-856A-4854-8AA2-34C06F7415BD} - {2DF233FE-CBB8-4102-A68D-7D30C38961C1} = {2DF233FE-CBB8-4102-A68D-7D30C38961C1} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wine", "wine\wine.vcxproj", "{C978A6C2-F788-4F5E-8E14-73C1B6B521CE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "krnl386", "krnl386\krnl386.vcxproj", "{D3F34C25-272C-4E4F-9B6F-BE7ABB472966}" - ProjectSection(ProjectDependencies) = postProject - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wow32", "wow32\wow32.vcxproj", "{E4950E01-C995-49A5-9FED-5EF03155FD65}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convspec", "convspec\convspec.vcxproj", "{DC6BA231-C318-436F-8F5C-5E2CC73779E2}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "user", "user\user.vcxproj", "{066A261B-90F6-4AB7-8F53-1455F068D6F7}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vm86", "vm86\vm86.vcxproj", "{0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gdi", "gdi\gdi.vcxproj", "{0EBCFB5B-3092-4E06-A007-CA50B1DA3298}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win87em", "win87em\win87em.vcxproj", "{08AEBC9F-464E-41DD-B4CB-F2921F69B591}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shell", "shell\shell.vcxproj", "{BD91A02B-907B-4512-A963-1166D1EBC5C4}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyboard", "keyboard\keyboard.vcxproj", "{B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}" - ProjectSection(ProjectDependencies) = postProject - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winnls", "winnls\winnls.vcxproj", "{F234FA09-76BC-4154-8420-737CD7FA4EF7}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "commdlg", "commdlg\commdlg.vcxproj", "{8914D84A-84BD-4F85-99AC-723F8AEABAEB}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {08AEBC9F-464E-41DD-B4CB-F2921F69B591} = {08AEBC9F-464E-41DD-B4CB-F2921F69B591} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "olesvr", "olesvr\olesvr.vcxproj", "{22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lzexpand", "lzexpand\lzexpand.vcxproj", "{3A10E48B-E88F-46C6-8A01-7A62112D0E05}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convertwinefile", "convertwinefile\convertwinefile.vcxproj", "{782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wing", "wing\wing.vcxproj", "{90402A90-8D53-4843-BF11-7AE93361ED13}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mmsystem", "mmsystem\mmsystem.vcxproj", "{249FBAE5-EC5D-4988-87AC-A4371D827BA4}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sound", "sound\sound.vcxproj", "{7B417913-AE01-41E5-BFEA-AB971B779F63}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mouse", "mouse\mouse.vcxproj", "{F1DEC3F9-706B-410D-91D5-0381BB9BA22A}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wifeman", "wifeman\wifeman.vcxproj", "{B76406F9-E89B-4791-ACDE-CD23813F764B}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctl3dv2", "ctl3dv2\ctl3dv2.vcxproj", "{7F73550E-724D-4F7A-B192-35A764AC24D6}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctl3d", "ctl3d\ctl3d.vcxproj", "{B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}" - ProjectSection(ProjectDependencies) = postProject - {7F73550E-724D-4F7A-B192-35A764AC24D6} = {7F73550E-724D-4F7A-B192-35A764AC24D6} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winoldap", "winoldap\winoldap.vcxproj", "{F10EEF26-6451-4988-84D4-D193A4D2BF8C}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regedit", "regedit\regedit.vcxproj", "{F10EEF26-6451-4988-84D4-D193A4D2BF8D}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "olecli", "olecli\olecli.vcxproj", "{B3496128-1B1F-4D55-8F7F-7E39A53ABE75}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {3A10E48B-E88F-46C6-8A01-7A62112D0E05} = {3A10E48B-E88F-46C6-8A01-7A62112D0E05} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ddeml", "ddeml\ddeml.vcxproj", "{D4EED8A5-2B15-4299-9F65-D56383AC7848}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toolhelp", "toolhelp\toolhelp.vcxproj", "{96925A3C-9DD9-418E-A772-A112FFE93DC2}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ver", "ver\ver.vcxproj", "{7C04956D-FEBE-410F-ABB1-945695CDDFE5}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winecrt0", "winecrt0\winecrt0.vcxproj", "{583655C3-2633-4597-BD31-C5AA1EC78AD2}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "system", "system\system.vcxproj", "{6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "comm", "comm\comm.vcxproj", "{3D889B37-09C8-4030-B815-830566CD57A3}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dispdib", "dispdib\dispdib.vcxproj", "{3D889B37-09C8-4030-B815-830566CD57A4}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rmpatch", "rmpatch\rmpatch.vcxproj", "{3D889B37-09C8-4030-B815-830566CD57A5}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} - {96925A3C-9DD9-418E-A772-A112FFE93DC2} = {96925A3C-9DD9-418E-A772-A112FFE93DC2} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2", "ole2\ole2.vcxproj", "{F9B66ABE-3489-434C-8340-65B3421DC30C}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - {8A7A52D0-4772-475F-AB85-9C074CFEFDE8} = {8A7A52D0-4772-475F-AB85-9C074CFEFDE8} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "compobj", "compobj\compobj.vcxproj", "{B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "storage", "storage\storage.vcxproj", "{4A75E3F9-856A-4854-8AA2-34C06F7415BD}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winspool", "winspool\winspool.vcxproj", "{C8F4997D-B814-43BB-A71B-507B2E956F55}" - ProjectSection(ProjectDependencies) = postProject - {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} = {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2conv", "ole2conv\ole2conv.vcxproj", "{90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2disp", "ole2disp\ole2disp.vcxproj", "{2D769A3B-881A-4307-B6C9-02EBC61211A4}" - ProjectSection(ProjectDependencies) = postProject - {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} = {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2nls", "ole2nls\ole2nls.vcxproj", "{504CC4CA-612C-4681-AD9A-90E51785A5D2}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2prox", "ole2prox\ole2prox.vcxproj", "{6139024B-2348-440D-9192-3A40C3CE31B5}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2thk", "ole2thk\ole2thk.vcxproj", "{94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winhlp32", "winhlp32\winhlp32.vcxproj", "{37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvideo", "msvideo\msvideo.vcxproj", "{0DCF5163-4049-4850-92BE-5D6A2444C51D}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {249FBAE5-EC5D-4988-87AC-A4371D827BA4} = {249FBAE5-EC5D-4988-87AC-A4371D827BA4} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "avifile", "avifile\avifile.vcxproj", "{3825B17A-681F-48CF-B9AD-5337B1F521C8}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msacm", "msacm\msacm.vcxproj", "{FA7FFBC0-45A5-4419-B18C-DEC8363C2413}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "otvdmw", "otvdm\otvdmw.vcxproj", "{73E019BF-2393-4BB3-90CA-B5B5749E4B69}" - ProjectSection(ProjectDependencies) = postProject - {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA} = {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "haxmvm", "haxmvm\haxmvm.vcxproj", "{55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "display", "display\display.vcxproj", "{E0AF9E72-F364-481A-A6E5-63EA88DF684E}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsock", "winsock\winsock.vcxproj", "{ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nddeapi", "nddeapi\nddeapi.vcxproj", "{72482539-7702-455E-81E0-F3AF237CF57F}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "widl", "widl\widl.vcxproj", "{8A7A52D0-4772-475F-AB85-9C074CFEFDE8}" - ProjectSection(ProjectDependencies) = postProject - {433BAA32-23BE-4B63-B24B-B89938F4FF35} = {433BAA32-23BE-4B63-B24B-B89938F4FF35} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wpp", "wpp\wpp.vcxproj", "{433BAA32-23BE-4B63-B24B-B89938F4FF35}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "commctrl", "commctrl\commctrl.vcxproj", "{CB9C6113-15AB-4DB9-A323-C2094A9A6E92}" - ProjectSection(ProjectDependencies) = postProject - {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "typelib", "typelib\typelib.vcxproj", "{1AAA3531-513D-4A96-9795-D48CF33BF516}" - ProjectSection(ProjectDependencies) = postProject - {2D769A3B-881A-4307-B6C9-02EBC61211A4} = {2D769A3B-881A-4307-B6C9-02EBC61211A4} - {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timer", "timer\timer.vcxproj", "{09EF1555-CA21-47F8-8830-04A53295F8B6}" - ProjectSection(ProjectDependencies) = postProject - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "whpxvm", "whpxvm\whpxvm.vcxproj", "{2DF233FE-CBB8-4102-A68D-7D30C38961C1}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gvm", "gvm\gvm.vcxproj", "{258FD007-046D-4625-BB5A-B7934B71934F}" - ProjectSection(ProjectDependencies) = postProject - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Debug|Win32.ActiveCfg = Debug|Win32 - {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Debug|Win32.Build.0 = Debug|Win32 - {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Release|Win32.ActiveCfg = Release|Win32 - {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Release|Win32.Build.0 = Release|Win32 - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Debug|Win32.ActiveCfg = Debug|Win32 - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Debug|Win32.Build.0 = Debug|Win32 - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Release|Win32.ActiveCfg = Release|Win32 - {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Release|Win32.Build.0 = Release|Win32 - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Debug|Win32.ActiveCfg = Debug|Win32 - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Debug|Win32.Build.0 = Debug|Win32 - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Release|Win32.ActiveCfg = Release|Win32 - {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Release|Win32.Build.0 = Release|Win32 - {E4950E01-C995-49A5-9FED-5EF03155FD65}.Debug|Win32.ActiveCfg = Debug|Win32 - {E4950E01-C995-49A5-9FED-5EF03155FD65}.Debug|Win32.Build.0 = Debug|Win32 - {E4950E01-C995-49A5-9FED-5EF03155FD65}.Release|Win32.ActiveCfg = Release|Win32 - {E4950E01-C995-49A5-9FED-5EF03155FD65}.Release|Win32.Build.0 = Release|Win32 - {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Debug|Win32.ActiveCfg = Debug|Win32 - {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Debug|Win32.Build.0 = Debug|Win32 - {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Release|Win32.ActiveCfg = Release|Win32 - {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Release|Win32.Build.0 = Release|Win32 - {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Debug|Win32.ActiveCfg = Debug|Win32 - {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Debug|Win32.Build.0 = Debug|Win32 - {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Release|Win32.ActiveCfg = Release|Win32 - {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Release|Win32.Build.0 = Release|Win32 - {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Debug|Win32.ActiveCfg = Debug|Win32 - {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Debug|Win32.Build.0 = Debug|Win32 - {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Release|Win32.ActiveCfg = Release|Win32 - {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Release|Win32.Build.0 = Release|Win32 - {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Debug|Win32.ActiveCfg = Debug|Win32 - {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Debug|Win32.Build.0 = Debug|Win32 - {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Release|Win32.ActiveCfg = Release|Win32 - {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Release|Win32.Build.0 = Release|Win32 - {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Debug|Win32.ActiveCfg = Debug|Win32 - {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Debug|Win32.Build.0 = Debug|Win32 - {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Release|Win32.ActiveCfg = Release|Win32 - {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Release|Win32.Build.0 = Release|Win32 - {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Debug|Win32.ActiveCfg = Debug|Win32 - {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Debug|Win32.Build.0 = Debug|Win32 - {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Release|Win32.ActiveCfg = Release|Win32 - {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Release|Win32.Build.0 = Release|Win32 - {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Debug|Win32.ActiveCfg = Debug|Win32 - {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Debug|Win32.Build.0 = Debug|Win32 - {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Release|Win32.ActiveCfg = Release|Win32 - {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Release|Win32.Build.0 = Release|Win32 - {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Debug|Win32.ActiveCfg = Debug|Win32 - {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Debug|Win32.Build.0 = Debug|Win32 - {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Release|Win32.ActiveCfg = Release|Win32 - {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Release|Win32.Build.0 = Release|Win32 - {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Debug|Win32.ActiveCfg = Debug|Win32 - {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Debug|Win32.Build.0 = Debug|Win32 - {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Release|Win32.ActiveCfg = Release|Win32 - {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Release|Win32.Build.0 = Release|Win32 - {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Debug|Win32.ActiveCfg = Debug|Win32 - {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Debug|Win32.Build.0 = Debug|Win32 - {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Release|Win32.ActiveCfg = Release|Win32 - {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Release|Win32.Build.0 = Release|Win32 - {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Debug|Win32.ActiveCfg = Debug|Win32 - {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Debug|Win32.Build.0 = Debug|Win32 - {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Release|Win32.ActiveCfg = Release|Win32 - {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Release|Win32.Build.0 = Release|Win32 - {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Debug|Win32.ActiveCfg = Debug|Win32 - {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Debug|Win32.Build.0 = Debug|Win32 - {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Release|Win32.ActiveCfg = Release|Win32 - {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Release|Win32.Build.0 = Release|Win32 - {90402A90-8D53-4843-BF11-7AE93361ED13}.Debug|Win32.ActiveCfg = Debug|Win32 - {90402A90-8D53-4843-BF11-7AE93361ED13}.Debug|Win32.Build.0 = Debug|Win32 - {90402A90-8D53-4843-BF11-7AE93361ED13}.Release|Win32.ActiveCfg = Release|Win32 - {90402A90-8D53-4843-BF11-7AE93361ED13}.Release|Win32.Build.0 = Release|Win32 - {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Debug|Win32.ActiveCfg = Debug|Win32 - {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Debug|Win32.Build.0 = Debug|Win32 - {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Release|Win32.ActiveCfg = Release|Win32 - {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Release|Win32.Build.0 = Release|Win32 - {7B417913-AE01-41E5-BFEA-AB971B779F63}.Debug|Win32.ActiveCfg = Debug|Win32 - {7B417913-AE01-41E5-BFEA-AB971B779F63}.Debug|Win32.Build.0 = Debug|Win32 - {7B417913-AE01-41E5-BFEA-AB971B779F63}.Release|Win32.ActiveCfg = Release|Win32 - {7B417913-AE01-41E5-BFEA-AB971B779F63}.Release|Win32.Build.0 = Release|Win32 - {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Debug|Win32.ActiveCfg = Debug|Win32 - {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Debug|Win32.Build.0 = Debug|Win32 - {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Release|Win32.ActiveCfg = Release|Win32 - {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Release|Win32.Build.0 = Release|Win32 - {B76406F9-E89B-4791-ACDE-CD23813F764B}.Debug|Win32.ActiveCfg = Debug|Win32 - {B76406F9-E89B-4791-ACDE-CD23813F764B}.Debug|Win32.Build.0 = Debug|Win32 - {B76406F9-E89B-4791-ACDE-CD23813F764B}.Release|Win32.ActiveCfg = Release|Win32 - {B76406F9-E89B-4791-ACDE-CD23813F764B}.Release|Win32.Build.0 = Release|Win32 - {7F73550E-724D-4F7A-B192-35A764AC24D6}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F73550E-724D-4F7A-B192-35A764AC24D6}.Debug|Win32.Build.0 = Debug|Win32 - {7F73550E-724D-4F7A-B192-35A764AC24D6}.Release|Win32.ActiveCfg = Release|Win32 - {7F73550E-724D-4F7A-B192-35A764AC24D6}.Release|Win32.Build.0 = Release|Win32 - {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Debug|Win32.ActiveCfg = Debug|Win32 - {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Debug|Win32.Build.0 = Debug|Win32 - {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Release|Win32.ActiveCfg = Release|Win32 - {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Release|Win32.Build.0 = Release|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Debug|Win32.ActiveCfg = Debug|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Debug|Win32.Build.0 = Debug|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Release|Win32.ActiveCfg = Release|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Release|Win32.Build.0 = Release|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Debug|Win32.ActiveCfg = Debug|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Debug|Win32.Build.0 = Debug|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Release|Win32.ActiveCfg = Release|Win32 - {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Release|Win32.Build.0 = Release|Win32 - {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Debug|Win32.ActiveCfg = Debug|Win32 - {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Debug|Win32.Build.0 = Debug|Win32 - {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Release|Win32.ActiveCfg = Release|Win32 - {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Release|Win32.Build.0 = Release|Win32 - {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Debug|Win32.ActiveCfg = Debug|Win32 - {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Debug|Win32.Build.0 = Debug|Win32 - {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Release|Win32.ActiveCfg = Release|Win32 - {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Release|Win32.Build.0 = Release|Win32 - {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Debug|Win32.ActiveCfg = Debug|Win32 - {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Debug|Win32.Build.0 = Debug|Win32 - {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Release|Win32.ActiveCfg = Release|Win32 - {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Release|Win32.Build.0 = Release|Win32 - {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Debug|Win32.ActiveCfg = Debug|Win32 - {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Debug|Win32.Build.0 = Debug|Win32 - {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Release|Win32.ActiveCfg = Release|Win32 - {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Release|Win32.Build.0 = Release|Win32 - {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Debug|Win32.ActiveCfg = Debug|Win32 - {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Debug|Win32.Build.0 = Debug|Win32 - {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Release|Win32.ActiveCfg = Release|Win32 - {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Release|Win32.Build.0 = Release|Win32 - {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Debug|Win32.ActiveCfg = Debug|Win32 - {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Debug|Win32.Build.0 = Debug|Win32 - {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Release|Win32.ActiveCfg = Release|Win32 - {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Release|Win32.Build.0 = Release|Win32 - {3D889B37-09C8-4030-B815-830566CD57A3}.Debug|Win32.ActiveCfg = Debug|Win32 - {3D889B37-09C8-4030-B815-830566CD57A3}.Debug|Win32.Build.0 = Debug|Win32 - {3D889B37-09C8-4030-B815-830566CD57A3}.Release|Win32.ActiveCfg = Release|Win32 - {3D889B37-09C8-4030-B815-830566CD57A3}.Release|Win32.Build.0 = Release|Win32 - {3D889B37-09C8-4030-B815-830566CD57A4}.Debug|Win32.ActiveCfg = Debug|Win32 - {3D889B37-09C8-4030-B815-830566CD57A4}.Debug|Win32.Build.0 = Debug|Win32 - {3D889B37-09C8-4030-B815-830566CD57A4}.Release|Win32.ActiveCfg = Release|Win32 - {3D889B37-09C8-4030-B815-830566CD57A4}.Release|Win32.Build.0 = Release|Win32 - {3D889B37-09C8-4030-B815-830566CD57A5}.Debug|Win32.ActiveCfg = Debug|Win32 - {3D889B37-09C8-4030-B815-830566CD57A5}.Debug|Win32.Build.0 = Debug|Win32 - {3D889B37-09C8-4030-B815-830566CD57A5}.Release|Win32.ActiveCfg = Release|Win32 - {3D889B37-09C8-4030-B815-830566CD57A5}.Release|Win32.Build.0 = Release|Win32 - {F9B66ABE-3489-434C-8340-65B3421DC30C}.Debug|Win32.ActiveCfg = Debug|Win32 - {F9B66ABE-3489-434C-8340-65B3421DC30C}.Debug|Win32.Build.0 = Debug|Win32 - {F9B66ABE-3489-434C-8340-65B3421DC30C}.Release|Win32.ActiveCfg = Release|Win32 - {F9B66ABE-3489-434C-8340-65B3421DC30C}.Release|Win32.Build.0 = Release|Win32 - {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Debug|Win32.ActiveCfg = Debug|Win32 - {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Debug|Win32.Build.0 = Debug|Win32 - {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Release|Win32.ActiveCfg = Release|Win32 - {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Release|Win32.Build.0 = Release|Win32 - {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Debug|Win32.ActiveCfg = Debug|Win32 - {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Debug|Win32.Build.0 = Debug|Win32 - {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Release|Win32.ActiveCfg = Release|Win32 - {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Release|Win32.Build.0 = Release|Win32 - {C8F4997D-B814-43BB-A71B-507B2E956F55}.Debug|Win32.ActiveCfg = Debug|Win32 - {C8F4997D-B814-43BB-A71B-507B2E956F55}.Debug|Win32.Build.0 = Debug|Win32 - {C8F4997D-B814-43BB-A71B-507B2E956F55}.Release|Win32.ActiveCfg = Release|Win32 - {C8F4997D-B814-43BB-A71B-507B2E956F55}.Release|Win32.Build.0 = Release|Win32 - {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Debug|Win32.ActiveCfg = Debug|Win32 - {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Debug|Win32.Build.0 = Debug|Win32 - {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Release|Win32.ActiveCfg = Release|Win32 - {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Release|Win32.Build.0 = Release|Win32 - {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Debug|Win32.ActiveCfg = Debug|Win32 - {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Debug|Win32.Build.0 = Debug|Win32 - {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Release|Win32.ActiveCfg = Release|Win32 - {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Release|Win32.Build.0 = Release|Win32 - {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Debug|Win32.ActiveCfg = Debug|Win32 - {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Debug|Win32.Build.0 = Debug|Win32 - {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Release|Win32.ActiveCfg = Release|Win32 - {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Release|Win32.Build.0 = Release|Win32 - {6139024B-2348-440D-9192-3A40C3CE31B5}.Debug|Win32.ActiveCfg = Debug|Win32 - {6139024B-2348-440D-9192-3A40C3CE31B5}.Debug|Win32.Build.0 = Debug|Win32 - {6139024B-2348-440D-9192-3A40C3CE31B5}.Release|Win32.ActiveCfg = Release|Win32 - {6139024B-2348-440D-9192-3A40C3CE31B5}.Release|Win32.Build.0 = Release|Win32 - {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Debug|Win32.ActiveCfg = Debug|Win32 - {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Debug|Win32.Build.0 = Debug|Win32 - {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Release|Win32.ActiveCfg = Release|Win32 - {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Release|Win32.Build.0 = Release|Win32 - {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Debug|Win32.ActiveCfg = Debug|Win32 - {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Debug|Win32.Build.0 = Debug|Win32 - {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Release|Win32.ActiveCfg = Release|Win32 - {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Release|Win32.Build.0 = Release|Win32 - {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Debug|Win32.ActiveCfg = Debug|Win32 - {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Debug|Win32.Build.0 = Debug|Win32 - {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Release|Win32.ActiveCfg = Release|Win32 - {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Release|Win32.Build.0 = Release|Win32 - {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Debug|Win32.ActiveCfg = Debug|Win32 - {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Debug|Win32.Build.0 = Debug|Win32 - {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Release|Win32.ActiveCfg = Release|Win32 - {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Release|Win32.Build.0 = Release|Win32 - {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Debug|Win32.ActiveCfg = Debug|Win32 - {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Debug|Win32.Build.0 = Debug|Win32 - {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Release|Win32.ActiveCfg = Release|Win32 - {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Release|Win32.Build.0 = Release|Win32 - {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Debug|Win32.ActiveCfg = Debug|Win32 - {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Debug|Win32.Build.0 = Debug|Win32 - {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Release|Win32.ActiveCfg = Release|Win32 - {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Release|Win32.Build.0 = Release|Win32 - {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Debug|Win32.ActiveCfg = Debug|Win32 - {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Debug|Win32.Build.0 = Debug|Win32 - {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Release|Win32.ActiveCfg = Release|Win32 - {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Release|Win32.Build.0 = Release|Win32 - {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Debug|Win32.ActiveCfg = Debug|Win32 - {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Debug|Win32.Build.0 = Debug|Win32 - {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Release|Win32.ActiveCfg = Release|Win32 - {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Release|Win32.Build.0 = Release|Win32 - {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Debug|Win32.ActiveCfg = Debug|Win32 - {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Debug|Win32.Build.0 = Debug|Win32 - {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Release|Win32.ActiveCfg = Release|Win32 - {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Release|Win32.Build.0 = Release|Win32 - {72482539-7702-455E-81E0-F3AF237CF57F}.Debug|Win32.ActiveCfg = Debug|Win32 - {72482539-7702-455E-81E0-F3AF237CF57F}.Debug|Win32.Build.0 = Debug|Win32 - {72482539-7702-455E-81E0-F3AF237CF57F}.Release|Win32.ActiveCfg = Release|Win32 - {72482539-7702-455E-81E0-F3AF237CF57F}.Release|Win32.Build.0 = Release|Win32 - {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Debug|Win32.ActiveCfg = Debug|Win32 - {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Debug|Win32.Build.0 = Debug|Win32 - {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Release|Win32.ActiveCfg = Release|Win32 - {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Release|Win32.Build.0 = Release|Win32 - {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Debug|Win32.ActiveCfg = Debug|Win32 - {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Debug|Win32.Build.0 = Debug|Win32 - {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Release|Win32.ActiveCfg = Release|Win32 - {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Release|Win32.Build.0 = Release|Win32 - {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Debug|Win32.ActiveCfg = Debug|Win32 - {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Debug|Win32.Build.0 = Debug|Win32 - {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Release|Win32.ActiveCfg = Release|Win32 - {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Release|Win32.Build.0 = Release|Win32 - {1AAA3531-513D-4A96-9795-D48CF33BF516}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AAA3531-513D-4A96-9795-D48CF33BF516}.Debug|Win32.Build.0 = Debug|Win32 - {1AAA3531-513D-4A96-9795-D48CF33BF516}.Release|Win32.ActiveCfg = Release|Win32 - {1AAA3531-513D-4A96-9795-D48CF33BF516}.Release|Win32.Build.0 = Release|Win32 - {09EF1555-CA21-47F8-8830-04A53295F8B6}.Debug|Win32.ActiveCfg = Debug|Win32 - {09EF1555-CA21-47F8-8830-04A53295F8B6}.Debug|Win32.Build.0 = Debug|Win32 - {09EF1555-CA21-47F8-8830-04A53295F8B6}.Release|Win32.ActiveCfg = Release|Win32 - {09EF1555-CA21-47F8-8830-04A53295F8B6}.Release|Win32.Build.0 = Release|Win32 - {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Debug|Win32.ActiveCfg = Debug|Win32 - {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Debug|Win32.Build.0 = Debug|Win32 - {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Release|Win32.ActiveCfg = Release|Win32 - {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Release|Win32.Build.0 = Release|Win32 - {258FD007-046D-4625-BB5A-B7934B71934F}.Debug|Win32.ActiveCfg = Debug|Win32 - {258FD007-046D-4625-BB5A-B7934B71934F}.Debug|Win32.Build.0 = Debug|Win32 - {258FD007-046D-4625-BB5A-B7934B71934F}.Release|Win32.ActiveCfg = Release|Win32 - {258FD007-046D-4625-BB5A-B7934B71934F}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {692D1D4A-93CF-4B31-BF6F-4901B375934E} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.34931.43 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "otvdm", "otvdm\otvdm.vcxproj", "{9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}" + ProjectSection(ProjectDependencies) = postProject + {E4950E01-C995-49A5-9FED-5EF03155FD65} = {E4950E01-C995-49A5-9FED-5EF03155FD65} + {258FD007-046D-4625-BB5A-B7934B71934F} = {258FD007-046D-4625-BB5A-B7934B71934F} + {F234FA09-76BC-4154-8420-737CD7FA4EF7} = {F234FA09-76BC-4154-8420-737CD7FA4EF7} + {7F73550E-724D-4F7A-B192-35A764AC24D6} = {7F73550E-724D-4F7A-B192-35A764AC24D6} + {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} = {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} + {CB9C6113-15AB-4DB9-A323-C2094A9A6E92} = {CB9C6113-15AB-4DB9-A323-C2094A9A6E92} + {7B417913-AE01-41E5-BFEA-AB971B779F63} = {7B417913-AE01-41E5-BFEA-AB971B779F63} + {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} = {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2} = {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2} + {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF} = {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F10EEF26-6451-4988-84D4-D193A4D2BF8C} = {F10EEF26-6451-4988-84D4-D193A4D2BF8C} + {F10EEF26-6451-4988-84D4-D193A4D2BF8D} = {F10EEF26-6451-4988-84D4-D193A4D2BF8D} + {B3496128-1B1F-4D55-8F7F-7E39A53ABE75} = {B3496128-1B1F-4D55-8F7F-7E39A53ABE75} + {BD91A02B-907B-4512-A963-1166D1EBC5C4} = {BD91A02B-907B-4512-A963-1166D1EBC5C4} + {1AAA3531-513D-4A96-9795-D48CF33BF516} = {1AAA3531-513D-4A96-9795-D48CF33BF516} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770} = {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770} + {3D889B37-09C8-4030-B815-830566CD57A3} = {3D889B37-09C8-4030-B815-830566CD57A3} + {3D889B37-09C8-4030-B815-830566CD57A4} = {3D889B37-09C8-4030-B815-830566CD57A4} + {3D889B37-09C8-4030-B815-830566CD57A5} = {3D889B37-09C8-4030-B815-830566CD57A5} + {72482539-7702-455E-81E0-F3AF237CF57F} = {72482539-7702-455E-81E0-F3AF237CF57F} + {2D769A3B-881A-4307-B6C9-02EBC61211A4} = {2D769A3B-881A-4307-B6C9-02EBC61211A4} + {96925A3C-9DD9-418E-A772-A112FFE93DC2} = {96925A3C-9DD9-418E-A772-A112FFE93DC2} + {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A} = {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A} + {8914D84A-84BD-4F85-99AC-723F8AEABAEB} = {8914D84A-84BD-4F85-99AC-723F8AEABAEB} + {6139024B-2348-440D-9192-3A40C3CE31B5} = {6139024B-2348-440D-9192-3A40C3CE31B5} + {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58} = {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58} + {09EF1555-CA21-47F8-8830-04A53295F8B6} = {09EF1555-CA21-47F8-8830-04A53295F8B6} + {0EBCFB5B-3092-4E06-A007-CA50B1DA3298} = {0EBCFB5B-3092-4E06-A007-CA50B1DA3298} + {0DCF5163-4049-4850-92BE-5D6A2444C51D} = {0DCF5163-4049-4850-92BE-5D6A2444C51D} + {7C04956D-FEBE-410F-ABB1-945695CDDFE5} = {7C04956D-FEBE-410F-ABB1-945695CDDFE5} + {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF} = {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF} + {E0AF9E72-F364-481A-A6E5-63EA88DF684E} = {E0AF9E72-F364-481A-A6E5-63EA88DF684E} + {3825B17A-681F-48CF-B9AD-5337B1F521C8} = {3825B17A-681F-48CF-B9AD-5337B1F521C8} + {C8F4997D-B814-43BB-A71B-507B2E956F55} = {C8F4997D-B814-43BB-A71B-507B2E956F55} + {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A} = {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A} + {3A10E48B-E88F-46C6-8A01-7A62112D0E05} = {3A10E48B-E88F-46C6-8A01-7A62112D0E05} + {90402A90-8D53-4843-BF11-7AE93361ED13} = {90402A90-8D53-4843-BF11-7AE93361ED13} + {08AEBC9F-464E-41DD-B4CB-F2921F69B591} = {08AEBC9F-464E-41DD-B4CB-F2921F69B591} + {D4EED8A5-2B15-4299-9F65-D56383AC7848} = {D4EED8A5-2B15-4299-9F65-D56383AC7848} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2} = {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2} + {FA7FFBC0-45A5-4419-B18C-DEC8363C2413} = {FA7FFBC0-45A5-4419-B18C-DEC8363C2413} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + {504CC4CA-612C-4681-AD9A-90E51785A5D2} = {504CC4CA-612C-4681-AD9A-90E51785A5D2} + {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C} = {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C} + {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4} = {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4} + {249FBAE5-EC5D-4988-87AC-A4371D827BA4} = {249FBAE5-EC5D-4988-87AC-A4371D827BA4} + {B76406F9-E89B-4791-ACDE-CD23813F764B} = {B76406F9-E89B-4791-ACDE-CD23813F764B} + {F1DEC3F9-706B-410D-91D5-0381BB9BA22A} = {F1DEC3F9-706B-410D-91D5-0381BB9BA22A} + {4A75E3F9-856A-4854-8AA2-34C06F7415BD} = {4A75E3F9-856A-4854-8AA2-34C06F7415BD} + {2DF233FE-CBB8-4102-A68D-7D30C38961C1} = {2DF233FE-CBB8-4102-A68D-7D30C38961C1} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wine", "wine\wine.vcxproj", "{C978A6C2-F788-4F5E-8E14-73C1B6B521CE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "krnl386", "krnl386\krnl386.vcxproj", "{D3F34C25-272C-4E4F-9B6F-BE7ABB472966}" + ProjectSection(ProjectDependencies) = postProject + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wow32", "wow32\wow32.vcxproj", "{E4950E01-C995-49A5-9FED-5EF03155FD65}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convspec", "convspec\convspec.vcxproj", "{DC6BA231-C318-436F-8F5C-5E2CC73779E2}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "user", "user\user.vcxproj", "{066A261B-90F6-4AB7-8F53-1455F068D6F7}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vm86", "vm86\vm86.vcxproj", "{0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gdi", "gdi\gdi.vcxproj", "{0EBCFB5B-3092-4E06-A007-CA50B1DA3298}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win87em", "win87em\win87em.vcxproj", "{08AEBC9F-464E-41DD-B4CB-F2921F69B591}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shell", "shell\shell.vcxproj", "{BD91A02B-907B-4512-A963-1166D1EBC5C4}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyboard", "keyboard\keyboard.vcxproj", "{B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}" + ProjectSection(ProjectDependencies) = postProject + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winnls", "winnls\winnls.vcxproj", "{F234FA09-76BC-4154-8420-737CD7FA4EF7}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "commdlg", "commdlg\commdlg.vcxproj", "{8914D84A-84BD-4F85-99AC-723F8AEABAEB}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {08AEBC9F-464E-41DD-B4CB-F2921F69B591} = {08AEBC9F-464E-41DD-B4CB-F2921F69B591} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "olesvr", "olesvr\olesvr.vcxproj", "{22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lzexpand", "lzexpand\lzexpand.vcxproj", "{3A10E48B-E88F-46C6-8A01-7A62112D0E05}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convertwinefile", "convertwinefile\convertwinefile.vcxproj", "{782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wing", "wing\wing.vcxproj", "{90402A90-8D53-4843-BF11-7AE93361ED13}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mmsystem", "mmsystem\mmsystem.vcxproj", "{249FBAE5-EC5D-4988-87AC-A4371D827BA4}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sound", "sound\sound.vcxproj", "{7B417913-AE01-41E5-BFEA-AB971B779F63}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mouse", "mouse\mouse.vcxproj", "{F1DEC3F9-706B-410D-91D5-0381BB9BA22A}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wifeman", "wifeman\wifeman.vcxproj", "{B76406F9-E89B-4791-ACDE-CD23813F764B}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctl3dv2", "ctl3dv2\ctl3dv2.vcxproj", "{7F73550E-724D-4F7A-B192-35A764AC24D6}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctl3d", "ctl3d\ctl3d.vcxproj", "{B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}" + ProjectSection(ProjectDependencies) = postProject + {7F73550E-724D-4F7A-B192-35A764AC24D6} = {7F73550E-724D-4F7A-B192-35A764AC24D6} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winoldap", "winoldap\winoldap.vcxproj", "{F10EEF26-6451-4988-84D4-D193A4D2BF8C}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regedit", "regedit\regedit.vcxproj", "{F10EEF26-6451-4988-84D4-D193A4D2BF8D}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "olecli", "olecli\olecli.vcxproj", "{B3496128-1B1F-4D55-8F7F-7E39A53ABE75}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {3A10E48B-E88F-46C6-8A01-7A62112D0E05} = {3A10E48B-E88F-46C6-8A01-7A62112D0E05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ddeml", "ddeml\ddeml.vcxproj", "{D4EED8A5-2B15-4299-9F65-D56383AC7848}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toolhelp", "toolhelp\toolhelp.vcxproj", "{96925A3C-9DD9-418E-A772-A112FFE93DC2}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ver", "ver\ver.vcxproj", "{7C04956D-FEBE-410F-ABB1-945695CDDFE5}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winecrt0", "winecrt0\winecrt0.vcxproj", "{583655C3-2633-4597-BD31-C5AA1EC78AD2}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "system", "system\system.vcxproj", "{6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "comm", "comm\comm.vcxproj", "{3D889B37-09C8-4030-B815-830566CD57A3}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dispdib", "dispdib\dispdib.vcxproj", "{3D889B37-09C8-4030-B815-830566CD57A4}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rmpatch", "rmpatch\rmpatch.vcxproj", "{3D889B37-09C8-4030-B815-830566CD57A5}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {DC6BA231-C318-436F-8F5C-5E2CC73779E2} = {DC6BA231-C318-436F-8F5C-5E2CC73779E2} + {96925A3C-9DD9-418E-A772-A112FFE93DC2} = {96925A3C-9DD9-418E-A772-A112FFE93DC2} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2", "ole2\ole2.vcxproj", "{F9B66ABE-3489-434C-8340-65B3421DC30C}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + {8A7A52D0-4772-475F-AB85-9C074CFEFDE8} = {8A7A52D0-4772-475F-AB85-9C074CFEFDE8} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "compobj", "compobj\compobj.vcxproj", "{B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "storage", "storage\storage.vcxproj", "{4A75E3F9-856A-4854-8AA2-34C06F7415BD}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winspool", "winspool\winspool.vcxproj", "{C8F4997D-B814-43BB-A71B-507B2E956F55}" + ProjectSection(ProjectDependencies) = postProject + {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} = {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2conv", "ole2conv\ole2conv.vcxproj", "{90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2disp", "ole2disp\ole2disp.vcxproj", "{2D769A3B-881A-4307-B6C9-02EBC61211A4}" + ProjectSection(ProjectDependencies) = postProject + {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} = {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2nls", "ole2nls\ole2nls.vcxproj", "{504CC4CA-612C-4681-AD9A-90E51785A5D2}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2prox", "ole2prox\ole2prox.vcxproj", "{6139024B-2348-440D-9192-3A40C3CE31B5}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ole2thk", "ole2thk\ole2thk.vcxproj", "{94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winhlp32", "winhlp32\winhlp32.vcxproj", "{37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msvideo", "msvideo\msvideo.vcxproj", "{0DCF5163-4049-4850-92BE-5D6A2444C51D}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {249FBAE5-EC5D-4988-87AC-A4371D827BA4} = {249FBAE5-EC5D-4988-87AC-A4371D827BA4} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "avifile", "avifile\avifile.vcxproj", "{3825B17A-681F-48CF-B9AD-5337B1F521C8}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msacm", "msacm\msacm.vcxproj", "{FA7FFBC0-45A5-4419-B18C-DEC8363C2413}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "otvdmw", "otvdm\otvdmw.vcxproj", "{73E019BF-2393-4BB3-90CA-B5B5749E4B69}" + ProjectSection(ProjectDependencies) = postProject + {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA} = {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "haxmvm", "haxmvm\haxmvm.vcxproj", "{55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "display", "display\display.vcxproj", "{E0AF9E72-F364-481A-A6E5-63EA88DF684E}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsock", "winsock\winsock.vcxproj", "{ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nddeapi", "nddeapi\nddeapi.vcxproj", "{72482539-7702-455E-81E0-F3AF237CF57F}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "widl", "widl\widl.vcxproj", "{8A7A52D0-4772-475F-AB85-9C074CFEFDE8}" + ProjectSection(ProjectDependencies) = postProject + {433BAA32-23BE-4B63-B24B-B89938F4FF35} = {433BAA32-23BE-4B63-B24B-B89938F4FF35} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wpp", "wpp\wpp.vcxproj", "{433BAA32-23BE-4B63-B24B-B89938F4FF35}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "commctrl", "commctrl\commctrl.vcxproj", "{CB9C6113-15AB-4DB9-A323-C2094A9A6E92}" + ProjectSection(ProjectDependencies) = postProject + {066A261B-90F6-4AB7-8F53-1455F068D6F7} = {066A261B-90F6-4AB7-8F53-1455F068D6F7} + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "typelib", "typelib\typelib.vcxproj", "{1AAA3531-513D-4A96-9795-D48CF33BF516}" + ProjectSection(ProjectDependencies) = postProject + {2D769A3B-881A-4307-B6C9-02EBC61211A4} = {2D769A3B-881A-4307-B6C9-02EBC61211A4} + {F9B66ABE-3489-434C-8340-65B3421DC30C} = {F9B66ABE-3489-434C-8340-65B3421DC30C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timer", "timer\timer.vcxproj", "{09EF1555-CA21-47F8-8830-04A53295F8B6}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "whpxvm", "whpxvm\whpxvm.vcxproj", "{2DF233FE-CBB8-4102-A68D-7D30C38961C1}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gvm", "gvm\gvm.vcxproj", "{258FD007-046D-4625-BB5A-B7934B71934F}" + ProjectSection(ProjectDependencies) = postProject + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netapi", "netapi\netapi.vcxproj", "{5AB8CD32-0031-4D8B-BFE0-382C6C1E1770}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} + {583655C3-2633-4597-BD31-C5AA1EC78AD2} = {583655C3-2633-4597-BD31-C5AA1EC78AD2} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Debug|Win32.ActiveCfg = Debug|Win32 + {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Debug|Win32.Build.0 = Debug|Win32 + {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Release|Win32.ActiveCfg = Release|Win32 + {9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}.Release|Win32.Build.0 = Release|Win32 + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Debug|Win32.Build.0 = Debug|Win32 + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Release|Win32.ActiveCfg = Release|Win32 + {C978A6C2-F788-4F5E-8E14-73C1B6B521CE}.Release|Win32.Build.0 = Release|Win32 + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Debug|Win32.ActiveCfg = Debug|Win32 + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Debug|Win32.Build.0 = Debug|Win32 + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Release|Win32.ActiveCfg = Release|Win32 + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966}.Release|Win32.Build.0 = Release|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD65}.Debug|Win32.ActiveCfg = Debug|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD65}.Debug|Win32.Build.0 = Debug|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD65}.Release|Win32.ActiveCfg = Release|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD65}.Release|Win32.Build.0 = Release|Win32 + {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Debug|Win32.ActiveCfg = Debug|Win32 + {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Debug|Win32.Build.0 = Debug|Win32 + {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Release|Win32.ActiveCfg = Release|Win32 + {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Release|Win32.Build.0 = Release|Win32 + {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Debug|Win32.ActiveCfg = Debug|Win32 + {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Debug|Win32.Build.0 = Debug|Win32 + {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Release|Win32.ActiveCfg = Release|Win32 + {066A261B-90F6-4AB7-8F53-1455F068D6F7}.Release|Win32.Build.0 = Release|Win32 + {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Debug|Win32.Build.0 = Debug|Win32 + {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Release|Win32.ActiveCfg = Release|Win32 + {0A37BC0E-8433-453D-9DEA-7AAD7C0E6E5C}.Release|Win32.Build.0 = Release|Win32 + {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Debug|Win32.ActiveCfg = Debug|Win32 + {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Debug|Win32.Build.0 = Debug|Win32 + {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Release|Win32.ActiveCfg = Release|Win32 + {0EBCFB5B-3092-4E06-A007-CA50B1DA3298}.Release|Win32.Build.0 = Release|Win32 + {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Debug|Win32.ActiveCfg = Debug|Win32 + {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Debug|Win32.Build.0 = Debug|Win32 + {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Release|Win32.ActiveCfg = Release|Win32 + {08AEBC9F-464E-41DD-B4CB-F2921F69B591}.Release|Win32.Build.0 = Release|Win32 + {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Debug|Win32.Build.0 = Debug|Win32 + {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Release|Win32.ActiveCfg = Release|Win32 + {BD91A02B-907B-4512-A963-1166D1EBC5C4}.Release|Win32.Build.0 = Release|Win32 + {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Debug|Win32.Build.0 = Debug|Win32 + {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Release|Win32.ActiveCfg = Release|Win32 + {B83EEE1C-F8DE-4F82-8928-67F1B142E5F2}.Release|Win32.Build.0 = Release|Win32 + {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Debug|Win32.ActiveCfg = Debug|Win32 + {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Debug|Win32.Build.0 = Debug|Win32 + {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Release|Win32.ActiveCfg = Release|Win32 + {F234FA09-76BC-4154-8420-737CD7FA4EF7}.Release|Win32.Build.0 = Release|Win32 + {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Debug|Win32.ActiveCfg = Debug|Win32 + {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Debug|Win32.Build.0 = Debug|Win32 + {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Release|Win32.ActiveCfg = Release|Win32 + {8914D84A-84BD-4F85-99AC-723F8AEABAEB}.Release|Win32.Build.0 = Release|Win32 + {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Debug|Win32.ActiveCfg = Debug|Win32 + {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Debug|Win32.Build.0 = Debug|Win32 + {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Release|Win32.ActiveCfg = Release|Win32 + {22C717E1-BDA2-4AB0-BF3F-FBBEB46681D4}.Release|Win32.Build.0 = Release|Win32 + {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Debug|Win32.Build.0 = Debug|Win32 + {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Release|Win32.ActiveCfg = Release|Win32 + {3A10E48B-E88F-46C6-8A01-7A62112D0E05}.Release|Win32.Build.0 = Release|Win32 + {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Debug|Win32.ActiveCfg = Debug|Win32 + {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Debug|Win32.Build.0 = Debug|Win32 + {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Release|Win32.ActiveCfg = Release|Win32 + {782AFA35-AE4C-4BC1-9AC9-6D0075AF6AB7}.Release|Win32.Build.0 = Release|Win32 + {90402A90-8D53-4843-BF11-7AE93361ED13}.Debug|Win32.ActiveCfg = Debug|Win32 + {90402A90-8D53-4843-BF11-7AE93361ED13}.Debug|Win32.Build.0 = Debug|Win32 + {90402A90-8D53-4843-BF11-7AE93361ED13}.Release|Win32.ActiveCfg = Release|Win32 + {90402A90-8D53-4843-BF11-7AE93361ED13}.Release|Win32.Build.0 = Release|Win32 + {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Debug|Win32.ActiveCfg = Debug|Win32 + {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Debug|Win32.Build.0 = Debug|Win32 + {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Release|Win32.ActiveCfg = Release|Win32 + {249FBAE5-EC5D-4988-87AC-A4371D827BA4}.Release|Win32.Build.0 = Release|Win32 + {7B417913-AE01-41E5-BFEA-AB971B779F63}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B417913-AE01-41E5-BFEA-AB971B779F63}.Debug|Win32.Build.0 = Debug|Win32 + {7B417913-AE01-41E5-BFEA-AB971B779F63}.Release|Win32.ActiveCfg = Release|Win32 + {7B417913-AE01-41E5-BFEA-AB971B779F63}.Release|Win32.Build.0 = Release|Win32 + {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Debug|Win32.Build.0 = Debug|Win32 + {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Release|Win32.ActiveCfg = Release|Win32 + {F1DEC3F9-706B-410D-91D5-0381BB9BA22A}.Release|Win32.Build.0 = Release|Win32 + {B76406F9-E89B-4791-ACDE-CD23813F764B}.Debug|Win32.ActiveCfg = Debug|Win32 + {B76406F9-E89B-4791-ACDE-CD23813F764B}.Debug|Win32.Build.0 = Debug|Win32 + {B76406F9-E89B-4791-ACDE-CD23813F764B}.Release|Win32.ActiveCfg = Release|Win32 + {B76406F9-E89B-4791-ACDE-CD23813F764B}.Release|Win32.Build.0 = Release|Win32 + {7F73550E-724D-4F7A-B192-35A764AC24D6}.Debug|Win32.ActiveCfg = Debug|Win32 + {7F73550E-724D-4F7A-B192-35A764AC24D6}.Debug|Win32.Build.0 = Debug|Win32 + {7F73550E-724D-4F7A-B192-35A764AC24D6}.Release|Win32.ActiveCfg = Release|Win32 + {7F73550E-724D-4F7A-B192-35A764AC24D6}.Release|Win32.Build.0 = Release|Win32 + {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Debug|Win32.Build.0 = Debug|Win32 + {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Release|Win32.ActiveCfg = Release|Win32 + {B1A8AC7F-6B94-4AD0-8471-2C44F3014B5A}.Release|Win32.Build.0 = Release|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Debug|Win32.ActiveCfg = Debug|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Debug|Win32.Build.0 = Debug|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Release|Win32.ActiveCfg = Release|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8C}.Release|Win32.Build.0 = Release|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Debug|Win32.Build.0 = Debug|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Release|Win32.ActiveCfg = Release|Win32 + {F10EEF26-6451-4988-84D4-D193A4D2BF8D}.Release|Win32.Build.0 = Release|Win32 + {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Debug|Win32.ActiveCfg = Debug|Win32 + {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Debug|Win32.Build.0 = Debug|Win32 + {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Release|Win32.ActiveCfg = Release|Win32 + {B3496128-1B1F-4D55-8F7F-7E39A53ABE75}.Release|Win32.Build.0 = Release|Win32 + {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Debug|Win32.ActiveCfg = Debug|Win32 + {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Debug|Win32.Build.0 = Debug|Win32 + {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Release|Win32.ActiveCfg = Release|Win32 + {D4EED8A5-2B15-4299-9F65-D56383AC7848}.Release|Win32.Build.0 = Release|Win32 + {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Debug|Win32.ActiveCfg = Debug|Win32 + {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Debug|Win32.Build.0 = Debug|Win32 + {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Release|Win32.ActiveCfg = Release|Win32 + {96925A3C-9DD9-418E-A772-A112FFE93DC2}.Release|Win32.Build.0 = Release|Win32 + {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Debug|Win32.Build.0 = Debug|Win32 + {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Release|Win32.ActiveCfg = Release|Win32 + {7C04956D-FEBE-410F-ABB1-945695CDDFE5}.Release|Win32.Build.0 = Release|Win32 + {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Debug|Win32.ActiveCfg = Debug|Win32 + {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Debug|Win32.Build.0 = Debug|Win32 + {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Release|Win32.ActiveCfg = Release|Win32 + {583655C3-2633-4597-BD31-C5AA1EC78AD2}.Release|Win32.Build.0 = Release|Win32 + {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Debug|Win32.ActiveCfg = Debug|Win32 + {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Debug|Win32.Build.0 = Debug|Win32 + {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Release|Win32.ActiveCfg = Release|Win32 + {6E81B0D8-0218-4EB9-88D7-AD2F2EBD928C}.Release|Win32.Build.0 = Release|Win32 + {3D889B37-09C8-4030-B815-830566CD57A3}.Debug|Win32.ActiveCfg = Debug|Win32 + {3D889B37-09C8-4030-B815-830566CD57A3}.Debug|Win32.Build.0 = Debug|Win32 + {3D889B37-09C8-4030-B815-830566CD57A3}.Release|Win32.ActiveCfg = Release|Win32 + {3D889B37-09C8-4030-B815-830566CD57A3}.Release|Win32.Build.0 = Release|Win32 + {3D889B37-09C8-4030-B815-830566CD57A4}.Debug|Win32.ActiveCfg = Debug|Win32 + {3D889B37-09C8-4030-B815-830566CD57A4}.Debug|Win32.Build.0 = Debug|Win32 + {3D889B37-09C8-4030-B815-830566CD57A4}.Release|Win32.ActiveCfg = Release|Win32 + {3D889B37-09C8-4030-B815-830566CD57A4}.Release|Win32.Build.0 = Release|Win32 + {3D889B37-09C8-4030-B815-830566CD57A5}.Debug|Win32.ActiveCfg = Debug|Win32 + {3D889B37-09C8-4030-B815-830566CD57A5}.Debug|Win32.Build.0 = Debug|Win32 + {3D889B37-09C8-4030-B815-830566CD57A5}.Release|Win32.ActiveCfg = Release|Win32 + {3D889B37-09C8-4030-B815-830566CD57A5}.Release|Win32.Build.0 = Release|Win32 + {F9B66ABE-3489-434C-8340-65B3421DC30C}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9B66ABE-3489-434C-8340-65B3421DC30C}.Debug|Win32.Build.0 = Debug|Win32 + {F9B66ABE-3489-434C-8340-65B3421DC30C}.Release|Win32.ActiveCfg = Release|Win32 + {F9B66ABE-3489-434C-8340-65B3421DC30C}.Release|Win32.Build.0 = Release|Win32 + {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Debug|Win32.ActiveCfg = Debug|Win32 + {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Debug|Win32.Build.0 = Debug|Win32 + {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Release|Win32.ActiveCfg = Release|Win32 + {B88A001B-29A3-45C1-8FF9-A75CB7C7DCCF}.Release|Win32.Build.0 = Release|Win32 + {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Debug|Win32.ActiveCfg = Debug|Win32 + {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Debug|Win32.Build.0 = Debug|Win32 + {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Release|Win32.ActiveCfg = Release|Win32 + {4A75E3F9-856A-4854-8AA2-34C06F7415BD}.Release|Win32.Build.0 = Release|Win32 + {C8F4997D-B814-43BB-A71B-507B2E956F55}.Debug|Win32.ActiveCfg = Debug|Win32 + {C8F4997D-B814-43BB-A71B-507B2E956F55}.Debug|Win32.Build.0 = Debug|Win32 + {C8F4997D-B814-43BB-A71B-507B2E956F55}.Release|Win32.ActiveCfg = Release|Win32 + {C8F4997D-B814-43BB-A71B-507B2E956F55}.Release|Win32.Build.0 = Release|Win32 + {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Debug|Win32.ActiveCfg = Debug|Win32 + {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Debug|Win32.Build.0 = Debug|Win32 + {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Release|Win32.ActiveCfg = Release|Win32 + {90843552-9BC9-4DF2-AFC5-F4ECEDDF7E58}.Release|Win32.Build.0 = Release|Win32 + {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Debug|Win32.ActiveCfg = Debug|Win32 + {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Debug|Win32.Build.0 = Debug|Win32 + {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Release|Win32.ActiveCfg = Release|Win32 + {2D769A3B-881A-4307-B6C9-02EBC61211A4}.Release|Win32.Build.0 = Release|Win32 + {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Debug|Win32.ActiveCfg = Debug|Win32 + {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Debug|Win32.Build.0 = Debug|Win32 + {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Release|Win32.ActiveCfg = Release|Win32 + {504CC4CA-612C-4681-AD9A-90E51785A5D2}.Release|Win32.Build.0 = Release|Win32 + {6139024B-2348-440D-9192-3A40C3CE31B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {6139024B-2348-440D-9192-3A40C3CE31B5}.Debug|Win32.Build.0 = Debug|Win32 + {6139024B-2348-440D-9192-3A40C3CE31B5}.Release|Win32.ActiveCfg = Release|Win32 + {6139024B-2348-440D-9192-3A40C3CE31B5}.Release|Win32.Build.0 = Release|Win32 + {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Debug|Win32.ActiveCfg = Debug|Win32 + {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Debug|Win32.Build.0 = Debug|Win32 + {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Release|Win32.ActiveCfg = Release|Win32 + {94C8AE24-778A-4FEB-B3E1-457BDCCE06DF}.Release|Win32.Build.0 = Release|Win32 + {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Debug|Win32.Build.0 = Debug|Win32 + {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Release|Win32.ActiveCfg = Release|Win32 + {37F4B5BE-FB3C-44E7-BA9B-6D0E0C7709F2}.Release|Win32.Build.0 = Release|Win32 + {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Debug|Win32.ActiveCfg = Debug|Win32 + {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Debug|Win32.Build.0 = Debug|Win32 + {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Release|Win32.ActiveCfg = Release|Win32 + {0DCF5163-4049-4850-92BE-5D6A2444C51D}.Release|Win32.Build.0 = Release|Win32 + {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Debug|Win32.ActiveCfg = Debug|Win32 + {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Debug|Win32.Build.0 = Debug|Win32 + {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Release|Win32.ActiveCfg = Release|Win32 + {3825B17A-681F-48CF-B9AD-5337B1F521C8}.Release|Win32.Build.0 = Release|Win32 + {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Debug|Win32.ActiveCfg = Debug|Win32 + {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Debug|Win32.Build.0 = Debug|Win32 + {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Release|Win32.ActiveCfg = Release|Win32 + {FA7FFBC0-45A5-4419-B18C-DEC8363C2413}.Release|Win32.Build.0 = Release|Win32 + {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Debug|Win32.ActiveCfg = Debug|Win32 + {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Debug|Win32.Build.0 = Debug|Win32 + {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Release|Win32.ActiveCfg = Release|Win32 + {73E019BF-2393-4BB3-90CA-B5B5749E4B69}.Release|Win32.Build.0 = Release|Win32 + {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Debug|Win32.ActiveCfg = Debug|Win32 + {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Debug|Win32.Build.0 = Debug|Win32 + {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Release|Win32.ActiveCfg = Release|Win32 + {55AC3B70-9AFB-498C-BEC6-F56AF538FEDF}.Release|Win32.Build.0 = Release|Win32 + {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Debug|Win32.Build.0 = Debug|Win32 + {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Release|Win32.ActiveCfg = Release|Win32 + {E0AF9E72-F364-481A-A6E5-63EA88DF684E}.Release|Win32.Build.0 = Release|Win32 + {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Debug|Win32.ActiveCfg = Debug|Win32 + {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Debug|Win32.Build.0 = Debug|Win32 + {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Release|Win32.ActiveCfg = Release|Win32 + {ABEECE42-C504-4F41-AF77-BE6AAE7E9B8A}.Release|Win32.Build.0 = Release|Win32 + {72482539-7702-455E-81E0-F3AF237CF57F}.Debug|Win32.ActiveCfg = Debug|Win32 + {72482539-7702-455E-81E0-F3AF237CF57F}.Debug|Win32.Build.0 = Debug|Win32 + {72482539-7702-455E-81E0-F3AF237CF57F}.Release|Win32.ActiveCfg = Release|Win32 + {72482539-7702-455E-81E0-F3AF237CF57F}.Release|Win32.Build.0 = Release|Win32 + {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Debug|Win32.ActiveCfg = Debug|Win32 + {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Debug|Win32.Build.0 = Debug|Win32 + {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Release|Win32.ActiveCfg = Release|Win32 + {8A7A52D0-4772-475F-AB85-9C074CFEFDE8}.Release|Win32.Build.0 = Release|Win32 + {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Debug|Win32.ActiveCfg = Debug|Win32 + {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Debug|Win32.Build.0 = Debug|Win32 + {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Release|Win32.ActiveCfg = Release|Win32 + {433BAA32-23BE-4B63-B24B-B89938F4FF35}.Release|Win32.Build.0 = Release|Win32 + {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Debug|Win32.Build.0 = Debug|Win32 + {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Release|Win32.ActiveCfg = Release|Win32 + {CB9C6113-15AB-4DB9-A323-C2094A9A6E92}.Release|Win32.Build.0 = Release|Win32 + {1AAA3531-513D-4A96-9795-D48CF33BF516}.Debug|Win32.ActiveCfg = Debug|Win32 + {1AAA3531-513D-4A96-9795-D48CF33BF516}.Debug|Win32.Build.0 = Debug|Win32 + {1AAA3531-513D-4A96-9795-D48CF33BF516}.Release|Win32.ActiveCfg = Release|Win32 + {1AAA3531-513D-4A96-9795-D48CF33BF516}.Release|Win32.Build.0 = Release|Win32 + {09EF1555-CA21-47F8-8830-04A53295F8B6}.Debug|Win32.ActiveCfg = Debug|Win32 + {09EF1555-CA21-47F8-8830-04A53295F8B6}.Debug|Win32.Build.0 = Debug|Win32 + {09EF1555-CA21-47F8-8830-04A53295F8B6}.Release|Win32.ActiveCfg = Release|Win32 + {09EF1555-CA21-47F8-8830-04A53295F8B6}.Release|Win32.Build.0 = Release|Win32 + {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Debug|Win32.ActiveCfg = Debug|Win32 + {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Debug|Win32.Build.0 = Debug|Win32 + {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Release|Win32.ActiveCfg = Release|Win32 + {2DF233FE-CBB8-4102-A68D-7D30C38961C1}.Release|Win32.Build.0 = Release|Win32 + {258FD007-046D-4625-BB5A-B7934B71934F}.Debug|Win32.ActiveCfg = Debug|Win32 + {258FD007-046D-4625-BB5A-B7934B71934F}.Debug|Win32.Build.0 = Debug|Win32 + {258FD007-046D-4625-BB5A-B7934B71934F}.Release|Win32.ActiveCfg = Release|Win32 + {258FD007-046D-4625-BB5A-B7934B71934F}.Release|Win32.Build.0 = Release|Win32 + {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770}.Debug|Win32.ActiveCfg = Debug|Win32 + {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770}.Debug|Win32.Build.0 = Debug|Win32 + {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770}.Release|Win32.ActiveCfg = Release|Win32 + {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {692D1D4A-93CF-4B31-BF6F-4901B375934E} + EndGlobalSection +EndGlobal From b45fafa5e4bc1cb5266d314b928b5276eb8d450c Mon Sep 17 00:00:00 2001 From: jgdrg <40196788+jgdrg@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:49:23 +0100 Subject: [PATCH 55/95] Tidy up netapi.c --- netapi/netapi.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/netapi/netapi.c b/netapi/netapi.c index 3ffe275518..b69e9f45eb 100644 --- a/netapi/netapi.c +++ b/netapi/netapi.c @@ -30,32 +30,26 @@ WINE_DEFAULT_DEBUG_CHANNEL(netapi); +// Structure taken from https://datatracker.ietf.org/doc/html/draft-leach-cifs-rap-spec-00 +// and https://learn.microsoft.com/en-us/windows/win32/api/lmwksta/ns-lmwksta-wksta_info_100 typedef struct { - SEGPTR wki10_computername; //The unique computer name given to the workstation when it is started. - SEGPTR wki10_username; //The name of the user currently logged on to the workstation. - LPSTR wki10_langroup; //The default logon domain.The actual logon domain is stored in wkil0_logon_domain. - UCHAR wkil0_ver_major; - UCHAR wkil0_ver_minor; - LPSTR wkil0_1ogon_domain; //A pointer to a text string with the name of the workstation's logon domain. The value is NULL - LPSTR wkil0_oth_domains; //A pointer to a list of other domains that the workstation is currently browsing. - //The domains are space delimited and the list is zero + SEGPTR wki10_computername; //pointer to a NULL terminated ASCII string that specifies the name of the workstation + SEGPTR wki10_username; //pointer to a NULL terminated ASCII string that specifies the user who is logged on at the workstation + LPSTR wki10_langroup; //pointer to a NULL terminated ASCII string that specifies the domain to which the workstation belongs + UCHAR wkil0_ver_major; //major version number of the operating system the workstation is running + UCHAR wkil0_ver_minor; //minor version number of the operating system the workstation is running + LPSTR wkil0_1ogon_domain; //pointer to a NULL terminated ASCII string that specifies the domain for which a user is logged on + LPSTR wkil0_oth_domains; //pointer to a list of other domains that the workstation is currently browsing. + //The domains are space delimited and the list is zero } WKSTA_INFO_10, *PWKSTA_INFO_10; -//#include -//typedef void* HDBC; -//typedef HWND SQLHWND; -//typedef signed short RETCODE; -//typedef short SQLSMALLINT; -//SQL_DRIVER_PROMPT - /*********************************************************************** - * NetWkstaGetInfo (WINSOCK.249) + * NetWkstaGetInfo */ INT16 WINAPI NetWkstaGetInfo16(LPCSTR pszServer, USHORT sLevel, char* pbBuffer, USHORT cbBuffer, PUSHORT pcbTotalAvalaible) { WCHAR serverW[RMLEN] = { 0 }; MultiByteToWideChar(CP_ACP, 0, pszServer, -1, serverW, RMLEN); - //LPBYTE bufptr32 = NULL; LPWKSTA_INFO_100 pwkstaInfo100 = NULL; NET_API_STATUS status = NetWkstaGetInfo(serverW, 100, (LPBYTE*)&pwkstaInfo100); @@ -78,10 +72,11 @@ INT16 WINAPI NetWkstaGetInfo16(LPCSTR pszServer, USHORT sLevel, char* pbBuffer, CHAR strUserName[UNLEN]; sprintf_s(strUserName, UNLEN, "%S", pwkstaUserInfo0->wkui0_username); // convert to ansi - // NT\ds\netapi\svcdlls\wkssvc\server\wksta.c + // Calculate total bytes and location within buffer to store strings DWORD TotalBytesNeeded = sizeof(WKSTA_INFO_10) + (strlen(strComputerName) + strlen(strUserName) + 3) * sizeof(CHAR); LPBYTE FixedDataEnd = (LPBYTE)(pbBuffer + sizeof(WKSTA_INFO_10)); + // Check if buffer is too small if (cbBuffer < TotalBytesNeeded) { if (pcbTotalAvalaible) @@ -108,11 +103,11 @@ INT16 WINAPI NetWkstaGetInfo16(LPCSTR pszServer, USHORT sLevel, char* pbBuffer, pwkstaInfo10->wki10_username = u; // Fill in rest of the fields - pwkstaInfo10->wki10_langroup = NULL; + pwkstaInfo10->wki10_langroup = NULL; //TODO pwkstaInfo10->wkil0_ver_major = (UCHAR)pwkstaInfo100->wki100_ver_major; pwkstaInfo10->wkil0_ver_minor = (UCHAR)pwkstaInfo100->wki100_ver_minor; - pwkstaInfo10->wkil0_1ogon_domain = NULL; - pwkstaInfo10->wkil0_oth_domains = NULL; + pwkstaInfo10->wkil0_1ogon_domain = NULL; //TODO + pwkstaInfo10->wkil0_oth_domains = NULL; //TODO status = NERR_Success; } else @@ -131,7 +126,7 @@ INT16 WINAPI NetWkstaGetInfo16(LPCSTR pszServer, USHORT sLevel, char* pbBuffer, NetApiBufferFree(pwkstaUserInfo0); } - // Need to free buffer with NetApiBufferFree + NetApiBufferFree(pwkstaInfo100); } From 129d816651963234d453fcc3fbd61e13b7d45281 Mon Sep 17 00:00:00 2001 From: jgdrg <40196788+jgdrg@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:15:54 +0100 Subject: [PATCH 56/95] Update accept to fix issue --- winsock/socket.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/winsock/socket.c b/winsock/socket.c index a2320ea28f..3ece26b32c 100644 --- a/winsock/socket.c +++ b/winsock/socket.c @@ -442,9 +442,17 @@ static HANDLE16 run_query( HWND16 hWnd, UINT uMsg, LPTHREAD_START_ROUTINE func, */ SOCKET16 WINAPI accept16(SOCKET16 s, struct sockaddr* addr, INT16* addrlen16 ) { - INT addrlen32 = addrlen16 ? *addrlen16 : 0; - SOCKET retSocket = accept( s, addr, &addrlen32 ); + struct sockaddr addr32; + INT addrlen32 = addrlen16 ? *addrlen16 : sizeof(addr32); + + // Both addr and addrlen are optional + // If you pass an addrlen parameter, the win32 accept api call assumes the length should be greater or equal to sockaddr struct. + // Passing in a value of zero in addrlen32 will cause error WSAEFAULT + // As a fix, set addrlen32 to size of a local sockaddr structure and pass this too. Copy the returned contents to addr if necessary. + + SOCKET retSocket = accept( s, &addr32, &addrlen32 ); if( addrlen16 ) *addrlen16 = addrlen32; + if (retSocket != INVALID_SOCKET && addr) memcpy(addr, &addr32, addrlen32); return retSocket; } From f7d91d656243bd0389e02762d8f2f8bb4278ea27 Mon Sep 17 00:00:00 2001 From: jgdrg <40196788+jgdrg@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:35:20 +0100 Subject: [PATCH 57/95] Update netapi.vcxproj to required Windows SDK version --- netapi/netapi.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netapi/netapi.vcxproj b/netapi/netapi.vcxproj index 8b054f66d5..1bb34f96f2 100644 --- a/netapi/netapi.vcxproj +++ b/netapi/netapi.vcxproj @@ -12,7 +12,7 @@ Win32Proj - 10.0 + 10.0.17134.0 netapi {5AB8CD32-0031-4D8B-BFE0-382C6C1E1770} @@ -113,4 +113,4 @@ netapi32.lib;%(AdditionalDependencies) - \ No newline at end of file + From ffe7fd8b0b90a617aad58ab9bfa1a1a432901b19 Mon Sep 17 00:00:00 2001 From: jgdrg <40196788+jgdrg@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:02:18 +0100 Subject: [PATCH 58/95] Update package.ps1 script for NETAPI DLL --- tools/package.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/package.ps1 b/tools/package.ps1 index 82c9a4495d..4bb3f68654 100644 --- a/tools/package.ps1 +++ b/tools/package.ps1 @@ -53,6 +53,7 @@ Make-Dll (Join-Path $root "mmsystem/mmsystem.dll16.spec") "MMSYSTEM" (Join-Path Make-Dll (Join-Path $root "mouse/mouse.drv16.spec") "MOUSE" (Join-Path $dst "dummydll/SYSTEM/MOUSE.DRV") Make-Dll (Join-Path $root "msacm/msacm.dll16.spec") "MSACM" (Join-Path $dst "dummydll/SYSTEM/MSACM.DLL") Make-Dll (Join-Path $root "msvideo/msvideo.dll16.spec") "MSVIDEO" (Join-Path $dst "dummydll/SYSTEM/MSVIDEO.DLL") +Make-Dll (Join-Path $root "netapi/netapi.dll16.spec") "NETAPI" (Join-Path $dst "dummydll/SYSTEM/NETAPI.DLL") Make-Dll (Join-Path $root "nddeapi/nddeapi.dll16.spec") "NDDEAPI" (Join-Path $dst "dummydll/SYSTEM/NDDEAPI.DLL") Make-Dll (Join-Path $root "ole2/ole2.dll16.spec") "OLE2" (Join-Path $dst "dummydll/SYSTEM/OLE2.DLL") Make-Dll (Join-Path $root "ole2conv/ole2conv.dll16.spec") "OLE2CONV" (Join-Path $dst "dummydll/SYSTEM/OLE2CONV.DLL") From a76d3f9816ca84cf7a0d28d360c1b229b67f606b Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 16 Aug 2024 18:49:52 -0500 Subject: [PATCH 59/95] in 8bpp mode redraw the window if it's hdc palette is realized --- user/user.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/user/user.c b/user/user.c index f54da8673b..92c277a215 100644 --- a/user/user.c +++ b/user/user.c @@ -2275,9 +2275,15 @@ HPALETTE16 WINAPI SelectPalette16( HDC16 hdc, HPALETTE16 hpal, BOOL16 bForceBack UINT16 WINAPI RealizePalette16( HDC16 hdc ) { HDC hdc32 = HDC_32(hdc); - if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) + if (krnl386_get_compat_mode("256color")) + { + if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY) && (GetObjectType(hdc32) == OBJ_DC)) - set_realized_palette(hdc32); + set_realized_palette(hdc32); + HWND hwnd = WindowFromDC(hdc32); + if (hwnd) RedrawWindow(hwnd, NULL, NULL, RDW_INTERNALPAINT); + } + return UserRealizePalette(hdc32); } From f2785ba3473f15d09164f292100f996a64dc651e Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 23 Aug 2024 21:35:04 -0500 Subject: [PATCH 60/95] set fs and gs to 0 in globalfree --- krnl386/global.c | 2 ++ vm86/msdos.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/krnl386/global.c b/krnl386/global.c index 8f163b9d19..a9f7e0c01c 100644 --- a/krnl386/global.c +++ b/krnl386/global.c @@ -798,6 +798,8 @@ DWORD WINAPI WIN16_GlobalFlags16(HGLOBAL16 handle) DWORD WINAPI WIN16_GlobalFree16(HGLOBAL16 handle) { CURRENT_STACK16->es = 0; + CURRENT_STACK16->fs = 0; + CURRENT_STACK16->gs = 0; return GlobalFree16(handle); } void regen_icon(HICON16 icon); diff --git a/vm86/msdos.cpp b/vm86/msdos.cpp index 8acd493689..fe73d891ea 100644 --- a/vm86/msdos.cpp +++ b/vm86/msdos.cpp @@ -1718,8 +1718,8 @@ extern "C" /* Some programs expect that gs is not a valid selector! */ /* Some programs expect that fs is not a valid selector! */ /* win16 sets 0? */ - SREG(FS) = (WORD)context.SegFs == reg_fs ? 0 : context.SegFs; - SREG(GS) = (WORD)context.SegGs == reg_gs ? 0 : context.SegGs; + SREG(FS) = reg ? (WORD)context.SegFs : (WORD)oa->fs; + SREG(GS) = reg ? (WORD)context.SegGs : (WORD)oa->gs; if (reg) { if (!(ip19 != context.Eip || cs16 != context.SegCs)) From f9b4c02ed5b52c51309f52cfd628346b9b7a44f7 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 8 Sep 2024 21:01:05 -0500 Subject: [PATCH 61/95] if the task is dead then don't even try to call a notifier as there's no stack --- toolhelp/toolhelp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolhelp/toolhelp.c b/toolhelp/toolhelp.c index 625c6c09d8..458b288310 100644 --- a/toolhelp/toolhelp.c +++ b/toolhelp/toolhelp.c @@ -801,7 +801,7 @@ BOOL WINAPI TOOLHELP_CallNotify(WORD wID, DWORD dwData) __TRY { // TODO: call notifiers in own thread - skip = ((notifys[i].htask & 3) == 3) && !IsTask16(GetCurrentTask()); + skip = !IsTask16(GetCurrentTask()); } __EXCEPT_ALL { From a5c1b95be6c80a3a7f54af972fa63a3854172584 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 14 Sep 2024 21:40:38 -0500 Subject: [PATCH 62/95] VerifyConsoleIoHandle always returns 0 on Windows 11 so use GetConsoleMode instead --- krnl386/int21.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/krnl386/int21.c b/krnl386/int21.c index 54f843edf5..8ab6baceb3 100644 --- a/krnl386/int21.c +++ b/krnl386/int21.c @@ -2816,12 +2816,13 @@ static void INT21_Ioctl_Char( CONTEXT *context ) BOOL IsConsoleIOHandle = FALSE; IO_STATUS_BLOCK io; FILE_INTERNAL_INFORMATION info; + DWORD mode; HANDLE handle = DosFileHandleToWin32Handle(BX_reg(context)); status = NtQueryInformationFile( handle, &io, &info, sizeof(info), FileInternalInformation ); if (status) { - if( VerifyConsoleIoHandle( handle)) + if( GetConsoleMode(handle, &mode) ) IsConsoleIOHandle = TRUE; else { SET_AX( context, RtlNtStatusToDosError(status) ); From 14661f67e88e1b178a2f20c256a57583c6454f84 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 21 Sep 2024 21:35:54 -0500 Subject: [PATCH 63/95] make redrawwindow in realizepalette configurable --- otvdm.ini | 3 +++ user/user.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/otvdm.ini b/otvdm.ini index b30bc313ce..d06724b928 100644 --- a/otvdm.ini +++ b/otvdm.ini @@ -106,6 +106,9 @@ ; Emulate 8bpp color mode using DIBs (default: 0) ;DIBPalette=0 +; Redraw the window when a palette is realized in 8bpp mode (default: 0) +;RealizeRedraw=0 + ; If EnumFontLimitation=1, this section declare the font to be enumerated. ;[EnumFontLimitation] ;font name=1(enumerated)/0(not enumerated) diff --git a/user/user.c b/user/user.c index 92c277a215..657babaad6 100644 --- a/user/user.c +++ b/user/user.c @@ -2281,7 +2281,8 @@ UINT16 WINAPI RealizePalette16( HDC16 hdc ) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY) && (GetObjectType(hdc32) == OBJ_DC)) set_realized_palette(hdc32); HWND hwnd = WindowFromDC(hdc32); - if (hwnd) RedrawWindow(hwnd, NULL, NULL, RDW_INTERNALPAINT); + if (hwnd && krnl386_get_config_int("otvdm", "RealizeRedraw", FALSE)) + RedrawWindow(hwnd, NULL, NULL, RDW_INTERNALPAINT); } return UserRealizePalette(hdc32); From e3b8944edf40aa34b67daedb362bb05793006888 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 30 Sep 2024 21:36:20 -0500 Subject: [PATCH 64/95] wait on the win16lock before checking for a hook entry --- user/hook.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/user/hook.c b/user/hook.c index 565c56774d..498bc9f404 100644 --- a/user/hook.c +++ b/user/hook.c @@ -306,12 +306,16 @@ static LRESULT call_hook_entry_16(struct hook16_queue_info *info, struct hook_en */ static LRESULT call_hook_16( INT id, INT code, WPARAM wp, LPARAM lp, BOOL global ) { + _EnterWin16Lock(); struct hook16_queue_info *info = get_hook_info(FALSE, 0); struct list *head = list_head(&(global ? global_hook_entry : info->hook_entry)[id - WH_MIN]); - if (!head) - return 0; - struct hook_entry *hook_entry = LIST_ENTRY(head, struct hook_entry, entry); - LRESULT result = call_hook_entry_16(info, hook_entry, id, code, wp, lp); + LRESULT result = 0; + if (head) + { + struct hook_entry *hook_entry = LIST_ENTRY(head, struct hook_entry, entry); + result = call_hook_entry_16(info, hook_entry, id, code, wp, lp); + } + _LeaveWin16Lock(); return result; } static LRESULT call_hook_entry_16( struct hook16_queue_info *info, struct hook_entry *hook_entry, INT id, INT code, WPARAM wp, LPARAM lp ) @@ -532,8 +536,6 @@ static LRESULT CALLBACK call_WH_GETMESSAGE( INT code, WPARAM wp, LPARAM lp, BOOL LRESULT result; CallNextHookEx(get_hhook(WH_GETMESSAGE, global), code, wp, lp); - if (global && !msg->hwnd) return 1; // XXX: a thread message can cause the hook to be called in the wrong context - params.time = msg->time; params.pt.x = msg->pt.x; params.pt.y = msg->pt.y; From c202965755e4a029f5896e15597ada436550aac5 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 11 Oct 2024 16:49:39 -0500 Subject: [PATCH 65/95] set the current directory to lpdir in shellexecute then set it back on return --- shell/shell.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/shell/shell.c b/shell/shell.c index 03e4a25106..80b6193169 100644 --- a/shell/shell.c +++ b/shell/shell.c @@ -706,7 +706,11 @@ static UINT_PTR SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, static UINT_PTR WINAPI SHELL_Execute16_Windows(const CHAR *lpCmd, int nShowCmd, const CHAR *lpDir) { UINT ret; + char currdir[MAX_PATH]; + GetCurrentDirectoryA(MAX_PATH, currdir); + SetCurrentDirectoryA(lpDir); ret = WinExec16(lpCmd, nShowCmd); + SetCurrentDirectoryA(currdir); return ret; } From d62d9e9b297654ad45dcc3400a44d42afe06eb61 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 23 Aug 2024 21:32:38 -0500 Subject: [PATCH 66/95] add vdd support --- CMakeLists.txt | 1 + krnl386/dosexe.h | 4 +- krnl386/instr.c | 4 +- krnl386/interrupts.c | 51 +-- krnl386/ioports.c | 41 ++- krnl386/krnl386.def | 84 +++++ krnl386/krnl386.exe16.spec | 85 +++++ krnl386/krnl386.vcxproj | 1 + krnl386/vdd.c | 641 +++++++++++++++++++++++++++++++++++++ ntvdm/CMakeLists.txt | 6 + ntvdm/main.c | 8 + ntvdm/ntvdm.def | 86 +++++ ntvdm/ntvdm.dll.spec | 83 +++++ ntvdm/ntvdm.vcxproj | 104 ++++++ otvdm.sln | 10 + vm86/msdos.cpp | 43 ++- whpxvm/whpxvm.c | 68 ++-- 17 files changed, 1217 insertions(+), 103 deletions(-) create mode 100644 krnl386/vdd.c create mode 100644 ntvdm/CMakeLists.txt create mode 100644 ntvdm/main.c create mode 100644 ntvdm/ntvdm.def create mode 100644 ntvdm/ntvdm.dll.spec create mode 100644 ntvdm/ntvdm.vcxproj diff --git a/CMakeLists.txt b/CMakeLists.txt index d174250ec9..cf54550443 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,6 +114,7 @@ add_subdirectory(winspool) add_subdirectory(wpp) add_subdirectory(otvdm) add_subdirectory(gvm) +add_subdirectory(ntvdm) if (HAVE_WINHVPLATFORM_H) add_subdirectory(whpxvm) endif() diff --git a/krnl386/dosexe.h b/krnl386/dosexe.h index cf605ecb16..2252f338da 100644 --- a/krnl386/dosexe.h +++ b/krnl386/dosexe.h @@ -459,8 +459,8 @@ extern void DOSVM_SetPMHandler48( BYTE, FARPROC48 ) DECLSPEC_HIDDEN; extern void DOSVM_SetRMHandler( BYTE, FARPROC16 ) DECLSPEC_HIDDEN; /* ioports.c */ -extern DWORD DOSVM_inport( int port, int size ) DECLSPEC_HIDDEN; -extern void DOSVM_outport( int port, int size, DWORD value ) DECLSPEC_HIDDEN; +extern DWORD DOSVM_inport( int port, int size, CONTEXT *ctx ) DECLSPEC_HIDDEN; +extern void DOSVM_outport( int port, int size, DWORD value, CONTEXT *ctx ) DECLSPEC_HIDDEN; extern void DOSVM_setportcb(OUTPROC outproc, INPROC inproc, int port, OUTPROC *oldout, INPROC* oldin) DECLSPEC_HIDDEN; /* relay.c */ diff --git a/krnl386/instr.c b/krnl386/instr.c index f59ce908e2..ac7dd5d7f6 100644 --- a/krnl386/instr.c +++ b/krnl386/instr.c @@ -379,7 +379,7 @@ static BOOL INSTR_EmulateLDS( CONTEXT *context, BYTE *instr, int long_op, */ static DWORD INSTR_inport( WORD port, int size, CONTEXT *context ) { - DWORD res = DOSVM_inport( port, size ); + DWORD res = DOSVM_inport( port, size, context ); if (TRACE_ON(io)) { @@ -410,7 +410,7 @@ static DWORD INSTR_inport( WORD port, int size, CONTEXT *context ) */ static void INSTR_outport( WORD port, int size, DWORD val, CONTEXT *context ) { - DOSVM_outport( port, size, val ); + DOSVM_outport( port, size, val, context ); if (TRACE_ON(io)) { diff --git a/krnl386/interrupts.c b/krnl386/interrupts.c index f16ba0fd73..c507c0d47a 100644 --- a/krnl386/interrupts.c +++ b/krnl386/interrupts.c @@ -1137,57 +1137,12 @@ static void WINAPI DOSVM_Int03Handler(CONTEXT *context) } } +void vdd_req(char func, CONTEXT *context); /* NTVDM BOP stub */ static void WINAPI DOSVM_Int06Handler(CONTEXT *context) { LPBYTE insn = (LPBYTE)CTX_SEG_OFF_TO_LIN(context, context->SegCs, context->Eip); - /* - * RegisterModule - * DS:SI DLL - * ES:DI init func name - * DS:BX dispatch routine name - */ - if (insn[0] == 0xc4 && insn[1] == 0xc4 && insn[2] == 0x58 && insn[3] == 0x00) - { - LPCSTR dll = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Esi); - LPCSTR init = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi); - LPCSTR dispatch = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Ebx); - context->Eip += 4; -#if 0 - /* NOTE: VDD DLL references ntvdm.exe */ - HMODULE hVdd = LoadLibraryA(dll); - if (!hVdd) - { - SET_CFLAG(context); - SET_AX(context, GetLastError()); - return; - } - FARPROC pfnInit = GetProcAddress(hVdd, init); - FARPROC pfnDispatch = GetProcAddress(hVdd, dispatch); - RESET_CFLAG(context); - if (pfnInit) - { - pfnInit(); - } -#else - SET_CFLAG(context); - SET_AX(context, 1); - ERR("VDD RegisterModule not implemented. %s %s %s\n", debugstr_a(dll), debugstr_a(init), debugstr_a(dispatch)); -#endif - } - /* UnregisterModule */ - else if (insn[0] == 0xc4 && insn[1] == 0xc4 && insn[2] == 0x58 && insn[3] == 0x01) - { - WORD handle = LOWORD(context->Eax); - context->Eip += 4; - ERR("VDD UnregisterModule not implemented. %04x\n", handle); - } - /* DispatchCall */ - else if (insn[0] == 0xc4 && insn[1] == 0xc4 && insn[2] == 0x58 && insn[3] == 0x02) - { - WORD handle = LOWORD(context->Eax); - context->Eip += 4; - ERR("VDD DispatchCall not implemented. %04x\n", handle); - } + if (insn[0] == 0xc4 && insn[1] == 0xc4 && insn[2] == 0x58) + vdd_req(insn[3], context); } diff --git a/krnl386/ioports.c b/krnl386/ioports.c index d66f582205..5b01326db2 100644 --- a/krnl386/ioports.c +++ b/krnl386/ioports.c @@ -742,13 +742,16 @@ void DOSVM_setportcb(OUTPROC outproc, INPROC inproc, int port, OUTPROC *oldout, incb[port] = inproc; } +BOOL vdd_io_read(int port, int size, WORD *val); +BOOL vdd_io_write(int port, int size, WORD val); + /********************************************************************** * DOSVM_inport * * Note: The size argument has to be handled correctly _externally_ * (as we always return a DWORD) */ -DWORD DOSVM_inport( int port, int size ) +DWORD DOSVM_inport( int port, int size, CONTEXT* ctx ) { DWORD res = ~0U; @@ -784,6 +787,23 @@ DWORD DOSVM_inport( int port, int size ) } #endif + switch (size) + { + case 4: + res |= DOSVM_inport(port, 2, ctx); + res |= DOSVM_inport(port + 2, 2, ctx) << 16; + return res; + case 2: + if (!vdd_io_read(port, 2, &res)) + { + res |= DOSVM_inport(port, 1, ctx); + res |= DOSVM_inport(port + 1, 1, ctx) << 8; + } + return res; + case 1: + if (vdd_io_read(port, 1, &res, ctx)) + return res; + } switch (port) { case 0x40: @@ -947,7 +967,7 @@ DWORD DOSVM_inport( int port, int size ) /********************************************************************** * DOSVM_outport */ -void DOSVM_outport( int port, int size, DWORD value ) +void DOSVM_outport( int port, int size, DWORD value, CONTEXT *ctx ) { TRACE("IO: 0x%x (%d-byte value) to port 0x%04x\n", value, size, port ); @@ -982,6 +1002,23 @@ void DOSVM_outport( int port, int size, DWORD value ) } #endif + switch (size) + { + case 4: + DOSVM_outport(port, 2, value & 0xffff, ctx); + DOSVM_outport(port + 2, 2, value >> 16, ctx); + return; + case 2: + if (!vdd_io_write(port, 2, value, ctx)) + { + DOSVM_outport(port, 1, value & 0xff, ctx); + DOSVM_outport(port + 1, 1, value >> 8, ctx); + } + return; + case 1: + if (vdd_io_write(port, 1, value, ctx)) + return; + } switch (port) { case 0x20: diff --git a/krnl386/krnl386.def b/krnl386/krnl386.def index a017b5e692..ad049061b7 100644 --- a/krnl386/krnl386.def +++ b/krnl386/krnl386.def @@ -246,3 +246,87 @@ EXPORTS get_idle_event get_windows_build GetSelectorLimit16 + + getAL + getAH + getAX + getEAX + getBL + getBH + getBX + getEBX + getCL + getCH + getCX + getECX + getDL + getDH + getDX + getEDX + getSP + getESP + getBP + getEBP + getSI + getESI + getDI + getEDI + setAL + setAH + setAX + setEAX + setBL + setBH + setBX + setEBX + setCL + setCH + setCX + setECX + setDL + setDH + setDX + setEDX + setSP + setESP + setBP + setEBP + setSI + setESI + setDI + setEDI + getDS + getES + getCS + getSS + getFS + getGS + setDS + setES + setCS + setSS + setFS + setGS + getIP + getEIP + setIP + setEIP + getCF + getPF + getAF + getZF + getSF + getIF + getDF + getOF + setCF + setPF + setAF + setZF + setSF + setIF + setDF + setOF + VDDInstallIOHook + VDDDeInstallIOHook + MGetVDMPointer diff --git a/krnl386/krnl386.exe16.spec b/krnl386/krnl386.exe16.spec index be194775bd..b0f65b27da 100644 --- a/krnl386/krnl386.exe16.spec +++ b/krnl386/krnl386.exe16.spec @@ -801,3 +801,88 @@ @ stdcall -arch=win32 vm_inject(long long long long long) @ stdcall -arch=win32 get_idle_event() @ stdcall -arch=win32 get_windows_build() + +#VDD apis +@ stdcall -arch=win32 getAL() +@ stdcall -arch=win32 getAH() +@ stdcall -arch=win32 getAX() +@ stdcall -arch=win32 getEAX() +@ stdcall -arch=win32 getBL() +@ stdcall -arch=win32 getBH() +@ stdcall -arch=win32 getBX() +@ stdcall -arch=win32 getEBX() +@ stdcall -arch=win32 getCL() +@ stdcall -arch=win32 getCH() +@ stdcall -arch=win32 getCX() +@ stdcall -arch=win32 getECX() +@ stdcall -arch=win32 getDL() +@ stdcall -arch=win32 getDH() +@ stdcall -arch=win32 getDX() +@ stdcall -arch=win32 getEDX() +@ stdcall -arch=win32 getSP() +@ stdcall -arch=win32 getESP() +@ stdcall -arch=win32 getBP() +@ stdcall -arch=win32 getEBP() +@ stdcall -arch=win32 getSI() +@ stdcall -arch=win32 getESI() +@ stdcall -arch=win32 getDI() +@ stdcall -arch=win32 getEDI() +@ stdcall -arch=win32 setAL(long) +@ stdcall -arch=win32 setAH(long) +@ stdcall -arch=win32 setAX(long) +@ stdcall -arch=win32 setEAX(long) +@ stdcall -arch=win32 setBL(long) +@ stdcall -arch=win32 setBH(long) +@ stdcall -arch=win32 setBX(long) +@ stdcall -arch=win32 setEBX(long) +@ stdcall -arch=win32 setCL(long) +@ stdcall -arch=win32 setCH(long) +@ stdcall -arch=win32 setCX(long) +@ stdcall -arch=win32 setECX(long) +@ stdcall -arch=win32 setDL(long) +@ stdcall -arch=win32 setDH(long) +@ stdcall -arch=win32 setDX(long) +@ stdcall -arch=win32 setEDX(long) +@ stdcall -arch=win32 setSP(long) +@ stdcall -arch=win32 setESP(long) +@ stdcall -arch=win32 setBP(long) +@ stdcall -arch=win32 setEBP(long) +@ stdcall -arch=win32 setSI(long) +@ stdcall -arch=win32 setESI(long) +@ stdcall -arch=win32 setDI(long) +@ stdcall -arch=win32 setEDI(long) +@ stdcall -arch=win32 getDS() +@ stdcall -arch=win32 getES() +@ stdcall -arch=win32 getCS() +@ stdcall -arch=win32 getSS() +@ stdcall -arch=win32 getFS() +@ stdcall -arch=win32 getGS() +@ stdcall -arch=win32 setDS(long) +@ stdcall -arch=win32 setES(long) +@ stdcall -arch=win32 setCS(long) +@ stdcall -arch=win32 setSS(long) +@ stdcall -arch=win32 setFS(long) +@ stdcall -arch=win32 setGS(long) +@ stdcall -arch=win32 getIP() +@ stdcall -arch=win32 getEIP() +@ stdcall -arch=win32 setIP(long) +@ stdcall -arch=win32 setEIP(long) +@ stdcall -arch=win32 getCF() +@ stdcall -arch=win32 getPF() +@ stdcall -arch=win32 getAF() +@ stdcall -arch=win32 getZF() +@ stdcall -arch=win32 getSF() +@ stdcall -arch=win32 getIF() +@ stdcall -arch=win32 getDF() +@ stdcall -arch=win32 getOF() +@ stdcall -arch=win32 setCF(long) +@ stdcall -arch=win32 setPF(long) +@ stdcall -arch=win32 setAF(long) +@ stdcall -arch=win32 setZF(long) +@ stdcall -arch=win32 setSF(long) +@ stdcall -arch=win32 setIF(long) +@ stdcall -arch=win32 setDF(long) +@ stdcall -arch=win32 setOF(long) +@ stdcall -arch=win32 VDDInstallIOHook(long long ptr ptr) +@ stdcall -arch=win32 VDDDeInstallIOHook(long long ptr) +@ stdcall -arch=win32 MGetVDMPointer(long long long) diff --git a/krnl386/krnl386.vcxproj b/krnl386/krnl386.vcxproj index 9efea0f67e..4424686a70 100644 --- a/krnl386/krnl386.vcxproj +++ b/krnl386/krnl386.vcxproj @@ -145,6 +145,7 @@ + diff --git a/krnl386/vdd.c b/krnl386/vdd.c new file mode 100644 index 0000000000..c603bfc26d --- /dev/null +++ b/krnl386/vdd.c @@ -0,0 +1,641 @@ +#include +#include "kernel16_private.h" +#include "dosexe.h" +#include "windows/wownt32.h" + +typedef struct +{ + HMODULE hvdd; + FARPROC dispatch; +} vdd_module_t; + +static vdd_module_t vdd_modules[5] = {0}; + +void vdd_req(char func, CONTEXT *context) +{ + /* + * RegisterModule + * DS:SI DLL + * ES:DI init func name + * DS:BX dispatch routine name + */ + if (func == 0x00) + { + LPCSTR dll = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Esi); + LPCSTR init = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi); + LPCSTR dispatch = (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Ebx); + context->Eip += 4; + HMODULE hVdd = LoadLibraryA(dll); + if (!hVdd) + { + SET_CFLAG(context); + SET_AX(context, GetLastError()); + return; + } + FARPROC pfnInit = GetProcAddress(hVdd, init); + FARPROC pfnDispatch = GetProcAddress(hVdd, dispatch); + int i; + for (i = 0; i < 5; i++) + { + if (!vdd_modules[i].hvdd) + { + vdd_modules[i].hvdd = hVdd; + vdd_modules[i].dispatch = dispatch; + } + } + if (i == 5) + { + FreeLibrary(dll); + SET_CFLAG(context); + SET_AX(context, 4); + return; + } + RESET_CFLAG(context); + SET_AX(context, i); + if (pfnInit) + { + pfnInit(); + } + } + /* UnregisterModule */ + else if (func == 0x01) + { + WORD handle = LOWORD(context->Eax); + context->Eip += 4; + if ((handle > 5) || !vdd_modules[handle].hvdd) + return; // ntvdm exits here + FreeLibrary(vdd_modules[handle].hvdd); + vdd_modules[handle].hvdd = 0; + } + /* DispatchCall */ + else if (func == 0x02) + { + WORD handle = LOWORD(context->Eax); + context->Eip += 4; + if ((handle > 5) || !vdd_modules[handle].hvdd) + return; // ntvdm exits here + vdd_modules[handle].dispatch(); + } +} + +static CONTEXT *last_context = NULL; + +#define GET_LO_BYTE_REG(reg) ((BYTE)(last_context ? last_context->##reg : 0)) +#define GET_HI_BYTE_REG(reg) ((BYTE)((last_context ? last_context->##reg : 0) >> 8)) +#define GET_WORD_REG(reg) ((WORD)(last_context ? last_context->##reg : 0)) +#define GET_DWORD_REG(reg) (last_context ? last_context->##reg : 0) + +#define SET_LO_BYTE_REG(reg, val) { if (last_context) last_context->##reg = ((last_context->##reg & ~0xff) | val); } +#define SET_HI_BYTE_REG(reg, val) { if (last_context) last_context->##reg = ((last_context->##reg & ~0xff00) | (val << 8)); } +#define SET_WORD_REG(reg, val) { if (last_context) last_context->##reg = ((last_context->##reg & ~0xffff) | val); } +#define SET_DWORD_REG(reg, val) { if (last_context) last_context->##reg = val; } + +#define GET_FLAG(bit) (last_context ? (last_context->EFlags >> bit) & 1 : 0) +#define SET_FLAG(bit, val) { if (last_context) last_context->EFlags = ((last_context->EFlags & ~(1 << bit)) | ((val & 1) << bit)); } + +BYTE WINAPI getAL() +{ + return GET_LO_BYTE_REG(Eax); +} + +BYTE WINAPI getAH() +{ + return GET_HI_BYTE_REG(Eax); +} + +WORD WINAPI getAX() +{ + return GET_WORD_REG(Eax); +} + +DWORD WINAPI getEAX() +{ + return GET_DWORD_REG(Eax); +} + +BYTE WINAPI getBL() +{ + return GET_LO_BYTE_REG(Ebx); +} + +BYTE WINAPI getBH() +{ + return GET_HI_BYTE_REG(Ebx); +} + +WORD WINAPI getBX() +{ + return GET_WORD_REG(Ebx); +} + +DWORD WINAPI getEBX() +{ + return GET_DWORD_REG(Ebx); +} + +BYTE WINAPI getCL() +{ + return GET_LO_BYTE_REG(Ecx); +} + +BYTE WINAPI getCH() +{ + return GET_HI_BYTE_REG(Ecx); +} + +WORD WINAPI getCX() +{ + return GET_WORD_REG(Ecx); +} + +DWORD WINAPI getECX() +{ + return GET_DWORD_REG(Ecx); +} + +BYTE WINAPI getDL() +{ + return GET_LO_BYTE_REG(Edx); +} + +BYTE WINAPI getDH() +{ + return GET_HI_BYTE_REG(Edx); +} + +WORD WINAPI getDX() +{ + return GET_WORD_REG(Edx); +} + +DWORD WINAPI getEDX() +{ + return GET_DWORD_REG(Edx); +} + +WORD WINAPI getSP() +{ + return GET_WORD_REG(Esp); +} + +DWORD WINAPI getESP() +{ + return GET_DWORD_REG(Esp); +} + +WORD WINAPI getBP() +{ + return GET_WORD_REG(Ebp); +} + +DWORD WINAPI getEBP() +{ + return GET_DWORD_REG(Ebp); +} + +WORD WINAPI getSI() +{ + return GET_WORD_REG(Esi); +} + +DWORD WINAPI getESI() +{ + return GET_DWORD_REG(Esi); +} + +WORD WINAPI getDI() +{ + return GET_WORD_REG(Edi); +} + +DWORD WINAPI getEDI() +{ + return GET_DWORD_REG(Edi); +} + +void WINAPI setAL(BYTE val) +{ + SET_LO_BYTE_REG(Eax, val); +} + +void WINAPI setAH(BYTE val) +{ + SET_HI_BYTE_REG(Eax, val); +} + +void WINAPI setAX(WORD val) +{ + SET_WORD_REG(Eax, val); +} + +void WINAPI setEAX(DWORD val) +{ + SET_DWORD_REG(Eax, val); +} + +void WINAPI setBL(BYTE val) +{ + SET_LO_BYTE_REG(Ebx, val); +} + +void WINAPI setBH(BYTE val) +{ + SET_HI_BYTE_REG(Ebx, val); +} + +void WINAPI setBX(WORD val) +{ + SET_WORD_REG(Ebx, val); +} + +void WINAPI setEBX(DWORD val) +{ + SET_DWORD_REG(Ebx, val); +} + +void WINAPI setCL(BYTE val) +{ + SET_LO_BYTE_REG(Ecx, val); +} + +void WINAPI setCH(BYTE val) +{ + SET_HI_BYTE_REG(Ecx, val); +} + +void WINAPI setCX(DWORD val) +{ + SET_WORD_REG(Ecx, val); +} + +void WINAPI setECX(BYTE val) +{ + SET_DWORD_REG(Ecx, val); +} + +void WINAPI setDL(BYTE val) +{ + SET_LO_BYTE_REG(Edx, val); +} + +void WINAPI setDH(BYTE val) +{ + SET_HI_BYTE_REG(Edx, val); +} + +void WINAPI setDX(WORD val) +{ + SET_WORD_REG(Edx, val); +} + +void WINAPI setEDX(DWORD val) +{ + SET_DWORD_REG(Edx, val); +} + +void WINAPI setSP(WORD val) +{ + SET_WORD_REG(Esp, val); +} + +void WINAPI setESP(DWORD val) +{ + SET_DWORD_REG(Esp, val); +} + +void WINAPI setBP(WORD val) +{ + SET_WORD_REG(Ebp, val); +} + +void WINAPI setEBP(DWORD val) +{ + SET_DWORD_REG(Ebp, val); +} + +void WINAPI setSI(WORD val) +{ + SET_WORD_REG(Esi, val); +} + +void WINAPI setESI(DWORD val) +{ + SET_DWORD_REG(Esi, val); +} + +void WINAPI setDI(WORD val) +{ + SET_WORD_REG(Edi, val); +} + +void WINAPI setEDI(DWORD val) +{ + SET_DWORD_REG(Edi, val); +} + +WORD WINAPI getDS() +{ + return GET_WORD_REG(SegDs); +} + +WORD WINAPI getES() +{ + return GET_WORD_REG(SegEs); +} + +WORD WINAPI getCS() +{ + return GET_WORD_REG(SegCs); +} + +WORD WINAPI getSS() +{ + return GET_WORD_REG(SegSs); +} + +WORD WINAPI getFS() +{ + return GET_WORD_REG(SegFs); +} + +WORD WINAPI getGS() +{ + return GET_WORD_REG(SegGs); +} + +void WINAPI setDS(WORD val) +{ + SET_WORD_REG(SegDs, val); +} + +void WINAPI setES(WORD val) +{ + SET_WORD_REG(SegEs, val); +} + +void WINAPI setCS(WORD val) +{ + SET_WORD_REG(SegCs, val); +} + +void WINAPI setSS(WORD val) +{ + SET_WORD_REG(SegSs, val); +} + +void WINAPI setFS(WORD val) +{ + SET_WORD_REG(SegFs, val); +} + +void WINAPI setGS(WORD val) +{ + SET_WORD_REG(SegGs, val); +} + +WORD WINAPI getIP() +{ + return GET_WORD_REG(Eip); +} + +WORD WINAPI getEIP() +{ + return GET_DWORD_REG(Eip); +} + +void WINAPI setIP(WORD val) +{ + SET_WORD_REG(Eip, val); +} + +void WINAPI setEIP(DWORD val) +{ + SET_DWORD_REG(Eip, val); +} + +DWORD WINAPI getCF() +{ + return GET_FLAG(0); +} + +DWORD WINAPI getPF() +{ + return GET_FLAG(2); +} + +DWORD WINAPI getAF() +{ + return GET_FLAG(4); +} + +DWORD WINAPI getZF() +{ + return GET_FLAG(6); +} + +DWORD WINAPI getSF() +{ + return GET_FLAG(7); +} + +DWORD WINAPI getIF() +{ + return GET_FLAG(9); +} + +DWORD WINAPI getDF() +{ + return GET_FLAG(10); +} + +DWORD WINAPI getOF() +{ + return GET_FLAG(11); +} + +void WINAPI setCF(DWORD val) +{ + SET_FLAG(0, val); +} + +void WINAPI setPF(DWORD val) +{ + SET_FLAG(2, val); +} + +void WINAPI setAF(DWORD val) +{ + SET_FLAG(4, val); +} + +void WINAPI setZF(DWORD val) +{ + SET_FLAG(6, val); +} + +void WINAPI setSF(DWORD val) +{ + SET_FLAG(7, val); +} + +void WINAPI setIF(DWORD val) +{ + SET_FLAG(9, val); +} + +void WINAPI setDF(DWORD val) +{ + SET_FLAG(10, val); +} + +void WINAPI setOF(DWORD val) +{ + SET_FLAG(11, val); +} + +typedef VOID (WINAPI *PFNVDD_INB)(WORD iport, PBYTE data); +typedef VOID (WINAPI *PFNVDD_INW)(WORD iport, PWORD data); +typedef VOID (WINAPI *PFNVDD_INSB)(WORD iport, PBYTE data, WORD count); +typedef VOID (WINAPI *PFNVDD_INSW)(WORD iport, PWORD data, WORD count); +typedef VOID (WINAPI *PFNVDD_OUTB)(WORD iport, BYTE data); +typedef VOID (WINAPI *PFNVDD_OUTW)(WORD iport, WORD data); +typedef VOID (WINAPI *PFNVDD_OUTSB)(WORD iport, PBYTE data, WORD count); +typedef VOID (WINAPI *PFNVDD_OUTSW)(WORD iport, PWORD data, WORD count); + +typedef struct _VDD_IO_HANDLERS +{ + PFNVDD_INB inb_handler; + PFNVDD_INW inw_handler; + PFNVDD_INSB insb_handler; + PFNVDD_INSW insw_handler; + PFNVDD_OUTB outb_handler; + PFNVDD_OUTW outw_handler; + PFNVDD_OUTSB outsb_handler; + PFNVDD_OUTSW outsw_handler; +} VDD_IO_HANDLERS, *PVDD_IO_HANDLERS; + +typedef struct _VDD_IO_PORTRANGE +{ + WORD First; + WORD Last; +} VDD_IO_PORTRANGE, *PVDD_IO_PORTRANGE; + +typedef struct +{ + HANDLE hvdd; + VDD_IO_HANDLERS io_funcs; + WORD io_range_len; + PVDD_IO_PORTRANGE io_range; +} vdd_io_t; + +static vdd_io_t vdd_io[5] = {0}; + +BOOL WINAPI VDDInstallIOHook(HANDLE hvdd, WORD cPortRange, PVDD_IO_PORTRANGE pPortRange, PVDD_IO_HANDLERS IOhandler) +{ + int handle = (int)hvdd; + int found; + for (int i = 0; i < 5; i++) + { + if (!vdd_io[i].hvdd) + found = i; + if (vdd_io[i].hvdd == hvdd) + return FALSE; + } + if (found >= 5 || !IOhandler->inb_handler || !IOhandler->outb_handler) + return FALSE; + + vdd_io[found].hvdd = hvdd; + memcpy(&vdd_io[found].io_funcs, IOhandler, sizeof(VDD_IO_HANDLERS)); + vdd_io[found].io_range_len = cPortRange; + vdd_io[found].io_range = HeapAlloc(GetProcessHeap(), 0, cPortRange * sizeof(VDD_IO_PORTRANGE)); + memcpy(&vdd_io[found].io_range, pPortRange, cPortRange * sizeof(VDD_IO_PORTRANGE)); + return TRUE; +} + +void WINAPI VDDDeInstallIOHook(HANDLE hvdd, WORD cPortRange, PVDD_IO_PORTRANGE pPortRange) +{ + int handle = (int)hvdd; + int i; + for (i = 0; i < 5; i++) + { + if (hvdd == vdd_io[i].hvdd) + break; + } + if (i >= 5); + return FALSE; + + vdd_io[i].hvdd = NULL; + HeapFree(GetProcessHeap(), 0, vdd_io[i].io_range); + return TRUE; +} + +BOOL vdd_io_read(int port, int size, WORD *val, CONTEXT *ctx) +{ + for (int i = 0; i < 5; i++) + { + if (vdd_io[i].hvdd) + { + for (int j = 0; j < vdd_io[i].io_range_len; j++) + { + if ((vdd_io[i].io_range[j].First >= port) && (vdd_io[i].io_range[j].Last <= port)) + { + last_context = ctx; + switch (size) + { + case 2: + if (vdd_io[i].io_funcs.inw_handler) + vdd_io[i].io_funcs.inw_handler(port, val); + else + { + vdd_io[i].io_funcs.inb_handler(port, (BYTE *)val); + vdd_io[i].io_funcs.inb_handler(port + 1, ((BYTE *)val) + 1); + } + case 1: + vdd_io[i].io_funcs.inb_handler(port, (BYTE *)val); + } + last_context = NULL; + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL vdd_io_write(int port, int size, WORD val, CONTEXT *ctx) +{ + for (int i = 0; i < 5; i++) + { + if (vdd_io[i].hvdd) + { + for (int j = 0; j < vdd_io[i].io_range_len; j++) + { + if ((vdd_io[i].io_range[j].First >= port) && (vdd_io[i].io_range[j].Last <= port)) + { + last_context = ctx; + switch (size) + { + case 2: + if (vdd_io[i].io_funcs.outw_handler) + vdd_io[i].io_funcs.outw_handler(port, val); + else + { + vdd_io[i].io_funcs.outb_handler(port, val); + vdd_io[i].io_funcs.outb_handler(port + 1, val >> 8); + } + case 1: + vdd_io[i].io_funcs.outb_handler(port, val); + } + last_context = NULL; + return TRUE; + } + } + } + } + return FALSE; +} + +BYTE *WINAPI MGetVDMPointer(DWORD addr, DWORD size, BOOL protmode) +{ + return (BYTE *)K32WOWGetVDMPointer(addr, size, protmode); +} diff --git a/ntvdm/CMakeLists.txt b/ntvdm/CMakeLists.txt new file mode 100644 index 0000000000..0e8c5121fd --- /dev/null +++ b/ntvdm/CMakeLists.txt @@ -0,0 +1,6 @@ +file(GLOB SOURCE *.c *.cpp *.rc) +add_library(ntvdm SHARED ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/ntvdm.def) +include_directories(../wine) +add_definitions(-D_X86_ -D__WINESRC__ -D__i386__ -DHAVE_STRNCASECMP -DHAVE__STRNICMP -D_WINTERNL_ -DNtCurrentTeb=NtCurrentTeb__ -DDECLSPEC_HIDDEN= -Dstrncasecmp=_strnicmp) +target_link_libraries(ntvdm krnl386) +set_target_properties(ntvdm PROPERTIES PREFIX "") diff --git a/ntvdm/main.c b/ntvdm/main.c new file mode 100644 index 0000000000..b2d1ea9f88 --- /dev/null +++ b/ntvdm/main.c @@ -0,0 +1,8 @@ +#include + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + DisableThreadLibraryCalls(hinstDLL); + return TRUE; +} diff --git a/ntvdm/ntvdm.def b/ntvdm/ntvdm.def new file mode 100644 index 0000000000..cc029adccc --- /dev/null +++ b/ntvdm/ntvdm.def @@ -0,0 +1,86 @@ +LIBRARY ntvdm.dll + +EXPORTS + getAL = krnl386.getAL + getAH = krnl386.getAH + getAX = krnl386.getAX + getEAX = krnl386.getEAX + getBL = krnl386.getBL + getBH = krnl386.getBH + getBX = krnl386.getBX + getEBX = krnl386.getEBX + getCL = krnl386.getCL + getCH = krnl386.getCH + getCX = krnl386.getCX + getECX = krnl386.getECX + getDL = krnl386.getDL + getDH = krnl386.getDH + getDX = krnl386.getDX + getEDX = krnl386.getEDX + getSP = krnl386.getSP + getESP = krnl386.getESP + getBP = krnl386.getBP + getEBP = krnl386.getEBP + getSI = krnl386.getSI + getESI = krnl386.getESI + getDI = krnl386.getDI + getEDI = krnl386.getEDI + setAL = krnl386.setAL + setAH = krnl386.setAH + setAX = krnl386.setAX + setEAX = krnl386.setEAX + setBL = krnl386.setBL + setBH = krnl386.setBH + setBX = krnl386.setBX + setEBX = krnl386.setEBX + setCL = krnl386.setCL + setCH = krnl386.setCH + setCX = krnl386.setCX + setECX = krnl386.setECX + setDL = krnl386.setDL + setDH = krnl386.setDH + setDX = krnl386.setDX + setEDX = krnl386.setEDX + setSP = krnl386.setSP + setESP = krnl386.setESP + setBP = krnl386.setBP + setEBP = krnl386.setEBP + setSI = krnl386.setSI + setESI = krnl386.setESI + setDI = krnl386.setDI + setEDI = krnl386.setEDI + getDS = krnl386.getDS + getES = krnl386.getES + getCS = krnl386.getCS + getSS = krnl386.getSS + getFS = krnl386.getFS + getGS = krnl386.getGS + setDS = krnl386.setDS + setES = krnl386.setES + setCS = krnl386.setCS + setSS = krnl386.setSS + setFS = krnl386.setFS + setGS = krnl386.setGS + getIP = krnl386.getIP + getEIP = krnl386.getEIP + setIP = krnl386.setIP + setEIP = krnl386.setEIP + getCF = krnl386.getCF + getPF = krnl386.getPF + getAF = krnl386.getAF + getZF = krnl386.getZF + getSF = krnl386.getSF + getIF = krnl386.getIF + getDF = krnl386.getDF + getOF = krnl386.getOF + setCF = krnl386.setCF + setPF = krnl386.setPF + setAF = krnl386.setAF + setZF = krnl386.setZF + setSF = krnl386.setSF + setIF = krnl386.setIF + setDF = krnl386.setDF + setOF = krnl386.setOF + VDDInstallIOHook = krnl386.VDDInstallIOHook + VDDDeInstallIOHook = krnl386.VDDDeInstallIOHook + MGetVDMPointer = krnl386.MGetVDMPointer diff --git a/ntvdm/ntvdm.dll.spec b/ntvdm/ntvdm.dll.spec new file mode 100644 index 0000000000..969a00c335 --- /dev/null +++ b/ntvdm/ntvdm.dll.spec @@ -0,0 +1,83 @@ +@ stdcall getAL() +@ stdcall getAH() +@ stdcall getAX() +@ stdcall getEAX() +@ stdcall getBL() +@ stdcall getBH() +@ stdcall getBX() +@ stdcall getEBX() +@ stdcall getCL() +@ stdcall getCH() +@ stdcall getCX() +@ stdcall getECX() +@ stdcall getDL() +@ stdcall getDH() +@ stdcall getDX() +@ stdcall getEDX() +@ stdcall getSP() +@ stdcall getESP() +@ stdcall getBP() +@ stdcall getEBP() +@ stdcall getSI() +@ stdcall getESI() +@ stdcall getDI() +@ stdcall getEDI() +@ stdcall setAL(long) +@ stdcall setAH(long) +@ stdcall setAX(long) +@ stdcall setEAX(long) +@ stdcall setBL(long) +@ stdcall setBH(long) +@ stdcall setBX(long) +@ stdcall setEBX(long) +@ stdcall setCL(long) +@ stdcall setCH(long) +@ stdcall setCX(long) +@ stdcall setECX(long) +@ stdcall setDL(long) +@ stdcall setDH(long) +@ stdcall setDX(long) +@ stdcall setEDX(long) +@ stdcall setSP(long) +@ stdcall setESP(long) +@ stdcall setBP(long) +@ stdcall setEBP(long) +@ stdcall setSI(long) +@ stdcall setESI(long) +@ stdcall setDI(long) +@ stdcall setEDI(long) +@ stdcall getDS() +@ stdcall getES() +@ stdcall getCS() +@ stdcall getSS() +@ stdcall getFS() +@ stdcall getGS() +@ stdcall setDS(long) +@ stdcall setES(long) +@ stdcall setCS(long) +@ stdcall setSS(long) +@ stdcall setFS(long) +@ stdcall setGS(long) +@ stdcall getIP() +@ stdcall getEIP() +@ stdcall setIP(long) +@ stdcall setEIP(long) +@ stdcall getCF() +@ stdcall getPF() +@ stdcall getAF() +@ stdcall getZF() +@ stdcall getSF() +@ stdcall getIF() +@ stdcall getDF() +@ stdcall getOF() +@ stdcall setCF(long) +@ stdcall setPF(long) +@ stdcall setAF(long) +@ stdcall setZF(long) +@ stdcall setSF(long) +@ stdcall setIF(long) +@ stdcall setDF(long) +@ stdcall setOF(long) +@ stdcall VDDInstallIOHook(long long ptr ptr) +@ stdcall VDDDeInstallIOHook(long long ptr) +@ stdcall MGetVDMPointer(long long long) diff --git a/ntvdm/ntvdm.vcxproj b/ntvdm/ntvdm.vcxproj new file mode 100644 index 0000000000..62d3612833 --- /dev/null +++ b/ntvdm/ntvdm.vcxproj @@ -0,0 +1,104 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + {E4950E01-C995-49A5-9FED-5EF03155FD66} + Win32Proj + ntvdm + 10.0.17134.0 + + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;_X86_;__WINESRC__;__i386__;USE_COMPILER_EXCEPTIONS;_WINTERNL_;NtCurrentTeb=NtCurrentTeb__;inline=__inline;%(PreprocessorDefinitions) + ../wine + + + Windows + true + $(OutDir)krnl386.lib + ntvdm.def + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;_X86_;__WINESRC__;__i386__;USE_COMPILER_EXCEPTIONS;_WINTERNL_;NtCurrentTeb=NtCurrentTeb__;inline=__inline;%(PreprocessorDefinitions) + ../wine + + + Windows + true + true + true + ntvdm.def + $(OutDir)krnl386.lib + + + + + + + + + + + + + + diff --git a/otvdm.sln b/otvdm.sln index fd07d17eae..245d552a3f 100644 --- a/otvdm.sln +++ b/otvdm.sln @@ -6,6 +6,7 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "otvdm", "otvdm\otvdm.vcxproj", "{9C0EBE04-AE9A-40D5-ACFA-5F0854456DDA}" ProjectSection(ProjectDependencies) = postProject {E4950E01-C995-49A5-9FED-5EF03155FD65} = {E4950E01-C995-49A5-9FED-5EF03155FD65} + {E4950E01-C995-49A5-9FED-5EF03155FD66} = {E4950E01-C995-49A5-9FED-5EF03155FD66} {258FD007-046D-4625-BB5A-B7934B71934F} = {258FD007-046D-4625-BB5A-B7934B71934F} {F234FA09-76BC-4154-8420-737CD7FA4EF7} = {F234FA09-76BC-4154-8420-737CD7FA4EF7} {7F73550E-724D-4F7A-B192-35A764AC24D6} = {7F73550E-724D-4F7A-B192-35A764AC24D6} @@ -76,6 +77,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wow32", "wow32\wow32.vcxpro {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ntvdm", "ntvdm\ntvdm.vcxproj", "{E4950E01-C995-49A5-9FED-5EF03155FD66}" + ProjectSection(ProjectDependencies) = postProject + {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} = {D3F34C25-272C-4E4F-9B6F-BE7ABB472966} + EndProjectSection +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convspec", "convspec\convspec.vcxproj", "{DC6BA231-C318-436F-8F5C-5E2CC73779E2}" ProjectSection(ProjectDependencies) = postProject {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} = {C978A6C2-F788-4F5E-8E14-73C1B6B521CE} @@ -448,6 +454,10 @@ Global {E4950E01-C995-49A5-9FED-5EF03155FD65}.Debug|Win32.Build.0 = Debug|Win32 {E4950E01-C995-49A5-9FED-5EF03155FD65}.Release|Win32.ActiveCfg = Release|Win32 {E4950E01-C995-49A5-9FED-5EF03155FD65}.Release|Win32.Build.0 = Release|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD66}.Debug|Win32.ActiveCfg = Debug|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD66}.Debug|Win32.Build.0 = Debug|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD66}.Release|Win32.ActiveCfg = Release|Win32 + {E4950E01-C995-49A5-9FED-5EF03155FD66}.Release|Win32.Build.0 = Release|Win32 {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Debug|Win32.ActiveCfg = Debug|Win32 {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Debug|Win32.Build.0 = Debug|Win32 {DC6BA231-C318-436F-8F5C-5E2CC73779E2}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/vm86/msdos.cpp b/vm86/msdos.cpp index fe73d891ea..83324006ab 100644 --- a/vm86/msdos.cpp +++ b/vm86/msdos.cpp @@ -476,44 +476,63 @@ int pic_ack() return 0; } -typedef DWORD (*DOSVM_inport_t)(int port, int size); -typedef void (*DOSVM_outport_t)(int port, int size, DWORD value); +typedef DWORD (*DOSVM_inport_t)(int port, int size, CONTEXT *ctx); +typedef void (*DOSVM_outport_t)(int port, int size, DWORD value, CONTEXT *ctx); DOSVM_inport_t DOSVM_inport; DOSVM_outport_t DOSVM_outport; +extern "C" void save_context(CONTEXT *context); +extern "C" void load_context(CONTEXT *context); // i/o bus UINT8 read_io_byte(offs_t addr) { - return (UINT8)DOSVM_inport(addr, 1); + CONTEXT *ctx; + save_context(ctx); + UINT8 ret = (UINT8)DOSVM_inport(addr, 1, ctx); + load_context(ctx); + return ret; } UINT16 read_io_word(offs_t addr) { - return(read_io_byte(addr) | (read_io_byte(addr + 1) << 8)); + CONTEXT *ctx; + save_context(ctx); + UINT16 ret = (UINT16)DOSVM_inport(addr, 2, ctx); + load_context(ctx); + return ret; } UINT32 read_io_dword(offs_t addr) { - return(read_io_byte(addr) | (read_io_byte(addr + 1) << 8) | (read_io_byte(addr + 2) << 16) | (read_io_byte(addr + 3) << 24)); + CONTEXT *ctx; + save_context(ctx); + UINT32 ret = DOSVM_inport(addr, 4, ctx); + load_context(ctx); + return ret; } void write_io_byte(offs_t addr, UINT8 val) { - DOSVM_outport(addr, 1, val); + CONTEXT *ctx; + save_context(ctx); + DOSVM_outport(addr, 1, val, ctx); + load_context(ctx); } void write_io_word(offs_t addr, UINT16 val) { - write_io_byte(addr + 0, (val >> 0) & 0xff); - write_io_byte(addr + 1, (val >> 8) & 0xff); + CONTEXT *ctx; + save_context(ctx); + DOSVM_outport(addr, 2, val, ctx); + load_context(ctx); } void write_io_dword(offs_t addr, UINT32 val) { - write_io_byte(addr + 0, (val >> 0) & 0xff); - write_io_byte(addr + 1, (val >> 8) & 0xff); - write_io_byte(addr + 2, (val >> 16) & 0xff); - write_io_byte(addr + 3, (val >> 24) & 0xff); + CONTEXT *ctx; + save_context(ctx); + DOSVM_outport(addr, 4, val, ctx); + load_context(ctx); } #undef min #undef max diff --git a/whpxvm/whpxvm.c b/whpxvm/whpxvm.c index e64df6cbd8..0cc1922494 100644 --- a/whpxvm/whpxvm.c +++ b/whpxvm/whpxvm.c @@ -312,8 +312,8 @@ __attribute__ ((aligned(4096))) WORD seg_cs; WORD seg_ds; -typedef DWORD (*DOSVM_inport_t)(int port, int size); -typedef void (*DOSVM_outport_t)(int port, int size, DWORD value); +typedef DWORD (*DOSVM_inport_t)(int port, int size, CONTEXT *ctx); +typedef void (*DOSVM_outport_t)(int port, int size, DWORD value, CONTEXT *ctx); DOSVM_inport_t DOSVM_inport; DOSVM_outport_t DOSVM_outport; @@ -1310,47 +1310,39 @@ void vm86main(CONTEXT *context, DWORD csip, DWORD sssp, DWORD cbArgs, PEXCEPTION case WHvRunVpExitReasonX64IoPortAccess: { WHV_X64_IO_PORT_ACCESS_CONTEXT *io = &exit.IoPortAccess; - WHV_REGISTER_VALUE vals[] = {{0}, {0}}; - const WHV_REGISTER_NAME regs[] = {WHvX64RegisterRip, WHvX64RegisterRax, WHvX64RegisterRflags}; - vals[0].Reg32 = exit.VpContext.Rip + exit.VpContext.InstructionLength; - vals[1].Reg64 = io->Rax; + CONTEXT ctx; + save_context_from_state(&ctx, &state2); + ctx.Eip = exit.VpContext.Rip + exit.VpContext.InstructionLength; + ctx.Eax = io->Rax; if(!(io->AccessInfo.StringOp)) { switch(io->AccessInfo.AccessSize) { case 1: if(!io->AccessInfo.IsWrite) - vals[1].Reg64 = (io->Rax & ~0xff) | DOSVM_inport(io->PortNumber, 1); + ctx.Eax = (io->Rax & ~0xff) | (UINT8)DOSVM_inport(io->PortNumber, 1, &ctx); else - DOSVM_outport(io->PortNumber, io->Rax, 1); + DOSVM_outport(io->PortNumber, io->Rax, 1, &ctx); break; case 2: if(!io->AccessInfo.IsWrite) { - vals[1].Reg64 = (io->Rax & ~0xffff); - vals[1].Reg64 |= DOSVM_inport(io->PortNumber, 1); - vals[1].Reg64 |= DOSVM_inport(io->PortNumber + 1, 1) << 8; + ctx.Eax = (io->Rax & ~0xffff); + ctx.Eax |= (UINT16)DOSVM_inport(io->PortNumber, 2, &ctx); } else { - DOSVM_outport(io->PortNumber, io->Rax, 1); - DOSVM_outport(io->PortNumber + 1, io->Rax >> 8, 1); + DOSVM_outport(io->PortNumber, io->Rax, 2, &ctx); } break; case 4: if(!io->AccessInfo.IsWrite) { - vals[1].Reg64 = DOSVM_inport(io->PortNumber, 1); - vals[1].Reg64 |= DOSVM_inport(io->PortNumber + 1, 1) << 8; - vals[1].Reg64 |= DOSVM_inport(io->PortNumber + 2, 1) << 16; - vals[1].Reg64 |= DOSVM_inport(io->PortNumber + 3, 1) << 24; + ctx.Eax = DOSVM_inport(io->PortNumber, 4, &ctx); } else { - DOSVM_outport(io->PortNumber, io->Rax, 1); - DOSVM_outport(io->PortNumber + 1, io->Rax >> 8, 1); - DOSVM_outport(io->PortNumber + 2, io->Rax >> 16, 1); - DOSVM_outport(io->PortNumber + 3, io->Rax >> 24, 1); + DOSVM_outport(io->PortNumber, io->Rax, 4, &ctx); } break; } @@ -1365,47 +1357,49 @@ void vm86main(CONTEXT *context, DWORD csip, DWORD sssp, DWORD cbArgs, PEXCEPTION addr = mem + io->Es.Base + io->Rdi; for(int i = 0; i < count; i++) { - addr = exit.VpContext.Rflags & 0x400 ? addr - io->AccessInfo.AccessSize : addr + io->AccessInfo.AccessSize; + addr = ctx.EFlags & 0x400 ? addr - io->AccessInfo.AccessSize : addr + io->AccessInfo.AccessSize; switch(io->AccessInfo.AccessSize) { case 1: if(!io->AccessInfo.IsWrite) - DOSVM_outport(io->PortNumber, *addr, 1); + DOSVM_outport(io->PortNumber, *addr, 1, &ctx); else - *addr = DOSVM_inport(io->PortNumber, 1); + *addr = DOSVM_inport(io->PortNumber, 1, &ctx); break; case 2: if(!io->AccessInfo.IsWrite) { - DOSVM_outport(io->PortNumber, *addr, 1); - DOSVM_outport(io->PortNumber + 1, *(addr + 1), 1); + DOSVM_outport(io->PortNumber, *addr, 2, &ctx); } else { - *addr = DOSVM_inport(io->PortNumber, 1); - *(addr + 1) = DOSVM_inport(io->PortNumber + 1, 1); + UINT16 val = DOSVM_inport(io->PortNumber, 2, &ctx); + *addr = val; + *(addr + 1) = val >> 8; } break; case 4: if(!io->AccessInfo.IsWrite) { - DOSVM_outport(io->PortNumber, *addr, 1); - DOSVM_outport(io->PortNumber + 1, *(addr + 1), 1); - DOSVM_outport(io->PortNumber + 2, *(addr + 2), 1); - DOSVM_outport(io->PortNumber + 3, *(addr + 3), 1); + DOSVM_outport(io->PortNumber, *addr, 4, &ctx); } else { - *addr = DOSVM_inport(io->PortNumber, 1); - *(addr + 1) = DOSVM_inport(io->PortNumber + 1, 1); - *(addr + 2) = DOSVM_inport(io->PortNumber + 2, 1); - *(addr + 3) = DOSVM_inport(io->PortNumber + 3, 1); + UINT16 val = DOSVM_inport(io->PortNumber, 4, &ctx); + *addr = val; + *(addr + 1) = val >> 8; + *(addr + 2) = val >> 16; + *(addr + 3) = val >> 24; } break; } } } - pWHvSetVirtualProcessorRegisters(partition, 0, regs, 2, vals); + load_context_to_state(&ctx, &state2); + if (FAILED(result = pWHvSetVirtualProcessorRegisters(partition, 0, whpx_vcpu_reg_names, ARRAYSIZE(whpx_vcpu_reg_names), state2.values))) + { + + } break; } default: From 84da8178caea558739f97e996b085ba1a5318708 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 8 Sep 2024 20:59:17 -0500 Subject: [PATCH 67/95] more vdd --- krnl386/krnl386.def | 2 +- krnl386/krnl386.exe16.spec | 2 +- krnl386/vdd.c | 24 +++--- ntvdm/ntvdm.def | 168 ++++++++++++++++++------------------- ntvdm/ntvdm.dll.spec | 2 +- ntvdm/ntvdm.vcxproj | 2 + 6 files changed, 102 insertions(+), 98 deletions(-) diff --git a/krnl386/krnl386.def b/krnl386/krnl386.def index ad049061b7..1c98d9db2c 100644 --- a/krnl386/krnl386.def +++ b/krnl386/krnl386.def @@ -329,4 +329,4 @@ EXPORTS setOF VDDInstallIOHook VDDDeInstallIOHook - MGetVDMPointer + MGetVdmPointer diff --git a/krnl386/krnl386.exe16.spec b/krnl386/krnl386.exe16.spec index b0f65b27da..2e6471cf77 100644 --- a/krnl386/krnl386.exe16.spec +++ b/krnl386/krnl386.exe16.spec @@ -885,4 +885,4 @@ @ stdcall -arch=win32 setOF(long) @ stdcall -arch=win32 VDDInstallIOHook(long long ptr ptr) @ stdcall -arch=win32 VDDDeInstallIOHook(long long ptr) -@ stdcall -arch=win32 MGetVDMPointer(long long long) +@ stdcall -arch=win32 MGetVdmPointer(long long long) diff --git a/krnl386/vdd.c b/krnl386/vdd.c index c603bfc26d..743b6a1af5 100644 --- a/krnl386/vdd.c +++ b/krnl386/vdd.c @@ -10,6 +10,7 @@ typedef struct } vdd_module_t; static vdd_module_t vdd_modules[5] = {0}; +static CONTEXT *last_context = NULL; void vdd_req(char func, CONTEXT *context) { @@ -40,12 +41,13 @@ void vdd_req(char func, CONTEXT *context) if (!vdd_modules[i].hvdd) { vdd_modules[i].hvdd = hVdd; - vdd_modules[i].dispatch = dispatch; + vdd_modules[i].dispatch = pfnDispatch; + break; } } if (i == 5) { - FreeLibrary(dll); + FreeLibrary(hVdd); SET_CFLAG(context); SET_AX(context, 4); return; @@ -74,12 +76,12 @@ void vdd_req(char func, CONTEXT *context) context->Eip += 4; if ((handle > 5) || !vdd_modules[handle].hvdd) return; // ntvdm exits here + last_context = context; vdd_modules[handle].dispatch(); + last_context = NULL; } } -static CONTEXT *last_context = NULL; - #define GET_LO_BYTE_REG(reg) ((BYTE)(last_context ? last_context->##reg : 0)) #define GET_HI_BYTE_REG(reg) ((BYTE)((last_context ? last_context->##reg : 0) >> 8)) #define GET_WORD_REG(reg) ((WORD)(last_context ? last_context->##reg : 0)) @@ -533,7 +535,7 @@ static vdd_io_t vdd_io[5] = {0}; BOOL WINAPI VDDInstallIOHook(HANDLE hvdd, WORD cPortRange, PVDD_IO_PORTRANGE pPortRange, PVDD_IO_HANDLERS IOhandler) { int handle = (int)hvdd; - int found; + int found = -1; for (int i = 0; i < 5; i++) { if (!vdd_io[i].hvdd) @@ -541,13 +543,13 @@ BOOL WINAPI VDDInstallIOHook(HANDLE hvdd, WORD cPortRange, PVDD_IO_PORTRANGE pPo if (vdd_io[i].hvdd == hvdd) return FALSE; } - if (found >= 5 || !IOhandler->inb_handler || !IOhandler->outb_handler) + if (found == -1 || !IOhandler->inb_handler || !IOhandler->outb_handler) return FALSE; vdd_io[found].hvdd = hvdd; memcpy(&vdd_io[found].io_funcs, IOhandler, sizeof(VDD_IO_HANDLERS)); vdd_io[found].io_range_len = cPortRange; - vdd_io[found].io_range = HeapAlloc(GetProcessHeap(), 0, cPortRange * sizeof(VDD_IO_PORTRANGE)); + vdd_io[found].io_range = (PVDD_IO_PORTRANGE)HeapAlloc(GetProcessHeap(), 0, cPortRange * sizeof(VDD_IO_PORTRANGE)); memcpy(&vdd_io[found].io_range, pPortRange, cPortRange * sizeof(VDD_IO_PORTRANGE)); return TRUE; } @@ -561,12 +563,12 @@ void WINAPI VDDDeInstallIOHook(HANDLE hvdd, WORD cPortRange, PVDD_IO_PORTRANGE p if (hvdd == vdd_io[i].hvdd) break; } - if (i >= 5); - return FALSE; + if (i >= 5) + return; vdd_io[i].hvdd = NULL; HeapFree(GetProcessHeap(), 0, vdd_io[i].io_range); - return TRUE; + return; } BOOL vdd_io_read(int port, int size, WORD *val, CONTEXT *ctx) @@ -635,7 +637,7 @@ BOOL vdd_io_write(int port, int size, WORD val, CONTEXT *ctx) return FALSE; } -BYTE *WINAPI MGetVDMPointer(DWORD addr, DWORD size, BOOL protmode) +BYTE *WINAPI MGetVdmPointer(DWORD addr, DWORD size, BOOL protmode) { return (BYTE *)K32WOWGetVDMPointer(addr, size, protmode); } diff --git a/ntvdm/ntvdm.def b/ntvdm/ntvdm.def index cc029adccc..bb44881901 100644 --- a/ntvdm/ntvdm.def +++ b/ntvdm/ntvdm.def @@ -1,86 +1,86 @@ -LIBRARY ntvdm.dll +LIBRARY ntvdm.exe EXPORTS - getAL = krnl386.getAL - getAH = krnl386.getAH - getAX = krnl386.getAX - getEAX = krnl386.getEAX - getBL = krnl386.getBL - getBH = krnl386.getBH - getBX = krnl386.getBX - getEBX = krnl386.getEBX - getCL = krnl386.getCL - getCH = krnl386.getCH - getCX = krnl386.getCX - getECX = krnl386.getECX - getDL = krnl386.getDL - getDH = krnl386.getDH - getDX = krnl386.getDX - getEDX = krnl386.getEDX - getSP = krnl386.getSP - getESP = krnl386.getESP - getBP = krnl386.getBP - getEBP = krnl386.getEBP - getSI = krnl386.getSI - getESI = krnl386.getESI - getDI = krnl386.getDI - getEDI = krnl386.getEDI - setAL = krnl386.setAL - setAH = krnl386.setAH - setAX = krnl386.setAX - setEAX = krnl386.setEAX - setBL = krnl386.setBL - setBH = krnl386.setBH - setBX = krnl386.setBX - setEBX = krnl386.setEBX - setCL = krnl386.setCL - setCH = krnl386.setCH - setCX = krnl386.setCX - setECX = krnl386.setECX - setDL = krnl386.setDL - setDH = krnl386.setDH - setDX = krnl386.setDX - setEDX = krnl386.setEDX - setSP = krnl386.setSP - setESP = krnl386.setESP - setBP = krnl386.setBP - setEBP = krnl386.setEBP - setSI = krnl386.setSI - setESI = krnl386.setESI - setDI = krnl386.setDI - setEDI = krnl386.setEDI - getDS = krnl386.getDS - getES = krnl386.getES - getCS = krnl386.getCS - getSS = krnl386.getSS - getFS = krnl386.getFS - getGS = krnl386.getGS - setDS = krnl386.setDS - setES = krnl386.setES - setCS = krnl386.setCS - setSS = krnl386.setSS - setFS = krnl386.setFS - setGS = krnl386.setGS - getIP = krnl386.getIP - getEIP = krnl386.getEIP - setIP = krnl386.setIP - setEIP = krnl386.setEIP - getCF = krnl386.getCF - getPF = krnl386.getPF - getAF = krnl386.getAF - getZF = krnl386.getZF - getSF = krnl386.getSF - getIF = krnl386.getIF - getDF = krnl386.getDF - getOF = krnl386.getOF - setCF = krnl386.setCF - setPF = krnl386.setPF - setAF = krnl386.setAF - setZF = krnl386.setZF - setSF = krnl386.setSF - setIF = krnl386.setIF - setDF = krnl386.setDF - setOF = krnl386.setOF - VDDInstallIOHook = krnl386.VDDInstallIOHook - VDDDeInstallIOHook = krnl386.VDDDeInstallIOHook - MGetVDMPointer = krnl386.MGetVDMPointer + getAL = krnl386.exe16.getAL + getAH = krnl386.exe16.getAH + getAX = krnl386.exe16.getAX + getEAX = krnl386.exe16.getEAX + getBL = krnl386.exe16.getBL + getBH = krnl386.exe16.getBH + getBX = krnl386.exe16.getBX + getEBX = krnl386.exe16.getEBX + getCL = krnl386.exe16.getCL + getCH = krnl386.exe16.getCH + getCX = krnl386.exe16.getCX + getECX = krnl386.exe16.getECX + getDL = krnl386.exe16.getDL + getDH = krnl386.exe16.getDH + getDX = krnl386.exe16.getDX + getEDX = krnl386.exe16.getEDX + getSP = krnl386.exe16.getSP + getESP = krnl386.exe16.getESP + getBP = krnl386.exe16.getBP + getEBP = krnl386.exe16.getEBP + getSI = krnl386.exe16.getSI + getESI = krnl386.exe16.getESI + getDI = krnl386.exe16.getDI + getEDI = krnl386.exe16.getEDI + setAL = krnl386.exe16.setAL + setAH = krnl386.exe16.setAH + setAX = krnl386.exe16.setAX + setEAX = krnl386.exe16.setEAX + setBL = krnl386.exe16.setBL + setBH = krnl386.exe16.setBH + setBX = krnl386.exe16.setBX + setEBX = krnl386.exe16.setEBX + setCL = krnl386.exe16.setCL + setCH = krnl386.exe16.setCH + setCX = krnl386.exe16.setCX + setECX = krnl386.exe16.setECX + setDL = krnl386.exe16.setDL + setDH = krnl386.exe16.setDH + setDX = krnl386.exe16.setDX + setEDX = krnl386.exe16.setEDX + setSP = krnl386.exe16.setSP + setESP = krnl386.exe16.setESP + setBP = krnl386.exe16.setBP + setEBP = krnl386.exe16.setEBP + setSI = krnl386.exe16.setSI + setESI = krnl386.exe16.setESI + setDI = krnl386.exe16.setDI + setEDI = krnl386.exe16.setEDI + getDS = krnl386.exe16.getDS + getES = krnl386.exe16.getES + getCS = krnl386.exe16.getCS + getSS = krnl386.exe16.getSS + getFS = krnl386.exe16.getFS + getGS = krnl386.exe16.getGS + setDS = krnl386.exe16.setDS + setES = krnl386.exe16.setES + setCS = krnl386.exe16.setCS + setSS = krnl386.exe16.setSS + setFS = krnl386.exe16.setFS + setGS = krnl386.exe16.setGS + getIP = krnl386.exe16.getIP + getEIP = krnl386.exe16.getEIP + setIP = krnl386.exe16.setIP + setEIP = krnl386.exe16.setEIP + getCF = krnl386.exe16.getCF + getPF = krnl386.exe16.getPF + getAF = krnl386.exe16.getAF + getZF = krnl386.exe16.getZF + getSF = krnl386.exe16.getSF + getIF = krnl386.exe16.getIF + getDF = krnl386.exe16.getDF + getOF = krnl386.exe16.getOF + setCF = krnl386.exe16.setCF + setPF = krnl386.exe16.setPF + setAF = krnl386.exe16.setAF + setZF = krnl386.exe16.setZF + setSF = krnl386.exe16.setSF + setIF = krnl386.exe16.setIF + setDF = krnl386.exe16.setDF + setOF = krnl386.exe16.setOF + VDDInstallIOHook = krnl386.exe16.VDDInstallIOHook + VDDDeInstallIOHook = krnl386.exe16.VDDDeInstallIOHook + MGetVdmPointer = krnl386.exe16.MGetVdmPointer diff --git a/ntvdm/ntvdm.dll.spec b/ntvdm/ntvdm.dll.spec index 969a00c335..8f931bfd6b 100644 --- a/ntvdm/ntvdm.dll.spec +++ b/ntvdm/ntvdm.dll.spec @@ -80,4 +80,4 @@ @ stdcall setOF(long) @ stdcall VDDInstallIOHook(long long ptr ptr) @ stdcall VDDDeInstallIOHook(long long ptr) -@ stdcall MGetVDMPointer(long long long) +@ stdcall MGetVdmPointer(long long long) diff --git a/ntvdm/ntvdm.vcxproj b/ntvdm/ntvdm.vcxproj index 62d3612833..32f3303074 100644 --- a/ntvdm/ntvdm.vcxproj +++ b/ntvdm/ntvdm.vcxproj @@ -50,9 +50,11 @@ true + .exe false + .exe From 590499d2ac43d50dd71c78f535c9433f48d1bf28 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 24 Oct 2024 19:16:45 -0500 Subject: [PATCH 68/95] try to fix cmake --- ntvdm/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ntvdm/CMakeLists.txt b/ntvdm/CMakeLists.txt index 0e8c5121fd..4cbad0c954 100644 --- a/ntvdm/CMakeLists.txt +++ b/ntvdm/CMakeLists.txt @@ -1,5 +1,5 @@ -file(GLOB SOURCE *.c *.cpp *.rc) -add_library(ntvdm SHARED ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/ntvdm.def) +file(GLOB SOURCE *.c) +add_library(ntvdm SHARED ${SOURCE} ntvdm.def) include_directories(../wine) add_definitions(-D_X86_ -D__WINESRC__ -D__i386__ -DHAVE_STRNCASECMP -DHAVE__STRNICMP -D_WINTERNL_ -DNtCurrentTeb=NtCurrentTeb__ -DDECLSPEC_HIDDEN= -Dstrncasecmp=_strnicmp) target_link_libraries(ntvdm krnl386) From 9ff4883e403db1bec75d10d4f26f7bb7f54bb3d3 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 24 Oct 2024 19:27:27 -0500 Subject: [PATCH 69/95] fix build again --- krnl386/ioports.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/krnl386/ioports.c b/krnl386/ioports.c index 5b01326db2..70f991214c 100644 --- a/krnl386/ioports.c +++ b/krnl386/ioports.c @@ -742,8 +742,8 @@ void DOSVM_setportcb(OUTPROC outproc, INPROC inproc, int port, OUTPROC *oldout, incb[port] = inproc; } -BOOL vdd_io_read(int port, int size, WORD *val); -BOOL vdd_io_write(int port, int size, WORD val); +BOOL vdd_io_read(int port, int size, WORD *val, CONTEXT *ctx); +BOOL vdd_io_write(int port, int size, WORD val, CONTEXT *ctx); /********************************************************************** * DOSVM_inport @@ -794,7 +794,7 @@ DWORD DOSVM_inport( int port, int size, CONTEXT* ctx ) res |= DOSVM_inport(port + 2, 2, ctx) << 16; return res; case 2: - if (!vdd_io_read(port, 2, &res)) + if (!vdd_io_read(port, 2, &res, ctx)) { res |= DOSVM_inport(port, 1, ctx); res |= DOSVM_inport(port + 1, 1, ctx) << 8; From 876de7ae4a5cba47ff012bdfa3f265a944095264 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 24 Oct 2024 19:47:25 -0500 Subject: [PATCH 70/95] more fix --- krnl386/vdd.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/krnl386/vdd.c b/krnl386/vdd.c index 743b6a1af5..722c1d96b0 100644 --- a/krnl386/vdd.c +++ b/krnl386/vdd.c @@ -82,15 +82,15 @@ void vdd_req(char func, CONTEXT *context) } } -#define GET_LO_BYTE_REG(reg) ((BYTE)(last_context ? last_context->##reg : 0)) -#define GET_HI_BYTE_REG(reg) ((BYTE)((last_context ? last_context->##reg : 0) >> 8)) -#define GET_WORD_REG(reg) ((WORD)(last_context ? last_context->##reg : 0)) -#define GET_DWORD_REG(reg) (last_context ? last_context->##reg : 0) - -#define SET_LO_BYTE_REG(reg, val) { if (last_context) last_context->##reg = ((last_context->##reg & ~0xff) | val); } -#define SET_HI_BYTE_REG(reg, val) { if (last_context) last_context->##reg = ((last_context->##reg & ~0xff00) | (val << 8)); } -#define SET_WORD_REG(reg, val) { if (last_context) last_context->##reg = ((last_context->##reg & ~0xffff) | val); } -#define SET_DWORD_REG(reg, val) { if (last_context) last_context->##reg = val; } +#define GET_LO_BYTE_REG(reg) ((BYTE)(last_context ? last_context->reg : 0)) +#define GET_HI_BYTE_REG(reg) ((BYTE)((last_context ? last_context->reg : 0) >> 8)) +#define GET_WORD_REG(reg) ((WORD)(last_context ? last_context->reg : 0)) +#define GET_DWORD_REG(reg) (last_context ? last_context->reg : 0) + +#define SET_LO_BYTE_REG(reg, val) { if (last_context) last_context->reg = ((last_context->reg & ~0xff) | val); } +#define SET_HI_BYTE_REG(reg, val) { if (last_context) last_context->reg = ((last_context->reg & ~0xff00) | (val << 8)); } +#define SET_WORD_REG(reg, val) { if (last_context) last_context->reg = ((last_context->reg & ~0xffff) | val); } +#define SET_DWORD_REG(reg, val) { if (last_context) last_context->reg = val; } #define GET_FLAG(bit) (last_context ? (last_context->EFlags >> bit) & 1 : 0) #define SET_FLAG(bit, val) { if (last_context) last_context->EFlags = ((last_context->EFlags & ~(1 << bit)) | ((val & 1) << bit)); } From f837ec1458426015a5515b03fce54caab5905c81 Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 14 Nov 2024 14:44:44 -0600 Subject: [PATCH 71/95] DC_PAPERS returns an array of WORDs --- winspool/winspool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winspool/winspool.c b/winspool/winspool.c index c950cd4a66..a429565465 100644 --- a/winspool/winspool.c +++ b/winspool/winspool.c @@ -186,7 +186,7 @@ DWORD WINAPI DeviceCapabilities16(LPCSTR pDevice, LPCSTR pPort, WORD fwCapabilit DWORD papers_count = DeviceCapabilitiesA(pDevice, pPort, DC_PAPERS, pOutput, pDevMode ? (LPDEVMODEA)&devmode32[0] : NULL); if (papers_count == -1) return -1; - LPDWORD papers = (LPDWORD)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(WORD)); + LPWORD papers = (LPDWORD)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(WORD)); DWORD i, j = 0; char (*names)[CCHPAPERNAME16] = !pOutput ? NULL : (char(*)[CCHPAPERNAME16])HeapAlloc(GetProcessHeap(), 0, papers_count * CCHPAPERNAME16 * sizeof(char)); char (*names16)[CCHPAPERNAME16] = (char(*)[CCHPAPERNAME16])pOutput; @@ -211,7 +211,7 @@ DWORD WINAPI DeviceCapabilities16(LPCSTR pDevice, LPCSTR pPort, WORD fwCapabilit case DC_PAPERSIZE: { DWORD papers_count = DeviceCapabilitiesA(pDevice, pPort, DC_PAPERS, pOutput, pDevMode ? (LPDEVMODEA)&devmode32[0] : NULL); - LPDWORD papers = (LPDWORD)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(WORD)); + LPWORD papers = (LPDWORD)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(WORD)); DWORD i, j = 0; LPPOINT points32 = !pOutput ? NULL : (LPPOINT)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(POINT)); LPPOINT16 points16 = (LPPOINT16)pOutput; From c9dfdddbd3249702d34593b2222839cbbc05097a Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 5 Dec 2024 16:18:51 -0600 Subject: [PATCH 72/95] don't pass output to devicecapabilities when getting the count --- winspool/winspool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winspool/winspool.c b/winspool/winspool.c index a429565465..0b12d6931f 100644 --- a/winspool/winspool.c +++ b/winspool/winspool.c @@ -183,7 +183,7 @@ DWORD WINAPI DeviceCapabilities16(LPCSTR pDevice, LPCSTR pPort, WORD fwCapabilit } case DC_PAPERNAMES: { - DWORD papers_count = DeviceCapabilitiesA(pDevice, pPort, DC_PAPERS, pOutput, pDevMode ? (LPDEVMODEA)&devmode32[0] : NULL); + DWORD papers_count = DeviceCapabilitiesA(pDevice, pPort, DC_PAPERS, NULL, pDevMode ? (LPDEVMODEA)&devmode32[0] : NULL); if (papers_count == -1) return -1; LPWORD papers = (LPDWORD)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(WORD)); @@ -210,7 +210,7 @@ DWORD WINAPI DeviceCapabilities16(LPCSTR pDevice, LPCSTR pPort, WORD fwCapabilit } case DC_PAPERSIZE: { - DWORD papers_count = DeviceCapabilitiesA(pDevice, pPort, DC_PAPERS, pOutput, pDevMode ? (LPDEVMODEA)&devmode32[0] : NULL); + DWORD papers_count = DeviceCapabilitiesA(pDevice, pPort, DC_PAPERS, NULL, pDevMode ? (LPDEVMODEA)&devmode32[0] : NULL); LPWORD papers = (LPDWORD)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(WORD)); DWORD i, j = 0; LPPOINT points32 = !pOutput ? NULL : (LPPOINT)HeapAlloc(GetProcessHeap(), 0, papers_count * sizeof(POINT)); From 6374dee3699cd86eab0c9c1bc183de35b14a395e Mon Sep 17 00:00:00 2001 From: cracyc Date: Thu, 5 Dec 2024 16:26:33 -0600 Subject: [PATCH 73/95] fix deadlock in wordperfect 6.1 --- user/window.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/user/window.c b/user/window.c index 82f3e6c96b..4b7c6d3197 100644 --- a/user/window.c +++ b/user/window.c @@ -1754,6 +1754,14 @@ LONG WINAPI SetWindowLong16( HWND16 hwnd16, INT16 offset, LONG newval ) } else if (offset == GWL_HWNDPARENT) return (SetWindowLongA(WIN_Handle32(hwnd), offset, HWND_32(newval))); + else if (offset == GWL_STYLE) // WPWIN61 + { + DWORD count; + ReleaseThunkLock(&count); + LONG ret = SetWindowLongA( hwnd, offset, newval ); + RestoreThunkLock(count); + return ret; + } /*else*/ return SetWindowLongA( hwnd, offset, newval ); } From d7be868b784a92f60a7f2206c0e2cebd0144f056 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 9 Dec 2024 09:22:30 -0600 Subject: [PATCH 74/95] check for null pointer in gettextmetrics --- gdi/gdi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gdi/gdi.c b/gdi/gdi.c index 5ee56195f5..b00c8ce7d6 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -2566,6 +2566,8 @@ BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *tm ) { TEXTMETRICA tm32; + if (!tm) return FALSE; + if (!GetTextMetricsA( HDC_32(hdc), &tm32 )) return FALSE; tm->tmHeight = tm32.tmHeight; From 9fdd48ea53b65d6faae329f0aa7b2db7b4d1c43d Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 9 Dec 2024 12:55:43 -0600 Subject: [PATCH 75/95] ne hseg must be a handle not a selector --- krnl386/ne_segment.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/krnl386/ne_segment.c b/krnl386/ne_segment.c index 29ff8f178f..1d758a68c7 100644 --- a/krnl386/ne_segment.c +++ b/krnl386/ne_segment.c @@ -1096,8 +1096,7 @@ BOOL NE_CreateSegment( NE_MODULE *pModule, int segnum, WORD sel ) if (pSeg->flags & NE_SEGFLAGS_32BIT) selflags |= WINE_LDT_FLAGS_32BIT; if (pModule->ne_expver < 0x300 && !(pModule->ne_flags & NE_FFLAGS_BUILTIN)) selflags &= ~WINE_LDT_FLAGS_32BIT; - pSeg->hSeg = sel ? sel : AllocSelector16(0); - GLOBAL_Alloc( NE_Ne2MemFlags(pSeg->flags), minsize, pModule->self, selflags, pSeg->hSeg ); + pSeg->hSeg = GLOBAL_Alloc( NE_Ne2MemFlags(pSeg->flags), minsize, pModule->self, selflags, sel ? sel : AllocSelector16(0) ); GLOBAL_SetSeg(pSeg->hSeg, segnum, (pSeg->flags & NE_SEGFLAGS_DATA) ? 2 : 3); if (!pSeg->hSeg) return FALSE; From 75a9efc83ace3c33e815c9edda53d57e41f5c544 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 13 Dec 2024 19:16:43 -0600 Subject: [PATCH 76/95] don't use initialized memory as a pointer --- mmsystem/mci16.c | 2 +- msvideo/msvideo16.c | 2 ++ vm86/msdos.cpp | 48 ++++++++++++++++++++++----------------------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/mmsystem/mci16.c b/mmsystem/mci16.c index 82a2141193..a8097fb657 100644 --- a/mmsystem/mci16.c +++ b/mmsystem/mci16.c @@ -967,7 +967,7 @@ DWORD WINAPI mciSendCommand16(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD if (dwParam1 & MCI_BREAK_HWND) data |= mbp16->hwndBreak << 16; } - BOOL ret = mciSetYieldProc(wDevID, check_break, mbp16->hwndBreak << 16 | mbp16->nVirtKey); + BOOL ret = mciSetYieldProc(wDevID, check_break, data); return ret ? 0 : MCIERR_INVALID_DEVICE_ID; } case MCI_PLAY: diff --git a/msvideo/msvideo16.c b/msvideo/msvideo16.c index 7714487534..c357a5ac77 100644 --- a/msvideo/msvideo16.c +++ b/msvideo/msvideo16.c @@ -1060,6 +1060,7 @@ BOOL add_module(DWORD fccType, DWORD fccHandler, HMODULE16 hmod) void remove_module(DWORD fccType, DWORD fccHandler, BOOL unload) { HMODULE16 hmod; + if (!MSVIDEO_drv) return; for (int i = 0; i < 10; i++) { if ((MSVIDEO_drv[i].fccType == fccType) && (MSVIDEO_drv[i].fccHandler == fccHandler)) @@ -1078,6 +1079,7 @@ void remove_module(DWORD fccType, DWORD fccHandler, BOOL unload) void remove_all_modules() { + if (!MSVIDEO_drv) return; for (int i = 0; i < 10; i++) { if (MSVIDEO_drv[i].hmod) diff --git a/vm86/msdos.cpp b/vm86/msdos.cpp index 83324006ab..00f9f78f86 100644 --- a/vm86/msdos.cpp +++ b/vm86/msdos.cpp @@ -486,53 +486,53 @@ extern "C" void load_context(CONTEXT *context); // i/o bus UINT8 read_io_byte(offs_t addr) { - CONTEXT *ctx; - save_context(ctx); - UINT8 ret = (UINT8)DOSVM_inport(addr, 1, ctx); - load_context(ctx); + CONTEXT ctx; + save_context(&ctx); + UINT8 ret = (UINT8)DOSVM_inport(addr, 1, &ctx); + load_context(&ctx); return ret; } UINT16 read_io_word(offs_t addr) { - CONTEXT *ctx; - save_context(ctx); - UINT16 ret = (UINT16)DOSVM_inport(addr, 2, ctx); - load_context(ctx); + CONTEXT ctx; + save_context(&ctx); + UINT16 ret = (UINT16)DOSVM_inport(addr, 2, &ctx); + load_context(&ctx); return ret; } UINT32 read_io_dword(offs_t addr) { - CONTEXT *ctx; - save_context(ctx); - UINT32 ret = DOSVM_inport(addr, 4, ctx); - load_context(ctx); + CONTEXT ctx; + save_context(&ctx); + UINT32 ret = DOSVM_inport(addr, 4, &ctx); + load_context(&ctx); return ret; } void write_io_byte(offs_t addr, UINT8 val) { - CONTEXT *ctx; - save_context(ctx); - DOSVM_outport(addr, 1, val, ctx); - load_context(ctx); + CONTEXT ctx; + save_context(&ctx); + DOSVM_outport(addr, 1, val, &ctx); + load_context(&ctx); } void write_io_word(offs_t addr, UINT16 val) { - CONTEXT *ctx; - save_context(ctx); - DOSVM_outport(addr, 2, val, ctx); - load_context(ctx); + CONTEXT ctx; + save_context(&ctx); + DOSVM_outport(addr, 2, val, &ctx); + load_context(&ctx); } void write_io_dword(offs_t addr, UINT32 val) { - CONTEXT *ctx; - save_context(ctx); - DOSVM_outport(addr, 4, val, ctx); - load_context(ctx); + CONTEXT ctx; + save_context(&ctx); + DOSVM_outport(addr, 4, val, &ctx); + load_context(&ctx); } #undef min #undef max From c13df21be892658080ddc3001c146b008dd55bb1 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 13 Dec 2024 16:04:43 -0600 Subject: [PATCH 77/95] work around change in 24h2 forcing ws_ex_windowedge on 3.1 windows --- user/window.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/user/window.c b/user/window.c index 4b7c6d3197..00744fe516 100644 --- a/user/window.c +++ b/user/window.c @@ -62,6 +62,7 @@ void WINAPI K32WOWHandle16Destroy(HANDLE handle, WOW_HANDLE_TYPE type); void WINAPI K32WOWHandle16DestroyHint(HANDLE handle, WOW_HANDLE_TYPE type); BOOL16 WINAPI IsOldWindowsTask(HINSTANCE16 hInst); BYTE get_aflags(HMODULE16 hModule); +ULONG WINAPI get_windows_build(); /* size of buffer needed to store an atom string */ #define ATOM_BUFFER_SIZE 256 @@ -3137,6 +3138,7 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, HWND hwnd; BOOL release = FALSE; DWORD count; + BOOL fix_windowedge = FALSE; if (instance == NULL) { @@ -3172,6 +3174,16 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, if (((style & 0xf) == BS_USERBUTTON) && !(style & 0xc0) && !stricmp(className, "Button")) style |= 0x10; // BS_USERBUTTON support hack + // work around WS_EX_WINDOWEDGE 3.10 compat breakage in Windows 11 24H2 + // must be done after create because otherwise both windowedge and staticedge get set + // even though they are supposed to be mutually exclusive + if (get_windows_build() >= 26100) + { + if (((style & (WS_CAPTION | WS_SIZEBOX)) == WS_CAPTION) && !(style & WS_CHILD) && !(exStyle && (WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE)) && + (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) + fix_windowedge = TRUE; + } + /* Create the window */ cs.lpCreateParams = data; @@ -3232,6 +3244,14 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, ERR("Could not create window(%08x,\"%s\"(\"%s\"),\"%s\",%08x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%08x)\n", exStyle, IS_INTRESOURCE(className) ? "(ATOM)" : className, cs.lpszClass, windowName, style, x, y, width, height, parent, menu, instance, data); return NULL; } + + if (fix_windowedge) + { + DWORD curexstyle = GetWindowLongA(hwnd, GWL_EXSTYLE); + if (curexstyle & WS_EX_WINDOWEDGE) + SetWindowLongA(hwnd, GWL_EXSTYLE, (curexstyle & ~WS_EX_WINDOWEDGE) | WS_EX_STATICEDGE); + } + HWND16 hWnd16 = HWND_16(hwnd); InitWndProc16(hwnd, hWnd16); SetWindowHInst16(hWnd16, instance); From 4cf20e1920f9542dddbdaf27250f0c854604f105 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 14 Dec 2024 19:35:41 -0600 Subject: [PATCH 78/95] expand the client area over the border to make it one px wide --- user/message.c | 20 +++++++++++++++++++- user/window.c | 10 +--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/user/message.c b/user/message.c index a3f918678d..52d23733cd 100644 --- a/user/message.c +++ b/user/message.c @@ -70,6 +70,7 @@ When EDIT received WM_KILLFOCUS, EDIT sent this message to COMBOBOX. WINE_DEFAULT_DEBUG_CHANNEL(msg); WINE_DECLARE_DEBUG_CHANNEL(message); BOOL is_win_menu_disallowed(DWORD style); +ULONG WINAPI get_windows_build(); DWORD USER16_AlertableWait = 0; static UINT aviwnd_msg = 0; static void *aviwnd_cwp; @@ -2038,7 +2039,6 @@ static HICON16 get_default_icon(HINSTANCE16 inst) #include "../mmsystem/winemm16.h" void InitWndProc16(HWND hWnd, HWND16 hWnd16); -ULONG WINAPI get_windows_build(); /********************************************************************** * WINPROC_CallProc32ATo16 * @@ -2218,6 +2218,17 @@ LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT NCCALCSIZE_PARAMS *nc32 = (NCCALCSIZE_PARAMS *)lParam; NCCALCSIZE_PARAMS16 nc; WINDOWPOS16 winpos; + BOOL fixborder = FALSE; + if (get_windows_build() >= 26100) + { + DWORD exstyle = GetWindowLong(hwnd, GWL_EXSTYLE); + if ((exstyle & WS_EX_STATICEDGE) && (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) + { + if (exstyle & WS_EX_WINDOWEDGE) + SetWindowLong(hwnd, GWL_EXSTYLE, exstyle & ~WS_EX_WINDOWEDGE); + fixborder = TRUE; + } + } RECT32to16( &nc32->rgrc[0], &nc.rgrc[0] ); if (wParam) @@ -2230,6 +2241,13 @@ LRESULT WINPROC_CallProc32ATo16( winproc_callback16_t callback, HWND hwnd, UINT lParam = MapLS( &nc ); ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg ); UnMapLS( lParam ); + if (fixborder) + { + nc.rgrc[0].top--; + nc.rgrc[0].left--; + nc.rgrc[0].bottom++; + nc.rgrc[0].right++; + } RECT16to32( &nc.rgrc[0], &nc32->rgrc[0] ); if (wParam) { diff --git a/user/window.c b/user/window.c index 00744fe516..3e1f7eeb39 100644 --- a/user/window.c +++ b/user/window.c @@ -3138,7 +3138,6 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, HWND hwnd; BOOL release = FALSE; DWORD count; - BOOL fix_windowedge = FALSE; if (instance == NULL) { @@ -3181,7 +3180,7 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, { if (((style & (WS_CAPTION | WS_SIZEBOX)) == WS_CAPTION) && !(style & WS_CHILD) && !(exStyle && (WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE)) && (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) - fix_windowedge = TRUE; + exStyle |= WS_EX_STATICEDGE; } /* Create the window */ @@ -3245,13 +3244,6 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, return NULL; } - if (fix_windowedge) - { - DWORD curexstyle = GetWindowLongA(hwnd, GWL_EXSTYLE); - if (curexstyle & WS_EX_WINDOWEDGE) - SetWindowLongA(hwnd, GWL_EXSTYLE, (curexstyle & ~WS_EX_WINDOWEDGE) | WS_EX_STATICEDGE); - } - HWND16 hWnd16 = HWND_16(hwnd); InitWndProc16(hwnd, hWnd16); SetWindowHInst16(hWnd16, instance); From d0468b71d27662fe5e3bc645697216a9ffce4339 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 17 Dec 2024 21:39:53 -0600 Subject: [PATCH 79/95] fix listbox creation --- user/message.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/user/message.c b/user/message.c index 52d23733cd..156e7c5abd 100644 --- a/user/message.c +++ b/user/message.c @@ -1551,6 +1551,7 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1 CLIENTCREATESTRUCT c32; BOOL mdichild = GetWindowLongW(hwnd32, GWL_EXSTYLE) & WS_EX_MDICHILD ? TRUE : FALSE; BOOL mdiclient = is_mdiclient(hwnd, hwnd32) || (call_window_proc_callback == callback && is_mdiclient_wndproc(arg)); + BOOL fixlistbox = (get_windows_build() >= 26100) && (window_type_table[hwnd] == (BYTE)WINDOW_TYPE_LISTBOX) && (msg == WM_CREATE); CREATESTRUCT16to32A( hwnd32, cs16, &cs ); if (mdichild) @@ -1566,7 +1567,27 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1 c32.hWindowMenu = HMENU_32(c16->hWindowMenu); cs.lpCreateParams = (LPVOID)&c32; } + // some programs set ws_hscroll when they want ws_vscroll + // this appears to work in win31 but Windows 11 24H2 broke the compatbility + if (fixlistbox) + { + if (cs.style & WS_HSCROLL) + { + cs.style |= WS_VSCROLL; + SetWindowLongW(hwnd32, GWL_STYLE, cs.style); + } + } ret = callback( hwnd32, msg, wParam, (LPARAM)&cs, result, arg ); + // some programs expect the listbox to be resized in create + // again Windows 11 24H2 broke the compatbility + if (fixlistbox) + { + cs.x -= 1; + cs.y -= 1; + cs.cx += 2; + cs.cy += 2; + SetWindowPos(hwnd32, 0, cs.x, cs.y, cs.cx, cs.cy, SWP_NOZORDER); + } if (mdiclient || mdichild) cs.lpCreateParams = cs16->lpCreateParams; CREATESTRUCT32Ato16( hwnd32, &cs, cs16 ); From 120c9f8d066ef7dcf3b232f3fc74a14cac9d2289 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 27 Dec 2024 10:26:19 -0600 Subject: [PATCH 80/95] the bs_userbutton hack doesn't work on 24h2 so borrow from wine upstream --- user/message.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ user/window.c | 2 -- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/user/message.c b/user/message.c index 156e7c5abd..fd2d23574f 100644 --- a/user/message.c +++ b/user/message.c @@ -3788,6 +3788,7 @@ BOOL16 WINAPI TranslateMDISysAccel16( HWND16 hwndClient, LPMSG16 msg ) } + /*********************************************************************** * button_proc16 */ @@ -4856,6 +4857,80 @@ typedef struct HHOOK wndprocret; HHOOK cbt; } user_hook_data; + +static void UB_Message(HWND hwnd, HDC hDC, UINT action) +{ + RECT rc; + HBRUSH hBrush; + HFONT hFont; + HWND parent; + + GetClientRect(hwnd, &rc); + + if ((hFont = SendMessageW(hwnd, WM_GETFONT, 0, 0))) SelectObject(hDC, hFont); + + parent = GetParent(hwnd); + if (!parent) parent = hwnd; + hBrush = (HBRUSH)SendMessageW(parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd); + if (!hBrush) /* did the app forget to call defwindowproc ? */ + hBrush = (HBRUSH)DefWindowProcW(parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd); + + FillRect(hDC, &rc, hBrush); + if (action == BN_SETFOCUS) + DrawFocusRect(hDC, &rc); + + SendMessageW(parent, WM_COMMAND, MAKEWPARAM(GetWindowLongA(hwnd, GWLP_ID), action), hwnd); +} + +static LRESULT UB_WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) +{ + LRESULT ret = 0; + switch (umsg) + { + case WM_PAINT: + { + PAINTSTRUCT paint; + LONG style = GetWindowLongA(hwnd, GWL_STYLE); + LONG state = SendMessageW(hwnd, BM_GETSTATE, 0, 0); + HDC hDC = BeginPaint(hwnd, &paint); + UB_Message(hwnd, hDC, BN_PAINT); + if (state & BST_PUSHED) + UB_Message(hwnd, hDC, BN_PUSHED); + if (style & WS_DISABLED) + UB_Message(hwnd, hDC, BN_DISABLE); + EndPaint(hwnd, &paint); + break; + } + case WM_SETFOCUS: + { + HDC hdc = GetDC(hwnd); + UB_Message(hwnd, hdc, BN_SETFOCUS); + ReleaseDC(hwnd, hdc); + break; + } + case WM_KILLFOCUS: + { + HDC hdc = GetDC(hwnd); + UB_Message(hwnd, hdc, BN_KILLFOCUS); + ReleaseDC(hwnd, hdc); + break; + } + case WM_LBUTTONDBLCLK: + SendMessageW(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLongA(hwnd, GWLP_ID), BN_DOUBLECLICKED), hwnd); + break; + default: + { + WNDPROC origwndproc = (WNDPROC)GetPropA(hwnd, "origwndproc"); + if (origwndproc) + ret = origwndproc(hwnd, umsg, wparam, lparam); + else + ret = DefWindowProcW(hwnd, umsg, wparam, lparam); + break; + } + } + return ret; +} + LRESULT CALLBACK CBTHook(int nCode, WPARAM wParam, LPARAM lParam) { user_hook_data *hd = (user_hook_data*)TlsGetValue(hhook_tls_index); @@ -4884,6 +4959,11 @@ LRESULT CALLBACK CBTHook(int nCode, WPARAM wParam, LPARAM lParam) { SetWindowLongA(hWnd, GWL_HINSTANCE, 0); } + if ((window_type_table[HWND_16(hWnd)] == (BYTE)WINDOW_TYPE_BUTTON) && ((create->lpcs->style & BS_TYPEMASK) == BS_USERBUTTON)) + { + WNDPROC origwndproc = SetWindowLongW(hWnd, GWL_WNDPROC, UB_WndProc); + SetPropA(hWnd, "origwndproc", (HANDLE)origwndproc); + } } else if((nCode == HCBT_MINMAX) && (lParam == SW_MAXIMIZE) && (GetWindowLongA(wParam, GWL_STYLE) & WS_MAXIMIZE)) SetPropA(wParam, "WindowMaximized", 1); diff --git a/user/window.c b/user/window.c index 3e1f7eeb39..ae4e2d9f28 100644 --- a/user/window.c +++ b/user/window.c @@ -3170,8 +3170,6 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, if ((style & (WS_CAPTION | WS_SIZEBOX)) == (WS_CAPTION | WS_SIZEBOX)) style |= WS_MINIMIZEBOX | WS_MAXIMIZEBOX; } - if (((style & 0xf) == BS_USERBUTTON) && !(style & 0xc0) && !stricmp(className, "Button")) - style |= 0x10; // BS_USERBUTTON support hack // work around WS_EX_WINDOWEDGE 3.10 compat breakage in Windows 11 24H2 // must be done after create because otherwise both windowedge and staticedge get set From b9ffdd15138cebb1d58d8eb50312536bd8b56e3d Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 27 Dec 2024 10:31:11 -0600 Subject: [PATCH 81/95] be consistent --- user/message.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/message.c b/user/message.c index fd2d23574f..76b23d52ba 100644 --- a/user/message.c +++ b/user/message.c @@ -4879,7 +4879,7 @@ static void UB_Message(HWND hwnd, HDC hDC, UINT action) if (action == BN_SETFOCUS) DrawFocusRect(hDC, &rc); - SendMessageW(parent, WM_COMMAND, MAKEWPARAM(GetWindowLongA(hwnd, GWLP_ID), action), hwnd); + SendMessageW(parent, WM_COMMAND, MAKEWPARAM(GetWindowLongW(hwnd, GWLP_ID), action), hwnd); } static LRESULT UB_WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) @@ -4890,7 +4890,7 @@ static LRESULT UB_WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) case WM_PAINT: { PAINTSTRUCT paint; - LONG style = GetWindowLongA(hwnd, GWL_STYLE); + LONG style = GetWindowLongW(hwnd, GWL_STYLE); LONG state = SendMessageW(hwnd, BM_GETSTATE, 0, 0); HDC hDC = BeginPaint(hwnd, &paint); UB_Message(hwnd, hDC, BN_PAINT); @@ -4916,7 +4916,7 @@ static LRESULT UB_WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) break; } case WM_LBUTTONDBLCLK: - SendMessageW(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLongA(hwnd, GWLP_ID), BN_DOUBLECLICKED), hwnd); + SendMessageW(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLongW(hwnd, GWLP_ID), BN_DOUBLECLICKED), hwnd); break; default: { From 2038c585d58a2a5339c2c299f5555832cda33611 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 27 Dec 2024 12:50:38 -0600 Subject: [PATCH 82/95] oops --- user/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/window.c b/user/window.c index ae4e2d9f28..3bd00fbbe8 100644 --- a/user/window.c +++ b/user/window.c @@ -3176,7 +3176,7 @@ HWND16 WINAPI CreateWindowEx16( DWORD exStyle, LPCSTR className, // even though they are supposed to be mutually exclusive if (get_windows_build() >= 26100) { - if (((style & (WS_CAPTION | WS_SIZEBOX)) == WS_CAPTION) && !(style & WS_CHILD) && !(exStyle && (WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE)) && + if (((style & (WS_CAPTION | WS_SIZEBOX)) == WS_CAPTION) && !(style & WS_CHILD) && !(exStyle & (WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE)) && (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) exStyle |= WS_EX_STATICEDGE; } From 207ac342eaa06de3b26e781c38bbb75f6be111ac Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 27 Dec 2024 20:09:12 -0600 Subject: [PATCH 83/95] remove userbutton hack from dialog too --- user/dialog.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/user/dialog.c b/user/dialog.c index d9ba60c77c..b4bb390d38 100644 --- a/user/dialog.c +++ b/user/dialog.c @@ -141,12 +141,7 @@ static LPCSTR DIALOG_GetControl16( LPCSTR p, DLG_CONTROL_INFO *info ) { switch((BYTE)*p) { - case 0x80: strcpy( buffer, "BUTTON" ); - // this is undocumented but makes BS_USERBUTTON work - // BS_ICON and BS_BITMAP work without it - if (((info->style & 0xf) == BS_USERBUTTON) && !(info->style & 0xc0)) - info->style |= 0x10; - break; + case 0x80: strcpy( buffer, "BUTTON" ); break; case 0x81: strcpy( buffer, "EDIT" ); break; case 0x82: strcpy( buffer, "STATIC" ); break; case 0x83: strcpy( buffer, "LISTBOX" ); break; From 83a9fe941e96f09d404dd4e9c4baf12b4b091ba3 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 27 Dec 2024 21:48:32 -0600 Subject: [PATCH 84/95] wm_querydragicon isn't sent to mdi childs in 24h2 so do it in wm_ncpaint this doesn't quite behave like windows used to so tweaking may be needed --- user/message.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/user/message.c b/user/message.c index 76b23d52ba..591c6ca1b7 100644 --- a/user/message.c +++ b/user/message.c @@ -1898,9 +1898,22 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1 case WM_SIZECLIPBOARD: FIXME_(msg)( "message %04x needs translation\n", msg ); break; - case WM_NCPAINT: + case WM_NCPAINT: + if ((get_windows_build() >= 26100) && (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) + { + LONG style = GetWindowLongA(hwnd32, GWL_STYLE); + if ((style & (WS_CHILD | WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) == (WS_CHILD | WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) + { + HICON icon = SendMessageA(hwnd32, WM_GETICON, ICON_SMALL, 0); + if (!icon) + { + icon = SendMessageA(hwnd32, WM_QUERYDRAGICON, 0, 0); + if (icon) SendMessageA(hwnd32, WM_SETICON, ICON_SMALL, icon); + } + } + } ret = callback(hwnd32, msg, (WPARAM)HRGN_32(wParam), lParam, result, arg); - break; + break; case WM_ERASEBKGND: ret = callback(hwnd32, msg, (WPARAM)HDC_32(wParam), lParam, result, arg); break; From df19301b35e2f1b94d1c950707998117166f28eb Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 28 Dec 2024 12:53:58 -0600 Subject: [PATCH 85/95] also for top level captioned windows --- user/message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/message.c b/user/message.c index 591c6ca1b7..75cab4bd68 100644 --- a/user/message.c +++ b/user/message.c @@ -1902,7 +1902,7 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1 if ((get_windows_build() >= 26100) && (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) { LONG style = GetWindowLongA(hwnd32, GWL_STYLE); - if ((style & (WS_CHILD | WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) == (WS_CHILD | WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) + if ((style & (WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) == (WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) { HICON icon = SendMessageA(hwnd32, WM_GETICON, ICON_SMALL, 0); if (!icon) From 9dd0f17f2a95acc88bb623afcd0e11c66cdb9f4a Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 28 Dec 2024 19:01:11 -0600 Subject: [PATCH 86/95] WSCAPTION == WS_BORDER | WS_DLGFRAME --- user/message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/message.c b/user/message.c index 75cab4bd68..a73eb35752 100644 --- a/user/message.c +++ b/user/message.c @@ -1902,7 +1902,7 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1 if ((get_windows_build() >= 26100) && (GetExpWinVer16(GetExePtr(GetCurrentTask())) < 0x400)) { LONG style = GetWindowLongA(hwnd32, GWL_STYLE); - if ((style & (WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) == (WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_CAPTION)) + if ((style & (WS_SYSMENU | WS_CAPTION)) == (WS_SYSMENU | WS_CAPTION)) { HICON icon = SendMessageA(hwnd32, WM_GETICON, ICON_SMALL, 0); if (!icon) From 6508835b4831896212bad37ffce3fc1ec7a13584 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 3 Jan 2025 12:34:09 -0600 Subject: [PATCH 87/95] handle fix-compat-mode before ntvdm64 --- otvdm/winevdm.c | 70 ++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/otvdm/winevdm.c b/otvdm/winevdm.c index ceb0d2c2b8..670079d85b 100644 --- a/otvdm/winevdm.c +++ b/otvdm/winevdm.c @@ -741,6 +741,41 @@ int entry_point( int argc, char *argv[] ) "\"A --ntvdm64: \"full-dos-path\A.EXE\" --ntvdm64-args \" 1 2 3 4" =>"\"A\" \"full-dos-path\A.EXE\" --ntvdm64-args 1 2 3 4" */ + if (!strcmp(argv[0], "--fix-compat-mode")) + { + pid = atoi(argv[1]); + WINE_ERR("parent pid = %d\n", pid); + argv += 2; + argc -= 2; + compat_success = TRUE; + } + //compatible mode + else if ((!compat_success + +#ifdef FIX_COMPAT_MODE + || 1 +#endif + ) +#ifdef SET_COMPAT_LAYER + && getenv("__COMPAT_LAYER") == NULL +#endif + ) + { +#ifdef SET_COMPAT_LAYER + WINE_ERR("Set compatible mode to VistaRTM\n"); +#else + WINE_ERR("Spawn a child process to apply compatible flags.\n"); +#endif + if (fix_compatible()) + { + return 0; + } + else + { + WINE_ERR("failed"); + } + } + if (cmdline1) { LPWSTR raw = GetCommandLineW(); @@ -795,41 +830,6 @@ int entry_point( int argc, char *argv[] ) argv[argc] = NULL; - if (!strcmp(argv[0], "--fix-compat-mode")) - { - pid = atoi(argv[1]); - WINE_ERR("parent pid = %d\n", pid); - argv += 2; - argc -= 2; - compat_success = TRUE; - } - //compatible mode - else if ((!compat_success - -#ifdef FIX_COMPAT_MODE - || 1 -#endif - ) -#ifdef SET_COMPAT_LAYER - && getenv("__COMPAT_LAYER") == NULL -#endif - ) - { -#ifdef SET_COMPAT_LAYER - WINE_ERR("Set compatible mode to VistaRTM\n"); -#else - WINE_ERR("Spawn a child process to apply compatible flags.\n"); -#endif - if (fix_compatible()) - { - return 0; - } - else - { - WINE_ERR("failed"); - } - } - if (!argv[1]) usage(); if (!strcmp( argv[1], "--app-name" )) From 4329695ad768668d78c40a4df1b6cba9b06dc727 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 6 Jan 2025 21:04:57 -0600 Subject: [PATCH 88/95] dialogbox should return -1 if the dialog resource isn't found and settimer minimum is 55ms --- user/dialog.c | 4 ++-- user/window.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/user/dialog.c b/user/dialog.c index d9ba60c77c..b5bb9137a3 100644 --- a/user/dialog.c +++ b/user/dialog.c @@ -1009,8 +1009,8 @@ INT16 WINAPI DialogBoxParam16( HINSTANCE16 hInst, LPCSTR template, SEGPTR data; int ret = -1; - if (!(hRsrc = FindResource16( hInst, template, (LPSTR)RT_DIALOG ))) return 0; - if (!(hmem = LoadResource16( hInst, hRsrc ))) return 0; + if (!(hRsrc = FindResource16( hInst, template, (LPSTR)RT_DIALOG ))) return -1; + if (!(hmem = LoadResource16( hInst, hRsrc ))) return -1; if ((data = WOWGlobalLock16( hmem ))) { HWND owner = WIN_Handle32(owner16); diff --git a/user/window.c b/user/window.c index 4b7c6d3197..2864e564ae 100644 --- a/user/window.c +++ b/user/window.c @@ -356,6 +356,7 @@ UINT16 WINAPI SetTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout, TIMERPROC16 pr { TIMERPROC proc32; UINT ret; + timeout = timeout < 55 ? 55 : timeout; if (proc == NULL) { return SetTimer(WIN_Handle32(hwnd), id, timeout, NULL); From f73208af75e6276ae697c303f512bbafa38ec0bc Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 10 Jan 2025 21:15:57 -0600 Subject: [PATCH 89/95] handle blts to 8bit dibs better --- gdi/gdi.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++----- user/user.c | 33 +++++++++++++++++---- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index b00c8ce7d6..2e14665ac6 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -41,6 +41,7 @@ #include #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define DIBINDEX(n) MAKELONG((n),0x10FF) WINE_DEFAULT_DEBUG_CHANNEL(gdi); @@ -1183,22 +1184,52 @@ BOOL16 WINAPI StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, HDC hdcdst32 = HDC_32(hdcDst); if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdcsrc32, TECHNOLOGY) == DT_RASDISPLAY)) { - DIBSECTION dib; + DIBSECTION dib, dibdst; HBITMAP hbmp = GetCurrentObject(hdcsrc32, OBJ_BITMAP); int count = GetObject(hbmp, sizeof(DIBSECTION), &dib); + HBITMAP hbmpdst = GetCurrentObject(hdcdst32, OBJ_BITMAP); + int countdst = GetObject(hbmpdst, sizeof(DIBSECTION), &dibdst); + BOOL srcdib, dstdib; + if ((count == sizeof(DIBSECTION)) && (dib.dsBmih.biBitCount == 8) && !dib.dshSection && (GetPtr16(HBITMAP_16(hbmp), 1) == 0xd1b00001)) + srcdib = TRUE; + if ((countdst == sizeof(DIBSECTION)) && (dibdst.dsBmih.biBitCount == 8) && !dibdst.dshSection && (GetPtr16(HBITMAP_16(hbmpdst), 1) == 0xd1b00001)) + dstdib = TRUE; + + if (srcdib && (GetObjectType(hdcdst32) == OBJ_DC)) { HPALETTE realpal = get_realized_palette(); if (realpal != GetStockObject(DEFAULT_PALETTE)) { HPALETTE oldpal = SelectPalette(hdcsrc32, realpal, FALSE); set_dib_colors(hdcsrc32); - BOOL ret = StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); + BOOL16 ret = StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); SelectPalette(hdcsrc32, oldpal, FALSE); set_dib_colors(hdcsrc32); return ret; } } + if (dstdib && (dib.dsBm.bmBitsPixel == 1)) + { + // make sure that when a mono bitmap is combined with a 8bpp dib, fg color is 0 and bg color is 0xff + COLORREF txcolor = SetTextColor(hdcdst32, DIBINDEX(0)); + COLORREF bkcolor = SetBkColor(hdcdst32, DIBINDEX(255)); + BOOL16 ret = StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); + SetTextColor(hdcdst32, txcolor); + SetBkColor(hdcdst32, bkcolor); + return ret; + } + if (srcdib && (dibdst.dsBm.bmBitsPixel == 1)) + { + COLORREF txcolor = GetTextColor(hdcsrc32); + COLORREF bkcolor = GetBkColor(hdcsrc32); + if ((txcolor >> 24) == 1) SetTextColor(hdcsrc32, DIBINDEX(txcolor & 0xff)); + if ((bkcolor >> 24) == 1) SetBkColor(hdcsrc32, DIBINDEX(bkcolor & 0xff)); + BOOL16 ret = StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); + SetTextColor(hdcsrc32, txcolor); + SetBkColor(hdcsrc32, bkcolor); + return ret; + } } return StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); } @@ -1537,7 +1568,7 @@ HGDIOBJ16 WINAPI SelectObject16( HDC16 hdc, HGDIOBJ16 handle ) HGDIOBJ handle32 = HGDIOBJ_32(handle); HGDIOBJ result = SelectObject( hdc32, handle32 ); DWORD type = GetObjectType(handle32); - if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && result && (type == OBJ_BITMAP)) + if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && result && (type == OBJ_BITMAP) && (GetCurrentObject(hdc32, OBJ_PAL) != GetStockObject(DEFAULT_PALETTE))) { DIBSECTION dib; int count = GetObject(handle32, sizeof(DIBSECTION), &dib); @@ -1593,6 +1624,7 @@ HBITMAP16 WINAPI CreateBitmap16( INT16 width, INT16 height, UINT16 planes, } ret = HBITMAP_16(ret32); } + ReleaseDC(NULL, dc); return ret; } else if ((planes == 1) && (bpp > 8)) @@ -1693,6 +1725,8 @@ HDC16 WINAPI CreateCompatibleDC16( HDC16 hdc ) HDC hdc32 = CreateCompatibleDC( HDC_32(hdc) ); if (IsOldWindowsTask(GetCurrentTask()) && !(get_aflags(GetExePtr(GetCurrentTask())) & NE_AFLAGS_WIN2_PROTMODE) && (GetCurrentObject(hdc32, OBJ_FONT) == GetStockObject(SYSTEM_FONT))) SelectObject(hdc32, GetStockObject(SYSTEM_FIXED_FONT)); + if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY)) + SelectPalette(hdc32, get_realized_palette(), FALSE); return HDC_16(hdc32); } @@ -2069,6 +2103,8 @@ void delete_dib_driver(HDC hdc) BOOL16 WINAPI DeleteDC16( HDC16 hdc ) { HDC hdc32 = HDC_32(hdc); + if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY)) + SelectPalette(hdc32, GetStockObject(DEFAULT_PALETTE), FALSE); if (DeleteDC( hdc32 )) { struct saved_visrgn *saved, *next; @@ -3700,6 +3736,12 @@ INT16 WINAPI UpdateColors16( HDC16 hdc ) return TRUE; } +static WINAPI paint_all_windows(HWND hwnd, LPARAM lparam) +{ + InvalidateRect(hwnd, NULL, FALSE); + RedrawWindow(hwnd, NULL, NULL, RDW_UPDATENOW); + return FALSE; +} /*********************************************************************** * AnimatePalette (GDI.367) @@ -3712,7 +3754,9 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, if (GetPtr16(hpalette, 1)) { DWORD *dclist = GetPtr16(hpalette, 1); - AnimatePalette(hpal32, StartIndex + 10, NumEntries, PaletteColors); + if (StartIndex < 10) StartIndex = 10; + + AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); for (int i = 0; i < 20; i++) { if (dclist[i]) @@ -3739,6 +3783,8 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, } } } + if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (hpal32 == get_realized_palette())) + EnumThreadWindows(GetCurrentThreadId(), paint_all_windows, NULL); } else AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); @@ -4024,7 +4070,8 @@ INT16 WINAPI StretchDIBits16( HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst, const BITMAPINFO *info, UINT16 wUsage, DWORD dwRop ) { BITMAPINFO *bmp = NULL; - HBITMAP16 ret; + INT16 ret; + HDC hdc32 = HDC_32(hdc); if ((info->bmiHeader.biCompression == BI_RLE4) || (info->bmiHeader.biCompression == BI_RLE8)) { int hdrsize = info->bmiHeader.biSize + ((info->bmiHeader.biClrUsed ? info->bmiHeader.biClrUsed : @@ -4034,7 +4081,29 @@ INT16 WINAPI StretchDIBits16( HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst, memcpy(bmp, info, hdrsize); bmp->bmiHeader.biSizeImage = rle_size(info->bmiHeader.biCompression, bits); } - ret = StretchDIBits( HDC_32(hdc), xDst, yDst, widthDst, heightDst, + else if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY) && (info->bmiHeader.biBitCount == 8)) // this doesn't support RLE8 right now + { + DIBSECTION dib; + HBITMAP hbmp = GetCurrentObject(hdc32, OBJ_BITMAP); + int count = GetObject(hbmp, sizeof(DIBSECTION), &dib); + if ((count == sizeof(DIBSECTION)) && (dib.dsBmih.biBitCount == 8) && !dib.dshSection && (GetPtr16(HBITMAP_16(hbmp), 1) == 0xd1b00001)) + { + char *section; + HPALETTE hpal = GetCurrentObject(hdc32, OBJ_PAL); + HBITMAP hbmpsrc = CreateDIBSection(hdc32, info, wUsage, §ion, NULL, 0); + HDC hdcsrc = CreateCompatibleDC(hdc32); + HPALETTE oldpal = SelectPalette(hdcsrc, hpal, FALSE); + HBITMAP oldbmp = SelectObject(hdcsrc, hbmpsrc); + memcpy(section, bits, ((info->bmiHeader.biWidth + 3) & ~3) * (ySrc + heightSrc)); + INT16 ret = StretchBlt(hdc32, xDst, yDst, widthDst, heightDst, hdcsrc, xSrc, ySrc, widthSrc, heightSrc, dwRop); + SelectPalette(hdcsrc, oldpal, FALSE); + SelectObject(hdcsrc, oldbmp); + DeleteObject(hbmpsrc); + DeleteDC(hdcsrc); + return ret; + } + } + ret = StretchDIBits( hdc32, xDst, yDst, widthDst, heightDst, xSrc, ySrc, widthSrc, heightSrc, bits, bmp ? bmp : info, wUsage, dwRop ); if (bmp) @@ -4083,7 +4152,7 @@ INT16 WINAPI SetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan, } } BITMAPINFO *bmp = NULL; - HBITMAP16 ret; + INT16 ret; if (((info->bmiHeader.biCompression == BI_RLE4) || (info->bmiHeader.biCompression == BI_RLE8)) && !info->bmiHeader.biSizeImage) { int hdrsize = info->bmiHeader.biSize + ((info->bmiHeader.biClrUsed ? info->bmiHeader.biClrUsed : diff --git a/user/user.c b/user/user.c index 657babaad6..5d1a15fc94 100644 --- a/user/user.c +++ b/user/user.c @@ -902,16 +902,39 @@ INT16 WINAPI FillRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush ) HDC hd = HDC_32(hdc); int ret = FillRect(hd, &r32, hb); return ret;*/ - HBRUSH prevBrush; + HBRUSH prevBrush; + HBRUSH hbrush32 = HBRUSH_32(hbrush); + HDC hdc32 = HDC_32(hdc); + + if (!(prevBrush = SelectObject( hdc32, hbrush32 ))) return 0; + + if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY)) + { + DIBSECTION dib; + HBITMAP hbmp = GetCurrentObject(hdc32, OBJ_BITMAP); + int count = GetObject(hbmp, sizeof(DIBSECTION), &dib); + if ((count == sizeof(DIBSECTION)) && (dib.dsBmih.biBitCount == 8) && !dib.dshSection && (GetPtr16(HBITMAP_16(hbmp), 1) == 0xd1b00001)) + { + LOGBRUSH lb; + count = GetObject(hbrush32, sizeof(LOGBRUSH), &lb); + if ((count == sizeof(LOGBRUSH)) && (lb.lbStyle == BS_SOLID) && ((lb.lbColor >> 24) == 1)) + { + HBRUSH newbrush = CreateSolidBrush((lb.lbColor & 0xff) | 0x10ff0000); + SelectObject( hdc32, newbrush ); + PatBlt( hdc32, rect->left, rect->top, + rect->right - rect->left, rect->bottom - rect->top, PATCOPY ); + SelectObject( hdc32, prevBrush ); + return 1; + } + } + } /* coordinates are logical so we cannot fast-check 'rect', * it will be done later in the PatBlt(). */ - - if (!(prevBrush = SelectObject( HDC_32(hdc), HBRUSH_32(hbrush) ))) return 0; - PatBlt( HDC_32(hdc), rect->left, rect->top, + PatBlt( hdc32, rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top, PATCOPY ); - SelectObject( HDC_32(hdc), prevBrush ); + SelectObject( hdc32, prevBrush ); return 1; } From 262f71fafd89e22573aeb1594893db94c4843f56 Mon Sep 17 00:00:00 2001 From: cracyc Date: Fri, 10 Jan 2025 21:20:43 -0600 Subject: [PATCH 90/95] delete brush --- user/user.c | 1 + 1 file changed, 1 insertion(+) diff --git a/user/user.c b/user/user.c index 5d1a15fc94..036c25973d 100644 --- a/user/user.c +++ b/user/user.c @@ -924,6 +924,7 @@ INT16 WINAPI FillRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush ) PatBlt( hdc32, rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top, PATCOPY ); SelectObject( hdc32, prevBrush ); + DeleteObject( newbrush ); return 1; } } From 77fe1980547cc549583ed3863a43963ea9f0d92d Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 11 Jan 2025 16:10:59 -0600 Subject: [PATCH 91/95] handle setpalettentries like animatepalette --- gdi/gdi.c | 82 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 2e14665ac6..001cc8336e 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -3716,6 +3716,46 @@ UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, return GetPaletteEntries( HPALETTE_32(hpalette), start, count, entries ); } +static WINAPI paint_all_windows(HWND hwnd, LPARAM lparam) +{ + InvalidateRect(hwnd, NULL, FALSE); + RedrawWindow(hwnd, NULL, NULL, RDW_UPDATENOW); + return FALSE; +} + +BOOL update_palette(HPALETTE16 hpalette) +{ + HPALETTE hpal32 = HPALETTE_32(hpalette); + DWORD *dclist = GetPtr16(hpalette, 1); + for (int i = 0; i < 20; i++) + { + if (dclist[i]) + { + HDC hdc32 = HDC_32(dclist[i] & 0xffff); + if (!GetObjectType(hdc32) || (GetCurrentObject(hdc32, OBJ_PAL) != hpal32)) + { + dclist[i] = 0; + continue; + } + if (WindowFromDC(hdc32)) + { + HWND hwnd = WindowFromDC(hdc32); + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); + } + else if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE)) + { + DIBSECTION dib; + HBITMAP bitmap = GetCurrentObject(hdc32, OBJ_BITMAP); + int ret = GetObject(bitmap, sizeof(DIBSECTION), &dib); + if ((ret == sizeof(DIBSECTION)) && (dib.dsBmih.biBitCount == 8) && !dib.dshSection && (GetPtr16(HBITMAP_16(bitmap), 1) == 0xd1b00001)) + set_dib_colors(hdc32); + } + } + } + if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (hpal32 == get_realized_palette())) + EnumThreadWindows(GetCurrentThreadId(), paint_all_windows, NULL); +} /*********************************************************************** * SetPaletteEntries (GDI.364) @@ -3723,7 +3763,9 @@ UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, UINT16 WINAPI SetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, UINT16 count, const PALETTEENTRY *entries ) { - return SetPaletteEntries( HPALETTE_32(hpalette), start, count, entries ); + UINT16 ret = SetPaletteEntries( HPALETTE_32(hpalette), start, count, entries ); + if (GetPtr16(hpalette, 1)) update_palette(hpalette); + return ret; } @@ -3736,13 +3778,6 @@ INT16 WINAPI UpdateColors16( HDC16 hdc ) return TRUE; } -static WINAPI paint_all_windows(HWND hwnd, LPARAM lparam) -{ - InvalidateRect(hwnd, NULL, FALSE); - RedrawWindow(hwnd, NULL, NULL, RDW_UPDATENOW); - return FALSE; -} - /*********************************************************************** * AnimatePalette (GDI.367) */ @@ -3753,38 +3788,9 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, if (GetObjectType(hpal32) != OBJ_PAL) return; if (GetPtr16(hpalette, 1)) { - DWORD *dclist = GetPtr16(hpalette, 1); if (StartIndex < 10) StartIndex = 10; - AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); - for (int i = 0; i < 20; i++) - { - if (dclist[i]) - { - HDC hdc32 = HDC_32(dclist[i] & 0xffff); - if (!GetObjectType(hdc32) || (GetCurrentObject(hdc32, OBJ_PAL) != hpal32)) - { - dclist[i] = 0; - continue; - } - if (WindowFromDC(hdc32)) - { - HWND hwnd = WindowFromDC(hdc32); - InvalidateRect(hwnd, NULL, FALSE); - UpdateWindow(hwnd); - } - else if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE)) - { - DIBSECTION dib; - HBITMAP bitmap = GetCurrentObject(hdc32, OBJ_BITMAP); - int ret = GetObject(bitmap, sizeof(DIBSECTION), &dib); - if ((ret == sizeof(DIBSECTION)) && (dib.dsBmih.biBitCount == 8) && !dib.dshSection && (GetPtr16(HBITMAP_16(bitmap), 1) == 0xd1b00001)) - set_dib_colors(hdc32); - } - } - } - if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (hpal32 == get_realized_palette())) - EnumThreadWindows(GetCurrentThreadId(), paint_all_windows, NULL); + update_palette(hpalette); } else AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); From a9aebc5c24037d20de9db9c09919e4e3a2c35af3 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 13 Jan 2025 20:47:45 -0600 Subject: [PATCH 92/95] better handle blts to and from the screen so if the palette doesn't contain the system colors the realized palette should have them inserted for the first 10 entries --- gdi/gdi.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 001cc8336e..7aca00b8b5 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -120,7 +120,58 @@ static void set_dib_colors(HDC hdc) } SetDIBColorTable(hdc, 0, 256, &pal); } - + +// if the first 10 colors in the palette are not +// the system colors then the colors need to be shifted +// (1 color if syspaluse == SYSPAL_NOSTATIC); +static void set_dib_colors_for_screen(HDC hdc) +{ + PALETTEENTRY pal[256] = {0}; + PALETTEENTRY syspal[10]; + if (syspaluse == SYSPAL_NOSTATIC256) return set_dib_colors(hdc); + int syscolors = syspaluse == SYSPAL_STATIC ? 10 : 1; + int skip = 0; + GetSystemPaletteEntries(hdc, 0, syscolors, &syspal); + GetPaletteEntries(GetCurrentObject(hdc, OBJ_PAL), 0, 256, &pal); + for (int i = 0; i < syscolors; i++) + { + if (((DWORD *)syspal)[i] != ((DWORD *)pal)[i]) + { + skip = syscolors; + break; + } + } + PALETTEENTRY tmp; + for (int i = 255 - skip; i >= 0; i--) + { + tmp.peBlue = pal[i].peRed; + tmp.peGreen = pal[i].peGreen; + tmp.peRed = pal[i].peBlue; + pal[i + skip].peRed = tmp.peRed; + pal[i + skip].peGreen = tmp.peGreen; + pal[i + skip].peBlue = tmp.peBlue; + } + for (int i = 0; i < skip; i++) + { + pal[i].peBlue = syspal[i].peRed; + pal[i].peGreen = syspal[i].peGreen; + pal[i].peRed = syspal[i].peBlue; + } + SetDIBColorTable(hdc, 0, 256, &pal); +} + +// hack so pirates won't read from the screen when to palette is blank +static BOOL is_blank_palette(HPALETTE hpal) +{ + PALETTEENTRY pal[236]; + int count = GetPaletteEntries(hpal, 0, 236, &pal); + for (int i = 0; i < count; i++) + { + if (((DWORD *)pal)[i] & 0xffffff) + return FALSE; + } + return TRUE; +} /* * ############################################################################ @@ -1202,13 +1253,27 @@ BOOL16 WINAPI StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, if (realpal != GetStockObject(DEFAULT_PALETTE)) { HPALETTE oldpal = SelectPalette(hdcsrc32, realpal, FALSE); - set_dib_colors(hdcsrc32); + set_dib_colors_for_screen(hdcsrc32); BOOL16 ret = StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); SelectPalette(hdcsrc32, oldpal, FALSE); set_dib_colors(hdcsrc32); return ret; } } + if (dstdib && (GetObjectType(hdcsrc32) == OBJ_DC)) + { + HPALETTE realpal = get_realized_palette(); + if (realpal != GetStockObject(DEFAULT_PALETTE)) + { + if (is_blank_palette(realpal)) return 0; + HPALETTE oldpal = SelectPalette(hdcdst32, realpal, FALSE); + set_dib_colors_for_screen(hdcdst32); + BOOL16 ret = StretchBlt(hdcdst32, xDst, yDst, widthDst, heightDst, hdcsrc32, xSrc, ySrc, widthSrc, heightSrc, rop); + SelectPalette(hdcdst32, oldpal, FALSE); + set_dib_colors(hdcdst32); + return ret; + } + } if (dstdib && (dib.dsBm.bmBitsPixel == 1)) { // make sure that when a mono bitmap is combined with a 8bpp dib, fg color is 0 and bg color is 0xff @@ -3719,7 +3784,7 @@ UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, static WINAPI paint_all_windows(HWND hwnd, LPARAM lparam) { InvalidateRect(hwnd, NULL, FALSE); - RedrawWindow(hwnd, NULL, NULL, RDW_UPDATENOW); + UpdateWindow(hwnd); return FALSE; } @@ -3786,14 +3851,8 @@ void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, { HPALETTE hpal32 = HPALETTE_32(hpalette); if (GetObjectType(hpal32) != OBJ_PAL) return; - if (GetPtr16(hpalette, 1)) - { - if (StartIndex < 10) StartIndex = 10; - AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); - update_palette(hpalette); - } - else - AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); + AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); + if (GetPtr16(hpalette, 1)) update_palette(hpalette); } From 44321ca7ccadf364733ae7d0fef503b74893cca8 Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 20 Jan 2025 22:05:34 -0600 Subject: [PATCH 93/95] make dc list resizable and use realized palette in createdibitmap --- gdi/gdi.c | 30 ++++++++++++++++++------------ user/user.c | 20 ++++++++++++++++---- user/user.def | 1 + user/user.exe16.spec | 1 + 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/gdi/gdi.c b/gdi/gdi.c index 7aca00b8b5..46f32fe33f 100644 --- a/gdi/gdi.c +++ b/gdi/gdi.c @@ -160,7 +160,7 @@ static void set_dib_colors_for_screen(HDC hdc) SetDIBColorTable(hdc, 0, 256, &pal); } -// hack so pirates won't read from the screen when to palette is blank +// hack so pirates won't read from the screen when the palette is blank static BOOL is_blank_palette(HPALETTE hpal) { PALETTEENTRY pal[236]; @@ -1782,6 +1782,7 @@ HBITMAP16 WINAPI CreateCompatibleBitmap16( HDC16 hdc, INT16 width, INT16 height BOOL16 WINAPI IsOldWindowsTask(HINSTANCE16 hInst); BYTE get_aflags(HMODULE16 hModule); +HPALETTE16 WINAPI SelectPalette16(HDC16 hdc, HPALETTE16 hpal, BOOL16 bForceBackground); /*********************************************************************** * CreateCompatibleDC (GDI.52) */ @@ -1791,7 +1792,7 @@ HDC16 WINAPI CreateCompatibleDC16( HDC16 hdc ) if (IsOldWindowsTask(GetCurrentTask()) && !(get_aflags(GetExePtr(GetCurrentTask())) & NE_AFLAGS_WIN2_PROTMODE) && (GetCurrentObject(hdc32, OBJ_FONT) == GetStockObject(SYSTEM_FONT))) SelectObject(hdc32, GetStockObject(SYSTEM_FIXED_FONT)); if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE) && (GetDeviceCaps(hdc32, TECHNOLOGY) == DT_RASDISPLAY)) - SelectPalette(hdc32, get_realized_palette(), FALSE); + SelectPalette16(HDC_16(hdc32), HPALETTE_16(get_realized_palette()), FALSE); return HDC_16(hdc32); } @@ -3783,16 +3784,16 @@ UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start, static WINAPI paint_all_windows(HWND hwnd, LPARAM lparam) { - InvalidateRect(hwnd, NULL, FALSE); - UpdateWindow(hwnd); + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); return FALSE; } BOOL update_palette(HPALETTE16 hpalette) { HPALETTE hpal32 = HPALETTE_32(hpalette); + if (GetObjectType(hpal32) != OBJ_PAL) return; DWORD *dclist = GetPtr16(hpalette, 1); - for (int i = 0; i < 20; i++) + for (int i = 1; i < dclist[0]; i++) { if (dclist[i]) { @@ -3805,8 +3806,7 @@ BOOL update_palette(HPALETTE16 hpalette) if (WindowFromDC(hdc32)) { HWND hwnd = WindowFromDC(hdc32); - InvalidateRect(hwnd, NULL, FALSE); - UpdateWindow(hwnd); + RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW); } else if (krnl386_get_config_int("otvdm", "DIBPalette", FALSE)) { @@ -3849,9 +3849,7 @@ INT16 WINAPI UpdateColors16( HDC16 hdc ) void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex, UINT16 NumEntries, const PALETTEENTRY* PaletteColors) { - HPALETTE hpal32 = HPALETTE_32(hpalette); - if (GetObjectType(hpal32) != OBJ_PAL) return; - AnimatePalette(hpal32, StartIndex, NumEntries, PaletteColors); + AnimatePalette(HPALETTE_32(hpalette), StartIndex, NumEntries, PaletteColors); if (GetPtr16(hpalette, 1)) update_palette(hpalette); } @@ -4270,8 +4268,16 @@ HBITMAP16 WINAPI CreateDIBitmap16( HDC16 hdc, const BITMAPINFOHEADER * header, } if (krnl386_get_compat_mode("256color") && krnl386_get_config_int("otvdm", "DIBPalette", FALSE)) { - ret = CreateCompatibleBitmap16(hdc, header->biWidth, header->biHeight); - SetDIBits(HDC_32(hdc), HBITMAP_32(ret), 0, data->bmiHeader.biHeight, bits, bmp ? bmp : data, coloruse); + HDC16 hdc2 = CreateCompatibleDC16(hdc); + HDC hdc232 = HDC_32(hdc2); + ret = CreateCompatibleBitmap16(hdc2, header->biWidth, header->biHeight); + HBITMAP hbmp = HDC_32(ret); + HBITMAP oldbmp = SelectObject(hdc232, hbmp); + if (GetObjectType(HDC_32(hdc)) == OBJ_DC) + set_dib_colors_for_screen(hdc232); + SetDIBits(hdc232, hbmp, 0, data->bmiHeader.biHeight, bits, bmp ? bmp : data, coloruse); + SelectObject(hdc232, oldbmp); + DeleteDC16(hdc2); } else ret = HBITMAP_16( CreateDIBitmap( HDC_32(hdc), header, init, bits, bmp ? bmp : data, coloruse ) ); diff --git a/user/user.c b/user/user.c index 036c25973d..18914a555a 100644 --- a/user/user.c +++ b/user/user.c @@ -2259,17 +2259,29 @@ HPALETTE16 WINAPI SelectPalette16( HDC16 hdc, HPALETTE16 hpal, BOOL16 bForceBack if (!dclist) { dclist = (WORD *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 20 * sizeof(DWORD)); + dclist[0] = 20; SetPtr16(hpal, dclist, 1); } - for (int i = 0; i < 20; i++) +retry: + for (int i = 1; i < dclist[0]; i++) { if ((!dclist[i] || !GetObjectType(HDC_32(dclist[i])) || (GetCurrentObject(HDC_32(dclist[i]), OBJ_PAL) != hpal32)) && (found == -1)) found = i; if ((dclist[i] & 0xffff) == hdc) - found = i; - } + found = i; + } if (found == -1) - ERR("No space in pal->dc list hpal: %x\n", hpal); + { + if (dclist[0] < 100) + { + dclist = (WORD *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dclist, (dclist[0] + 20) * sizeof(DWORD)); + dclist[0] = dclist[0] + 20; + SetPtr16(hpal, dclist, 1); + goto retry; + } + else + ERR("pal->dc list growing too large\n", hpal); + } else if (found != -2) dclist[found] = (DWORD)hdc | (bForceBackground << 16); diff --git a/user/user.def b/user/user.def index d42a5783fc..0158c60e73 100644 --- a/user/user.def +++ b/user/user.def @@ -6,6 +6,7 @@ EXPORTS _wine_spec_dos_header @1 DATA;=.L__wine_spec_dos_header @1 DATA PRIVATE CreateIcon16 @2 CreateIconFromResourceEx16 + SelectPalette16 dialog_template16_to_template32 DIALOG_CallDialogProc __wine_call_wndproc diff --git a/user/user.exe16.spec b/user/user.exe16.spec index c6d39d86f7..0b307dc26d 100644 --- a/user/user.exe16.spec +++ b/user/user.exe16.spec @@ -588,6 +588,7 @@ # @ stdcall -arch=win32 CreateIcon16(long long long long long ptr ptr) @ stdcall -arch=win32 CreateIconFromResourceEx16(ptr long long long long long long) +@ stdcall -arch=win32 SelectPalette16(long long long) @ stdcall -arch=win32 dialog_template16_to_template32(long long ptr ptr) @ stdcall -arch=win32 DIALOG_CallDialogProc(ptr long ptr ptr ptr) @ stdcall -arch=win32 __wine_call_wndproc(long long long long long) From 764f3b55d533d54876f3d439669813eaabb0d174 Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 22 Jan 2025 08:55:44 -0600 Subject: [PATCH 94/95] fix vdd port io --- krnl386/vdd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/krnl386/vdd.c b/krnl386/vdd.c index 722c1d96b0..168a86dcce 100644 --- a/krnl386/vdd.c +++ b/krnl386/vdd.c @@ -550,7 +550,7 @@ BOOL WINAPI VDDInstallIOHook(HANDLE hvdd, WORD cPortRange, PVDD_IO_PORTRANGE pPo memcpy(&vdd_io[found].io_funcs, IOhandler, sizeof(VDD_IO_HANDLERS)); vdd_io[found].io_range_len = cPortRange; vdd_io[found].io_range = (PVDD_IO_PORTRANGE)HeapAlloc(GetProcessHeap(), 0, cPortRange * sizeof(VDD_IO_PORTRANGE)); - memcpy(&vdd_io[found].io_range, pPortRange, cPortRange * sizeof(VDD_IO_PORTRANGE)); + memcpy(vdd_io[found].io_range, pPortRange, cPortRange * sizeof(VDD_IO_PORTRANGE)); return TRUE; } @@ -579,7 +579,7 @@ BOOL vdd_io_read(int port, int size, WORD *val, CONTEXT *ctx) { for (int j = 0; j < vdd_io[i].io_range_len; j++) { - if ((vdd_io[i].io_range[j].First >= port) && (vdd_io[i].io_range[j].Last <= port)) + if ((vdd_io[i].io_range[j].First <= port) && (vdd_io[i].io_range[j].Last >= port)) { last_context = ctx; switch (size) @@ -612,7 +612,7 @@ BOOL vdd_io_write(int port, int size, WORD val, CONTEXT *ctx) { for (int j = 0; j < vdd_io[i].io_range_len; j++) { - if ((vdd_io[i].io_range[j].First >= port) && (vdd_io[i].io_range[j].Last <= port)) + if ((vdd_io[i].io_range[j].First <= port) && (vdd_io[i].io_range[j].Last >= port)) { last_context = ctx; switch (size) From 8c8b77204035bffb6a702572d9683b6023c36a85 Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 19 Feb 2025 20:17:21 -0600 Subject: [PATCH 95/95] set in count value after 16bit mask --- krnl386/registry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/krnl386/registry.c b/krnl386/registry.c index 5b01b24853..256ba6d0a2 100644 --- a/krnl386/registry.c +++ b/krnl386/registry.c @@ -329,10 +329,10 @@ DWORD WINAPI RegEnumValue16( HKEY hkey, DWORD index, LPSTR value, LPDWORD val_co */ DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count ) { - DWORD incount = *count; if (!advapi32) init_func_ptrs(); fix_win16_hkey( &hkey ); if (count) *count &= 0xffff; + DWORD incount = *count; DWORD result = pRegQueryValueA( hkey, name, data, (LONG*) count ); if (result == ERROR_MORE_DATA) {