Hans Leidekker : kernel32: Implement and test {G, S}etConsoleInputExeName{A , W}.

Alexandre Julliard julliard at winehq.org
Mon Dec 3 09:18:01 CST 2007


Module: wine
Branch: master
Commit: 8f3afb41204ba9886b88da58d0b4478346940948
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8f3afb41204ba9886b88da58d0b4478346940948

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Sun Dec  2 22:12:19 2007 +0100

kernel32: Implement and test {G, S}etConsoleInputExeName{A, W}.

---

 dlls/kernel32/console.c       |   88 +++++++++++++++++++++++++---------------
 dlls/kernel32/tests/console.c |   53 ++++++++++++++++++++++++
 2 files changed, 108 insertions(+), 33 deletions(-)

diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index ec9c15c..1f24614 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -55,6 +55,15 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(console);
 
+static CRITICAL_SECTION CONSOLE_CritSect;
+static CRITICAL_SECTION_DEBUG critsect_debug =
+{
+    0, 0, &CONSOLE_CritSect,
+    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
+      0, 0, { (DWORD_PTR)(__FILE__ ": CONSOLE_CritSect") }
+};
+static CRITICAL_SECTION CONSOLE_CritSect = { &critsect_debug, -1, 0, 0, 0, 0 };
+
 static const WCHAR coninW[] = {'C','O','N','I','N','$',0};
 static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0};
 
@@ -982,23 +991,35 @@ BOOL WINAPI GetConsoleKeyboardLayoutNameW(LPWSTR layoutName)
     return TRUE;
 }
 
+static WCHAR input_exe[MAX_PATH + 1];
+
 /***********************************************************************
- *            GetConsoleInputExeNameA   (KERNEL32.@)
+ *            GetConsoleInputExeNameW   (KERNEL32.@)
  */
-DWORD WINAPI GetConsoleInputExeNameA(DWORD BufferLength, LPSTR lpBuffer)
+BOOL WINAPI GetConsoleInputExeNameW(DWORD buflen, LPWSTR buffer)
 {
-    DWORD ret = 0;
-    FIXME( "stub %u %p\n", BufferLength, lpBuffer);
-    return ret;
+    TRACE("%u %p\n", buflen, buffer);
+
+    RtlEnterCriticalSection(&CONSOLE_CritSect);
+    if (buflen > strlenW(input_exe)) strcpyW(buffer, input_exe);
+    else SetLastError(ERROR_BUFFER_OVERFLOW);
+    RtlLeaveCriticalSection(&CONSOLE_CritSect);
+
+    return TRUE;
 }
 
 /***********************************************************************
- *            GetConsoleInputExeNameW   (KERNEL32.@)
+ *            GetConsoleInputExeNameA   (KERNEL32.@)
  */
-DWORD WINAPI GetConsoleInputExeNameW(DWORD BufferLength, LPWSTR lpBuffer)
+BOOL WINAPI GetConsoleInputExeNameA(DWORD buflen, LPSTR buffer)
 {
-    DWORD ret = 0;
-    FIXME( "stub %u %p\n", BufferLength, lpBuffer);
+    WCHAR *bufferW;
+    BOOL ret;
+
+    if (!(bufferW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * buflen))) return FALSE;
+    if ((ret = GetConsoleInputExeNameW(buflen, bufferW)))
+        WideCharToMultiByte(CP_ACP, 0, bufferW, -1, buffer, buflen, NULL, NULL);
+    HeapFree(GetProcessHeap(), 0, bufferW);
     return ret;
 }
 
@@ -1467,35 +1488,45 @@ BOOL WINAPI GetNumberOfConsoleMouseButtons(LPDWORD nrofbuttons)
 
 /******************************************************************************
  *  SetConsoleInputExeNameW	 [KERNEL32.@]
- *
- * BUGS
- *   Unimplemented
  */
 BOOL WINAPI SetConsoleInputExeNameW(LPCWSTR name)
 {
-    FIXME("(%s): stub!\n", debugstr_w(name));
+    TRACE("(%s)\n", debugstr_w(name));
+
+    if (!name || !name[0])
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    RtlEnterCriticalSection(&CONSOLE_CritSect);
+    if (strlenW(name) < sizeof(input_exe)/sizeof(WCHAR)) strcpyW(input_exe, name);
+    RtlLeaveCriticalSection(&CONSOLE_CritSect);
 
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return TRUE;
 }
 
 /******************************************************************************
  *  SetConsoleInputExeNameA	 [KERNEL32.@]
- *
- * BUGS
- *   Unimplemented
  */
 BOOL WINAPI SetConsoleInputExeNameA(LPCSTR name)
 {
-    int		len = MultiByteToWideChar(CP_ACP, 0, name, -1, NULL, 0);
-    LPWSTR	xptr = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-    BOOL	ret;
+    int len;
+    LPWSTR nameW;
+    BOOL ret;
 
-    if (!xptr) return FALSE;
+    if (!name || !name[0])
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    len = MultiByteToWideChar(CP_ACP, 0, name, -1, NULL, 0);
+    if (!(nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)))) return FALSE;
 
-    MultiByteToWideChar(CP_ACP, 0, name, -1, xptr, len);
-    ret = SetConsoleInputExeNameW(xptr);
-    HeapFree(GetProcessHeap(), 0, xptr);
+    MultiByteToWideChar(CP_ACP, 0, name, -1, nameW, len);
+    ret = SetConsoleInputExeNameW(nameW);
+    HeapFree(GetProcessHeap(), 0, nameW);
 
     return ret;
 }
@@ -1534,15 +1565,6 @@ struct ConsoleHandler
 static struct ConsoleHandler    CONSOLE_DefaultConsoleHandler = {CONSOLE_DefaultHandler, NULL};
 static struct ConsoleHandler*   CONSOLE_Handlers = &CONSOLE_DefaultConsoleHandler;
 
-static CRITICAL_SECTION CONSOLE_CritSect;
-static CRITICAL_SECTION_DEBUG critsect_debug =
-{
-    0, 0, &CONSOLE_CritSect,
-    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
-      0, 0, { (DWORD_PTR)(__FILE__ ": CONSOLE_CritSect") }
-};
-static CRITICAL_SECTION CONSOLE_CritSect = { &critsect_debug, -1, 0, 0, 0, 0 };
-
 /*****************************************************************************/
 
 /******************************************************************
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 2a8c467..109b6bb 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -23,6 +23,11 @@
 #include <windows.h>
 #include <stdio.h>
 
+BOOL WINAPI GetConsoleInputExeNameA(DWORD, LPSTR);
+BOOL WINAPI GetConsoleInputExeNameW(DWORD, LPWSTR);
+BOOL WINAPI SetConsoleInputExeNameA(LPCSTR);
+BOOL WINAPI SetConsoleInputExeNameW(LPCWSTR);
+
 /* DEFAULT_ATTRIB is used for all initial filling of the console.
  * all modifications are made with TEST_ATTRIB so that we could check
  * what has to be modified or not
@@ -746,6 +751,52 @@ static void testScreenBuffer(HANDLE hConOut)
     SetConsoleOutputCP(oldcp);
 }
 
+static void test_GetSetConsoleInputExeName(void)
+{
+    BOOL ret;
+    DWORD error;
+    char buffer[MAX_PATH], module[MAX_PATH], *p;
+    static char input_exe[MAX_PATH] = "winetest.exe";
+
+    SetLastError(0xdeadbeef);
+    ret = GetConsoleInputExeNameA(0, NULL);
+    error = GetLastError();
+    ok(ret, "GetConsoleInputExeNameA failed\n");
+    ok(error == ERROR_BUFFER_OVERFLOW, "got %u expected ERROR_BUFFER_OVERFLOW\n", error);
+
+    SetLastError(0xdeadbeef);
+    ret = GetConsoleInputExeNameA(0, buffer);
+    error = GetLastError();
+    ok(ret, "GetConsoleInputExeNameA failed\n");
+    ok(error == ERROR_BUFFER_OVERFLOW, "got %u expected ERROR_BUFFER_OVERFLOW\n", error);
+
+    GetModuleFileNameA(GetModuleHandle(NULL), module, sizeof(module));
+    p = strrchr(module, '\\') + 1;
+
+    ret = GetConsoleInputExeNameA(sizeof(buffer)/sizeof(buffer[0]), buffer);
+    ok(ret, "GetConsoleInputExeNameA failed\n");
+    todo_wine ok(!lstrcmpA(buffer, p), "got %s expected %s\n", buffer, p);
+
+    SetLastError(0xdeadbeef);
+    ret = SetConsoleInputExeNameA(NULL);
+    error = GetLastError();
+    ok(!ret, "SetConsoleInputExeNameA failed\n");
+    ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error);
+
+    SetLastError(0xdeadbeef);
+    ret = SetConsoleInputExeNameA("");
+    error = GetLastError();
+    ok(!ret, "SetConsoleInputExeNameA failed\n");
+    ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error);
+
+    ret = SetConsoleInputExeNameA(input_exe);
+    ok(ret, "SetConsoleInputExeNameA failed\n");
+
+    ret = GetConsoleInputExeNameA(sizeof(buffer)/sizeof(buffer[0]), buffer);
+    ok(ret, "GetConsoleInputExeNameA failed\n");
+    ok(!lstrcmpA(buffer, input_exe), "got %s expected %s\n", buffer, input_exe);
+}
+
 START_TEST(console)
 {
     HANDLE hConIn, hConOut;
@@ -784,4 +835,6 @@ START_TEST(console)
     testScreenBuffer(hConOut);
     testCtrlHandler();
     /* still to be done: access rights & access on objects */
+
+    test_GetSetConsoleInputExeName();
 }




More information about the wine-cvs mailing list