Some named pipe improvements (not usable yet!).

svn path=/trunk/; revision=1902
This commit is contained in:
Eric Kohl 2001-05-10 23:38:31 +00:00
parent 4c5a154f4d
commit 7d0f1e3433
9 changed files with 502 additions and 348 deletions

View file

@ -2,11 +2,12 @@
VOID MyErrExit(LPTSTR Message) VOID MyErrExit(LPTSTR Message)
{ {
MessageBox(NULL, Message, NULL, MB_OK); // MessageBox(NULL, Message, NULL, MB_OK);
puts(Message);
ExitProcess(0); ExitProcess(0);
} }
DWORD main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
HANDLE hPipe; HANDLE hPipe;
LPVOID lpvMessage; LPVOID lpvMessage;

View file

@ -2,24 +2,41 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <windows.h> #include <windows.h>
#include <tchar.h>
#define BUFSIZE 1024
#define PIPE_TIMEOUT 1000
VOID InstanceThread (LPVOID); VOID InstanceThread (LPVOID);
VOID GetAnswerToRequest (LPTSTR, LPTSTR, LPDWORD) VOID
GetAnswerToRequest(LPTSTR lpRequest,
LPTSTR lpReply,
LPDWORD lpcbReplyBytes)
{ {
} }
VOID MyErrExit(LPTSTR Message)
{
// MessageBox(NULL, Message, NULL, MB_OK);
puts(Message);
ExitProcess(0);
}
int xx = 0; int xx = 0;
DWORD main (VOID) int main(int argc, char *argv[])
{ {
BOOL fConnected; BOOL fConnected;
DWORD dwThreadId; DWORD dwThreadId;
HANDLE hPipe, hThread; HANDLE hPipe, hThread;
LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe"; LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");
for (;;) // for (;;)
{ // {
hPipe = CreateNamedPipe(lpszPipename, hPipe = CreateNamedPipe(lpszPipename,
PIPE_ACCESS_DUPLEX, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_TYPE_MESSAGE |
@ -31,13 +48,21 @@ DWORD main (VOID)
PIPE_TIMEOUT, PIPE_TIMEOUT,
NULL); NULL);
if (hPipe == INVALID_HANDLE_VALUE) if (hPipe == INVALID_HANDLE_VALUE)
MyErrExit ("CreatePipe"); {
printf("CreateNamedPipe() failed\n");
return 0;
}
fConnected = ConnectNamedPipe(hPipe, fConnected = ConnectNamedPipe(hPipe,
NULL) ? TRUE : (GetLastError () == NULL) ? TRUE : (GetLastError () ==
ERROR_PIPE_CONNECTED); ERROR_PIPE_CONNECTED);
if (fConnected) if (fConnected)
{ {
printf("Pipe connected!\n");
DisconnectNamedPipe(hPipe);
#if 0
hThread = CreateThread(NULL, hThread = CreateThread(NULL,
0, 0,
(LPTHREAD_START_ROUTINE) InstanceThread, (LPTHREAD_START_ROUTINE) InstanceThread,
@ -46,13 +71,17 @@ DWORD main (VOID)
&dwThreadId); &dwThreadId);
if (hThread == NULL) if (hThread == NULL)
MyErrExit("CreateThread"); MyErrExit("CreateThread");
#endif
} }
else else
{ {
// CloseHandle(hPipe);
}
// }
CloseHandle(hPipe); CloseHandle(hPipe);
}
} return 0;
return 1;
} }
VOID InstanceThread (LPVOID lpvParam) VOID InstanceThread (LPVOID lpvParam)
@ -73,6 +102,7 @@ VOID InstanceThread (LPVOID lpvParam)
NULL); NULL);
if (!fSuccess || cbBytesRead == 0) if (!fSuccess || cbBytesRead == 0)
break; break;
GetAnswerToRequest(chRequest, chReply, &cbReplyBytes); GetAnswerToRequest(chRequest, chReply, &cbReplyBytes);
fSuccess = WriteFile(hPipe, fSuccess = WriteFile(hPipe,

View file

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.5 2001/05/07 22:03:27 chorns Exp $ # $Id: Makefile,v 1.6 2001/05/10 23:38:31 ekohl Exp $
# #
# Named Pipes File System # Named Pipes File System
# #
@ -8,21 +8,25 @@ TARGETNAME=npfs
#BASE_CFLAGS = -I../../../include #BASE_CFLAGS = -I../../../include
OBJECTS = create.o fsctrl.o mount.o rw.o npfs.coff \ OBJECTS = create.o fsctrl.o mount.o rw.o npfs.coff
../../../ntoskrnl/ntoskrnl.a
LIBS = ../../../ntoskrnl/ntoskrnl.a
all: $(TARGETNAME).sys all: $(TARGETNAME).sys
.phony: all .phony: all
clean: clean:
- $(RM) create.o - $(RM) *.o
- $(RM) mount.o - $(RM) npfs.coff
- $(RM) junk.tmp
- $(RM) base.tmp
- $(RM) temp.exp
- $(RM) $(TARGETNAME).sys - $(RM) $(TARGETNAME).sys
.phony: clean .phony: clean
$(TARGETNAME).sys: $(OBJECTS) $(TARGETNAME).sys: $(OBJECTS) $(LIBS)
$(CC) \ $(CC) \
-specs=../../svc_specs \ -specs=../../svc_specs \
-mdll \ -mdll \
@ -31,7 +35,7 @@ $(TARGETNAME).sys: $(OBJECTS)
-Wl,--defsym,_edata=__data_end__ \ -Wl,--defsym,_edata=__data_end__ \
-Wl,--defsym,_etext=etext \ -Wl,--defsym,_etext=etext \
-Wl,--base-file,base.tmp \ -Wl,--base-file,base.tmp \
$(OBJECTS) $(OBJECTS) $(LIBS)
$(RM) junk.tmp $(RM) junk.tmp
$(DLLTOOL) \ $(DLLTOOL) \
--dllname $(TARGETNAME).sys \ --dllname $(TARGETNAME).sys \
@ -46,9 +50,10 @@ $(TARGETNAME).sys: $(OBJECTS)
-specs=../../svc_specs \ -specs=../../svc_specs \
-mdll \ -mdll \
-o $(TARGETNAME).sys \ -o $(TARGETNAME).sys \
$(OBJECTS) \ $(OBJECTS) $(LIBS) \
-Wl,temp.exp -Wl,temp.exp
$(RM) temp.exp $(RM) temp.exp
$(NM) --numeric-sort npfs.sys > npfs.sym
npfs.coff: ../../../include/reactos/buildno.h npfs.rc npfs.coff: ../../../include/reactos/buildno.h npfs.rc

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.5 2001/05/01 11:09:01 ekohl Exp $ /* $Id: create.c,v 1.6 2001/05/10 23:38:31 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -19,17 +19,9 @@
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
static LIST_ENTRY PipeListHead;
static KMUTEX PipeListLock;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
VOID NpfsInitPipeList(VOID)
{
InitializeListHead(&PipeListHead);
KeInitializeMutex(&PipeListLock, 0);
}
NTSTATUS STDCALL NTSTATUS STDCALL
NpfsCreate(PDEVICE_OBJECT DeviceObject, NpfsCreate(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
@ -39,7 +31,6 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
NTSTATUS Status; NTSTATUS Status;
PNPFS_PIPE Pipe; PNPFS_PIPE Pipe;
PNPFS_FCB Fcb; PNPFS_FCB Fcb;
PWSTR PipeName;
PNPFS_PIPE current; PNPFS_PIPE current;
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
PNPFS_DEVICE_EXTENSION DeviceExt; PNPFS_DEVICE_EXTENSION DeviceExt;
@ -51,8 +42,6 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject; FileObject = IoStack->FileObject;
PipeName = FileObject->FileName.Buffer;
Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB)); Fcb = ExAllocatePool(NonPagedPool, sizeof(NPFS_FCB));
if (Fcb == NULL) if (Fcb == NULL)
{ {
@ -64,15 +53,17 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
return(STATUS_NO_MEMORY); return(STATUS_NO_MEMORY);
} }
KeLockMutex(&PipeListLock); KeLockMutex(&DeviceExt->PipeListLock);
current_entry = PipeListHead.Flink; current_entry = DeviceExt->PipeListHead.Flink;
while (current_entry != &PipeListHead) while (current_entry != &DeviceExt->PipeListHead)
{ {
current = CONTAINING_RECORD(current_entry, current = CONTAINING_RECORD(current_entry,
NPFS_PIPE, NPFS_PIPE,
PipeListEntry); PipeListEntry);
if (wcscmp(Pipe->Name, current->Name) == 0) if (RtlCompareUnicodeString(&Pipe->PipeName,
&current->PipeName,
TRUE) == 0)
{ {
break; break;
} }
@ -80,10 +71,10 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
current_entry = current_entry->Flink; current_entry = current_entry->Flink;
} }
if (current_entry == &PipeListHead) if (current_entry == &DeviceExt->PipeListHead)
{ {
ExFreePool(Fcb); ExFreePool(Fcb);
KeUnlockMutex(&PipeListLock); KeUnlockMutex(&DeviceExt->PipeListLock);
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
@ -109,7 +100,10 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
Pipe->ReferenceCount++; Pipe->ReferenceCount++;
KeUnlockMutex(&PipeListLock); /* search for unconnected server fcb */
KeUnlockMutex(&DeviceExt->PipeListLock);
FileObject->FsContext = Fcb; FileObject->FsContext = Fcb;
@ -121,6 +115,7 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
return(Status); return(Status);
} }
NTSTATUS STDCALL NTSTATUS STDCALL
NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
@ -129,7 +124,6 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PNPFS_DEVICE_EXTENSION DeviceExt; PNPFS_DEVICE_EXTENSION DeviceExt;
PWSTR PipeName;
PNPFS_PIPE Pipe; PNPFS_PIPE Pipe;
PNPFS_FCB Fcb; PNPFS_FCB Fcb;
KIRQL oldIrql; KIRQL oldIrql;
@ -143,8 +137,6 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject; FileObject = IoStack->FileObject;
PipeName = FileObject->FileName.Buffer;
Buffer = (PIO_PIPE_CREATE_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer; Buffer = (PIO_PIPE_CREATE_BUFFER)Irp->Tail.Overlay.AuxiliaryBuffer;
Pipe = ExAllocatePool(NonPagedPool, sizeof(NPFS_PIPE)); Pipe = ExAllocatePool(NonPagedPool, sizeof(NPFS_PIPE));
@ -171,9 +163,7 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
return(STATUS_NO_MEMORY); return(STATUS_NO_MEMORY);
} }
Pipe->Name = ExAllocatePool(NonPagedPool, if (RtlCreateUnicodeString(&Pipe->PipeName, FileObject->FileName.Buffer) == 0)
(wcslen(PipeName) + 1) * sizeof(WCHAR));
if (Pipe->Name == NULL)
{ {
ExFreePool(Pipe); ExFreePool(Pipe);
ExFreePool(Fcb); ExFreePool(Fcb);
@ -186,7 +176,6 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
return(STATUS_NO_MEMORY); return(STATUS_NO_MEMORY);
} }
wcscpy(Pipe->Name, PipeName);
Pipe->ReferenceCount = 0; Pipe->ReferenceCount = 0;
InitializeListHead(&Pipe->FcbListHead); InitializeListHead(&Pipe->FcbListHead);
KeInitializeSpinLock(&Pipe->FcbListLock); KeInitializeSpinLock(&Pipe->FcbListLock);
@ -194,15 +183,15 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
Pipe->MaxInstances = Buffer->MaxInstances; Pipe->MaxInstances = Buffer->MaxInstances;
Pipe->TimeOut = Buffer->TimeOut; Pipe->TimeOut = Buffer->TimeOut;
KeLockMutex(&PipeListLock); KeLockMutex(&DeviceExt->PipeListLock);
current_entry = PipeListHead.Flink; current_entry = DeviceExt->PipeListHead.Flink;
while (current_entry != &PipeListHead) while (current_entry != &DeviceExt->PipeListHead)
{ {
current = CONTAINING_RECORD(current_entry, current = CONTAINING_RECORD(current_entry,
NPFS_PIPE, NPFS_PIPE,
PipeListEntry); PipeListEntry);
if (wcscmp(Pipe->Name, current->Name) == 0) if (RtlCompareUnicodeString(&Pipe->PipeName, &current->PipeName, TRUE) == 0)
{ {
break; break;
} }
@ -210,16 +199,16 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
current_entry = current_entry->Flink; current_entry = current_entry->Flink;
} }
if (current_entry != &PipeListHead) if (current_entry != &DeviceExt->PipeListHead)
{ {
ExFreePool(Pipe->Name); RtlFreeUnicodeString(&Pipe->PipeName);
ExFreePool(Pipe); ExFreePool(Pipe);
Pipe = current; Pipe = current;
} }
else else
{ {
InsertTailList(&PipeListHead, &Pipe->PipeListEntry); InsertTailList(&DeviceExt->PipeListHead, &Pipe->PipeListEntry);
} }
Pipe->ReferenceCount++; Pipe->ReferenceCount++;
@ -237,7 +226,11 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
Fcb->IsServer = TRUE; Fcb->IsServer = TRUE;
Fcb->OtherSide = NULL; Fcb->OtherSide = NULL;
KeUnlockMutex(&PipeListLock); KeInitializeEvent(&Fcb->ConnectEvent,
SynchronizationEvent,
FALSE);
KeUnlockMutex(&DeviceExt->PipeListLock);
FileObject->FsContext = Fcb; FileObject->FsContext = Fcb;
@ -254,27 +247,48 @@ NTSTATUS STDCALL
NpfsClose(PDEVICE_OBJECT DeviceObject, NpfsClose(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
{ {
PNPFS_DEVICE_EXTENSION DeviceExt;
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
PNPFS_FCB Fcb; PNPFS_FCB Fcb;
NTSTATUS Status; PNPFS_PIPE Pipe;
KIRQL oldIrql;
DPRINT1("NpfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp); DPRINT("NpfsClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
FileObject = IoStack->FileObject; FileObject = IoStack->FileObject;
Fcb = FileObject->FsContext; Fcb = FileObject->FsContext;
Pipe = Fcb->Pipe;
DPRINT1("Closing pipe %S\n", Fcb->Pipe->Name); DPRINT("Closing pipe %wZ\n", &Pipe->PipeName);
Status = STATUS_SUCCESS; KeLockMutex(&DeviceExt->PipeListLock);
Irp->IoStatus.Status = Status; Pipe->ReferenceCount--;
KeAcquireSpinLock(&Pipe->FcbListLock, &oldIrql);
RemoveEntryList(&Fcb->FcbListEntry);
KeReleaseSpinLock(&Pipe->FcbListLock, oldIrql);
ExFreePool(Fcb);
FileObject->FsContext = NULL;
if (Pipe->ReferenceCount == 0)
{
RtlFreeUnicodeString(&Pipe->PipeName);
RemoveEntryList(&Pipe->PipeListEntry);
ExFreePool(Pipe);
}
KeUnlockMutex(&DeviceExt->PipeListLock);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(Status); return(STATUS_SUCCESS);
} }
/* EOF */ /* EOF */

View file

@ -1,10 +1,11 @@
/* $Id: fsctrl.c,v 1.2 2001/05/01 11:09:01 ekohl Exp $ /* $Id: fsctrl.c,v 1.3 2001/05/10 23:38:31 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: services/fs/np/fsctrl.c * FILE: services/fs/np/fsctrl.c
* PURPOSE: Named pipe filesystem * PURPOSE: Named pipe filesystem
* PROGRAMMER: David Welch <welch@cwcom.net> * PROGRAMMER: David Welch <welch@cwcom.net>
* Eric Kohl <ekohl@rz-online.de>
*/ */
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
@ -18,6 +19,31 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
static NTSTATUS
NpfsConnectPipe(PNPFS_FCB Fcb)
{
NTSTATUS Status;
Status = KeWaitForSingleObject(&Fcb->ConnectEvent,
UserRequest,
KernelMode,
FALSE,
NULL);
DPRINT("Finished waiting! Status: %x\n", Status);
return STATUS_SUCCESS;
}
static NTSTATUS
NpfsDisconnectPipe(PNPFS_FCB Fcb)
{
return STATUS_SUCCESS;
}
NTSTATUS STDCALL NTSTATUS STDCALL
NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
PIRP Irp) PIRP Irp)
@ -29,6 +55,8 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
PNPFS_PIPE Pipe; PNPFS_PIPE Pipe;
PNPFS_FCB Fcb; PNPFS_FCB Fcb;
DPRINT("NpfsFileSystemContol(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject; FileObject = IoStack->FileObject;
@ -37,10 +65,18 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
switch (IoStack->Parameters.FileSystemControl.IoControlCode) switch (IoStack->Parameters.FileSystemControl.IoControlCode)
{ {
case FSCTL_WAIT_PIPE: case FSCTL_PIPE_LISTEN:
DPRINT("Connecting pipe %wZ\n", &Pipe->PipeName);
Status = NpfsConnectPipe(Fcb);
break; break;
case FSCTL_LISTEN: case FSCTL_PIPE_DISCONNECT:
DPRINT("Disconnecting pipe %wZ\n", &Pipe->PipeName);
Status = NpfsDisconnectPipe(Fcb);
break;
#if 0
case FSCTL_WAIT_PIPE:
break; break;
case FSCTL_SET_STATE: case FSCTL_SET_STATE:
@ -53,9 +89,18 @@ NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject,
break; break;
} }
#endif
default: default:
} DPRINT("IoControlCode: %x\n", IoStack->Parameters.FileSystemControl.IoControlCode)
Status = STATUS_UNSUCCESSFUL;
} }
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(Status);
}
/* EOF */ /* EOF */

View file

@ -1,4 +1,4 @@
/* $Id: mount.c,v 1.6 2001/05/07 22:03:27 chorns Exp $ /* $Id: mount.c,v 1.7 2001/05/10 23:38:31 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -16,42 +16,19 @@
#include <debug.h> #include <debug.h>
/* GLOBALS *******************************************************************/
//static PDRIVER_OBJECT DriverObject;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject, NTSTATUS STDCALL
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath) PUNICODE_STRING RegistryPath)
{ {
PNPFS_DEVICE_EXTENSION DeviceExtension;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
NTSTATUS Status;
UNICODE_STRING DeviceName; UNICODE_STRING DeviceName;
UNICODE_STRING LinkName; UNICODE_STRING LinkName;
NTSTATUS Status;
DbgPrint("Named Pipe Filesystem\n"); DbgPrint("Named Pipe FSD 0.0.2\n");
// DriverObject = _DriverObject;
#if 0
RtlInitUnicodeString(&DeviceName, L"\\Device\\Npfs");
Status = IoCreateDevice(DriverObject,
0,
&DeviceName,
FILE_DEVICE_NAMED_PIPE,
0,
FALSE,
&DeviceObject);
if (!NT_SUCCESS(Status))
{
return(Status);
}
RtlInitUnicodeString(&LinkName, L"\\??\\Pipe");
Status = IoCreateSymbolicLink(&LinkName,
&DeviceName);
#endif
DeviceObject->Flags = 0; DeviceObject->Flags = 0;
DriverObject->MajorFunction[IRP_MJ_CREATE] = NpfsCreate; DriverObject->MajorFunction[IRP_MJ_CREATE] = NpfsCreate;
@ -68,7 +45,6 @@ NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject,
// NpfsSetInformation; // NpfsSetInformation;
// DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers; // DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpfsFlushBuffers;
// DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NpfsShutdown; // DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NpfsShutdown;
// DriverObject->MajorFunction[IRP_MJ_CLEANUP] = NpfsCleanup;
// DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = // DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] =
// NpfsQuerySecurity; // NpfsQuerySecurity;
// DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = // DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] =
@ -78,9 +54,9 @@ NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject,
DriverObject->DriverUnload = NULL; DriverObject->DriverUnload = NULL;
RtlInitUnicodeString(&DeviceName, L"\\Device\\Npfs"); RtlInitUnicodeString(&DeviceName, L"\\Device\\NamedPipe");
Status = IoCreateDevice(DriverObject, Status = IoCreateDevice(DriverObject,
0, sizeof(NPFS_DEVICE_EXTENSION),
&DeviceName, &DeviceName,
FILE_DEVICE_NAMED_PIPE, FILE_DEVICE_NAMED_PIPE,
0, 0,
@ -88,25 +64,30 @@ NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject,
&DeviceObject); &DeviceObject);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Failed to create named pipe device! (Status %x)\n", Status); DPRINT("Failed to create named pipe device! (Status %x)\n", Status);
return(Status); return(Status);
} }
RtlInitUnicodeString(&LinkName, L"\\??\\Pipe"); #if 0
/* FIXME: this should really be done by SMSS!! */
RtlInitUnicodeString(&LinkName, L"\\??\\PIPE");
Status = IoCreateSymbolicLink(&LinkName, Status = IoCreateSymbolicLink(&LinkName,
&DeviceName); &DeviceName);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Failed to create named pipe symbolic link! (Status %x)\n", Status); DPRINT("Failed to create named pipe symbolic link! (Status %x)\n", Status);
// IoDeleteDevice(); // IoDeleteDevice();
return(Status); return(Status);
} }
#endif
NpfsInitPipeList(); /* initialize the device extension */
DeviceExtension = DeviceObject->DeviceExtension;
InitializeListHead(&DeviceExtension->PipeListHead);
KeInitializeMutex(&DeviceExtension->PipeListLock,
0);
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
/* EOF */ /* EOF */

View file

@ -3,12 +3,13 @@
typedef struct typedef struct
{ {
PDEVICE_OBJECT StorageDevice; LIST_ENTRY PipeListHead;
KMUTEX PipeListLock;
} NPFS_DEVICE_EXTENSION, *PNPFS_DEVICE_EXTENSION; } NPFS_DEVICE_EXTENSION, *PNPFS_DEVICE_EXTENSION;
typedef struct typedef struct
{ {
PWCHAR Name; UNICODE_STRING PipeName;
LIST_ENTRY PipeListEntry; LIST_ENTRY PipeListEntry;
KSPIN_LOCK FcbListLock; KSPIN_LOCK FcbListLock;
LIST_ENTRY FcbListHead; LIST_ENTRY FcbListHead;
@ -28,9 +29,9 @@ typedef struct _NPFS_FCB
PNPFS_PIPE Pipe; PNPFS_PIPE Pipe;
struct _NPFS_FCB* OtherSide; struct _NPFS_FCB* OtherSide;
BOOLEAN IsServer; BOOLEAN IsServer;
KEVENT ConnectEvent;
} NPFS_FCB, *PNPFS_FCB; } NPFS_FCB, *PNPFS_FCB;
VOID NpfsPipeList(VOID);
#define KeLockMutex(x) KeWaitForSingleObject(x, \ #define KeLockMutex(x) KeWaitForSingleObject(x, \
UserRequest, \ UserRequest, \

View file

@ -81,18 +81,48 @@ NTSTATUS STDCALL ZwCreateNamedPipeFile(OUT PHANDLE NamedPipeFileHandle,
IN ULONG OutBufferSize, IN ULONG OutBufferSize,
IN PLARGE_INTEGER DefaultTimeOut); IN PLARGE_INTEGER DefaultTimeOut);
#define FSCTL_PIPE_ASSIGN_EVENT \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_WAIT_PIPE \ #define FSCTL_PIPE_DISCONNECT \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_LISTEN \ #define FSCTL_PIPE_LISTEN \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_SET_STATE \ #define FSCTL_PIPE_PEEK \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
#define FSCTL_PIPE_QUERY_EVENT \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_TRANSCEIVE \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_PIPE_WAIT \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_IMPERSONATE \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_SET_CLIENT_PROCESS \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_QUERY_CLIENT_PROCESS \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_INTERNAL_READ \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
#define FSCTL_PIPE_INTERNAL_WRITE \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
#define FSCTL_PIPE_INTERNAL_TRANSCEIVE \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
#define FSCTL_PIPE_INTERNAL_READ_OVFLOW \
CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
#define FSCTL_GET_STATE \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _NPFS_WAIT_PIPE typedef struct _NPFS_WAIT_PIPE
{ {

View file

@ -1,4 +1,4 @@
/* $Id: npipe.c,v 1.4 2001/03/31 01:17:29 dwelch Exp $ /* $Id: npipe.c,v 1.5 2001/05/10 23:37:06 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -11,17 +11,18 @@
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <windows.h>
#include <wchar.h>
#include <string.h>
#include <ntdll/rtl.h> #include <ntdll/rtl.h>
#include <windows.h>
//#include <wchar.h>
//#include <string.h>
#include <kernel32/kernel32.h> #include <kernel32/kernel32.h>
#include <kernel32/error.h> #include <kernel32/error.h>
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
HANDLE STDCALL CreateNamedPipeA(LPCSTR lpName, HANDLE STDCALL
CreateNamedPipeA(LPCSTR lpName,
DWORD dwOpenMode, DWORD dwOpenMode,
DWORD dwPipeMode, DWORD dwPipeMode,
DWORD nMaxInstances, DWORD nMaxInstances,
@ -51,7 +52,8 @@ HANDLE STDCALL CreateNamedPipeA(LPCSTR lpName,
return(NamedPipeHandle); return(NamedPipeHandle);
} }
HANDLE STDCALL CreateNamedPipeW(LPCWSTR lpName, HANDLE STDCALL
CreateNamedPipeW(LPCWSTR lpName,
DWORD dwOpenMode, DWORD dwOpenMode,
DWORD dwPipeMode, DWORD dwPipeMode,
DWORD nMaxInstances, DWORD nMaxInstances,
@ -79,15 +81,17 @@ HANDLE STDCALL CreateNamedPipeW(LPCWSTR lpName,
&NamedPipeName, &NamedPipeName,
NULL, NULL,
NULL); NULL);
if (!Result) if (!Result)
{ {
SetLastError(ERROR_PATH_NOT_FOUND);
return(INVALID_HANDLE_VALUE); return(INVALID_HANDLE_VALUE);
} }
DPRINT("Pipe name: %wZ\n", &NamedPipeName);
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&NamedPipeName, &NamedPipeName,
0, OBJ_CASE_INSENSITIVE,
NULL, NULL,
NULL); NULL);
@ -100,7 +104,7 @@ HANDLE STDCALL CreateNamedPipeW(LPCWSTR lpName,
CreateOptions = 0; CreateOptions = 0;
if (dwOpenMode & FILE_FLAG_WRITE_THROUGH) if (dwOpenMode & FILE_FLAG_WRITE_THROUGH)
{ {
CreateOptions = CreateOptions | FILE_FLAG_WRITE_THROUGH; CreateOptions = CreateOptions | FILE_WRITE_THROUGH;
} }
if (dwOpenMode & FILE_FLAG_OVERLAPPED) if (dwOpenMode & FILE_FLAG_OVERLAPPED)
{ {
@ -146,7 +150,7 @@ HANDLE STDCALL CreateNamedPipeW(LPCWSTR lpName,
NonBlocking = FALSE; NonBlocking = FALSE;
} }
DefaultTimeOut.QuadPart = nDefaultTimeOut * 1000 * 1000; DefaultTimeOut.QuadPart = nDefaultTimeOut * 10000;
Status = NtCreateNamedPipeFile(&PipeHandle, Status = NtCreateNamedPipeFile(&PipeHandle,
DesiredAccess, DesiredAccess,
@ -162,22 +166,28 @@ HANDLE STDCALL CreateNamedPipeW(LPCWSTR lpName,
nInBufferSize, nInBufferSize,
nOutBufferSize, nOutBufferSize,
&DefaultTimeOut); &DefaultTimeOut);
RtlFreeUnicodeString(&NamedPipeName);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("NtCreateNamedPipe failed (Status %x)!\n", Status);
SetLastErrorByStatus (Status); SetLastErrorByStatus (Status);
return(INVALID_HANDLE_VALUE); return(INVALID_HANDLE_VALUE);
} }
return(PipeHandle); return(PipeHandle);
} }
BOOL STDCALL WaitNamedPipeA(LPCSTR lpNamedPipeName, BOOL STDCALL
WaitNamedPipeA(LPCSTR lpNamedPipeName,
DWORD nTimeOut) DWORD nTimeOut)
{ {
BOOL r; BOOL r;
UNICODE_STRING NameU; UNICODE_STRING NameU;
ANSI_STRING NameA; ANSI_STRING NameA;
RtlInitAnsiString(&NameA, lpNamedPipeName); RtlInitAnsiString(&NameA, (LPSTR)lpNamedPipeName);
RtlAnsiStringToUnicodeString(&NameU, &NameA, TRUE); RtlAnsiStringToUnicodeString(&NameU, &NameA, TRUE);
r = WaitNamedPipeW(NameU.Buffer, nTimeOut); r = WaitNamedPipeW(NameU.Buffer, nTimeOut);
@ -187,7 +197,8 @@ BOOL STDCALL WaitNamedPipeA(LPCSTR lpNamedPipeName,
return(r); return(r);
} }
BOOL STDCALL WaitNamedPipeW(LPCWSTR lpNamedPipeName, BOOL STDCALL
WaitNamedPipeW(LPCWSTR lpNamedPipeName,
DWORD nTimeOut) DWORD nTimeOut)
{ {
UNICODE_STRING NamedPipeName; UNICODE_STRING NamedPipeName;
@ -198,7 +209,7 @@ BOOL STDCALL WaitNamedPipeW(LPCWSTR lpNamedPipeName,
HANDLE FileHandle; HANDLE FileHandle;
IO_STATUS_BLOCK Iosb; IO_STATUS_BLOCK Iosb;
r = RtlDosPathNameToNtPathName_U(lpNamedPipeName, r = RtlDosPathNameToNtPathName_U((LPWSTR)lpNamedPipeName,
&NamedPipeName, &NamedPipeName,
NULL, NULL,
NULL); NULL);
@ -225,8 +236,9 @@ BOOL STDCALL WaitNamedPipeW(LPCWSTR lpNamedPipeName,
return(FALSE); return(FALSE);
} }
WaitPipe.Timeout.QuadPart = nTimeOut * 1000 * 1000; WaitPipe.Timeout.QuadPart = nTimeOut * 10000;
#if 0
Status = NtFsControlFile(FileHandle, Status = NtFsControlFile(FileHandle,
NULL, NULL,
NULL, NULL,
@ -242,25 +254,26 @@ BOOL STDCALL WaitNamedPipeW(LPCWSTR lpNamedPipeName,
SetLastErrorByStatus (Status); SetLastErrorByStatus (Status);
return(FALSE); return(FALSE);
} }
#endif
NtClose(FileHandle); NtClose(FileHandle);
return(TRUE); return(TRUE);
} }
BOOL STDCALL ConnectNamedPipe(HANDLE hNamedPipe, BOOL STDCALL
LPOVERLAPPED lpOverLapped) ConnectNamedPipe(HANDLE hNamedPipe,
LPOVERLAPPED lpOverlapped)
{ {
NPFS_LISTEN ListenPipe;
IO_STATUS_BLOCK Iosb; IO_STATUS_BLOCK Iosb;
HANDLE hEvent; HANDLE hEvent;
PIO_STATUS_BLOCK IoStatusBlock; PIO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status; NTSTATUS Status;
if (lpOverLapped != NULL) if (lpOverlapped != NULL)
{ {
lpOverLapped->Internal = STATUS_PENDING; lpOverlapped->Internal = STATUS_PENDING;
hEvent = lpOverLapped->hEvent; hEvent = lpOverlapped->hEvent;
IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped; IoStatusBlock = (PIO_STATUS_BLOCK)lpOverlapped;
} }
else else
{ {
@ -273,20 +286,33 @@ BOOL STDCALL ConnectNamedPipe(HANDLE hNamedPipe,
NULL, NULL,
NULL, NULL,
IoStatusBlock, IoStatusBlock,
FSCTL_LISTEN, FSCTL_PIPE_LISTEN,
&ListenPipe, NULL,
sizeof(ListenPipe), 0,
NULL, NULL,
0); 0);
if ((lpOverlapped == NULL) && (Status == STATUS_PENDING))
{
Status = NtWaitForSingleObject(hNamedPipe,
FALSE,
NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
SetLastErrorByStatus(Status); SetLastErrorByStatus(Status);
return(FALSE); return(FALSE);
} }
Status = Iosb.Status;
}
if (!NT_SUCCESS(Status) || (Status == STATUS_PENDING))
{
SetLastErrorByStatus (Status);
return(FALSE);
}
return(TRUE); return(TRUE);
} }
BOOL STDCALL SetNamedPipeHandleState(HANDLE hNamedPipe, BOOL STDCALL
SetNamedPipeHandleState(HANDLE hNamedPipe,
LPDWORD lpMode, LPDWORD lpMode,
LPDWORD lpMaxCollectionCount, LPDWORD lpMaxCollectionCount,
LPDWORD lpCollectDataTimeout) LPDWORD lpCollectDataTimeout)
@ -296,6 +322,7 @@ BOOL STDCALL SetNamedPipeHandleState(HANDLE hNamedPipe,
IO_STATUS_BLOCK Iosb; IO_STATUS_BLOCK Iosb;
NTSTATUS Status; NTSTATUS Status;
#if 0
Status = NtFsControlFile(hNamedPipe, Status = NtFsControlFile(hNamedPipe,
NULL, NULL,
NULL, NULL,
@ -311,6 +338,7 @@ BOOL STDCALL SetNamedPipeHandleState(HANDLE hNamedPipe,
SetLastErrorByStatus (Status); SetLastErrorByStatus (Status);
return(FALSE); return(FALSE);
} }
#endif
if (lpMode != NULL) if (lpMode != NULL)
{ {
@ -359,6 +387,7 @@ BOOL STDCALL SetNamedPipeHandleState(HANDLE hNamedPipe,
SetState.Timeout = GetState.Timeout; SetState.Timeout = GetState.Timeout;
} }
#if 0
Status = NtFsControlFile(hNamedPipe, Status = NtFsControlFile(hNamedPipe,
NULL, NULL,
NULL, NULL,
@ -374,6 +403,7 @@ BOOL STDCALL SetNamedPipeHandleState(HANDLE hNamedPipe,
SetLastErrorByStatus (Status); SetLastErrorByStatus (Status);
return(FALSE); return(FALSE);
} }
#endif
return(TRUE); return(TRUE);
} }
@ -394,8 +424,7 @@ CallNamedPipeA (
} }
WINBOOL WINBOOL STDCALL
STDCALL
CallNamedPipeW ( CallNamedPipeW (
LPCWSTR lpNamedPipeName, LPCWSTR lpNamedPipeName,
LPVOID lpInBuffer, LPVOID lpInBuffer,
@ -410,18 +439,45 @@ CallNamedPipeW (
return FALSE; return FALSE;
} }
WINBOOL
STDCALL WINBOOL STDCALL
DisconnectNamedPipe ( DisconnectNamedPipe(HANDLE hNamedPipe)
HANDLE hNamedPipe
)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); IO_STATUS_BLOCK Iosb;
return FALSE; NTSTATUS Status;
Status = NtFsControlFile(hNamedPipe,
NULL,
NULL,
NULL,
&Iosb,
FSCTL_PIPE_DISCONNECT,
NULL,
0,
NULL,
0);
if (Status == STATUS_PENDING)
{
Status = NtWaitForSingleObject(hNamedPipe,
FALSE,
NULL);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return(FALSE);
}
} }
WINBOOL if (!NT_SUCCESS(Status))
STDCALL {
SetLastErrorByStatus(Status);
return(FALSE);
}
return(TRUE);
}
WINBOOL STDCALL
GetNamedPipeHandleStateW ( GetNamedPipeHandleStateW (
HANDLE hNamedPipe, HANDLE hNamedPipe,
LPDWORD lpState, LPDWORD lpState,
@ -437,8 +493,7 @@ GetNamedPipeHandleStateW (
} }
WINBOOL WINBOOL STDCALL
STDCALL
GetNamedPipeHandleStateA ( GetNamedPipeHandleStateA (
HANDLE hNamedPipe, HANDLE hNamedPipe,
LPDWORD lpState, LPDWORD lpState,
@ -454,50 +509,42 @@ GetNamedPipeHandleStateA (
} }
WINBOOL WINBOOL STDCALL
STDCALL GetNamedPipeInfo(HANDLE hNamedPipe,
GetNamedPipeInfo (
HANDLE hNamedPipe,
LPDWORD lpFlags, LPDWORD lpFlags,
LPDWORD lpOutBufferSize, LPDWORD lpOutBufferSize,
LPDWORD lpInBufferSize, LPDWORD lpInBufferSize,
LPDWORD lpMaxInstances LPDWORD lpMaxInstances)
)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; return FALSE;
} }
WINBOOL
STDCALL WINBOOL STDCALL
PeekNamedPipe ( PeekNamedPipe(HANDLE hNamedPipe,
HANDLE hNamedPipe,
LPVOID lpBuffer, LPVOID lpBuffer,
DWORD nBufferSize, DWORD nBufferSize,
LPDWORD lpBytesRead, LPDWORD lpBytesRead,
LPDWORD lpTotalBytesAvail, LPDWORD lpTotalBytesAvail,
LPDWORD lpBytesLeftThisMessage LPDWORD lpBytesLeftThisMessage)
)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; return FALSE;
} }
WINBOOL
STDCALL WINBOOL STDCALL
TransactNamedPipe ( TransactNamedPipe(HANDLE hNamedPipe,
HANDLE hNamedPipe,
LPVOID lpInBuffer, LPVOID lpInBuffer,
DWORD nInBufferSize, DWORD nInBufferSize,
LPVOID lpOutBuffer, LPVOID lpOutBuffer,
DWORD nOutBufferSize, DWORD nOutBufferSize,
LPDWORD lpBytesRead, LPDWORD lpBytesRead,
LPOVERLAPPED lpOverlapped LPOVERLAPPED lpOverlapped)
)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; return FALSE;
} }
/* EOF */ /* EOF */