From de77cb9e799dfedc11b526a0b62ff7571ccbe8ac Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 12 Apr 2004 13:03:29 +0000 Subject: [PATCH] - Fixed connection/disconnecting/closing handling, so we don't connect to dead and disconnected pipes. - Handle the OPEN_EXISTING flag correctly. - Report reasonable error messages instead of STATUS_UNSUCCESSFUL. svn path=/trunk/; revision=9097 --- reactos/drivers/fs/np/create.c | 307 +++++++++++++++++---------------- reactos/drivers/fs/np/finfo.c | 5 +- reactos/drivers/fs/np/fsctrl.c | 51 +++--- reactos/drivers/fs/np/npfs.c | 4 +- reactos/drivers/fs/np/npfs.h | 4 +- reactos/drivers/fs/np/rw.c | 21 ++- 6 files changed, 206 insertions(+), 186 deletions(-) diff --git a/reactos/drivers/fs/np/create.c b/reactos/drivers/fs/np/create.c index 1739dd7e449..903509ef48d 100644 --- a/reactos/drivers/fs/np/create.c +++ b/reactos/drivers/fs/np/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.16 2003/06/21 19:55:55 hbirr Exp $ +/* $Id: create.c,v 1.17 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,10 +16,6 @@ #define NDEBUG #include - -/* GLOBALS *******************************************************************/ - - /* FUNCTIONS *****************************************************************/ NTSTATUS STDCALL @@ -142,31 +138,14 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject, KeUnlockMutex(&DeviceExt->PipeListLock); -#if 0 - if (Disposition == OPEN_EXISTING) - { - /* do not connect to listening servers */ - FileObject->FsContext = ClientFcb; - - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - DPRINT("Success!\n"); - - return(STATUS_SUCCESS); - } -#endif - - /* search for disconnected or listening server fcb */ + /* search for listening server fcb */ current_entry = Pipe->ServerFcbListHead.Flink; while (current_entry != &Pipe->ServerFcbListHead) { ServerFcb = CONTAINING_RECORD(current_entry, NPFS_FCB, FcbListEntry); - if ((ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) - || (ServerFcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)) + if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE) { DPRINT("Server found! Fcb %p\n", ServerFcb); break; @@ -180,12 +159,18 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject, FileObject->FsContext = ClientFcb; - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_SUCCESS); + if (Disposition == FILE_OPEN) + { + Irp->IoStatus.Status = STATUS_PIPE_BUSY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_PIPE_BUSY; + } + else + { + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } } ClientFcb->OtherSide = ServerFcb; @@ -234,102 +219,151 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Buffer = (PIO_PIPE_CREATE_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer; - Pipe = ExAllocatePool(NonPagedPool, sizeof(NPFS_PIPE)); - if (Pipe == NULL) - { - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_NO_MEMORY); - } - + Irp->IoStatus.Information = 0; + Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB)); if (Fcb == NULL) { - ExFreePool(Pipe); - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_NO_MEMORY); + return STATUS_NO_MEMORY; } - if (RtlCreateUnicodeString(&Pipe->PipeName, FileObject->FileName.Buffer) == 0) - { - ExFreePool(Pipe); - ExFreePool(Fcb); - - Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); + KeLockMutex(&DeviceExt->PipeListLock); - return(STATUS_NO_MEMORY); - } + /* + * First search for existing Pipe with the same name. + */ - Pipe->ReferenceCount = 0; - InitializeListHead(&Pipe->ServerFcbListHead); - InitializeListHead(&Pipe->ClientFcbListHead); - KeInitializeSpinLock(&Pipe->FcbListLock); - - Pipe->PipeType = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_TYPE : FILE_PIPE_BYTE_STREAM_TYPE; - Pipe->PipeWriteMode = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; - Pipe->PipeReadMode = Buffer->ReadModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; - Pipe->PipeBlockMode = Buffer->NonBlocking; - Pipe->PipeConfiguration = IoStack->Parameters.Create.Options & 0x3; - Pipe->MaximumInstances = Buffer->MaxInstances; - Pipe->CurrentInstances = 0; - Pipe->TimeOut = Buffer->TimeOut; - if (!(IoStack->Parameters.Create.Options & FILE_PIPE_OUTBOUND) || - IoStack->Parameters.Create.Options & FILE_PIPE_FULL_DUPLEX) + current_entry = DeviceExt->PipeListHead.Flink; + while (current_entry != &DeviceExt->PipeListHead) { - if (Buffer->InBufferSize == 0) + current = CONTAINING_RECORD(current_entry, + NPFS_PIPE, + PipeListEntry); + + if (RtlCompareUnicodeString(&FileObject->FileName, ¤t->PipeName, TRUE) == 0) + { + break; + } + + current_entry = current_entry->Flink; + } + + if (current_entry != &DeviceExt->PipeListHead) + { + /* + * Found Pipe with the same name. Check if we are + * allowed to use it. + */ + + Pipe = current; + KeUnlockMutex(&DeviceExt->PipeListLock); + + if (Pipe->CurrentInstances >= Pipe->MaximumInstances) { - Pipe->InboundQuota = DeviceExt->DefaultQuota; + ExFreePool(Fcb); + Irp->IoStatus.Status = STATUS_PIPE_BUSY; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_PIPE_BUSY; } - else + + /* FIXME: Check pipe modes also! */ + if (Pipe->MaximumInstances != Buffer->MaxInstances || + Pipe->TimeOut.QuadPart != Buffer->TimeOut.QuadPart) { - Pipe->InboundQuota = PAGE_ROUND_UP(Buffer->InBufferSize); - if (Pipe->InboundQuota < DeviceExt->MinQuota) - { - Pipe->InboundQuota = DeviceExt->MinQuota; - } - else if (Pipe->InboundQuota > DeviceExt->MaxQuota) - { - Pipe->InboundQuota = DeviceExt->MaxQuota; - } - } + ExFreePool(Fcb); + Irp->IoStatus.Status = STATUS_ACCESS_DENIED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_ACCESS_DENIED; + } } else { - Pipe->InboundQuota = 0; - } - if (IoStack->Parameters.Create.Options & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND)) - { - if (Buffer->OutBufferSize == 0) + Pipe = ExAllocatePool(NonPagedPool, sizeof(NPFS_PIPE)); + if (Pipe == NULL) { - Pipe->OutboundQuota = DeviceExt->DefaultQuota; + KeUnlockMutex(&DeviceExt->PipeListLock); + Irp->IoStatus.Status = STATUS_NO_MEMORY; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NO_MEMORY; + } + + if (RtlCreateUnicodeString(&Pipe->PipeName, FileObject->FileName.Buffer) == 0) + { + KeUnlockMutex(&DeviceExt->PipeListLock); + ExFreePool(Pipe); + ExFreePool(Fcb); + Irp->IoStatus.Status = STATUS_NO_MEMORY; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return(STATUS_NO_MEMORY); + } + + Pipe->ReferenceCount = 0; + InitializeListHead(&Pipe->ServerFcbListHead); + InitializeListHead(&Pipe->ClientFcbListHead); + KeInitializeSpinLock(&Pipe->FcbListLock); + + Pipe->PipeType = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_TYPE : FILE_PIPE_BYTE_STREAM_TYPE; + Pipe->PipeWriteMode = Buffer->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; + Pipe->PipeReadMode = Buffer->ReadModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE; + Pipe->PipeBlockMode = Buffer->NonBlocking; + Pipe->PipeConfiguration = IoStack->Parameters.Create.Options & 0x3; + Pipe->MaximumInstances = Buffer->MaxInstances; + Pipe->CurrentInstances = 0; + Pipe->TimeOut = Buffer->TimeOut; + if (!(IoStack->Parameters.Create.Options & FILE_PIPE_OUTBOUND) || + IoStack->Parameters.Create.Options & FILE_PIPE_FULL_DUPLEX) + { + if (Buffer->InBufferSize == 0) + { + Pipe->InboundQuota = DeviceExt->DefaultQuota; + } + else + { + Pipe->InboundQuota = PAGE_ROUND_UP(Buffer->InBufferSize); + if (Pipe->InboundQuota < DeviceExt->MinQuota) + { + Pipe->InboundQuota = DeviceExt->MinQuota; + } + else if (Pipe->InboundQuota > DeviceExt->MaxQuota) + { + Pipe->InboundQuota = DeviceExt->MaxQuota; + } + } } else { - Pipe->OutboundQuota = PAGE_ROUND_UP(Buffer->OutBufferSize); - if (Pipe->OutboundQuota < DeviceExt->MinQuota) + Pipe->InboundQuota = 0; + } + if (IoStack->Parameters.Create.Options & (FILE_PIPE_FULL_DUPLEX|FILE_PIPE_OUTBOUND)) + { + if (Buffer->OutBufferSize == 0) { - Pipe->OutboundQuota = DeviceExt->MinQuota; + Pipe->OutboundQuota = DeviceExt->DefaultQuota; } - else if (Pipe->OutboundQuota > DeviceExt->MaxQuota) + else { - Pipe->OutboundQuota = DeviceExt->MaxQuota; - } - } - } - else - { - Pipe->OutboundQuota = 0; + Pipe->OutboundQuota = PAGE_ROUND_UP(Buffer->OutBufferSize); + if (Pipe->OutboundQuota < DeviceExt->MinQuota) + { + Pipe->OutboundQuota = DeviceExt->MinQuota; + } + else if (Pipe->OutboundQuota > DeviceExt->MaxQuota) + { + Pipe->OutboundQuota = DeviceExt->MaxQuota; + } + } + } + else + { + Pipe->OutboundQuota = 0; + } + + InsertTailList(&DeviceExt->PipeListHead, &Pipe->PipeListEntry); + KeUnlockMutex(&DeviceExt->PipeListLock); } if (Pipe->OutboundQuota) @@ -338,17 +372,17 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, if (Fcb->Data == NULL) { ExFreePool(Fcb); - RtlFreeUnicodeString(&Pipe->PipeName); - ExFreePool(Pipe); + + if (Pipe != current) + { + RtlFreeUnicodeString(&Pipe->PipeName); + ExFreePool(Pipe); + } Irp->IoStatus.Status = STATUS_NO_MEMORY; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return(STATUS_NO_MEMORY); + return STATUS_NO_MEMORY; } - } else { @@ -362,34 +396,6 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Fcb->MaxDataLength = Pipe->OutboundQuota; KeInitializeSpinLock(&Fcb->DataListLock); - - KeLockMutex(&DeviceExt->PipeListLock); - current_entry = DeviceExt->PipeListHead.Flink; - while (current_entry != &DeviceExt->PipeListHead) - { - current = CONTAINING_RECORD(current_entry, - NPFS_PIPE, - PipeListEntry); - - if (RtlCompareUnicodeString(&Pipe->PipeName, ¤t->PipeName, TRUE) == 0) - { - break; - } - - current_entry = current_entry->Flink; - } - - if (current_entry != &DeviceExt->PipeListHead) - { - RtlFreeUnicodeString(&Pipe->PipeName); - ExFreePool(Pipe); - - Pipe = current; - } - else - { - InsertTailList(&DeviceExt->PipeListHead, &Pipe->PipeListEntry); - } Pipe->ReferenceCount++; Pipe->CurrentInstances++; @@ -399,8 +405,8 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, Fcb->Pipe = Pipe; Fcb->PipeEnd = FILE_PIPE_SERVER_END; + Fcb->PipeState = FILE_PIPE_LISTENING_STATE; Fcb->OtherSide = NULL; - Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; KeInitializeEvent(&Fcb->ConnectEvent, SynchronizationEvent, @@ -409,15 +415,10 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, KeInitializeEvent(&Fcb->Event, SynchronizationEvent, FALSE); - - - KeUnlockMutex(&DeviceExt->PipeListLock); FileObject->FsContext = Fcb; Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); return(STATUS_SUCCESS); @@ -459,7 +460,6 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, KeLockMutex(&DeviceExt->PipeListLock); - if (Fcb->PipeEnd == FILE_PIPE_SERVER_END) { /* FIXME: Clean up existing connections here ?? */ @@ -475,9 +475,10 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, */ KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); } - Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; + Fcb->PipeState = 0; } } + Pipe->ReferenceCount--; if (Fcb->PipeEnd == FILE_PIPE_CLIENT_END) @@ -494,19 +495,25 @@ NpfsClose(PDEVICE_OBJECT DeviceObject, */ KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); } - Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE; + Fcb->PipeState = 0; } } FileObject->FsContext = NULL; +#if 0 + DPRINT("%x\n", Pipe->ReferenceCount); if (Pipe->ReferenceCount == 0) +#else + if (Fcb->PipeEnd == FILE_PIPE_SERVER_END && + Fcb->Pipe->CurrentInstances == 0) +#endif { KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); if (Fcb->OtherSide) - { - RemoveEntryList(&Fcb->OtherSide->FcbListEntry); - } + { + RemoveEntryList(&Fcb->OtherSide->FcbListEntry); + } RemoveEntryList(&Fcb->FcbListEntry); KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); if (Fcb->OtherSide) diff --git a/reactos/drivers/fs/np/finfo.c b/reactos/drivers/fs/np/finfo.c index 450f0655523..90993914023 100644 --- a/reactos/drivers/fs/np/finfo.c +++ b/reactos/drivers/fs/np/finfo.c @@ -1,4 +1,4 @@ -/* $Id: finfo.c,v 1.5 2002/09/08 10:22:11 chorns Exp $ +/* $Id: finfo.c,v 1.6 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,9 +15,6 @@ #define NDEBUG #include - - - /* FUNCTIONS *****************************************************************/ static NTSTATUS diff --git a/reactos/drivers/fs/np/fsctrl.c b/reactos/drivers/fs/np/fsctrl.c index 09c3344d1bb..537ea4403f3 100644 --- a/reactos/drivers/fs/np/fsctrl.c +++ b/reactos/drivers/fs/np/fsctrl.c @@ -1,4 +1,4 @@ -/* $Id: fsctrl.c,v 1.13 2003/11/13 15:26:07 ekohl Exp $ +/* $Id: fsctrl.c,v 1.14 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,7 +16,6 @@ #define NDEBUG #include - /* FUNCTIONS *****************************************************************/ static NTSTATUS @@ -26,6 +25,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) PLIST_ENTRY current_entry; PNPFS_FCB ClientFcb; NTSTATUS Status; + KIRQL oldIrql; DPRINT("NpfsConnectPipe()\n"); @@ -35,19 +35,13 @@ NpfsConnectPipe(PNPFS_FCB Fcb) if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE) return STATUS_PIPE_CLOSING; - /* - * Acceptable states are: FILE_PIPE_DISCONNECTED_STATE and - * FILE_PIPE_LISTENING_STATE - */ - DPRINT("Waiting for connection...\n"); Pipe = Fcb->Pipe; - Fcb->PipeState = FILE_PIPE_LISTENING_STATE; - /* search for a listening client fcb */ + KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql); current_entry = Pipe->ClientFcbListHead.Flink; while (current_entry != &Pipe->ClientFcbListHead) { @@ -55,8 +49,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) NPFS_FCB, FcbListEntry); - if ((ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE) - || (ClientFcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)) + if (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE) { break; } @@ -64,8 +57,7 @@ NpfsConnectPipe(PNPFS_FCB Fcb) current_entry = current_entry->Flink; } - if ((current_entry != &Pipe->ClientFcbListHead) - && (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE)) + if (current_entry != &Pipe->ClientFcbListHead) { /* found a listening client fcb */ DPRINT("Listening client fcb found -- connecting\n"); @@ -78,25 +70,23 @@ NpfsConnectPipe(PNPFS_FCB Fcb) Fcb->PipeState = FILE_PIPE_CONNECTED_STATE; ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE; + KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + /* FIXME: create and initialize data queues */ /* signal client's connect event */ KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE); } - else if ((current_entry != &Pipe->ClientFcbListHead) - && (ClientFcb->PipeState == FILE_PIPE_DISCONNECTED_STATE)) - { - /* found a disconnected client fcb */ - DPRINT("Disconnected client fcb found - notifying client\n"); - - /* signal client's connect event */ - KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE); - } else { /* no listening client fcb found */ DPRINT("No listening client fcb found -- waiting for client\n"); + + KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql); + + Fcb->PipeState = FILE_PIPE_LISTENING_STATE; + Status = KeWaitForSingleObject(&Fcb->ConnectEvent, UserRequest, KernelMode, @@ -496,7 +486,7 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, break; default: - DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.IoControlCode) + DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.FsControlCode) Status = STATUS_UNSUCCESSFUL; } @@ -508,4 +498,19 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, return(Status); } + +NTSTATUS STDCALL +NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + /* FIXME: Implement */ + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/drivers/fs/np/npfs.c b/reactos/drivers/fs/np/npfs.c index 3a2f20e2ab4..ae25b4cd16f 100644 --- a/reactos/drivers/fs/np/npfs.c +++ b/reactos/drivers/fs/np/npfs.c @@ -1,4 +1,4 @@ -/* $Id: npfs.c,v 1.9 2004/03/07 20:33:25 navaraf Exp $ +/* $Id: npfs.c,v 1.10 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -41,7 +41,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = NpfsQueryVolumeInformation; // DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup; -// DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers; + DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers; // DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = // NpfsDirectoryControl; DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = diff --git a/reactos/drivers/fs/np/npfs.h b/reactos/drivers/fs/np/npfs.h index e2f463b0b2f..2608ef0d511 100644 --- a/reactos/drivers/fs/np/npfs.h +++ b/reactos/drivers/fs/np/npfs.h @@ -1,4 +1,4 @@ -/* $Id: npfs.h,v 1.14 2003/06/21 19:55:55 hbirr Exp $ */ +/* $Id: npfs.h,v 1.15 2004/04/12 13:03:29 navaraf Exp $ */ #ifndef __SERVICES_FS_NP_NPFS_H #define __SERVICES_FS_NP_NPFS_H @@ -75,6 +75,8 @@ NTSTATUS STDCALL NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp); +NTSTATUS STDCALL NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp); + NTSTATUS STDCALL NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp); diff --git a/reactos/drivers/fs/np/rw.c b/reactos/drivers/fs/np/rw.c index 8eac2d0025d..df5d5948a5a 100644 --- a/reactos/drivers/fs/np/rw.c +++ b/reactos/drivers/fs/np/rw.c @@ -1,4 +1,4 @@ -/* $Id: rw.c,v 1.11 2004/04/10 16:20:59 navaraf Exp $ +/* $Id: rw.c,v 1.12 2004/04/12 13:03:29 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,10 +16,8 @@ #define NDEBUG #include - /* FUNCTIONS *****************************************************************/ - NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -49,7 +47,12 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (ReadFcb == NULL) { DPRINT("Pipe is NOT connected!\n"); - Status = STATUS_UNSUCCESSFUL; + if (Fcb->PipeState == FILE_PIPE_LISTENING_STATE) + Status = STATUS_PIPE_LISTENING; + else if (Fcb->PipeState == FILE_PIPE_DISCONNECTED_STATE) + Status = STATUS_PIPE_DISCONNECTED; + else + Status = STATUS_UNSUCCESSFUL; Information = 0; goto done; } @@ -92,6 +95,7 @@ NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp) } if (Fcb->PipeState != FILE_PIPE_CONNECTED_STATE) { + DPRINT("PipeState: %x\n", Fcb->PipeState); Status = STATUS_PIPE_BROKEN; goto done; } @@ -223,7 +227,7 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, if (Irp->MdlAddress == NULL) { - DbgPrint ("Irp->MdlAddress == NULL\n"); + DPRINT("Irp->MdlAddress == NULL\n"); Status = STATUS_UNSUCCESSFUL; Length = 0; goto done; @@ -232,7 +236,12 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject, if (Fcb->OtherSide == NULL) { DPRINT("Pipe is NOT connected!\n"); - Status = STATUS_UNSUCCESSFUL; + if (Fcb->PipeState == FILE_PIPE_LISTENING_STATE) + Status = STATUS_PIPE_LISTENING; + else if (Fcb->PipeState == FILE_PIPE_DISCONNECTED_STATE) + Status = STATUS_PIPE_DISCONNECTED; + else + Status = STATUS_UNSUCCESSFUL; Length = 0; goto done; }