From 35c12315be734c622da30d12e08b76a6a985d935 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 28 Sep 2014 18:27:58 +0000 Subject: [PATCH] [IMM32] * Sync with Wine 1.7.27. CORE-8540 svn path=/trunk/; revision=64371 --- reactos/dll/win32/imm32/imm.c | 249 +++++++++++++++++++++++----------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 174 insertions(+), 77 deletions(-) diff --git a/reactos/dll/win32/imm32/imm.c b/reactos/dll/win32/imm32/imm.c index 78b2b90da5b..f3c76d22b89 100644 --- a/reactos/dll/win32/imm32/imm.c +++ b/reactos/dll/win32/imm32/imm.c @@ -35,6 +35,7 @@ #include #include #include +#include WINE_DEFAULT_DEBUG_CHANNEL(imm); @@ -75,8 +76,11 @@ typedef struct tagInputContextData ImmHkl *immKbd; UINT lastVK; + DWORD magic; } InputContextData; +#define WINE_IMC_VALID_MAGIC 0x56434D49 + typedef struct _tagTRANSMSG { UINT message; WPARAM wParam; @@ -243,35 +247,36 @@ static void IMM_FreeThreadData(void) } } -static HMODULE LoadDefaultWineIME(void) +static HMODULE load_graphics_driver(void) { - char buffer[MAX_PATH], libname[32], *name, *next; - HMODULE module = 0; - HKEY hkey; - - TRACE("Attempting to fall back to wine default IME\n"); - - strcpy( buffer, "x11" ); /* default value */ - /* @@ Wine registry key: HKCU\Software\Wine\Drivers */ - if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Drivers", &hkey )) - { - DWORD type, count = sizeof(buffer); - RegQueryValueExA( hkey, "Ime", 0, &type, (LPBYTE) buffer, &count ); - RegCloseKey( hkey ); - } - - name = buffer; - while (name) - { - next = strchr( name, ',' ); - if (next) *next++ = 0; + static const WCHAR display_device_guid_propW[] = { + '_','_','w','i','n','e','_','d','i','s','p','l','a','y','_', + 'd','e','v','i','c','e','_','g','u','i','d',0 }; + static const WCHAR key_pathW[] = { + 'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\', + 'V','i','d','e','o','\\','{',0}; + static const WCHAR displayW[] = {'}','\\','0','0','0','0',0}; + static const WCHAR driverW[] = {'G','r','a','p','h','i','c','s','D','r','i','v','e','r',0}; - snprintf( libname, sizeof(libname), "wine%s.drv", name ); - if ((module = LoadLibraryA( libname )) != 0) break; - name = next; - } - - return module; + HMODULE ret = 0; + HKEY hkey; + DWORD size; + WCHAR path[MAX_PATH]; + WCHAR key[(sizeof(key_pathW) + sizeof(displayW)) / sizeof(WCHAR) + 40]; + UINT guid_atom = HandleToULong( GetPropW( GetDesktopWindow(), display_device_guid_propW )); + + if (!guid_atom) return 0; + memcpy( key, key_pathW, sizeof(key_pathW) ); + if (!GlobalGetAtomNameW( guid_atom, key + strlenW(key), 40 )) return 0; + strcatW( key, displayW ); + if (RegOpenKeyW( HKEY_LOCAL_MACHINE, key, &hkey )) return 0; + size = sizeof(path); + if (!RegQueryValueExW( hkey, driverW, NULL, NULL, (BYTE *)path, &size )) ret = LoadLibraryW( path ); + RegCloseKey( hkey ); + TRACE( "%s %p\n", debugstr_w(path), ret ); + return ret; } /* ImmHkl loading and freeing */ @@ -294,8 +299,7 @@ static ImmHkl *IMM_GetImmHkl(HKL hkl) ptr->hkl = hkl; if (ImmGetIMEFileNameW(hkl, filename, MAX_PATH)) ptr->hIME = LoadLibraryW(filename); - if (!ptr->hIME) - ptr->hIME = LoadDefaultWineIME(); + if (!ptr->hIME) ptr->hIME = load_graphics_driver(); if (ptr->hIME) { LOAD_FUNCPTR(ImeInquire); @@ -452,16 +456,34 @@ static HIMCC ImmCreateBlankCompStr(void) return rc; } +static InputContextData* get_imc_data(HIMC hIMC) +{ + InputContextData *data = hIMC; + + if (hIMC == NULL) + return NULL; + + if(IsBadReadPtr(data, sizeof(InputContextData)) || data->magic != WINE_IMC_VALID_MAGIC) + { + SetLastError(ERROR_INVALID_HANDLE); + return NULL; + } + return data; +} + /*********************************************************************** * ImmAssociateContext (IMM32.@) */ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) { HIMC old = NULL; - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p):\n", hWnd, hIMC); + if(hIMC && !data) + return NULL; + if (!IMM_GetThreadData()->defaultContext) IMM_GetThreadData()->defaultContext = ImmCreateContext(); @@ -642,6 +664,7 @@ HIMC WINAPI ImmCreateContext(void) InputContextData *new_context; LPGUIDELINE gl; LPCANDIDATEINFO ci; + int i; new_context = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputContextData)); @@ -669,9 +692,15 @@ HIMC WINAPI ImmCreateContext(void) gl->dwSize = sizeof(GUIDELINE); ImmUnlockIMCC(new_context->IMC.hGuideLine); + for (i = 0; i < sizeof(new_context->IMC.cfCandForm) / sizeof(CANDIDATEFORM); i++) + new_context->IMC.cfCandForm[i].dwIndex = ~0u; + /* Initialize the IME Private */ new_context->IMC.hPrivate = ImmCreateIMCC(new_context->immKbd->imeInfo.dwPrivateDataSize); + new_context->IMC.fdwConversion = new_context->immKbd->imeInfo.fdwConversionCaps; + new_context->IMC.fdwSentence = new_context->immKbd->imeInfo.fdwSentenceCaps; + if (!new_context->immKbd->pImeSelect(new_context, TRUE)) { TRACE("Selection of IME failed\n"); @@ -683,29 +712,32 @@ HIMC WINAPI ImmCreateContext(void) new_context->immKbd->uSelected++; TRACE("Created context %p\n",new_context); + new_context->magic = WINE_IMC_VALID_MAGIC; return new_context; } static BOOL IMM_DestroyContext(HIMC hIMC) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("Destroying %p\n",hIMC); - if (hIMC) - { - data->immKbd->uSelected --; - data->immKbd->pImeSelect(hIMC, FALSE); - SendMessageW(data->IMC.hWnd, WM_IME_SELECT, FALSE, (LPARAM)GetKeyboardLayout(0)); + if (!data) + return FALSE; - ImmDestroyIMCC(data->IMC.hCompStr); - ImmDestroyIMCC(data->IMC.hCandInfo); - ImmDestroyIMCC(data->IMC.hGuideLine); - ImmDestroyIMCC(data->IMC.hPrivate); - ImmDestroyIMCC(data->IMC.hMsgBuf); + data->immKbd->uSelected --; + data->immKbd->pImeSelect(hIMC, FALSE); + SendMessageW(data->IMC.hWnd, WM_IME_SELECT, FALSE, (LPARAM)GetKeyboardLayout(0)); + + ImmDestroyIMCC(data->IMC.hCompStr); + ImmDestroyIMCC(data->IMC.hCandInfo); + ImmDestroyIMCC(data->IMC.hGuideLine); + ImmDestroyIMCC(data->IMC.hPrivate); + ImmDestroyIMCC(data->IMC.hMsgBuf); + + data->magic = 0; + HeapFree(GetProcessHeap(),0,data); - HeapFree(GetProcessHeap(),0,data); - } return TRUE; } @@ -885,7 +917,7 @@ DWORD WINAPI ImmGetCandidateListA( HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); LPCANDIDATEINFO candinfo; LPCANDIDATELIST candlist; DWORD ret = 0; @@ -924,7 +956,7 @@ done: DWORD WINAPI ImmGetCandidateListCountA( HIMC hIMC, LPDWORD lpdwListCount) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); LPCANDIDATEINFO candinfo; DWORD ret, count; @@ -956,7 +988,7 @@ DWORD WINAPI ImmGetCandidateListCountA( DWORD WINAPI ImmGetCandidateListCountW( HIMC hIMC, LPDWORD lpdwListCount) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); LPCANDIDATEINFO candinfo; DWORD ret, count; @@ -989,7 +1021,7 @@ DWORD WINAPI ImmGetCandidateListW( HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); LPCANDIDATEINFO candinfo; LPCANDIDATELIST candlist; DWORD ret = 0; @@ -1028,7 +1060,7 @@ done: BOOL WINAPI ImmGetCandidateWindow( HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("%p, %d, %p\n", hIMC, dwIndex, lpCandidate); @@ -1038,6 +1070,9 @@ BOOL WINAPI ImmGetCandidateWindow( if ( dwIndex >= (sizeof(data->IMC.cfCandForm) / sizeof(CANDIDATEFORM)) ) return FALSE; + if (data->IMC.cfCandForm[dwIndex].dwIndex != dwIndex) + return FALSE; + *lpCandidate = data->IMC.cfCandForm[dwIndex]; return TRUE; @@ -1068,7 +1103,7 @@ BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf) */ BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p):\n", hIMC, lplf); @@ -1247,7 +1282,7 @@ static LONG ImmGetCompositionStringT( HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL unicode) { LONG rc = 0; - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); LPCOMPOSITIONSTRING compstr; LPBYTE compdata; @@ -1359,7 +1394,7 @@ LONG WINAPI ImmGetCompositionStringW( */ BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lpCompForm); @@ -1367,7 +1402,7 @@ BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm) return FALSE; *lpCompForm = data->IMC.cfCompForm; - return 1; + return TRUE; } /*********************************************************************** @@ -1486,7 +1521,7 @@ DWORD WINAPI ImmGetConversionListW( BOOL WINAPI ImmGetConversionStatus( HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("%p %p %p\n", hIMC, lpfdwConversion, lpfdwSentence); @@ -1526,6 +1561,8 @@ UINT WINAPI ImmGetDescriptionA( /* find out how many characters in the unicode buffer */ len = ImmGetDescriptionW( hKL, NULL, 0 ); + if (!len) + return 0; /* allocate a buffer of that size */ buf = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof (WCHAR) ); @@ -1541,7 +1578,10 @@ UINT WINAPI ImmGetDescriptionA( HeapFree( GetProcessHeap(), 0, buf ); - return len; + if (len == 0) + return 0; + + return len - 1; } /*********************************************************************** @@ -1553,6 +1593,7 @@ UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen) FIXME("(%p, %p, %d): semi stub\n", hKL, lpszDescription, uBufLen); + if (!hKL) return 0; if (!uBufLen) return lstrlenW( name ); lstrcpynW( lpszDescription, name, uBufLen ); return lstrlenW( lpszDescription ); @@ -1667,7 +1708,7 @@ UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen) */ BOOL WINAPI ImmGetOpenStatus(HIMC hIMC) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); static int i; if (!data) @@ -1770,7 +1811,7 @@ UINT WINAPI ImmGetRegisterWordStyleW( */ BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lpptPos); @@ -1966,13 +2007,21 @@ BOOL WINAPI ImmIsUIMessageW( BOOL WINAPI ImmNotifyIME( HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %d, %d, %d)\n", hIMC, dwAction, dwIndex, dwValue); + if (hIMC == NULL) + { + SetLastError(ERROR_SUCCESS); + return FALSE; + } + if (!data || ! data->immKbd->pNotifyIME) + { return FALSE; + } return data->immKbd->pNotifyIME(hIMC,dwAction,dwIndex,dwValue); } @@ -2042,11 +2091,11 @@ BOOL WINAPI ImmRegisterWordW( */ BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC) { - static int shown = 0; + static BOOL shown = FALSE; if (!shown) { FIXME("(%p, %p): stub\n", hWnd, hIMC); - shown = 1; + shown = TRUE; } return TRUE; } @@ -2056,9 +2105,11 @@ BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC) */ LRESULT WINAPI ImmRequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("%p %ld %ld\n", hIMC, wParam, wParam); + if (!data) + SetLastError(ERROR_INVALID_HANDLE); if (data && IsWindow(data->IMC.hWnd)) return SendMessageA(data->IMC.hWnd, WM_IME_REQUEST, wParam, lParam); @@ -2071,10 +2122,13 @@ LRESULT WINAPI ImmRequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam) */ LRESULT WINAPI ImmRequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("%p %ld %ld\n", hIMC, wParam, wParam); + if (!data) + SetLastError(ERROR_INVALID_HANDLE); + if (data && IsWindow(data->IMC.hWnd)) return SendMessageW(data->IMC.hWnd, WM_IME_REQUEST, wParam, lParam); @@ -2087,7 +2141,7 @@ LRESULT WINAPI ImmRequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam) BOOL WINAPI ImmSetCandidateWindow( HIMC hIMC, LPCANDIDATEFORM lpCandidate) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lpCandidate); @@ -2115,11 +2169,14 @@ BOOL WINAPI ImmSetCandidateWindow( */ BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lplf); if (!data || !lplf) + { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } memcpy(&data->IMC.lfFont.W,lplf,sizeof(LOGFONTA)); MultiByteToWideChar(CP_ACP, 0, lplf->lfFaceName, -1, data->IMC.lfFont.W.lfFaceName, @@ -2135,11 +2192,14 @@ BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf) */ BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lplf); if (!data || !lplf) + { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } data->IMC.lfFont.W = *lplf; ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, 0, IMC_SETCOMPOSITIONFONT); @@ -2161,7 +2221,7 @@ BOOL WINAPI ImmSetCompositionStringA( WCHAR *CompBuffer = NULL; WCHAR *ReadBuffer = NULL; BOOL rc; - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %d, %p, %d, %p, %d):\n", hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); @@ -2216,7 +2276,7 @@ BOOL WINAPI ImmSetCompositionStringW( CHAR *CompBuffer = NULL; CHAR *ReadBuffer = NULL; BOOL rc; - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %d, %p, %d, %p, %d):\n", hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); @@ -2269,7 +2329,7 @@ BOOL WINAPI ImmSetCompositionWindow( HIMC hIMC, LPCOMPOSITIONFORM lpCompForm) { BOOL reshow = FALSE; - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lpCompForm); TRACE("\t%x, (%i,%i), (%i,%i - %i,%i)\n",lpCompForm->dwStyle, @@ -2277,7 +2337,10 @@ BOOL WINAPI ImmSetCompositionWindow( lpCompForm->rcArea.left, lpCompForm->rcArea.bottom, lpCompForm->rcArea.right); if (!data) + { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } data->IMC.cfCompForm = *lpCompForm; @@ -2303,12 +2366,15 @@ BOOL WINAPI ImmSetConversionStatus( HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence) { DWORD oldConversion, oldSentence; - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("%p %d %d\n", hIMC, fdwConversion, fdwSentence); if (!data) + { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } if ( fdwConversion != data->IMC.fdwConversion ) { @@ -2333,12 +2399,15 @@ BOOL WINAPI ImmSetConversionStatus( */ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("%p %d\n", hIMC, fOpen); if (!data) + { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } if (data->immKbd->UIWnd == NULL) { @@ -2366,12 +2435,15 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen) */ BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %p)\n", hIMC, lpptPos); if (!data || !lpptPos) + { + SetLastError(ERROR_INVALID_HANDLE); return FALSE; + } TRACE("\t(%i,%i)\n", lpptPos->x, lpptPos->y); @@ -2489,9 +2561,16 @@ DWORD WINAPI ImmGetImeMenuItemsA( HIMC hIMC, DWORD dwFlags, DWORD dwType, LPIMEMENUITEMINFOA lpImeParentMenu, LPIMEMENUITEMINFOA lpImeMenu, DWORD dwSize) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %i, %i, %p, %p, %i):\n", hIMC, dwFlags, dwType, lpImeParentMenu, lpImeMenu, dwSize); + + if (!data) + { + SetLastError(ERROR_INVALID_HANDLE); + return 0; + } + if (data->immKbd->hIME && data->immKbd->pImeGetImeMenuItems) { if (!is_himc_ime_unicode(data) || (!lpImeParentMenu && !lpImeMenu)) @@ -2553,9 +2632,16 @@ DWORD WINAPI ImmGetImeMenuItemsW( HIMC hIMC, DWORD dwFlags, DWORD dwType, LPIMEMENUITEMINFOW lpImeParentMenu, LPIMEMENUITEMINFOW lpImeMenu, DWORD dwSize) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); TRACE("(%p, %i, %i, %p, %p, %i):\n", hIMC, dwFlags, dwType, lpImeParentMenu, lpImeMenu, dwSize); + + if (!data) + { + SetLastError(ERROR_INVALID_HANDLE); + return 0; + } + if (data->immKbd->hIME && data->immKbd->pImeGetImeMenuItems) { if (is_himc_ime_unicode(data) || (!lpImeParentMenu && !lpImeMenu)) @@ -2613,7 +2699,7 @@ DWORD WINAPI ImmGetImeMenuItemsW( HIMC hIMC, DWORD dwFlags, DWORD dwType, */ LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); if (!data) return NULL; @@ -2626,7 +2712,10 @@ LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC) */ BOOL WINAPI ImmUnlockIMC(HIMC hIMC) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); + + if (!data) + return FALSE; if (data->dwLock) data->dwLock--; return TRUE; @@ -2637,7 +2726,9 @@ BOOL WINAPI ImmUnlockIMC(HIMC hIMC) */ DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); + if (!data) + return 0; return data->dwLock; } @@ -2702,7 +2793,13 @@ DWORD WINAPI ImmGetIMCCSize(HIMCC imcc) */ BOOL WINAPI ImmGenerateMessage(HIMC hIMC) { - InputContextData *data = hIMC; + InputContextData *data = get_imc_data(hIMC); + + if (!data) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } TRACE("%i messages queued\n",data->IMC.dwNumMsgBuf); if (data->IMC.dwNumMsgBuf > 0) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index a0a47a9a826..e79cf1653ee 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -85,7 +85,7 @@ reactos/dll/win32/icmp # Out of sync reactos/dll/win32/ieframe # Synced to Wine-1.7.27 reactos/dll/win32/imaadp32.acm # Synced to Wine-1.7.17 reactos/dll/win32/imagehlp # Synced to Wine-1.7.17 -reactos/dll/win32/imm32 # Synced to Wine-1.7.17 +reactos/dll/win32/imm32 # Synced to Wine-1.7.27 reactos/dll/win32/inetcomm # Synced to Wine-1.7.17 reactos/dll/win32/inetmib1 # Synced to Wine-1.7.1 reactos/dll/win32/initpki # Synced to Wine-1.7.17 -- 2.17.1