Author: ion Date: Tue Apr 3 20:22:44 2007 New Revision: 26256
URL: http://svn.reactos.org/svn/reactos?rev=26256&view=rev Log: - Remove "zero-stream" from null, NT doesn't support this. - Implement Fast I/O Dispatch entrypoints for null. - Support query file information and lock IRPs, just like NT. - Remove query volume information IRP, not supported by NT. - Page the entire driver.
Removed: trunk/reactos/drivers/base/null/null.h Modified: trunk/reactos/drivers/base/null/null.c
Modified: trunk/reactos/drivers/base/null/null.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/null/null.c?re... ============================================================================== --- trunk/reactos/drivers/base/null/null.c (original) +++ trunk/reactos/drivers/base/null/null.c Tue Apr 3 20:22:44 2007 @@ -1,205 +1,207 @@ -/* $Id$ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: services/null/null.c - * PURPOSE: NULL device driver - * PROGRAMMER: David Welch (welch@mcmail.com) - * UPDATE HISTORY: - * 13/08/1998: Created - * 29/04/2002: Fixed bugs, added zero-stream device - * 28/06/2004: Compile against the DDK, use PSEH where necessary +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/base/null/null.c + * PURPOSE: Beep Device Driver + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * David Welch (welch@mcmail.com) */
-/* INCLUDES */ +/* INCLUDES ******************************************************************/ + #include <ntddk.h>
-#include <pseh/pseh.h> - -#include "null.h" - -/* OBJECTS */ -static const NULL_EXTENSION nxNull = NullBitBucket; -static const NULL_EXTENSION nxZero = NullZeroStream; - -/* FUNCTIONS */ -static NTSTATUS STDCALL -NullDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) -{ - PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp); - NTSTATUS nErrCode; - - nErrCode = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - switch(piosStack->MajorFunction) +/* FUNCTIONS *****************************************************************/ + +NTSTATUS +NTAPI +NullQueryFileInformation(OUT PVOID Buffer, + IN PULONG Length, + IN FILE_INFORMATION_CLASS InformationClass) +{ + PFILE_STANDARD_INFORMATION StandardInfo = Buffer; + PAGED_CODE(); + + /* We only support one class */ + if (InformationClass != FileStandardInformation) { - /* opening and closing handles to the device */ + /* Fail */ + return STATUS_INVALID_INFO_CLASS; + } + + /* Fill out the information */ + RtlZeroMemory(StandardInfo, sizeof(FILE_STANDARD_INFORMATION)); + StandardInfo->NumberOfLinks = 1; + + /* Return the length and success */ + *Length = sizeof(FILE_STANDARD_INFORMATION); + return STATUS_SUCCESS; +} + +BOOLEAN +NTAPI +NullRead(IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + /* Complete successfully */ + IoStatus->Status = STATUS_END_OF_FILE; + IoStatus->Information = 0; + return TRUE; +} + +BOOLEAN +NTAPI +NullWrite(IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject) +{ + PAGED_CODE(); + + /* Complete successfully */ + IoStatus->Status = STATUS_SUCCESS; + IoStatus->Information = Length; + return TRUE; +} + +NTSTATUS +STDCALL +NullDispatch(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; + PFILE_OBJECT FileObject; + ULONG Length; + PAGED_CODE(); + + /* Get the file object and check what kind of request this is */ + FileObject = IoStack->FileObject; + switch (IoStack->MajorFunction) + { case IRP_MJ_CREATE: case IRP_MJ_CLOSE: - switch(NULL_DEVICE_TYPE(DeviceObject)) + + /* Check if this is synch I/O */ + if (FileObject->Flags & FO_SYNCHRONOUS_IO) { - case NullBitBucket: - case NullZeroStream: - break; - - default: - ASSERT(FALSE); + /* Set distinguished value for Cc */ + FileObject->PrivateCacheMap = (PVOID)1; }
- break; - - /* write data */ + /* Complete successfully */ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + break; + + case IRP_MJ_READ: + + /* Return as if we read the entire file */ + Irp->IoStatus.Status = STATUS_END_OF_FILE; + Irp->IoStatus.Information = 0; + break; + case IRP_MJ_WRITE: - { - switch(NULL_DEVICE_TYPE(DeviceObject)) - { - case NullBitBucket: - Irp->IoStatus.Information = piosStack->Parameters.Write.Length; - break; - - case NullZeroStream: - nErrCode = STATUS_INVALID_DEVICE_REQUEST; - break; - - default: - ASSERT(FALSE); - } - - break; - } - - /* read data */ - case IRP_MJ_READ: - { - switch(NULL_DEVICE_TYPE(DeviceObject)) - { - case NullBitBucket: - nErrCode = STATUS_END_OF_FILE; - break; - - case NullZeroStream: - _SEH_TRY - { - RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, piosStack->Parameters.Read.Length); - Irp->IoStatus.Information = piosStack->Parameters.Read.Length; - } - _SEH_HANDLE - { - nErrCode = _SEH_GetExceptionCode(); - } - _SEH_END; - - break; - - default: - ASSERT(FALSE); - - } - - break; - } - - case IRP_MJ_QUERY_VOLUME_INFORMATION: - switch(piosStack->Parameters.QueryVolume.FsInformationClass) - { - case FileFsDeviceInformation: - { - ULONG BufferLength = piosStack->Parameters.QueryVolume.Length; - PFILE_FS_DEVICE_INFORMATION FsDeviceInfo = (PFILE_FS_DEVICE_INFORMATION)Irp->AssociatedIrp.SystemBuffer; - - if (BufferLength >= sizeof(FILE_FS_DEVICE_INFORMATION)) - { - FsDeviceInfo->DeviceType = FILE_DEVICE_NULL; - FsDeviceInfo->Characteristics = 0; /* FIXME: fix this !! */ - Irp->IoStatus.Information = sizeof(FILE_FS_DEVICE_INFORMATION); - nErrCode = STATUS_SUCCESS; - } - else - { - Irp->IoStatus.Information = 0; - nErrCode = STATUS_BUFFER_OVERFLOW; - } - } - break; - - default: - Irp->IoStatus.Information = 0; - nErrCode = STATUS_NOT_IMPLEMENTED; - } - break; - - default: + + /* Return as if we wrote the entire request */ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = IoStack->Parameters.Write.Length; + break; + + case IRP_MJ_LOCK_CONTROL: + + /* Dummy */ + Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; - nErrCode = STATUS_NOT_IMPLEMENTED; - + break; + + case IRP_MJ_QUERY_INFORMATION: + + /* Get the length inputted and do the request */ + Length = IoStack->Parameters.QueryFile.Length; + Irp->IoStatus.Status = NullQueryFileInformation(Irp->AssociatedIrp. + SystemBuffer, + &Length, + IoStack-> + Parameters. + QueryFile. + FileInformationClass); + + /* Return the actual length */ + Irp->IoStatus.Information = Length; + break; }
- Irp->IoStatus.Status = nErrCode; + /* Complete the request */ + Status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return (nErrCode); -} - -static VOID STDCALL -NullUnload(PDRIVER_OBJECT DriverObject) -{ -} - -/* TODO: \Device\Zero should be memory-mappable */ -NTSTATUS STDCALL -DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) -{ - PDEVICE_OBJECT pdoNullDevice; - PDEVICE_OBJECT pdoZeroDevice; - UNICODE_STRING wstrNullDeviceName = RTL_CONSTANT_STRING(L"\Device\Null"); - UNICODE_STRING wstrZeroDeviceName = RTL_CONSTANT_STRING(L"\Device\Zero"); - NTSTATUS nErrCode; - - /* register driver routines */ + return Status; +} + +NTSTATUS +STDCALL +DriverEntry(IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) +{ + PDEVICE_OBJECT DeviceObject; + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\Device\Null"); + NTSTATUS Status; + PFAST_IO_DISPATCH FastIoDispatch; + PAGED_CODE(); + + /* Page the driver */ + MmPageEntireDriver(DriverEntry); + + /* Create null device */ + Status = IoCreateDevice(DriverObject, + 0, + &DeviceName, + FILE_DEVICE_NULL, + 0, + FALSE, + &DeviceObject); + if (!NT_SUCCESS(Status)) return Status; + + /* Register driver routines */ DriverObject->MajorFunction[IRP_MJ_CLOSE] = NullDispatch; DriverObject->MajorFunction[IRP_MJ_CREATE] = NullDispatch; DriverObject->MajorFunction[IRP_MJ_WRITE] = NullDispatch; DriverObject->MajorFunction[IRP_MJ_READ] = NullDispatch; - DriverObject->DriverUnload = NullUnload; - - /* create null device */ - nErrCode = IoCreateDevice(DriverObject, - sizeof(NULL_EXTENSION), - &wstrNullDeviceName, - FILE_DEVICE_NULL, - 0, - FALSE, - &pdoNullDevice); - - /* failure */ - if(!NT_SUCCESS(nErrCode)) + DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = NullDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = NullDispatch; + + /* Allocate the fast I/O dispatch table */ + FastIoDispatch = ExAllocatePool(NonPagedPool, sizeof(FAST_IO_DISPATCH)); + if (!FastIoDispatch) { - return (nErrCode); + /* Failed, cleanup */ + IoDeleteDevice(DeviceObject); + return STATUS_INSUFFICIENT_RESOURCES; }
- pdoNullDevice->DeviceExtension = (PVOID)&nxNull; - - /* create zero device */ - nErrCode = IoCreateDevice(DriverObject, - sizeof(NULL_EXTENSION), - &wstrZeroDeviceName, - FILE_DEVICE_NULL, - FILE_READ_ONLY_DEVICE, /* zero device is read-only */ - FALSE, - &pdoZeroDevice); - - /* failure */ - if(!NT_SUCCESS(nErrCode)) - { - IoDeleteDevice(pdoNullDevice); - return (nErrCode); - } - - pdoZeroDevice->DeviceExtension = (PVOID)&nxZero; - pdoZeroDevice->Flags |= DO_BUFFERED_IO; - - return (nErrCode); + /* Initialize it */ + RtlZeroMemory(FastIoDispatch, sizeof(FAST_IO_DISPATCH)); + FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH); + + /* Setup our pointers */ + FastIoDispatch->FastIoRead = NullRead; + FastIoDispatch->FastIoWrite = NullWrite; + DriverObject->FastIoDispatch = FastIoDispatch; + + /* Return success */ + return STATUS_SUCCESS; }
/* EOF */
Removed: trunk/reactos/drivers/base/null/null.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/null/null.h?re... ============================================================================== --- trunk/reactos/drivers/base/null/null.h (original) +++ trunk/reactos/drivers/base/null/null.h (removed) @@ -1,22 +1,0 @@ -/* $Id$ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: services/dd/null/null.h - * PURPOSE: NULL device driver internal definitions - * PROGRAMMER: KJK::Hyperion noog@libero.it - * UPDATE HISTORY: - * 29/04/2002: Created - */ - -typedef enum __tagNULL_EXTENSION{ - NullBitBucket, - NullZeroStream, -} NULL_EXTENSION, *PNULL_EXTENSION; - -#define NULL_DEVICE_TYPE(__DEVICE__) (*((PNULL_EXTENSION)((__DEVICE__)->DeviceExtension))) - -NTSTATUS STDCALL -DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); - -/* EOF */