-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: drivers/fs/np/fsctrl.c
/* INCLUDES ******************************************************************/
-#include <ddk/ntddk.h>
-#include "npfs.h"
-
#define NDEBUG
#include <debug.h>
+#include "npfs.h"
+
/* FUNCTIONS *****************************************************************/
static VOID STDCALL
{
PNPFS_WAITER_ENTRY Waiter;
- DPRINT1("NpfsListeningCancelRoutine() called\n");
-
Waiter = (PNPFS_WAITER_ENTRY)&Irp->Tail.Overlay.DriverContext;
+ DPRINT1("NpfsListeningCancelRoutine() called for <%wZ>\n",
+ &Waiter->Fcb->Pipe->PipeName);
+
IoReleaseCancelSpinLock(Irp->CancelIrql);
return STATUS_PENDING;
}
IoReleaseCancelSpinLock(oldIrql);
-
+
RemoveEntryList(&Entry->Entry);
-
+
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
NTSTATUS Status;
PNPFS_FCB OtherSide;
PNPFS_PIPE Pipe;
- BOOL Server;
+ BOOLEAN Server;
DPRINT("NpfsDisconnectPipe()\n");
Server = (Fcb->PipeEnd == FILE_PIPE_SERVER_END);
OtherSide = Fcb->OtherSide;
Fcb->OtherSide = NULL;
+ Fcb->PipeState = FILE_PIPE_DISCONNECTED_STATE;
/* Lock the server first */
if (Server)
{
{
PLIST_ENTRY Entry;
PNPFS_WAITER_ENTRY WaitEntry = NULL;
- BOOLEAN Complete = FALSE;
+ BOOLEAN Complete = FALSE;
PIRP Irp = NULL;
Entry = Fcb->Pipe->WaiterListHead.Flink;
PNPFS_PIPE Pipe;
PLIST_ENTRY current_entry;
PNPFS_FCB ServerFcb;
- PNPFS_WAIT_PIPE WaitPipe;
+ PFILE_PIPE_WAIT_FOR_BUFFER WaitPipe;
NTSTATUS Status;
DPRINT("NpfsWaitPipe\n");
- WaitPipe = (PNPFS_WAIT_PIPE)Irp->AssociatedIrp.SystemBuffer;
+ WaitPipe = (PFILE_PIPE_WAIT_FOR_BUFFER)Irp->AssociatedIrp.SystemBuffer;
Pipe = Fcb->Pipe;
if (Fcb->PipeState != 0)
* RETURNS:
* Status of operation
*/
-static NTSTATUS
-NpfsGetState(PIRP Irp,
- PIO_STACK_LOCATION IrpSp)
-{
- PNPFS_GET_STATE Reply;
- PNPFS_PIPE Pipe;
- PNPFS_FCB Fcb;
-
- /* Validate parameters */
- if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(NPFS_GET_STATE))
- {
- DPRINT("Status (0x%X).\n", STATUS_INVALID_PARAMETER);
- return STATUS_INVALID_PARAMETER;
- }
-
- Fcb = IrpSp->FileObject->FsContext;
- Reply = (PNPFS_GET_STATE)Irp->AssociatedIrp.SystemBuffer;
- Pipe = Fcb->Pipe;
-
- Reply->WriteModeMessage = (Pipe->WriteMode == FILE_PIPE_MESSAGE_MODE);
- Reply->ReadModeMessage = (Pipe->ReadMode == FILE_PIPE_MESSAGE_MODE);
- Reply->NonBlocking = (Pipe->CompletionMode == FILE_PIPE_QUEUE_OPERATION);
- Reply->InBufferSize = Pipe->InboundQuota;
- Reply->OutBufferSize = Pipe->OutboundQuota;
- Reply->Timeout = Pipe->TimeOut;
-
- DPRINT("Status (0x%X).\n", STATUS_SUCCESS);
-
- return STATUS_SUCCESS;
-}
-
-
-/*
- * FUNCTION: Set state of a pipe
- * ARGUMENTS:
- * Irp = Pointer to I/O request packet
- * IrpSp = Pointer to current stack location of Irp
- * RETURNS:
- * Status of operation
- */
-static NTSTATUS
-NpfsSetState(PIRP Irp,
- PIO_STACK_LOCATION IrpSp)
-{
- PNPFS_SET_STATE Request;
- PNPFS_PIPE Pipe;
- PNPFS_FCB Fcb;
-
- /* Validate parameters */
- if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(NPFS_SET_STATE))
- {
- DPRINT("Status (0x%X).\n", STATUS_INVALID_PARAMETER);
- return STATUS_INVALID_PARAMETER;
- }
-
- Fcb = IrpSp->FileObject->FsContext;
- Request = (PNPFS_SET_STATE)Irp->AssociatedIrp.SystemBuffer;
- Pipe = Fcb->Pipe;
-
- Pipe->WriteMode =
- Request->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE;
- Pipe->ReadMode =
- Request->WriteModeMessage ? FILE_PIPE_MESSAGE_MODE : FILE_PIPE_BYTE_STREAM_MODE;
- Pipe->CompletionMode =
- Request->NonBlocking ? FILE_PIPE_QUEUE_OPERATION : FILE_PIPE_COMPLETE_OPERATION;
- Pipe->InboundQuota = Request->InBufferSize;
- Pipe->OutboundQuota = Request->OutBufferSize;
- Pipe->TimeOut = Request->Timeout;
-
- DPRINT("Status (0x%X).\n", STATUS_SUCCESS);
-
- return STATUS_SUCCESS;
-}
-
/*
* FUNCTION: Peek at a pipe (get information about messages)
DPRINT("Pipe: %p\n", Pipe);
DPRINT("PipeName: %wZ\n", &Pipe->PipeName);
+ Irp->IoStatus.Information = 0;
+
switch (IoStack->Parameters.FileSystemControl.FsControlCode)
{
case FSCTL_PIPE_ASSIGN_EVENT:
Status = STATUS_NOT_IMPLEMENTED;
break;
- case FSCTL_PIPE_GET_STATE:
- DPRINT("Get state\n");
- Status = NpfsGetState(Irp, (PIO_STACK_LOCATION)IoStack);
- break;
-
- case FSCTL_PIPE_SET_STATE:
- DPRINT("Set state\n");
- Status = NpfsSetState(Irp, (PIO_STACK_LOCATION)IoStack);
- break;
-
case FSCTL_PIPE_INTERNAL_READ:
DPRINT("Internal read\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
default:
- DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.FsControlCode)
+ DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.FsControlCode);
Status = STATUS_UNSUCCESSFUL;
}
if (Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
+
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}