- Fix PeekNamedPipe. Now only 14 winetests fail for pipetest. - Cleanup DisconnectNamedPipe and fix a small bug in it. Modified: trunk/reactos/lib/kernel32/file/npipe.c _____
Modified: trunk/reactos/lib/kernel32/file/npipe.c --- trunk/reactos/lib/kernel32/file/npipe.c 2005-11-09 04:29:46 UTC (rev 19087) +++ trunk/reactos/lib/kernel32/file/npipe.c 2005-11-09 04:32:44 UTC (rev 19088) @@ -760,43 +760,42 @@
/* * @implemented */ -BOOL STDCALL +BOOL +WINAPI DisconnectNamedPipe(HANDLE hNamedPipe) { - IO_STATUS_BLOCK Iosb; - NTSTATUS Status; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status;
- Status = NtFsControlFile(hNamedPipe, - NULL, - NULL, - NULL, - &Iosb, - FSCTL_PIPE_DISCONNECT, - NULL, - 0, - NULL, - 0); - if (Status == STATUS_PENDING) + /* Send the FSCTL to the driver */ + Status = NtFsControlFile(hNamedPipe, + NULL, + NULL, + NULL, + &Iosb, + FSCTL_PIPE_DISCONNECT, + NULL, + 0, + NULL, + 0); + if (Status == STATUS_PENDING) { - Status = NtWaitForSingleObject(hNamedPipe, - FALSE, - NULL); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return(FALSE); - } + /* Wait on NPFS to finish and get updated status */ + Status = NtWaitForSingleObject(hNamedPipe, FALSE, NULL); + if (NT_SUCCESS(Status)) Status = Iosb.Status; }
- if (!NT_SUCCESS(Status)) + /* Check for error */ + if (!NT_SUCCESS(Status)) { - SetLastErrorByStatus(Status); - return(FALSE); - } - return(TRUE); + /* Fail */ + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; }
- /* * @unimplemented */ @@ -989,91 +988,92 @@ return(TRUE); }
- /* * @implemented */ -BOOL STDCALL +BOOL +WINAPI PeekNamedPipe(HANDLE hNamedPipe, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesRead, - LPDWORD lpTotalBytesAvail, - LPDWORD lpBytesLeftThisMessage) + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesRead, + LPDWORD lpTotalBytesAvail, + LPDWORD lpBytesLeftThisMessage) { - PFILE_PIPE_PEEK_BUFFER Buffer; - IO_STATUS_BLOCK Iosb; - ULONG BufferSize; - NTSTATUS Status; + PFILE_PIPE_PEEK_BUFFER Buffer; + IO_STATUS_BLOCK Iosb; + ULONG BufferSize; + NTSTATUS Status;
- BufferSize = nBufferSize + sizeof(FILE_PIPE_PEEK_BUFFER); - Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - BufferSize); + /* Calculate the buffer space that we'll need and allocate it */ + BufferSize = nBufferSize + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0]); + Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize);
- Status = NtFsControlFile(hNamedPipe, - NULL, - NULL, - NULL, - &Iosb, - FSCTL_PIPE_PEEK, - NULL, - 0, - Buffer, - BufferSize); - if (Status == STATUS_PENDING) + /* Tell the driver to seek */ + Status = NtFsControlFile(hNamedPipe, + NULL, + NULL, + NULL, + &Iosb, + FSCTL_PIPE_PEEK, + NULL, + 0, + Buffer, + BufferSize); + if (Status == STATUS_PENDING) { - Status = NtWaitForSingleObject(hNamedPipe, - FALSE, - NULL); - if (NT_SUCCESS(Status)) - Status = Iosb.Status; + /* Wait for npfs to be done, and update the status */ + Status = NtWaitForSingleObject(hNamedPipe, FALSE, NULL); + if (NT_SUCCESS(Status)) Status = Iosb.Status; }
- if (Status == STATUS_BUFFER_OVERFLOW) - { - Status = STATUS_SUCCESS; - } + /* Overflow is success for us */ + if (Status == STATUS_BUFFER_OVERFLOW) Status = STATUS_SUCCESS;
- if (!NT_SUCCESS(Status)) + /* If we failed */ + if (!NT_SUCCESS(Status)) { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - Buffer); - SetLastErrorByStatus(Status); - return(FALSE); + /* Free the buffer and return failure */ + RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); + SetLastErrorByStatus(Status); + return FALSE; }
- if (lpTotalBytesAvail != NULL) - { - *lpTotalBytesAvail = Buffer->ReadDataAvailable; - } + /* Check if caller requested bytes available */ + if (lpTotalBytesAvail) *lpTotalBytesAvail = Buffer->ReadDataAvailable;
- if (lpBytesRead != NULL) + /* Check if caller requested bytes read */ + if (lpBytesRead) { - *lpBytesRead = Iosb.Information - sizeof(FILE_PIPE_PEEK_BUFFER); + /* Calculate the bytes returned, minus our structure overhead */ + *lpBytesRead = (ULONG)(Iosb.Information - + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0])); }
- if (lpBytesLeftThisMessage != NULL) + /* Check if caller requested bytes left */ + if (lpBytesLeftThisMessage) { - *lpBytesLeftThisMessage = Buffer->MessageLength - - (Iosb.Information - sizeof(FILE_PIPE_PEEK_BUFFER)); + /* Calculate total minus what we returned and our structure overhead */ + *lpBytesLeftThisMessage = Buffer->MessageLength - + (ULONG)(Iosb.Information - + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0])); }
- if (lpBuffer != NULL) + /* Check if the caller wanted to see the actual data */ + if (lpBuffer) { - memcpy(lpBuffer, Buffer->Data, - min(nBufferSize, Iosb.Information - sizeof(FILE_PIPE_PEEK_BUFFER))); + /* Give him what he wants */ + RtlCopyMemory(lpBuffer, + Buffer->Data, + Iosb.Information - + FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER, Data[0])); }
- RtlFreeHeap(RtlGetProcessHeap(), - 0, - Buffer); - - return(TRUE); + /* Free the buffer and return success */ + RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); + return TRUE; }
- /* * @implemented */