[ros-diffs] [fireball] 26634: - Add function stubs - Add simple dbgprinting mechanism for easier debugging.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri May 4 13:50:42 CEST 2007


Author: fireball
Date: Fri May  4 15:50:41 2007
New Revision: 26634

URL: http://svn.reactos.org/svn/reactos?rev=26634&view=rev
Log:
- Add function stubs
- Add simple dbgprinting mechanism for easier debugging.

Modified:
    trunk/reactos/drivers/filesystems/npfs_new/create.c
    trunk/reactos/drivers/filesystems/npfs_new/finfo.c
    trunk/reactos/drivers/filesystems/npfs_new/fsctrl.c
    trunk/reactos/drivers/filesystems/npfs_new/npfs.c
    trunk/reactos/drivers/filesystems/npfs_new/npfs.h
    trunk/reactos/drivers/filesystems/npfs_new/rw.c
    trunk/reactos/drivers/filesystems/npfs_new/volume.c

Modified: trunk/reactos/drivers/filesystems/npfs_new/create.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/create.c?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/create.c (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/create.c Fri May  4 15:50:41 2007
@@ -15,4 +15,40 @@
 
 /* FUNCTIONS *****************************************************************/
 
+NTSTATUS NTAPI
+NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "IRP_MJ_CREATE\n");
+
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+	return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "IRP_MJ_CREATE Named Pipe\n");
+
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+	return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "Cleanup\n");
+
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+	return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "IRP_MJ_CLOSE\n");
+
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+	return STATUS_SUCCESS;
+}
+
 /* EOF */

Modified: trunk/reactos/drivers/filesystems/npfs_new/finfo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/finfo.c?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/finfo.c (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/finfo.c Fri May  4 15:50:41 2007
@@ -15,4 +15,34 @@
 
 /* FUNCTIONS *****************************************************************/
 
+NTSTATUS NTAPI
+NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	FsRtlEnterFileSystem();
+
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsQueryInformation()\n");
+
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+	FsRtlExitFileSystem();
+
+	return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+NpfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	FsRtlEnterFileSystem();
+
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsSetInformation()\n");
+
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+	FsRtlExitFileSystem();
+
+	return STATUS_SUCCESS;
+}
+
 /* EOF */

Modified: trunk/reactos/drivers/filesystems/npfs_new/fsctrl.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/fsctrl.c?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/fsctrl.c (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/fsctrl.c Fri May  4 15:50:41 2007
@@ -15,5 +15,34 @@
 
 /* FUNCTIONS *****************************************************************/
 
+NTSTATUS NTAPI
+NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	FsRtlEnterFileSystem();
+
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsDirectoryControl()\n");
+
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+	FsRtlExitFileSystem();
+
+	return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	FsRtlEnterFileSystem();
+
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsFileSystemControl()\n");
+
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+	FsRtlExitFileSystem();
+
+	return STATUS_SUCCESS;
+}
 
 /* EOF */

Modified: trunk/reactos/drivers/filesystems/npfs_new/npfs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/npfs.c?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/npfs.c (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/npfs.c Fri May  4 15:50:41 2007
@@ -13,9 +13,11 @@
 //#define NDEBUG
 #include <debug.h>
 
+ULONG NpfsDebugLevel = NPFS_DEBUG_HIGHEST;
+
 /* FUNCTIONS *****************************************************************/
 
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
 			PUNICODE_STRING RegistryPath)
 {
@@ -24,33 +26,25 @@
 	UNICODE_STRING DeviceName;
 	NTSTATUS Status;
 
-	DPRINT("Named Pipe FSD 0.0.2\n");
+	DPRINT("Named Pipe File System Driver v0.1\n");
 
 	ASSERT (sizeof(NPFS_CONTEXT) <= FIELD_OFFSET(IRP, Tail.Overlay.DriverContext));
 	ASSERT (sizeof(NPFS_WAITER_ENTRY) <= FIELD_OFFSET(IRP, Tail.Overlay.DriverContext));
 
 	DriverObject->MajorFunction[IRP_MJ_CREATE] = NpfsCreate;
-	DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] =
-		NpfsCreateNamedPipe;
+	DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = NpfsCreateNamedPipe;
 	DriverObject->MajorFunction[IRP_MJ_CLOSE] = NpfsClose;
 	DriverObject->MajorFunction[IRP_MJ_READ] = NpfsRead;
 	DriverObject->MajorFunction[IRP_MJ_WRITE] = NpfsWrite;
-	DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
-		NpfsQueryInformation;
-	DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] =
-		NpfsSetInformation;
-	DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] =
-		NpfsQueryVolumeInformation;
+	DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = NpfsQueryInformation;
+	DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = NpfsSetInformation;
+	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_DIRECTORY_CONTROL] =
-	//     NpfsDirectoryControl;
-	DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
-		NpfsFileSystemControl;
-	//   DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] =
-	//     NpfsQuerySecurity;
-	//   DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] =
-	//     NpfsSetSecurity;
+	DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NpfsDirectoryControl;
+	DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NpfsFileSystemControl;
+	//DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpfsQuerySecurity;
+	//DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpfsSetSecurity;
 
 	DriverObject->DriverUnload = NULL;
 
@@ -86,4 +80,20 @@
 	return STATUS_SUCCESS;
 }
 
+VOID NTAPI
+NpfsDbgPrint(ULONG Level, char *fmt, ...)
+{
+	va_list args;
+	char str[300];
+
+	if ((NpfsDebugLevel & Level) == 0)
+		return;
+
+	va_start(args, fmt);
+	vsnprintf(str, sizeof(str), fmt, args);
+	va_end(args);
+	DbgPrint ("%4.4d: NPFS %s", PsGetCurrentProcessId(), str);
+}
+
+
 /* EOF */

Modified: trunk/reactos/drivers/filesystems/npfs_new/npfs.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/npfs.h?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/npfs.h (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/npfs.h Fri May  4 15:50:41 2007
@@ -3,6 +3,12 @@
 
 #include <ntifs.h>
 #include <ndk/iotypes.h>
+
+#include <stdarg.h>
+#include <stdio.h>
+
+/* Debug Levels */
+#define NPFS_DEBUG_HIGHEST 0x0
 
 typedef struct _NPFS_DEVICE_EXTENSION
 {
@@ -98,25 +104,29 @@
 
 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
 
-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 NTAPI NpfsCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-NTSTATUS STDCALL NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-NTSTATUS STDCALL NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-NTSTATUS STDCALL NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsDirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-NTSTATUS STDCALL NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL NpfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsSetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-NTSTATUS STDCALL NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS NTAPI NpfsQueryVolumeInformation (PDEVICE_OBJECT DeviceObject, PIRP Irp);
 
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
 			PUNICODE_STRING RegistryPath);
 
+VOID NTAPI
+NpfsDbgPrint(ULONG Level, char *fmt, ...);
+
 #endif /* __DRIVERS_FS_NP_NPFS_H */

Modified: trunk/reactos/drivers/filesystems/npfs_new/rw.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/rw.c?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/rw.c (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/rw.c Fri May  4 15:50:41 2007
@@ -43,737 +43,49 @@
 }
 #endif
 
-static VOID STDCALL
-NpfsReadWriteCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
-						   IN PIRP Irp)
+NTSTATUS NTAPI
+NpfsRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
-	PNPFS_CONTEXT Context;
-	PNPFS_DEVICE_EXTENSION DeviceExt;
-	PIO_STACK_LOCATION IoStack;
-	PNPFS_CCB Ccb;
-	BOOLEAN Complete = FALSE;
+	FsRtlEnterFileSystem();
 
-	DPRINT("NpfsReadWriteCancelRoutine(DeviceObject %x, Irp %x)\n", DeviceObject, Irp);
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsRead()\n");
 
-	IoReleaseCancelSpinLock(Irp->CancelIrql);
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-	Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
-	DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-	IoStack = IoGetCurrentIrpStackLocation(Irp);
-	Ccb = IoStack->FileObject->FsContext2;
+	FsRtlExitFileSystem();
 
-	KeLockMutex(&DeviceExt->PipeListLock);
-	ExAcquireFastMutex(&Ccb->DataListLock);
-	switch(IoStack->MajorFunction)
-	{
-	case IRP_MJ_READ:
-		if (Ccb->ReadRequestListHead.Flink != &Context->ListEntry)
-		{
-			/* we are not the first in the list, remove an complete us */
-			RemoveEntryList(&Context->ListEntry);
-			Complete = TRUE;
-		}
-		else
-		{
-			KeSetEvent(&Ccb->ReadEvent, IO_NO_INCREMENT, FALSE);
-		}
-		break;
-	default:
-		KEBUGCHECK(0);
-	}
-	ExReleaseFastMutex(&Ccb->DataListLock);
-	KeUnlockMutex(&DeviceExt->PipeListLock);
-	if (Complete)
-	{
-		Irp->IoStatus.Status = STATUS_CANCELLED;
-		Irp->IoStatus.Information = 0;
-		IoCompleteRequest(Irp, IO_NO_INCREMENT);
-	}
+	return STATUS_SUCCESS;
 }
 
-static VOID STDCALL
-NpfsWaiterThread(PVOID InitContext)
+NTSTATUS NTAPI
+NpfsWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
-	PNPFS_THREAD_CONTEXT ThreadContext = (PNPFS_THREAD_CONTEXT) InitContext;
-	ULONG CurrentCount;
-	ULONG Count = 0;
-	PIRP Irp = NULL;
-	PIRP NextIrp;
-	NTSTATUS Status;
-	BOOLEAN Terminate = FALSE;
-	BOOLEAN Cancel = FALSE;
-	PIO_STACK_LOCATION IoStack = NULL;
-	PNPFS_CONTEXT Context;
-	PNPFS_CONTEXT NextContext;
-	PNPFS_CCB Ccb;
+	FsRtlEnterFileSystem();
 
-	KeLockMutex(&ThreadContext->DeviceExt->PipeListLock);
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsWrite()\n");
 
-	while (1)
-	{
-		CurrentCount = ThreadContext->Count;
-		KeUnlockMutex(&ThreadContext->DeviceExt->PipeListLock);
-		if (Irp)
-		{
-			if (Cancel)
-			{
-				Irp->IoStatus.Status = STATUS_CANCELLED;
-				Irp->IoStatus.Information = 0;
-				IoCompleteRequest(Irp, IO_NO_INCREMENT);
-			}
-			else
-			{
-				switch (IoStack->MajorFunction)
-				{
-				case IRP_MJ_READ:
-					NpfsRead(IoStack->DeviceObject, Irp);
-					break;
-				default:
-					KEBUGCHECK(0);
-				}
-			}
-		}
-		if (Terminate)
-		{
-			break;
-		}
-		Status = KeWaitForMultipleObjects(CurrentCount,
-			ThreadContext->WaitObjectArray,
-			WaitAny,
-			Executive,
-			KernelMode,
-			FALSE,
-			NULL,
-			ThreadContext->WaitBlockArray);
-		if (!NT_SUCCESS(Status))
-		{
-			KEBUGCHECK(0);
-		}
-		KeLockMutex(&ThreadContext->DeviceExt->PipeListLock);
-		Count = Status - STATUS_SUCCESS;
-		ASSERT (Count < CurrentCount);
-		if (Count > 0)
-		{
-			Irp = ThreadContext->WaitIrpArray[Count];
-			ThreadContext->Count--;
-			ThreadContext->DeviceExt->EmptyWaiterCount++;
-			ThreadContext->WaitObjectArray[Count] = ThreadContext->WaitObjectArray[ThreadContext->Count];
-			ThreadContext->WaitIrpArray[Count] = ThreadContext->WaitIrpArray[ThreadContext->Count];
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-			Cancel = (NULL == IoSetCancelRoutine(Irp, NULL));
-			Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
-			IoStack = IoGetCurrentIrpStackLocation(Irp);
+	FsRtlExitFileSystem();
 
-			if (Cancel)
-			{
-				Ccb = IoStack->FileObject->FsContext2;
-				ExAcquireFastMutex(&Ccb->DataListLock);
-				RemoveEntryList(&Context->ListEntry);
-				switch (IoStack->MajorFunction)
-				{
-				case IRP_MJ_READ:
-					if (!IsListEmpty(&Ccb->ReadRequestListHead))
-					{
-						/* put the next request on the wait list */
-						NextContext = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
-						ThreadContext->WaitObjectArray[ThreadContext->Count] = NextContext->WaitEvent;
-						NextIrp = CONTAINING_RECORD(NextContext, IRP, Tail.Overlay.DriverContext);
-						ThreadContext->WaitIrpArray[ThreadContext->Count] = NextIrp;
-						ThreadContext->Count++;
-						ThreadContext->DeviceExt->EmptyWaiterCount--;
-					}
-					break;
-				default:
-					KEBUGCHECK(0);
-				}
-				ExReleaseFastMutex(&Ccb->DataListLock);
-			}
-		}
-		else
-		{
-			/* someone has add a new wait request */
-			Irp = NULL;
-		}
-		if (ThreadContext->Count == 1 && ThreadContext->DeviceExt->EmptyWaiterCount >= MAXIMUM_WAIT_OBJECTS)
-		{
-			/* it exist an other thread with empty wait slots, we can remove our thread from the list */
-			RemoveEntryList(&ThreadContext->ListEntry);
-			ThreadContext->DeviceExt->EmptyWaiterCount -= MAXIMUM_WAIT_OBJECTS - 1;
-			Terminate = TRUE;
-		}
-	}
-	ExFreePool(ThreadContext);
+	return STATUS_SUCCESS;
 }
 
-static NTSTATUS
-NpfsAddWaitingReadWriteRequest(IN PDEVICE_OBJECT DeviceObject,
-							   IN PIRP Irp)
+NTSTATUS NTAPI
+NpfsFlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
-	PLIST_ENTRY ListEntry;
-	PNPFS_THREAD_CONTEXT ThreadContext = NULL;
-	NTSTATUS Status;
-	HANDLE hThread;
-	KIRQL oldIrql;
+	FsRtlEnterFileSystem();
 
-	PNPFS_CONTEXT Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
-	PNPFS_DEVICE_EXTENSION DeviceExt = (PNPFS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsFlushBuffers()\n");
 
-	DPRINT("NpfsAddWaitingReadWriteRequest(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
-
-	KeLockMutex(&DeviceExt->PipeListLock);
-
-	ListEntry = DeviceExt->ThreadListHead.Flink;
-	while (ListEntry != &DeviceExt->ThreadListHead)
-	{
-		ThreadContext = CONTAINING_RECORD(ListEntry, NPFS_THREAD_CONTEXT, ListEntry);
-		if (ThreadContext->Count < MAXIMUM_WAIT_OBJECTS)
-		{
-			break;
-		}
-		ListEntry = ListEntry->Flink;
-	}
-	if (ListEntry == &DeviceExt->ThreadListHead)
-	{
-		ThreadContext = ExAllocatePool(NonPagedPool, sizeof(NPFS_THREAD_CONTEXT));
-		if (ThreadContext == NULL)
-		{
-			KeUnlockMutex(&DeviceExt->PipeListLock);
-			return STATUS_NO_MEMORY;
-		}
-		ThreadContext->DeviceExt = DeviceExt;
-		KeInitializeEvent(&ThreadContext->Event, SynchronizationEvent, FALSE);
-		ThreadContext->Count = 1;
-		ThreadContext->WaitObjectArray[0] = &ThreadContext->Event;
-
-
-		DPRINT("Creating a new system thread for waiting read/write requests\n");
-
-		Status = PsCreateSystemThread(&hThread,
-			THREAD_ALL_ACCESS,
-			NULL,
-			NULL,
-			NULL,
-			NpfsWaiterThread,
-			(PVOID)ThreadContext);
-		if (!NT_SUCCESS(Status))
-		{
-			ExFreePool(ThreadContext);
-			KeUnlockMutex(&DeviceExt->PipeListLock);
-			return Status;
-		}
-		InsertHeadList(&DeviceExt->ThreadListHead, &ThreadContext->ListEntry);
-		DeviceExt->EmptyWaiterCount += MAXIMUM_WAIT_OBJECTS - 1;
-	}
-	IoMarkIrpPending(Irp);
-
-	IoAcquireCancelSpinLock(&oldIrql);
-	if (Irp->Cancel)
-	{
-		IoReleaseCancelSpinLock(oldIrql);
-		Status = STATUS_CANCELLED;
-	}
-	else
-	{
-		(void)IoSetCancelRoutine(Irp, NpfsReadWriteCancelRoutine);
-		IoReleaseCancelSpinLock(oldIrql);
-		ThreadContext->WaitObjectArray[ThreadContext->Count] = Context->WaitEvent;
-		ThreadContext->WaitIrpArray[ThreadContext->Count] = Irp;
-		ThreadContext->Count++;
-		DeviceExt->EmptyWaiterCount--;
-		KeSetEvent(&ThreadContext->Event, IO_NO_INCREMENT, FALSE);
-		Status = STATUS_SUCCESS;
-	}
-	KeUnlockMutex(&DeviceExt->PipeListLock);
-	return Status;
-}
-
-NTSTATUS STDCALL
-NpfsRead(IN PDEVICE_OBJECT DeviceObject,
-		 IN PIRP Irp)
-{
-	PFILE_OBJECT FileObject;
-	NTSTATUS Status;
-	NTSTATUS OriginalStatus = STATUS_SUCCESS;
-	PNPFS_CCB Ccb;
-	PNPFS_CONTEXT Context;
-	KEVENT Event;
-	ULONG Length;
-	ULONG Information = 0;
-	ULONG CopyLength;
-	ULONG TempLength;
-	BOOLEAN IsOriginalRequest = TRUE;
-	PVOID Buffer;
-
-	DPRINT("NpfsRead(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
-
-	if (Irp->MdlAddress == NULL)
-	{
-		DPRINT("Irp->MdlAddress == NULL\n");
-		Status = STATUS_UNSUCCESSFUL;
-		Irp->IoStatus.Information = 0;
-		goto done;
-	}
-
-	FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
-	Ccb = FileObject->FsContext2;
-	Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
-
-	if (Ccb->OtherSide == NULL)
-	{
-		DPRINT("Pipe is NOT connected!\n");
-		if (Ccb->PipeState == FILE_PIPE_LISTENING_STATE)
-			Status = STATUS_PIPE_LISTENING;
-		else if (Ccb->PipeState == FILE_PIPE_DISCONNECTED_STATE)
-			Status = STATUS_PIPE_DISCONNECTED;
-		else
-			Status = STATUS_UNSUCCESSFUL;
-		Irp->IoStatus.Information = 0;
-		goto done;
-	}
-
-	if (Ccb->Data == NULL)
-	{
-		DPRINT1("Pipe is NOT readable!\n");
-		Status = STATUS_UNSUCCESSFUL;
-		Irp->IoStatus.Information = 0;
-		goto done;
-	}
-
-	ExAcquireFastMutex(&Ccb->DataListLock);
-
-	if (IoIsOperationSynchronous(Irp))
-	{
-		InsertTailList(&Ccb->ReadRequestListHead, &Context->ListEntry);
-		if (Ccb->ReadRequestListHead.Flink != &Context->ListEntry)
-		{
-			KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
-			Context->WaitEvent = &Event;
-			ExReleaseFastMutex(&Ccb->DataListLock);
-			Status = KeWaitForSingleObject(&Event,
-				Executive,
-				KernelMode,
-				FALSE,
-				NULL);
-			if (!NT_SUCCESS(Status))
-			{
-				KEBUGCHECK(0);
-			}
-			ExAcquireFastMutex(&Ccb->DataListLock);
-		}
-		Irp->IoStatus.Information = 0;
-	}
-	else
-	{
-		KIRQL oldIrql;
-		if (IsListEmpty(&Ccb->ReadRequestListHead) ||
-			Ccb->ReadRequestListHead.Flink != &Context->ListEntry)
-		{
-			/* this is a new request */
-			Irp->IoStatus.Information = 0;
-			Context->WaitEvent = &Ccb->ReadEvent;
-			InsertTailList(&Ccb->ReadRequestListHead, &Context->ListEntry);
-			if (Ccb->ReadRequestListHead.Flink != &Context->ListEntry)
-			{
-				/* there was already a request on the list */
-				IoAcquireCancelSpinLock(&oldIrql);
-				if (Irp->Cancel)
-				{
-					IoReleaseCancelSpinLock(oldIrql);
-					RemoveEntryList(&Context->ListEntry);
-					ExReleaseFastMutex(&Ccb->DataListLock);
-					Status = STATUS_CANCELLED;
-					goto done;
-				}
-				(void)IoSetCancelRoutine(Irp, NpfsReadWriteCancelRoutine);
-				IoReleaseCancelSpinLock(oldIrql);
-				ExReleaseFastMutex(&Ccb->DataListLock);
-				IoMarkIrpPending(Irp);
-				Status = STATUS_PENDING;
-				goto done;
-			}
-		}
-	}
-
-	while (1)
-	{
-		Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
-		Information = Irp->IoStatus.Information;
-		Length = IoGetCurrentIrpStackLocation(Irp)->Parameters.Read.Length;
-		ASSERT (Information <= Length);
-		Buffer = (PVOID)((ULONG_PTR)Buffer + Information);
-		Length -= Information;
-		Status = STATUS_SUCCESS;
-
-		while (1)
-		{
-			if (Ccb->ReadDataAvailable == 0)
-			{
-				if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
-				{
-					ASSERT(Ccb->OtherSide != NULL);
-					KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
-				}
-				if (Information > 0 &&
-					(Ccb->Fcb->ReadMode != FILE_PIPE_BYTE_STREAM_MODE ||
-					Ccb->PipeState != FILE_PIPE_CONNECTED_STATE))
-				{
-					break;
-				}
-				if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
-				{
-					DPRINT("PipeState: %x\n", Ccb->PipeState);
-					Status = STATUS_PIPE_BROKEN;
-					break;
-				}
-				ExReleaseFastMutex(&Ccb->DataListLock);
-				if (IoIsOperationSynchronous(Irp))
-				{
-					/* Wait for ReadEvent to become signaled */
-
-					DPRINT("Waiting for readable data (%wZ)\n", &Ccb->Fcb->PipeName);
-					Status = KeWaitForSingleObject(&Ccb->ReadEvent,
-						UserRequest,
-						KernelMode,
-						FALSE,
-						NULL);
-					DPRINT("Finished waiting (%wZ)! Status: %x\n", &Ccb->Fcb->PipeName, Status);
-					ExAcquireFastMutex(&Ccb->DataListLock);
-				}
-				else
-				{
-					Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
-
-					Context->WaitEvent = &Ccb->ReadEvent;
-					Status = NpfsAddWaitingReadWriteRequest(DeviceObject, Irp);
-
-					if (NT_SUCCESS(Status))
-					{
-						Status = STATUS_PENDING;
-					}
-					ExAcquireFastMutex(&Ccb->DataListLock);
-					break;
-				}
-			}
-			ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
-			if (Ccb->Fcb->ReadMode == FILE_PIPE_BYTE_STREAM_MODE)
-			{
-				DPRINT("Byte stream mode\n");
-				/* Byte stream mode */
-				while (Length > 0 && Ccb->ReadDataAvailable > 0)
-				{
-					CopyLength = min(Ccb->ReadDataAvailable, Length);
-					if ((ULONG_PTR)Ccb->ReadPtr + CopyLength <= (ULONG_PTR)Ccb->Data + Ccb->MaxDataLength)
-					{
-						memcpy(Buffer, Ccb->ReadPtr, CopyLength);
-						Ccb->ReadPtr = (PVOID)((ULONG_PTR)Ccb->ReadPtr + CopyLength);
-						if (Ccb->ReadPtr == (PVOID)((ULONG_PTR)Ccb->Data + Ccb->MaxDataLength))
-						{
-							Ccb->ReadPtr = Ccb->Data;
-						}
-					}
-					else
-					{
-						TempLength = (ULONG)((ULONG_PTR)Ccb->Data + Ccb->MaxDataLength - (ULONG_PTR)Ccb->ReadPtr);
-						memcpy(Buffer, Ccb->ReadPtr, TempLength);
-						memcpy((PVOID)((ULONG_PTR)Buffer + TempLength), Ccb->Data, CopyLength - TempLength);
-						Ccb->ReadPtr = (PVOID)((ULONG_PTR)Ccb->Data + CopyLength - TempLength);
-					}
-
-					Buffer = (PVOID)((ULONG_PTR)Buffer + CopyLength);
-					Length -= CopyLength;
-					Information += CopyLength;
-
-					Ccb->ReadDataAvailable -= CopyLength;
-					Ccb->WriteQuotaAvailable += CopyLength;
-				}
-
-				if (Length == 0)
-				{
-					if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
-					{
-						KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
-					}
-					KeResetEvent(&Ccb->ReadEvent);
-					break;
-				}
-			}
-			else
-			{
-				DPRINT("Message mode\n");
-
-				/* Message mode */
-				if (Ccb->ReadDataAvailable)
-				{
-					/* Truncate the message if the receive buffer is too small */
-					CopyLength = min(Ccb->ReadDataAvailable, Length);
-					memcpy(Buffer, Ccb->Data, CopyLength);
-
-#ifndef NDEBUG
-					DPRINT("Length %d Buffer %x\n",CopyLength,Buffer);
-					HexDump((PUCHAR)Buffer, CopyLength);
-#endif
-
-					Information = CopyLength;
-
-					if (Ccb->ReadDataAvailable > Length)
-					{
-						memmove(Ccb->Data, (PVOID)((ULONG_PTR)Ccb->Data + Length),
-							Ccb->ReadDataAvailable - Length);
-						Ccb->ReadDataAvailable -= Length;
-						Status = STATUS_MORE_ENTRIES;
-					}
-					else
-					{
-						KeResetEvent(&Ccb->ReadEvent);
-						if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
-						{
-							KeSetEvent(&Ccb->OtherSide->WriteEvent, IO_NO_INCREMENT, FALSE);
-						}
-						Ccb->ReadDataAvailable = 0;
-						Ccb->WriteQuotaAvailable = Ccb->MaxDataLength;
-					}
-				}
-
-				if (Information > 0)
-				{
-					break;
-				}
-			}
-		}
-		Irp->IoStatus.Information = Information;
-		Irp->IoStatus.Status = Status;
-
-		ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
-
-		if (IoIsOperationSynchronous(Irp))
-		{
-			RemoveEntryList(&Context->ListEntry);
-			if (!IsListEmpty(&Ccb->ReadRequestListHead))
-			{
-				Context = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
-				KeSetEvent(Context->WaitEvent, IO_NO_INCREMENT, FALSE);
-			}
-			ExReleaseFastMutex(&Ccb->DataListLock);
-			IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-			DPRINT("NpfsRead done (Status %lx)\n", Status);
-			return Status;
-		}
-		else
-		{
-			if (IsOriginalRequest)
-			{
-				IsOriginalRequest = FALSE;
-				OriginalStatus = Status;
-			}
-			if (Status == STATUS_PENDING)
-			{
-				ExReleaseFastMutex(&Ccb->DataListLock);
-				DPRINT("NpfsRead done (Status %lx)\n", OriginalStatus);
-				return OriginalStatus;
-			}
-			RemoveEntryList(&Context->ListEntry);
-			IoCompleteRequest(Irp, IO_NO_INCREMENT);
-			if (IsListEmpty(&Ccb->ReadRequestListHead))
-			{
-				ExReleaseFastMutex(&Ccb->DataListLock);
-				DPRINT("NpfsRead done (Status %lx)\n", OriginalStatus);
-				return OriginalStatus;
-			}
-			Context = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
-			Irp = CONTAINING_RECORD(Context, IRP, Tail.Overlay.DriverContext);
-		}
-	}
-
-done:
-	Irp->IoStatus.Status = Status;
-
-	if (Status != STATUS_PENDING)
-	{
-		IoCompleteRequest(Irp, IO_NO_INCREMENT);
-	}
-	DPRINT("NpfsRead done (Status %lx)\n", Status);
-
-	return Status;
-}
-
-NTSTATUS STDCALL
-NpfsWrite(PDEVICE_OBJECT DeviceObject,
-		  PIRP Irp)
-{
-	PIO_STACK_LOCATION IoStack;
-	PFILE_OBJECT FileObject;
-	PNPFS_FCB Fcb = NULL;
-	PNPFS_CCB Ccb = NULL;
-	PNPFS_CCB ReaderCcb;
-	PUCHAR Buffer;
-	NTSTATUS Status = STATUS_SUCCESS;
-	ULONG Length;
-	ULONG Offset;
-	ULONG Information;
-	ULONG CopyLength;
-	ULONG TempLength;
-
-	DPRINT("NpfsWrite()\n");
-
-	IoStack = IoGetCurrentIrpStackLocation(Irp);
-	FileObject = IoStack->FileObject;
-	DPRINT("FileObject %p\n", FileObject);
-	DPRINT("Pipe name %wZ\n", &FileObject->FileName);
-
-	Ccb = FileObject->FsContext2;
-	ReaderCcb = Ccb->OtherSide;
-	Fcb = Ccb->Fcb;
-
-	Length = IoStack->Parameters.Write.Length;
-	Offset = IoStack->Parameters.Write.ByteOffset.u.LowPart;
-	Information = 0;
-
-	if (Irp->MdlAddress == NULL)
-	{
-		DPRINT("Irp->MdlAddress == NULL\n");
-		Status = STATUS_UNSUCCESSFUL;
-		Length = 0;
-		goto done;
-	}
-
-	if (ReaderCcb == NULL)
-	{
-		DPRINT("Pipe is NOT connected!\n");
-		if (Ccb->PipeState == FILE_PIPE_LISTENING_STATE)
-			Status = STATUS_PIPE_LISTENING;
-		else if (Ccb->PipeState == FILE_PIPE_DISCONNECTED_STATE)
-			Status = STATUS_PIPE_DISCONNECTED;
-		else
-			Status = STATUS_UNSUCCESSFUL;
-		Length = 0;
-		goto done;
-	}
-
-	if (ReaderCcb->Data == NULL)
-	{
-		DPRINT("Pipe is NOT writable!\n");
-		Status = STATUS_UNSUCCESSFUL;
-		Length = 0;
-		goto done;
-	}
-
-	Status = STATUS_SUCCESS;
-	Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
-
-	ExAcquireFastMutex(&ReaderCcb->DataListLock);
-#ifndef NDEBUG
-	DPRINT("Length %d Buffer %x Offset %x\n",Length,Buffer,Offset);
-	HexDump(Buffer, Length);
-#endif
-
-	while(1)
-	{
-		if (ReaderCcb->WriteQuotaAvailable == 0)
-		{
-			KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
-			if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
-			{
-				Status = STATUS_PIPE_BROKEN;
-				ExReleaseFastMutex(&ReaderCcb->DataListLock);
-				goto done;
-			}
-			ExReleaseFastMutex(&ReaderCcb->DataListLock);
-
-			DPRINT("Waiting for buffer space (%S)\n", Fcb->PipeName.Buffer);
-			Status = KeWaitForSingleObject(&Ccb->WriteEvent,
-				UserRequest,
-				KernelMode,
-				FALSE,
-				NULL);
-			DPRINT("Finished waiting (%S)! Status: %x\n", Fcb->PipeName.Buffer, Status);
-
-			/*
-			* It's possible that the event was signaled because the
-			* other side of pipe was closed.
-			*/
-			if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
-			{
-				DPRINT("PipeState: %x\n", Ccb->PipeState);
-				Status = STATUS_PIPE_BROKEN;
-				// ExReleaseFastMutex(&ReaderCcb->DataListLock);
-				goto done;
-			}
-
-			ExAcquireFastMutex(&ReaderCcb->DataListLock);
-		}
-
-		if (Fcb->WriteMode == FILE_PIPE_BYTE_STREAM_MODE)
-		{
-			DPRINT("Byte stream mode\n");
-			while (Length > 0 && ReaderCcb->WriteQuotaAvailable > 0)
-			{
-				CopyLength = min(Length, ReaderCcb->WriteQuotaAvailable);
-				if ((ULONG_PTR)ReaderCcb->WritePtr + CopyLength <= (ULONG_PTR)ReaderCcb->Data + ReaderCcb->MaxDataLength)
-				{
-					memcpy(ReaderCcb->WritePtr, Buffer, CopyLength);
-					ReaderCcb->WritePtr = (PVOID)((ULONG_PTR)ReaderCcb->WritePtr + CopyLength);
-					if ((ULONG_PTR)ReaderCcb->WritePtr == (ULONG_PTR)ReaderCcb->Data + ReaderCcb->MaxDataLength)
-					{
-						ReaderCcb->WritePtr = ReaderCcb->Data;
-					}
-				}
-				else
-				{
-					TempLength = (ULONG)((ULONG_PTR)ReaderCcb->Data + ReaderCcb->MaxDataLength - (ULONG_PTR)ReaderCcb->WritePtr);
-					memcpy(ReaderCcb->WritePtr, Buffer, TempLength);
-					memcpy(ReaderCcb->Data, Buffer + TempLength, CopyLength - TempLength);
-					ReaderCcb->WritePtr = (PVOID)((ULONG_PTR)ReaderCcb->Data + CopyLength - TempLength);
-				}
-
-				Buffer += CopyLength;
-				Length -= CopyLength;
-				Information += CopyLength;
-
-				ReaderCcb->ReadDataAvailable += CopyLength;
-				ReaderCcb->WriteQuotaAvailable -= CopyLength;
-			}
-
-			if (Length == 0)
-			{
-				KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
-				KeResetEvent(&Ccb->WriteEvent);
-				break;
-			}
-		}
-		else
-		{
-			DPRINT("Message mode\n");
-			if (Length > 0)
-			{
-				CopyLength = min(Length, ReaderCcb->WriteQuotaAvailable);
-				memcpy(ReaderCcb->Data, Buffer, CopyLength);
-
-				Information = CopyLength;
-				ReaderCcb->ReadDataAvailable = CopyLength;
-				ReaderCcb->WriteQuotaAvailable = 0;
-			}
-
-			if (Information > 0)
-			{
-				KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
-				KeResetEvent(&Ccb->WriteEvent);
-				break;
-			}
-		}
-	}
-
-	ExReleaseFastMutex(&ReaderCcb->DataListLock);
-
-done:
-	Irp->IoStatus.Status = Status;
-	Irp->IoStatus.Information = Information;
-
+	/* TODO: Implement */
 	IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-	DPRINT("NpfsWrite done (Status %lx)\n", Status);
+	FsRtlExitFileSystem();
 
-	return Status;
+	return STATUS_SUCCESS;
 }
 
 /* EOF */

Modified: trunk/reactos/drivers/filesystems/npfs_new/volume.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs_new/volume.c?rev=26634&r1=26633&r2=26634&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs_new/volume.c (original)
+++ trunk/reactos/drivers/filesystems/npfs_new/volume.c Fri May  4 15:50:41 2007
@@ -15,5 +15,19 @@
 
 /* FUNCTIONS ****************************************************************/
 
+NTSTATUS NTAPI
+NpfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+	FsRtlEnterFileSystem();
+
+	NpfsDbgPrint(NPFS_DEBUG_HIGHEST, "NpfsQueryVolumeInformation()\n");
+
+	/* TODO: Implement */
+	IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+	FsRtlExitFileSystem();
+
+	return STATUS_SUCCESS;
+}
 
 /* EOF */




More information about the Ros-diffs mailing list