- Implemented NpfsCleanup. - Moved most of the code from NpfsClose to NpfsCleanup. - If a pipe handle is closed, remove the fcb from the wait list and cancel a connecting irp if one is waiting. Modified: trunk/reactos/drivers/fs/np/create.c Modified: trunk/reactos/drivers/fs/np/npfs.c Modified: trunk/reactos/drivers/fs/np/npfs.h _____
Modified: trunk/reactos/drivers/fs/np/create.c --- trunk/reactos/drivers/fs/np/create.c 2005-03-25 13:02:35 UTC (rev 14309) +++ trunk/reactos/drivers/fs/np/create.c 2005-03-25 13:40:33 UTC (rev 14310) @@ -92,7 +92,7 @@
{ DPRINT("Server found! Fcb %p\n", Waiter->Fcb);
- Waiter->Irp->IoStatus.Status = FILE_PIPE_CONNECTED_STATE; + Waiter->Irp->IoStatus.Status = STATUS_PIPE_CONNECTED; Waiter->Irp->IoStatus.Information = 0; IoCompleteRequest(Waiter->Irp, IO_NO_INCREMENT);
@@ -467,10 +467,9 @@
if (NewPipe) { - /* - * FIXME: - * Lock the pipelist and remove the pipe from the list. - */ + KeLockMutex(&DeviceExt->PipeListLock); + RemoveEntryList(&Pipe->PipeListEntry); + KeUnlockMutex(&DeviceExt->PipeListLock); RtlFreeUnicodeString(&Pipe->PipeName); ExFreePool(Pipe); } @@ -494,10 +493,6 @@
Pipe->CurrentInstances++;
- KeLockMutex(&Pipe->FcbListLock); - InsertTailList(&Pipe->ServerFcbListHead, &Fcb->FcbListEntry); - KeUnlockMutex(&Pipe->FcbListLock); - Fcb->Pipe = Pipe; Fcb->PipeEnd = FILE_PIPE_SERVER_END; Fcb->PipeState = FILE_PIPE_LISTENING_STATE; @@ -511,6 +506,10 @@ SynchronizationEvent, FALSE);
+ KeLockMutex(&Pipe->FcbListLock); + InsertTailList(&Pipe->ServerFcbListHead, &Fcb->FcbListEntry); + KeUnlockMutex(&Pipe->FcbListLock); + FileObject->FsContext = Fcb;
Irp->IoStatus.Status = STATUS_SUCCESS; @@ -523,8 +522,8 @@
NTSTATUS STDCALL -NpfsClose(PDEVICE_OBJECT DeviceObject, - PIRP Irp) +NpfsCleanup(PDEVICE_OBJECT DeviceObject, + PIRP Irp) { PNPFS_DEVICE_EXTENSION DeviceExt; PIO_STACK_LOCATION IoStack; @@ -533,7 +532,7 @@ PNPFS_PIPE Pipe; BOOL Server;
- DPRINT("NpfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp); + DPRINT("NpfsCleanup(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
IoStack = IoGetCurrentIrpStackLocation(Irp); DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -552,7 +551,7 @@ DPRINT("Fcb %x\n", Fcb); Pipe = Fcb->Pipe;
- DPRINT("Closing pipe %wZ\n", &Pipe->PipeName); + DPRINT("Cleaning pipe %wZ\n", &Pipe->PipeName);
KeLockMutex(&Pipe->FcbListLock);
@@ -562,7 +561,6 @@ { /* FIXME: Clean up existing connections here ?? */ DPRINT("Server\n"); - Pipe->CurrentInstances--; } else { @@ -573,7 +571,7 @@ { if (Fcb->OtherSide) { - Fcb->OtherSide->PipeState = FILE_PIPE_CLOSING_STATE; + Fcb->OtherSide->PipeState = FILE_PIPE_DISCONNECTED_STATE; Fcb->OtherSide->OtherSide = NULL; /* * Signaling the write event. If is possible that an other @@ -581,15 +579,119 @@ */ KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE); } + } + else if (Fcb->PipeState == FILE_PIPE_LISTENING_STATE) + { + PLIST_ENTRY Entry; + PNPFS_WAITER_ENTRY WaitEntry = NULL; + BOOLEAN Complete = FALSE; + KIRQL oldIrql;
- Fcb->PipeState = 0; + Entry = Fcb->Pipe->WaiterListHead.Flink; + while (Entry != &Fcb->Pipe->WaiterListHead) + { + WaitEntry = CONTAINING_RECORD(Entry, NPFS_WAITER_ENTRY, Entry); + if (WaitEntry->Fcb == Fcb) + { + RemoveEntryList(Entry); + IoAcquireCancelSpinLock(&oldIrql); + if (!Irp->Cancel) + { + IoSetCancelRoutine(WaitEntry->Irp, NULL); + Complete = TRUE; + } + IoReleaseCancelSpinLock(oldIrql); + break; + } + Entry = Entry->Flink; + } + + if (Entry != &Fcb->Pipe->WaiterListHead) + { + if (Complete) + { + WaitEntry->Irp->IoStatus.Status = STATUS_PIPE_BROKEN; + WaitEntry->Irp->IoStatus.Information = 0; + IoCompleteRequest(WaitEntry->Irp, IO_NO_INCREMENT); + } + ExFreePool(WaitEntry); + } } + Fcb->PipeState = FILE_PIPE_CLOSING_STATE;
+ KeUnlockMutex(&Pipe->FcbListLock); + + ExAcquireFastMutex(&Fcb->DataListLock); + if (Fcb->Data) + { + ExFreePool(Fcb->Data); + Fcb->Data = NULL; + Fcb->ReadPtr = NULL; + Fcb->WritePtr = NULL; + } + ExReleaseFastMutex(&Fcb->DataListLock); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + DPRINT("Success!\n"); + + return STATUS_SUCCESS; +} + +NTSTATUS STDCALL +NpfsClose(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PNPFS_DEVICE_EXTENSION DeviceExt; + PIO_STACK_LOCATION IoStack; + PFILE_OBJECT FileObject; + PNPFS_FCB Fcb; + PNPFS_PIPE Pipe; + BOOL Server; + + DPRINT("NpfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp); + + IoStack = IoGetCurrentIrpStackLocation(Irp); + DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FileObject = IoStack->FileObject; + Fcb = FileObject->FsContext; + + if (Fcb == NULL) + { + DPRINT("Success!\n"); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } + + DPRINT("Fcb %x\n", Fcb); + Pipe = Fcb->Pipe; + + DPRINT("Closing pipe %wZ\n", &Pipe->PipeName); + + KeLockMutex(&Pipe->FcbListLock); + + Server = (Fcb->PipeEnd == FILE_PIPE_SERVER_END); + + if (Server) + { + DPRINT("Server\n"); + Pipe->CurrentInstances--; + } + else + { + DPRINT("Client\n"); + } + + ASSERT (Fcb->PipeState == FILE_PIPE_CLOSING_STATE); + FileObject->FsContext = NULL;
RemoveEntryList(&Fcb->FcbListEntry); - if (Fcb->Data) - ExFreePool(Fcb->Data); + ExFreePool(Fcb);
KeUnlockMutex(&Pipe->FcbListLock); _____
Modified: trunk/reactos/drivers/fs/np/npfs.c --- trunk/reactos/drivers/fs/np/npfs.c 2005-03-25 13:02:35 UTC (rev 14309) +++ trunk/reactos/drivers/fs/np/npfs.c 2005-03-25 13:40:33 UTC (rev 14310) @@ -40,7 +40,7 @@
NpfsSetInformation; DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] = NpfsQueryVolumeInformation; -// DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup; DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers; // DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = // NpfsDirectoryControl; _____
Modified: trunk/reactos/drivers/fs/np/npfs.h --- trunk/reactos/drivers/fs/np/npfs.h 2005-03-25 13:02:35 UTC (rev 14309) +++ trunk/reactos/drivers/fs/np/npfs.h 2005-03-25 13:40:33 UTC (rev 14310) @@ -99,6 +99,7 @@
NTSTATUS STDCALL NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp); +NTSTATUS STDCALL NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS STDCALL NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);