[IMM32]
authorAmine Khaldi <amine.khaldi@reactos.org>
Sun, 28 Sep 2014 18:27:58 +0000 (18:27 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sun, 28 Sep 2014 18:27:58 +0000 (18:27 +0000)
* Sync with Wine 1.7.27.
CORE-8540

svn path=/trunk/; revision=64371

reactos/dll/win32/imm32/imm.c
reactos/media/doc/README.WINE

index 78b2b90..f3c76d2 100644 (file)
@@ -35,6 +35,7 @@
 #include <winnls.h>
 #include <winreg.h>
 #include <wine/list.h>
 #include <winnls.h>
 #include <winreg.h>
 #include <wine/list.h>
+#include <wine/unicode.h>
 
 WINE_DEFAULT_DEBUG_CHANNEL(imm);
 
 
 WINE_DEFAULT_DEBUG_CHANNEL(imm);
 
@@ -75,8 +76,11 @@ typedef struct tagInputContextData
 
         ImmHkl          *immKbd;
         UINT            lastVK;
 
         ImmHkl          *immKbd;
         UINT            lastVK;
+        DWORD           magic;
 } InputContextData;
 
 } InputContextData;
 
+#define WINE_IMC_VALID_MAGIC 0x56434D49
+
 typedef struct _tagTRANSMSG {
     UINT message;
     WPARAM wParam;
 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 */
 }
 
 /* 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);
 
     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);
     if (ptr->hIME)
     {
         LOAD_FUNCPTR(ImeInquire);
@@ -452,16 +456,34 @@ static HIMCC ImmCreateBlankCompStr(void)
     return rc;
 }
 
     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;
 /***********************************************************************
  *             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);
 
 
     TRACE("(%p, %p):\n", hWnd, hIMC);
 
+    if(hIMC && !data)
+        return NULL;
+
     if (!IMM_GetThreadData()->defaultContext)
         IMM_GetThreadData()->defaultContext = ImmCreateContext();
 
     if (!IMM_GetThreadData()->defaultContext)
         IMM_GetThreadData()->defaultContext = ImmCreateContext();
 
@@ -642,6 +664,7 @@ HIMC WINAPI ImmCreateContext(void)
     InputContextData *new_context;
     LPGUIDELINE gl;
     LPCANDIDATEINFO ci;
     InputContextData *new_context;
     LPGUIDELINE gl;
     LPCANDIDATEINFO ci;
+    int i;
 
     new_context = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputContextData));
 
 
     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);
 
     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);
 
     /* 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");
     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->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)
 {
     return new_context;
 }
 
 static BOOL IMM_DestroyContext(HIMC hIMC)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     TRACE("Destroying %p\n",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;
 }
 
     return TRUE;
 }
 
@@ -885,7 +917,7 @@ DWORD WINAPI ImmGetCandidateListA(
   HIMC hIMC, DWORD dwIndex,
   LPCANDIDATELIST lpCandList, DWORD dwBufLen)
 {
   HIMC hIMC, DWORD dwIndex,
   LPCANDIDATELIST lpCandList, DWORD dwBufLen)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
     LPCANDIDATEINFO candinfo;
     LPCANDIDATELIST candlist;
     DWORD ret = 0;
     LPCANDIDATEINFO candinfo;
     LPCANDIDATELIST candlist;
     DWORD ret = 0;
@@ -924,7 +956,7 @@ done:
 DWORD WINAPI ImmGetCandidateListCountA(
   HIMC hIMC, LPDWORD lpdwListCount)
 {
 DWORD WINAPI ImmGetCandidateListCountA(
   HIMC hIMC, LPDWORD lpdwListCount)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
     LPCANDIDATEINFO candinfo;
     DWORD ret, count;
 
     LPCANDIDATEINFO candinfo;
     DWORD ret, count;
 
@@ -956,7 +988,7 @@ DWORD WINAPI ImmGetCandidateListCountA(
 DWORD WINAPI ImmGetCandidateListCountW(
   HIMC hIMC, LPDWORD lpdwListCount)
 {
 DWORD WINAPI ImmGetCandidateListCountW(
   HIMC hIMC, LPDWORD lpdwListCount)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
     LPCANDIDATEINFO candinfo;
     DWORD ret, count;
 
     LPCANDIDATEINFO candinfo;
     DWORD ret, count;
 
@@ -989,7 +1021,7 @@ DWORD WINAPI ImmGetCandidateListW(
   HIMC hIMC, DWORD dwIndex,
   LPCANDIDATELIST lpCandList, DWORD dwBufLen)
 {
   HIMC hIMC, DWORD dwIndex,
   LPCANDIDATELIST lpCandList, DWORD dwBufLen)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
     LPCANDIDATEINFO candinfo;
     LPCANDIDATELIST candlist;
     DWORD ret = 0;
     LPCANDIDATEINFO candinfo;
     LPCANDIDATELIST candlist;
     DWORD ret = 0;
@@ -1028,7 +1060,7 @@ done:
 BOOL WINAPI ImmGetCandidateWindow(
   HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
 {
 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);
 
 
     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 ( 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;
     *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)
 {
  */
 BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     TRACE("(%p, %p):\n", hIMC, lplf);
 
 
     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;
                                       DWORD dwBufLen, BOOL unicode)
 {
     LONG rc = 0;
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
     LPCOMPOSITIONSTRING compstr;
     LPBYTE compdata;
 
     LPCOMPOSITIONSTRING compstr;
     LPBYTE compdata;
 
@@ -1359,7 +1394,7 @@ LONG WINAPI ImmGetCompositionStringW(
  */
 BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
 {
  */
 BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     TRACE("(%p, %p)\n", hIMC, lpCompForm);
 
 
     TRACE("(%p, %p)\n", hIMC, lpCompForm);
 
@@ -1367,7 +1402,7 @@ BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
         return FALSE;
 
     *lpCompForm = data->IMC.cfCompForm;
         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)
 {
 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);
 
 
     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 );
 
   /* 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) );
 
   /* 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 );
 
 
   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);
 
 
   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 );
   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)
 {
  */
 BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
 {
-  InputContextData *data = hIMC;
+  InputContextData *data = get_imc_data(hIMC);
   static int i;
 
     if (!data)
   static int i;
 
     if (!data)
@@ -1770,7 +1811,7 @@ UINT WINAPI ImmGetRegisterWordStyleW(
  */
 BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
 {
  */
 BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     TRACE("(%p, %p)\n", hIMC, lpptPos);
 
 
     TRACE("(%p, %p)\n", hIMC, lpptPos);
 
@@ -1966,13 +2007,21 @@ BOOL WINAPI ImmIsUIMessageW(
 BOOL WINAPI ImmNotifyIME(
   HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
 {
 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);
 
 
     TRACE("(%p, %d, %d, %d)\n",
         hIMC, dwAction, dwIndex, dwValue);
 
+    if (hIMC == NULL)
+    {
+        SetLastError(ERROR_SUCCESS);
+        return FALSE;
+    }
+
     if (!data || ! data->immKbd->pNotifyIME)
     if (!data || ! data->immKbd->pNotifyIME)
+    {
         return FALSE;
         return FALSE;
+    }
 
     return data->immKbd->pNotifyIME(hIMC,dwAction,dwIndex,dwValue);
 }
 
     return data->immKbd->pNotifyIME(hIMC,dwAction,dwIndex,dwValue);
 }
@@ -2042,11 +2091,11 @@ BOOL WINAPI ImmRegisterWordW(
  */
 BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
 {
  */
 BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
 {
-  static int shown = 0;
+  static BOOL shown = FALSE;
 
   if (!shown) {
      FIXME("(%p, %p): stub\n", hWnd, hIMC);
 
   if (!shown) {
      FIXME("(%p, %p): stub\n", hWnd, hIMC);
-     shown = 1;
+     shown = TRUE;
   }
   return TRUE;
 }
   }
   return TRUE;
 }
@@ -2056,9 +2105,11 @@ BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
 */
 LRESULT WINAPI ImmRequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam)
 {
 */
 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);
 
     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);
 
     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)
 {
 */
 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);
 
 
     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);
 
     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)
 {
 BOOL WINAPI ImmSetCandidateWindow(
   HIMC hIMC, LPCANDIDATEFORM lpCandidate)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     TRACE("(%p, %p)\n", hIMC, lpCandidate);
 
 
     TRACE("(%p, %p)\n", hIMC, lpCandidate);
 
@@ -2115,11 +2169,14 @@ BOOL WINAPI ImmSetCandidateWindow(
  */
 BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
 {
  */
 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)
     TRACE("(%p, %p)\n", hIMC, lplf);
 
     if (!data || !lplf)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
         return FALSE;
+    }
 
     memcpy(&data->IMC.lfFont.W,lplf,sizeof(LOGFONTA));
     MultiByteToWideChar(CP_ACP, 0, lplf->lfFaceName, -1, data->IMC.lfFont.W.lfFaceName,
 
     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)
 {
  */
 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)
     TRACE("(%p, %p)\n", hIMC, lplf);
 
     if (!data || !lplf)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
         return FALSE;
+    }
 
     data->IMC.lfFont.W = *lplf;
     ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, 0, IMC_SETCOMPOSITIONFONT);
 
     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;
     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);
 
     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;
     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);
 
     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;
   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,
 
     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)
           lpCompForm->rcArea.left, lpCompForm->rcArea.bottom, lpCompForm->rcArea.right);
 
     if (!data)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
         return FALSE;
+    }
 
     data->IMC.cfCompForm = *lpCompForm;
 
 
     data->IMC.cfCompForm = *lpCompForm;
 
@@ -2303,12 +2366,15 @@ BOOL WINAPI ImmSetConversionStatus(
   HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
 {
     DWORD oldConversion, oldSentence;
   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)
 
     TRACE("%p %d %d\n", hIMC, fdwConversion, fdwSentence);
 
     if (!data)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
         return FALSE;
+    }
 
     if ( fdwConversion != data->IMC.fdwConversion )
     {
 
     if ( fdwConversion != data->IMC.fdwConversion )
     {
@@ -2333,12 +2399,15 @@ BOOL WINAPI ImmSetConversionStatus(
  */
 BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
 {
  */
 BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     TRACE("%p %d\n", hIMC, fOpen);
 
     if (!data)
 
     TRACE("%p %d\n", hIMC, fOpen);
 
     if (!data)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
         return FALSE;
+    }
 
     if (data->immKbd->UIWnd == NULL)
     {
 
     if (data->immKbd->UIWnd == NULL)
     {
@@ -2366,12 +2435,15 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
  */
 BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
 {
  */
 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)
 
     TRACE("(%p, %p)\n", hIMC, lpptPos);
 
     if (!data || !lpptPos)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
         return FALSE;
+    }
 
     TRACE("\t(%i,%i)\n", lpptPos->x, lpptPos->y);
 
 
     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)
 {
    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);
     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))
     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)
 {
    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);
     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))
     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)
 {
 */
 LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
 
     if (!data)
         return NULL;
 
     if (!data)
         return NULL;
@@ -2626,7 +2712,10 @@ LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
 */
 BOOL WINAPI ImmUnlockIMC(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;
     if (data->dwLock)
         data->dwLock--;
     return TRUE;
@@ -2637,7 +2726,9 @@ BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
 */
 DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC)
 {
 */
 DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC)
 {
-    InputContextData *data = hIMC;
+    InputContextData *data = get_imc_data(hIMC);
+    if (!data)
+        return 0;
     return data->dwLock;
 }
 
     return data->dwLock;
 }
 
@@ -2702,7 +2793,13 @@ DWORD WINAPI ImmGetIMCCSize(HIMCC imcc)
 */
 BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
 {
 */
 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)
 
     TRACE("%i messages queued\n",data->IMC.dwNumMsgBuf);
     if (data->IMC.dwNumMsgBuf > 0)
index a0a47a9..e79cf16 100644 (file)
@@ -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/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
 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