Rob Shearman : kernel32: Implement CallNamedPipeW.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 5 13:10:25 CST 2007
Module: wine
Branch: master
Commit: 5267e36ad0abf1d5eb12d2a83ea4ec6af97b7b61
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5267e36ad0abf1d5eb12d2a83ea4ec6af97b7b61
Author: Rob Shearman <rob at codeweavers.com>
Date: Mon Mar 5 12:06:02 2007 +0000
kernel32: Implement CallNamedPipeW.
---
dlls/kernel32/sync.c | 37 +++++++++++++++++++++++++++++++++----
1 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index eaa0f70..d3f2f4b 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -1515,10 +1515,39 @@ BOOL WINAPI CallNamedPipeW(
LPVOID lpOutput, DWORD lpOutputSize,
LPDWORD lpBytesRead, DWORD nTimeout)
{
- FIXME("%s %p %d %p %d %p %d\n",
- debugstr_w(lpNamedPipeName), lpInput, lpInputSize,
- lpOutput, lpOutputSize, lpBytesRead, nTimeout);
- return FALSE;
+ HANDLE pipe;
+ BOOL ret;
+ DWORD mode;
+
+ TRACE("%s %p %d %p %d %p %d\n",
+ debugstr_w(lpNamedPipeName), lpInput, lpInputSize,
+ lpOutput, lpOutputSize, lpBytesRead, nTimeout);
+
+ pipe = CreateFileW(lpNamedPipeName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ if (pipe == INVALID_HANDLE_VALUE)
+ {
+ ret = WaitNamedPipeW(lpNamedPipeName, nTimeout);
+ if (!ret)
+ return FALSE;
+ pipe = CreateFileW(lpNamedPipeName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ if (pipe == INVALID_HANDLE_VALUE)
+ return FALSE;
+ }
+
+ mode = PIPE_READMODE_MESSAGE;
+ ret = SetNamedPipeHandleState(pipe, &mode, NULL, NULL);
+ if (!ret)
+ {
+ CloseHandle(pipe);
+ return FALSE;
+ }
+
+ ret = TransactNamedPipe(pipe, lpInput, lpInputSize, lpOutput, lpOutputSize, lpBytesRead, NULL);
+ CloseHandle(pipe);
+ if (!ret)
+ return FALSE;
+
+ return TRUE;
}
/******************************************************************
More information about the wine-cvs
mailing list