KERNEL32: implement CallNamedPipe

Mike McCormack mike at codeweavers.com
Tue Aug 31 07:19:02 CDT 2004


ChangeLog:
* implement CallNamedPipe
-------------- next part --------------
Index: dlls/kernel/sync.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/sync.c,v
retrieving revision 1.59
diff -u -r1.59 sync.c
--- dlls/kernel/sync.c	18 Aug 2004 00:04:58 -0000	1.59
+++ dlls/kernel/sync.c	31 Aug 2004 06:30:33 -0000
@@ -1392,28 +1392,61 @@
  *           CallNamedPipeA  (KERNEL32.@)
  */
 BOOL WINAPI CallNamedPipeA(
-    LPCSTR lpNamedPipeName, LPVOID lpInput, DWORD lpInputSize,
-    LPVOID lpOutput, DWORD lpOutputSize,
+    LPCSTR lpNamedPipeName, LPVOID lpInput, DWORD dwInputSize,
+    LPVOID lpOutput, DWORD dwOutputSize,
     LPDWORD lpBytesRead, DWORD nTimeout)
 {
-    FIXME("%s %p %ld %p %ld %p %ld\n",
-           debugstr_a(lpNamedPipeName), lpInput, lpInputSize,
-           lpOutput, lpOutputSize, lpBytesRead, nTimeout);
-    return FALSE;
+    DWORD len;
+    LPWSTR str = NULL;
+    BOOL ret;
+
+    TRACE("%s %p %ld %p %ld %p %ld\n",
+           debugstr_a(lpNamedPipeName), lpInput, dwInputSize,
+           lpOutput, dwOutputSize, lpBytesRead, nTimeout);
+
+    if( lpNamedPipeName )
+    {
+        len = MultiByteToWideChar( CP_ACP, 0, lpNamedPipeName, -1, NULL, 0 );
+        str = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+        MultiByteToWideChar( CP_ACP, 0, lpNamedPipeName, -1, str, len );
+    }
+    ret = CallNamedPipeW( str, lpInput, dwInputSize, lpOutput,
+                          dwOutputSize, lpBytesRead, nTimeout );
+    if( lpNamedPipeName )
+        HeapFree( GetProcessHeap(), 0, str );
+
+    return ret;
 }
 
 /***********************************************************************
  *           CallNamedPipeW  (KERNEL32.@)
  */
 BOOL WINAPI CallNamedPipeW(
-    LPCWSTR lpNamedPipeName, LPVOID lpInput, DWORD lpInputSize,
-    LPVOID lpOutput, DWORD lpOutputSize,
+    LPCWSTR lpNamedPipeName, LPVOID lpInput, DWORD dwInputSize,
+    LPVOID lpOutput, DWORD dwOutputSize,
     LPDWORD lpBytesRead, DWORD nTimeout)
 {
-    FIXME("%s %p %ld %p %ld %p %ld\n",
-           debugstr_w(lpNamedPipeName), lpInput, lpInputSize,
-           lpOutput, lpOutputSize, lpBytesRead, nTimeout);
-    return FALSE;
+    HANDLE handle;
+    DWORD count;
+    BOOL r;
+
+    TRACE("%s %p %ld %p %ld %p %ld\n",
+           debugstr_w(lpNamedPipeName), lpInput, dwInputSize,
+           lpOutput, dwOutputSize, lpBytesRead, nTimeout);
+
+    r = WaitNamedPipeW( lpNamedPipeName, nTimeout );
+    if( !r )
+        return r;
+    handle = CreateFileW( lpNamedPipeName, GENERIC_READ|GENERIC_WRITE,
+                          0, NULL, OPEN_EXISTING, 0, NULL );
+    if( !handle )
+        return FALSE;
+    r = WriteFile( handle, lpOutput, dwOutputSize, &count, NULL );
+    if( r )
+        r = ReadFile( handle, lpInput, dwInputSize, lpBytesRead, NULL );
+    CloseHandle( handle );
+
+    return r;
 }
 
 /******************************************************************


More information about the wine-patches mailing list