public int Peek(IntPtr buffer, int length, out int bytesAvailable, out int bytesLeftInMessage) { using (MemoryAlloc data = new MemoryAlloc(FilePipePeekBuffer.DataOffset + length)) { NtStatus status; int returnLength; status = this.FsControl(FsCtlPeek, IntPtr.Zero, 0, data, data.Size, out returnLength); // If we got a buffer overflow it simply means we didn't // read all of the available bytes. if (status == NtStatus.BufferOverflow) { status = NtStatus.Success; } status.ThrowIf(); FilePipePeekBuffer info = data.ReadStruct <FilePipePeekBuffer>(); bytesAvailable = info.ReadDataAvailable; int bytesRead = returnLength - FilePipePeekBuffer.DataOffset; bytesLeftInMessage = info.MessageLength - bytesRead; if (buffer != IntPtr.Zero) { data.ReadMemory(buffer, 0, FilePipePeekBuffer.DataOffset, bytesRead); } return(bytesRead); } }
public int Peek(IntPtr buffer, int length, out int bytesAvailable, out int bytesLeftInMessage) { using (var data = new MemoryAlloc(FilePipePeekBuffer.DataOffset + length)) { NtStatus status; int returnLength; status = this.FsControl(FsCtlPeek, IntPtr.Zero, 0, data, data.Size, out returnLength); // If we got a buffer overflow it simply means we didn't // read all of the available bytes. if (status == NtStatus.BufferOverflow) status = NtStatus.Success; if (status >= NtStatus.Error) Win32.ThrowLastError(status); FilePipePeekBuffer info = data.ReadStruct<FilePipePeekBuffer>(); int bytesRead; bytesAvailable = info.ReadDataAvailable; bytesRead = returnLength - FilePipePeekBuffer.DataOffset; bytesLeftInMessage = info.MessageLength - bytesRead; if (buffer != IntPtr.Zero) data.ReadMemory(buffer, 0, FilePipePeekBuffer.DataOffset, bytesRead); return bytesRead; } }