/* * Win32 pipes * * Copyright 1998 Alexandre Julliard */ #include #include "windows.h" #include "winerror.h" #include "k32obj.h" #include "process.h" #include "thread.h" #include "heap.h" #include "server/request.h" #include "server.h" typedef struct _PIPE { K32OBJ header; } PIPE; static void PIPE_Destroy( K32OBJ *obj ); const K32OBJ_OPS PIPE_Ops = { PIPE_Destroy /* destroy */ }; /*********************************************************************** * CreatePipe (KERNEL32.170) */ BOOL32 WINAPI CreatePipe( PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES sa, DWORD size ) { struct create_pipe_request req; struct create_pipe_reply reply; PIPE *read_pipe, *write_pipe; int len; req.inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle); CLIENT_SendRequest( REQ_CREATE_PIPE, -1, 1, &req, sizeof(req) ); if (CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) ) != ERROR_SUCCESS) return FALSE; SYSTEM_LOCK(); if (!(read_pipe = (PIPE *)K32OBJ_Create( K32OBJ_PIPE, sizeof(*read_pipe), NULL, reply.handle_read, STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|GENERIC_READ, sa, hReadPipe ))) { CLIENT_CloseHandle( reply.handle_write ); /* handle_read already closed by K32OBJ_Create */ SYSTEM_UNLOCK(); return FALSE; } K32OBJ_DecCount( &read_pipe->header ); if (!(write_pipe = (PIPE *)K32OBJ_Create( K32OBJ_PIPE, sizeof(*write_pipe), NULL, reply.handle_write, STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|GENERIC_WRITE, sa, hWritePipe ))) { CloseHandle( *hReadPipe ); *hReadPipe = INVALID_HANDLE_VALUE32; SYSTEM_UNLOCK(); return FALSE; } /* everything OK */ K32OBJ_DecCount( &write_pipe->header ); SetLastError(0); /* FIXME */ SYSTEM_UNLOCK(); return TRUE; } /*********************************************************************** * PIPE_Destroy */ static void PIPE_Destroy( K32OBJ *obj ) { PIPE *pipe = (PIPE *)obj; assert( obj->type == K32OBJ_PIPE ); obj->type = K32OBJ_UNKNOWN; HeapFree( SystemHeap, 0, pipe ); }