mirror of
https://github.com/reactos/reactos.git
synced 2024-07-05 12:15:46 +00:00
Minor simplifications.
svn path=/trunk/; revision=11269
This commit is contained in:
parent
e9542274b4
commit
2dea5c279b
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: create.c,v 1.22 2004/07/03 17:40:20 navaraf Exp $
|
/* $Id: create.c,v 1.23 2004/10/11 12:37:04 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -18,13 +18,59 @@
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
static PNPFS_PIPE
|
||||||
|
NpfsFindPipe(PNPFS_DEVICE_EXTENSION DeviceExt,
|
||||||
|
PUNICODE_STRING PipeName)
|
||||||
|
{
|
||||||
|
PLIST_ENTRY CurrentEntry;
|
||||||
|
PNPFS_PIPE Pipe;
|
||||||
|
|
||||||
|
CurrentEntry = DeviceExt->PipeListHead.Flink;
|
||||||
|
while (CurrentEntry != &DeviceExt->PipeListHead)
|
||||||
|
{
|
||||||
|
Pipe = CONTAINING_RECORD(CurrentEntry, NPFS_PIPE, PipeListEntry);
|
||||||
|
if (RtlCompareUnicodeString(PipeName,
|
||||||
|
&Pipe->PipeName,
|
||||||
|
TRUE) == 0)
|
||||||
|
{
|
||||||
|
DPRINT1("<%wZ> = <%wZ>\n", PipeName, &Pipe->PipeName);
|
||||||
|
return Pipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentEntry = CurrentEntry->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PNPFS_FCB
|
||||||
|
NpfsFindListeningServerInstance(PNPFS_PIPE Pipe)
|
||||||
|
{
|
||||||
|
PLIST_ENTRY CurrentEntry;
|
||||||
|
PNPFS_FCB ServerFcb;
|
||||||
|
|
||||||
|
CurrentEntry = Pipe->ServerFcbListHead.Flink;
|
||||||
|
while (CurrentEntry != &Pipe->ServerFcbListHead)
|
||||||
|
{
|
||||||
|
ServerFcb = CONTAINING_RECORD(CurrentEntry, NPFS_FCB, FcbListEntry);
|
||||||
|
if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
||||||
|
{
|
||||||
|
DPRINT("Server found! Fcb %p\n", ServerFcb);
|
||||||
|
return ServerFcb;
|
||||||
|
}
|
||||||
|
CurrentEntry = CurrentEntry->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
NpfsCreate(
|
NpfsCreate(
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
PIRP Irp)
|
PIRP Irp)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY CurrentEntry;
|
|
||||||
PNPFS_PIPE Current;
|
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
PNPFS_PIPE Pipe;
|
PNPFS_PIPE Pipe;
|
||||||
|
@ -43,29 +89,17 @@ NpfsCreate(
|
||||||
DPRINT("FileName %wZ\n", &FileObject->FileName);
|
DPRINT("FileName %wZ\n", &FileObject->FileName);
|
||||||
|
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Step 1. Find the pipe we're trying to open.
|
* Step 1. Find the pipe we're trying to open.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
KeLockMutex(&DeviceExt->PipeListLock);
|
KeLockMutex(&DeviceExt->PipeListLock);
|
||||||
CurrentEntry = DeviceExt->PipeListHead.Flink;
|
Pipe = NpfsFindPipe(DeviceExt,
|
||||||
while (CurrentEntry != &DeviceExt->PipeListHead)
|
&FileObject->FileName);
|
||||||
{
|
if (Pipe == NULL)
|
||||||
Current = CONTAINING_RECORD(CurrentEntry, NPFS_PIPE, PipeListEntry);
|
|
||||||
if (RtlCompareUnicodeString(
|
|
||||||
&FileObject->FileName,
|
|
||||||
&Current->PipeName,
|
|
||||||
TRUE) == 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
CurrentEntry = CurrentEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not found, bail out with error. */
|
|
||||||
if (CurrentEntry == &DeviceExt->PipeListHead)
|
|
||||||
{
|
{
|
||||||
|
/* Not found, bail out with error. */
|
||||||
DPRINT("No pipe found!\n");
|
DPRINT("No pipe found!\n");
|
||||||
KeUnlockMutex(&DeviceExt->PipeListLock);
|
KeUnlockMutex(&DeviceExt->PipeListLock);
|
||||||
Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND;
|
Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND;
|
||||||
|
@ -75,9 +109,6 @@ NpfsCreate(
|
||||||
|
|
||||||
KeUnlockMutex(&DeviceExt->PipeListLock);
|
KeUnlockMutex(&DeviceExt->PipeListLock);
|
||||||
|
|
||||||
/* Save the pipe we found for later use. */
|
|
||||||
Pipe = Current;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Step 2. Search for listening server FCB.
|
* Step 2. Search for listening server FCB.
|
||||||
*/
|
*/
|
||||||
|
@ -88,21 +119,10 @@ NpfsCreate(
|
||||||
*/
|
*/
|
||||||
KeLockMutex(&Pipe->FcbListLock);
|
KeLockMutex(&Pipe->FcbListLock);
|
||||||
|
|
||||||
CurrentEntry = Pipe->ServerFcbListHead.Flink;
|
ServerFcb = NpfsFindListeningServerInstance(Pipe);
|
||||||
while (CurrentEntry != &Pipe->ServerFcbListHead)
|
if (ServerFcb == NULL)
|
||||||
{
|
|
||||||
ServerFcb = CONTAINING_RECORD(CurrentEntry, NPFS_FCB, FcbListEntry);
|
|
||||||
if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
|
||||||
{
|
|
||||||
DPRINT("Server found! Fcb %p\n", ServerFcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
CurrentEntry = CurrentEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not found, bail out with error for FILE_OPEN requests. */
|
|
||||||
if (CurrentEntry == &Pipe->ServerFcbListHead)
|
|
||||||
{
|
{
|
||||||
|
/* Not found, bail out with error for FILE_OPEN requests. */
|
||||||
DPRINT("No server fcb found!\n");
|
DPRINT("No server fcb found!\n");
|
||||||
if (Disposition == FILE_OPEN)
|
if (Disposition == FILE_OPEN)
|
||||||
{
|
{
|
||||||
|
@ -111,7 +131,6 @@ NpfsCreate(
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return STATUS_PIPE_BUSY;
|
return STATUS_PIPE_BUSY;
|
||||||
}
|
}
|
||||||
ServerFcb = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -188,7 +207,7 @@ NpfsCreate(
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
DPRINT("Success!\n");
|
DPRINT("Success!\n");
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,11 +482,12 @@ NpfsClose(
|
||||||
/* FIXME: Clean up existing connections here ?? */
|
/* FIXME: Clean up existing connections here ?? */
|
||||||
DPRINT("Server\n");
|
DPRINT("Server\n");
|
||||||
Pipe->CurrentInstances--;
|
Pipe->CurrentInstances--;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
DPRINT("Client\n");
|
DPRINT("Client\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
|
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
|
||||||
{
|
{
|
||||||
if (Fcb->OtherSide)
|
if (Fcb->OtherSide)
|
||||||
|
@ -482,6 +502,7 @@ NpfsClose(
|
||||||
*/
|
*/
|
||||||
KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE);
|
KeSetEvent(&Fcb->OtherSide->Event, IO_NO_INCREMENT, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef FIN_WORKAROUND_READCLOSE
|
#ifndef FIN_WORKAROUND_READCLOSE
|
||||||
Fcb->PipeState = 0;
|
Fcb->PipeState = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -507,9 +528,11 @@ NpfsClose(
|
||||||
ExFreePool(Fcb->OtherSide->Data);
|
ExFreePool(Fcb->OtherSide->Data);
|
||||||
ExFreePool(Fcb->OtherSide);
|
ExFreePool(Fcb->OtherSide);
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveEntryList(&Fcb->FcbListEntry);
|
RemoveEntryList(&Fcb->FcbListEntry);
|
||||||
if (Fcb->Data)
|
if (Fcb->Data)
|
||||||
ExFreePool(Fcb->Data);
|
ExFreePool(Fcb->Data);
|
||||||
|
|
||||||
ExFreePool(Fcb);
|
ExFreePool(Fcb);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: fsctrl.c,v 1.15 2004/05/05 18:30:16 navaraf Exp $
|
/* $Id: fsctrl.c,v 1.16 2004/10/11 12:37:04 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -21,94 +21,86 @@
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
NpfsConnectPipe(PNPFS_FCB Fcb)
|
NpfsConnectPipe(PNPFS_FCB Fcb)
|
||||||
{
|
{
|
||||||
PNPFS_PIPE Pipe;
|
PNPFS_PIPE Pipe;
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PNPFS_FCB ClientFcb;
|
PNPFS_FCB ClientFcb;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("NpfsConnectPipe()\n");
|
DPRINT("NpfsConnectPipe()\n");
|
||||||
|
|
||||||
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
|
if (Fcb->PipeState == FILE_PIPE_CONNECTED_STATE)
|
||||||
{
|
{
|
||||||
KeResetEvent(&Fcb->ConnectEvent);
|
KeResetEvent(&Fcb->ConnectEvent);
|
||||||
return STATUS_PIPE_CONNECTED;
|
return STATUS_PIPE_CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE)
|
if (Fcb->PipeState == FILE_PIPE_CLOSING_STATE)
|
||||||
return STATUS_PIPE_CLOSING;
|
return STATUS_PIPE_CLOSING;
|
||||||
|
|
||||||
DPRINT("Waiting for connection...\n");
|
DPRINT("Waiting for connection...\n");
|
||||||
|
|
||||||
Pipe = Fcb->Pipe;
|
Pipe = Fcb->Pipe;
|
||||||
|
|
||||||
/* search for a listening client fcb */
|
/* search for a listening client fcb */
|
||||||
|
KeLockMutex(&Pipe->FcbListLock);
|
||||||
|
|
||||||
KeLockMutex(&Pipe->FcbListLock);
|
current_entry = Pipe->ClientFcbListHead.Flink;
|
||||||
current_entry = Pipe->ClientFcbListHead.Flink;
|
while (current_entry != &Pipe->ClientFcbListHead)
|
||||||
while (current_entry != &Pipe->ClientFcbListHead)
|
{
|
||||||
{
|
ClientFcb = CONTAINING_RECORD(current_entry,
|
||||||
ClientFcb = CONTAINING_RECORD(current_entry,
|
NPFS_FCB,
|
||||||
NPFS_FCB,
|
FcbListEntry);
|
||||||
FcbListEntry);
|
|
||||||
|
|
||||||
if (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current_entry != &Pipe->ClientFcbListHead)
|
|
||||||
{
|
|
||||||
/* found a listening client fcb */
|
|
||||||
DPRINT("Listening client fcb found -- connecting\n");
|
|
||||||
|
|
||||||
/* connect client and server fcb's */
|
if (ClientFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
||||||
Fcb->OtherSide = ClientFcb;
|
{
|
||||||
ClientFcb->OtherSide = Fcb;
|
/* found a listening client fcb */
|
||||||
|
DPRINT("Listening client fcb found -- connecting\n");
|
||||||
|
|
||||||
/* set connected state */
|
/* connect client and server fcb's */
|
||||||
Fcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
Fcb->OtherSide = ClientFcb;
|
||||||
ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
ClientFcb->OtherSide = Fcb;
|
||||||
|
|
||||||
KeUnlockMutex(&Pipe->FcbListLock);
|
/* set connected state */
|
||||||
|
Fcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
||||||
|
ClientFcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
||||||
|
|
||||||
/* FIXME: create and initialize data queues */
|
KeUnlockMutex(&Pipe->FcbListLock);
|
||||||
|
|
||||||
/* signal client's connect event */
|
/* FIXME: create and initialize data queues */
|
||||||
DPRINT("Setting the ConnectEvent for %x\n", ClientFcb);
|
|
||||||
KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE);
|
|
||||||
|
|
||||||
Status = STATUS_PIPE_CONNECTED;
|
/* signal client's connect event */
|
||||||
}
|
DPRINT("Setting the ConnectEvent for %x\n", ClientFcb);
|
||||||
else
|
KeSetEvent(&ClientFcb->ConnectEvent, IO_NO_INCREMENT, FALSE);
|
||||||
{
|
|
||||||
/* no listening client fcb found */
|
|
||||||
DPRINT("No listening client fcb found -- waiting for client\n");
|
|
||||||
|
|
||||||
KeUnlockMutex(&Pipe->FcbListLock);
|
return STATUS_PIPE_CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
Fcb->PipeState = FILE_PIPE_LISTENING_STATE;
|
current_entry = current_entry->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
Status = KeWaitForSingleObject(&Fcb->ConnectEvent,
|
KeUnlockMutex(&Pipe->FcbListLock);
|
||||||
UserRequest,
|
|
||||||
KernelMode,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (NT_SUCCESS(Status))
|
/* no listening client fcb found */
|
||||||
{
|
DPRINT("No listening client fcb found -- waiting for client\n");
|
||||||
Status = STATUS_PIPE_CONNECTED;
|
|
||||||
Fcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("Finished waiting! Status: %x\n", Status);
|
Fcb->PipeState = FILE_PIPE_LISTENING_STATE;
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("Client Fcb: %p\n", Fcb->OtherSide);
|
Status = KeWaitForSingleObject(&Fcb->ConnectEvent,
|
||||||
|
UserRequest,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("KeWaitForSingleObject() failed (Status %lx)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
Fcb->PipeState = FILE_PIPE_CONNECTED_STATE;
|
||||||
|
|
||||||
|
DPRINT("Client Fcb: %p\n", Fcb->OtherSide);
|
||||||
|
|
||||||
|
return STATUS_PIPE_CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,31 +166,28 @@ NpfsWaitPipe(PIRP Irp,
|
||||||
FcbListEntry);
|
FcbListEntry);
|
||||||
|
|
||||||
if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
if (ServerFcb->PipeState == FILE_PIPE_LISTENING_STATE)
|
||||||
break;
|
{
|
||||||
|
/* found a listening server fcb */
|
||||||
|
DPRINT("Listening server fcb found -- connecting\n");
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_entry != &Pipe->ServerFcbListHead)
|
/* no listening server fcb found -- wait for one */
|
||||||
{
|
Fcb->PipeState = FILE_PIPE_LISTENING_STATE;
|
||||||
/* found a listening server fcb */
|
|
||||||
DPRINT("Listening server fcb found -- connecting\n");
|
|
||||||
|
|
||||||
Status = STATUS_SUCCESS;
|
Status = KeWaitForSingleObject(&Fcb->ConnectEvent,
|
||||||
}
|
UserRequest,
|
||||||
else
|
KernelMode,
|
||||||
{
|
FALSE,
|
||||||
/* no listening server fcb found -- wait for one */
|
&WaitPipe->Timeout);
|
||||||
Fcb->PipeState = FILE_PIPE_LISTENING_STATE;
|
|
||||||
|
|
||||||
Status = KeWaitForSingleObject(&Fcb->ConnectEvent,
|
DPRINT("KeWaitForSingleObject() returned (Status %lx)\n", Status);
|
||||||
UserRequest,
|
|
||||||
KernelMode,
|
|
||||||
FALSE,
|
|
||||||
&WaitPipe->Timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(Status);
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue