From d28ae7e82f4943b3fc5b4246179296ada8bfbe42 Mon Sep 17 00:00:00 2001 From: Phillip Susi Date: Mon, 18 Jun 2001 03:10:00 +0000 Subject: [PATCH] Check in of new ram disk driver, loads floppy image into ram on boot svn path=/trunk/; revision=1986 --- reactos/drivers/dd/ramdrv/makefile | 41 ++++++++ reactos/drivers/dd/ramdrv/ramdrv.c | 160 +++++++++++++++++++++++++++++ reactos/drivers/dd/ramdrv/ramdrv.h | 5 + 3 files changed, 206 insertions(+) create mode 100644 reactos/drivers/dd/ramdrv/makefile create mode 100644 reactos/drivers/dd/ramdrv/ramdrv.c create mode 100644 reactos/drivers/dd/ramdrv/ramdrv.h diff --git a/reactos/drivers/dd/ramdrv/makefile b/reactos/drivers/dd/ramdrv/makefile new file mode 100644 index 00000000000..0668e4d9f62 --- /dev/null +++ b/reactos/drivers/dd/ramdrv/makefile @@ -0,0 +1,41 @@ +# $Id: makefile,v 1.1 2001/06/18 03:10:00 phreak Exp $ +# +# +PATH_TO_TOP = ../../.. + +TARGET=ramdrv + +OBJECTS = ramdrv.o ../../../ntoskrnl/ntoskrnl.a + +CFLAGS = -I. + +all: $(TARGET).sys + +ramdrv.o: ramdrv.h + +.phony: all + +clean: + - $(RM) floppy.o + - $(RM) junk.tmp + - $(RM) base.tmp + - $(RM) temp.exp + - $(RM) $(TARGET).sys + - $(RM) $(TARGET).sys.unstripped + +.phony: clean + +install: $(FLOPPY_DIR)/drivers/$(TARGET).sys + +$(FLOPPY_DIR)/drivers/$(TARGET).sys: $(TARGET).sys + $(CP) $(TARGET).sys $(FLOPPY_DIR)/drivers/$(TARGET).sys + +dist: ../../../$(DIST_DIR)/drivers/$(TARGET).sys + +../../../$(DIST_DIR)/drivers/$(TARGET).sys: $(TARGET).sys + $(CP) $(TARGET).sys ../../../$(DIST_DIR)/drivers/$(TARGET).sys + +$(TARGET).sys: $(OBJECTS) + +WITH_DEBUGGING=yes +include ../../../rules.mak diff --git a/reactos/drivers/dd/ramdrv/ramdrv.c b/reactos/drivers/dd/ramdrv/ramdrv.c new file mode 100644 index 00000000000..b8d9be616c0 --- /dev/null +++ b/reactos/drivers/dd/ramdrv/ramdrv.c @@ -0,0 +1,160 @@ +#include +#include "ramdrv.h" +#include + +NTSTATUS STDCALL RamdrvDispatchReadWrite(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PRAMDRV_DEVICE_EXTENSION devext = (PRAMDRV_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + PIO_STACK_LOCATION Stk = IoGetCurrentIrpStackLocation( Irp ); + + if( Stk->Parameters.Read.ByteOffset.u.HighPart || + Stk->Parameters.Read.ByteOffset.u.LowPart >= devext->Size ) + { + Irp->IoStatus.Status = STATUS_END_OF_FILE; + Irp->IoStatus.Information = 0; + IoCompleteRequest( Irp, 0 ); + return STATUS_END_OF_FILE; + } + if( (Stk->Parameters.Read.ByteOffset.u.LowPart + Stk->Parameters.Read.Length) > devext->Size ) + Stk->Parameters.Read.Length = devext->Size - Stk->Parameters.Read.ByteOffset.u.LowPart; + if( Stk->MajorFunction == IRP_MJ_READ ) + RtlCopyMemory( MmGetSystemAddressForMdl( Irp->MdlAddress ), + devext->Buffer + Stk->Parameters.Read.ByteOffset.u.LowPart, + Stk->Parameters.Read.Length ); + else RtlCopyMemory( devext->Buffer + Stk->Parameters.Read.ByteOffset.u.LowPart, + MmGetSystemAddressForMdl( Irp->MdlAddress ), + Stk->Parameters.Read.Length ); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Stk->Parameters.Read.Length; + IoCompleteRequest( Irp, 0 ); + return STATUS_SUCCESS; +} + +NTSTATUS STDCALL RamdrvDispatchOpenClose(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + DPRINT("RamdrvDispatchOpenClose\n"); + return STATUS_SUCCESS; +} + +NTSTATUS STDCALL DriverEntry(IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) +{ + UNICODE_STRING DeviceName; + NTSTATUS Status; + PDEVICE_OBJECT DeviceObject; + PRAMDRV_DEVICE_EXTENSION devext; + UNICODE_STRING LinkName; + HANDLE file; + OBJECT_ATTRIBUTES objattr; + IO_STATUS_BLOCK iosb; + LARGE_INTEGER allocsize; + HANDLE event; + + DbgPrint("Ramdisk driver\n"); + + /* Export other driver entry points... */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = RamdrvDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = RamdrvDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_READ] = RamdrvDispatchReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = RamdrvDispatchReadWrite; + // DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = + // RamdrvDispatchDeviceControl; + + + // create device and symbolic link + RtlInitUnicodeString( &DeviceName, L"\\Device\\Ramdisk" ); + Status = IoCreateDevice( DriverObject, + sizeof( RAMDRV_DEVICE_EXTENSION ), + &DeviceName, + FILE_DEVICE_DISK, + 0, + FALSE, + &DeviceObject ); + if( !NT_SUCCESS( Status ) ) + return Status; + DeviceObject->Flags |= DO_DIRECT_IO; + devext = (PRAMDRV_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + devext->Size = 1440 * 1024; + devext->Buffer = ExAllocatePool( PagedPool, devext->Size ); + if( !devext->Buffer ) + { + IoDeleteDevice( DeviceObject ); + return STATUS_INSUFFICIENT_RESOURCES; + } + RtlInitUnicodeString( &LinkName, L"\\ArcName\\virt(0)disk(0)ram(0)" ); + IoAssignArcName( &LinkName, &DeviceName ); + RtlInitUnicodeString( &LinkName, L"\\??\\Z:" ); + IoCreateSymbolicLink( &LinkName, &DeviceName ); + + RtlInitUnicodeString( &LinkName, L"\\Device\\Floppy0" ); + InitializeObjectAttributes( &objattr, + &LinkName, + 0, + 0, + 0 ); + allocsize.u.LowPart = allocsize.u.HighPart = 0; + + Status = NtCreateFile( &file, + GENERIC_READ | GENERIC_WRITE, + &objattr, + &iosb, + &allocsize, + 0, + 0, + OPEN_EXISTING, + 0, + 0, + 0 ); + if( !NT_SUCCESS( Status ) ) + { + DPRINT( "Failed to open floppy\n" ); + return STATUS_SUCCESS; + } + InitializeObjectAttributes( &objattr, + 0, + 0, + 0, + 0 ); + Status = NtCreateEvent( &event, + 0, + &objattr, + TRUE, + FALSE ); + if( !NT_SUCCESS( Status ) ) + { + DPRINT( "Failed to create event\n" ); + NtClose( file ); + return STATUS_SUCCESS; + } + + Status = NtReadFile( file, + event, + 0, + 0, + &iosb, + devext->Buffer, + 1440 * 1024, + &allocsize, + 0 ); + if( !NT_SUCCESS( Status ) ) + { + NtClose( file ); + NtClose( event ); + DPRINT( "Failed to read floppy\n" ); + return STATUS_SUCCESS; + } + Status = NtWaitForSingleObject( event, FALSE, 0 ); + if( Status != STATUS_WAIT_0 || !NT_SUCCESS( iosb.Status ) ) + { + DPRINT( "Failed to read floppy\n" ); + NtClose( file ); + NtClose( event ); + return STATUS_SUCCESS; + } + NtClose( file ); + NtClose( event ); + return STATUS_SUCCESS; +} + diff --git a/reactos/drivers/dd/ramdrv/ramdrv.h b/reactos/drivers/dd/ramdrv/ramdrv.h new file mode 100644 index 00000000000..554a21e27ff --- /dev/null +++ b/reactos/drivers/dd/ramdrv/ramdrv.h @@ -0,0 +1,5 @@ +typedef struct _RAMDRV_DEVICE_EXTENSION { + void *Buffer; + unsigned long Size; +} RAMDRV_DEVICE_EXTENSION, *PRAMDRV_DEVICE_EXTENSION; +