reactos/reactos/drivers/dd/null/null.c
KJK::Hyperion 488ec274f1 Fixed bugs in null device drivers, added zero stream device
svn path=/trunk/; revision=2897
2002-04-29 23:06:42 +00:00

164 lines
3.4 KiB
C

/* $Id: null.c,v 1.7 2002/04/29 23:06:42 hyperion Exp $
*
* 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
*/
/* INCLUDES */
#include <ddk/ntddk.h>
#include "null.h"
/* OBJECTS */
static const NULL_EXTENSION nxNull = NullBitBucket;
static const NULL_EXTENSION nxZero = NullZeroStream;
/* FUNCTIONS */
NTSTATUS STDCALL
NullDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS nErrCode;
nErrCode = STATUS_SUCCESS;
switch(piosStack->MajorFunction)
{
/* opening and closing handles to the device */
case IRP_MJ_CREATE:
case IRP_MJ_CLOSE:
{
break;
}
/* write data */
case IRP_MJ_WRITE:
{
switch(NULL_DEVICE_TYPE(DeviceObject))
{
case NullBitBucket:
Irp->IoStatus.Information = piosStack->Parameters.Write.Length;
break;
case NullZeroStream:
default:
Irp->IoStatus.Information = 0;
nErrCode = STATUS_NOT_IMPLEMENTED;
}
break;
}
/* read data */
case IRP_MJ_READ:
{
switch(NULL_DEVICE_TYPE(DeviceObject))
{
case NullBitBucket:
Irp->IoStatus.Information = 0;
nErrCode = STATUS_END_OF_FILE;
break;
case NullZeroStream:
RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, piosStack->Parameters.Read.Length);
Irp->IoStatus.Information = piosStack->Parameters.Read.Length;
break;
default:
Irp->IoStatus.Information = 0;
nErrCode = STATUS_NOT_IMPLEMENTED;
}
break;
}
/* unsupported operations */
default:
{
nErrCode = STATUS_NOT_IMPLEMENTED;
}
}
Irp->IoStatus.Status = nErrCode;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return (nErrCode);
}
NTSTATUS STDCALL
NullUnload(PDRIVER_OBJECT DriverObject)
{
return(STATUS_SUCCESS);
}
NTSTATUS STDCALL
DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT pdoNullDevice;
PDEVICE_OBJECT pdoZeroDevice;
UNICODE_STRING wstrDeviceName;
NTSTATUS nErrCode;
/* 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->MajorFunction[IRP_MJ_QUERY_INFORMATION] = NullDispatch; */
DriverObject->DriverUnload = NullUnload;
/* create null device */
RtlInitUnicodeString(&wstrDeviceName, L"\\Device\\Null");
nErrCode = IoCreateDevice
(
DriverObject,
sizeof(NULL_EXTENSION),
&wstrDeviceName,
FILE_DEVICE_NULL,
0,
FALSE,
&pdoNullDevice
);
/* failure */
if(!NT_SUCCESS(nErrCode))
{
return (nErrCode);
}
pdoNullDevice->DeviceExtension = (PVOID)&nxNull;
/* create zero device */
RtlInitUnicodeString(&wstrDeviceName, L"\\Device\\Zero");
nErrCode = IoCreateDevice
(
DriverObject,
sizeof(NULL_EXTENSION),
&wstrDeviceName,
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);
}
/* EOF */