From aab12f5f7cda3047519a2bddde1bb94a9a13ccdc Mon Sep 17 00:00:00 2001 From: Ivan Leo Puoti Date: Thu, 18 Aug 2005 10:59:26 +0000 Subject: [PATCH] Implement FSCTL_PIPE_DISCONNECT in NtFsControlFile and make DisconnectNamedPipe call it. --- dlls/kernel/sync.c | 27 +++++++++++++++++---------- dlls/ntdll/file.c | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/dlls/kernel/sync.c b/dlls/kernel/sync.c index 54b6f16a626..21d8db9162b 100644 --- a/dlls/kernel/sync.c +++ b/dlls/kernel/sync.c @@ -50,6 +50,7 @@ #include "winerror.h" #include "winnls.h" #include "winternl.h" +#include "winioctl.h" #include "wine/server.h" #include "wine/unicode.h" @@ -1357,22 +1358,28 @@ BOOL WINAPI ConnectNamedPipe(HANDLE hPipe, LPOVERLAPPED overlapped) /*********************************************************************** * DisconnectNamedPipe (KERNEL32.@) + * + * Disconnects from a named pipe + * + * Parameters + * hPipe: A handle to a named pipe returned by CreateNamedPipe + * + * Return values + * TRUE: Success + * FALSE: Failure, GetLastError can be called for further details */ BOOL WINAPI DisconnectNamedPipe(HANDLE hPipe) { - BOOL ret; + NTSTATUS status; + IO_STATUS_BLOCK io_block; TRACE("(%p)\n",hPipe); - SERVER_START_REQ( disconnect_named_pipe ) - { - req->handle = hPipe; - ret = !wine_server_call_err( req ); - if (ret && reply->fd != -1) close( reply->fd ); - } - SERVER_END_REQ; - - return ret; + status = NtFsControlFile(hPipe, 0, NULL, NULL, &io_block, FSCTL_PIPE_DISCONNECT, + NULL, 0, NULL, 0); + if (status == STATUS_SUCCESS) return TRUE; + SetLastError( RtlNtStatusToDosError(status) ); + return FALSE; } /*********************************************************************** diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 26364b45272..2f935d94aa3 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -866,22 +866,33 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE DeviceHandle, HANDLE hEvent, * NtFsControlFile [NTDLL.@] * ZwFsControlFile [NTDLL.@] */ -NTSTATUS WINAPI NtFsControlFile( - IN HANDLE DeviceHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer, - IN ULONG InputBufferSize, - OUT PVOID OutputBuffer, - IN ULONG OutputBufferSize) +NTSTATUS WINAPI NtFsControlFile(HANDLE DeviceHandle, HANDLE Event OPTIONAL, PIO_APC_ROUTINE ApcRoutine, + PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, + PVOID InputBuffer, ULONG InputBufferSize, PVOID OutputBuffer, ULONG OutputBufferSize) { - FIXME("(%p,%p,%p,%p,%p,0x%08lx,%p,0x%08lx,%p,0x%08lx): stub\n", - DeviceHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,IoControlCode, - InputBuffer,InputBufferSize,OutputBuffer,OutputBufferSize); - return 0; + NTSTATUS ret; + + TRACE("(%p,%p,%p,%p,%p,0x%08lx,%p,0x%08lx,%p,0x%08lx)\n", + DeviceHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,IoControlCode, + InputBuffer,InputBufferSize,OutputBuffer,OutputBufferSize); + + if(!IoStatusBlock) return STATUS_INVALID_PARAMETER; + + switch(IoControlCode) + { + case FSCTL_PIPE_DISCONNECT : + SERVER_START_REQ(disconnect_named_pipe) + { + req->handle = DeviceHandle; + ret = wine_server_call(req); + if (!ret && reply->fd != -1) close(reply->fd); + } + SERVER_END_REQ; + return ret; + default : + FIXME("Unsupported IoControlCode %lx\n", IoControlCode); + return STATUS_NOT_SUPPORTED; + } } /****************************************************************************** -- 2.11.4.GIT