ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

null.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:         ReactOS Kernel
00003  * LICENSE:         GPL - See COPYING in the top level directory
00004  * FILE:            drivers/base/null/null.c
00005  * PURPOSE:         Null Device Driver
00006  * PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
00007  *                  David Welch (welch@mcmail.com)
00008  */
00009 
00010 /* INCLUDES ******************************************************************/
00011 
00012 #include <ntddk.h>
00013 
00014 /* FUNCTIONS *****************************************************************/
00015 
00016 NTSTATUS
00017 NTAPI
00018 NullQueryFileInformation(OUT PVOID Buffer,
00019                          IN PULONG Length,
00020                          IN FILE_INFORMATION_CLASS InformationClass)
00021 {
00022     PFILE_STANDARD_INFORMATION StandardInfo = Buffer;
00023     PAGED_CODE();
00024 
00025     /* We only support one class */
00026     if (InformationClass != FileStandardInformation)
00027     {
00028         /* Fail */
00029         return STATUS_INVALID_INFO_CLASS;
00030     }
00031 
00032     /* Fill out the information */
00033     RtlZeroMemory(StandardInfo, sizeof(FILE_STANDARD_INFORMATION));
00034     StandardInfo->NumberOfLinks = 1;
00035 
00036     /* Return the length and success */
00037     *Length = sizeof(FILE_STANDARD_INFORMATION);
00038     return STATUS_SUCCESS;
00039 }
00040 
00041 BOOLEAN
00042 NTAPI
00043 NullRead(IN PFILE_OBJECT FileObject,
00044          IN PLARGE_INTEGER FileOffset,
00045          IN ULONG Length,
00046          IN BOOLEAN Wait,
00047          IN ULONG LockKey,
00048          OUT PVOID Buffer,
00049          OUT PIO_STATUS_BLOCK IoStatus,
00050          IN PDEVICE_OBJECT DeviceObject)
00051 {
00052     PAGED_CODE();
00053 
00054     /* Complete successfully */
00055     IoStatus->Status = STATUS_END_OF_FILE;
00056     IoStatus->Information = 0;
00057     return TRUE;
00058 }
00059 
00060 BOOLEAN
00061 NTAPI
00062 NullWrite(IN PFILE_OBJECT FileObject,
00063           IN PLARGE_INTEGER FileOffset,
00064           IN ULONG Length,
00065           IN BOOLEAN Wait,
00066           IN ULONG LockKey,
00067           IN PVOID Buffer,
00068           OUT PIO_STATUS_BLOCK IoStatus,
00069           IN PDEVICE_OBJECT DeviceObject)
00070 {
00071     PAGED_CODE();
00072 
00073     /* Complete successfully */
00074     IoStatus->Status = STATUS_SUCCESS;
00075     IoStatus->Information = Length;
00076     return TRUE;
00077 }
00078 
00079 NTSTATUS
00080 NTAPI
00081 NullDispatch(IN PDEVICE_OBJECT DeviceObject,
00082              IN PIRP Irp)
00083 {
00084     PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
00085     NTSTATUS Status;
00086     PFILE_OBJECT FileObject;
00087     ULONG Length;
00088     PAGED_CODE();
00089 
00090     /* Get the file object and check what kind of request this is */
00091     FileObject = IoStack->FileObject;
00092     switch (IoStack->MajorFunction)
00093     {
00094         case IRP_MJ_CREATE:
00095         case IRP_MJ_CLOSE:
00096 
00097             /* Check if this is synch I/O */
00098             if (FileObject->Flags & FO_SYNCHRONOUS_IO)
00099             {
00100                 /* Set distinguished value for Cc */
00101                 FileObject->PrivateCacheMap = (PVOID)1;
00102             }
00103 
00104             /* Complete successfully */
00105             Irp->IoStatus.Status = STATUS_SUCCESS;
00106             Irp->IoStatus.Information = 0;
00107             break;
00108 
00109          case IRP_MJ_READ:
00110 
00111             /* Return as if we read the entire file */
00112             Irp->IoStatus.Status = STATUS_END_OF_FILE;
00113             Irp->IoStatus.Information = 0;
00114             break;
00115 
00116         case IRP_MJ_WRITE:
00117 
00118             /* Return as if we wrote the entire request */
00119             Irp->IoStatus.Status = STATUS_SUCCESS;
00120             Irp->IoStatus.Information = IoStack->Parameters.Write.Length;
00121             break;
00122 
00123         case IRP_MJ_LOCK_CONTROL:
00124 
00125             /* Dummy */
00126             Irp->IoStatus.Status = STATUS_SUCCESS;
00127             Irp->IoStatus.Information = 0;
00128             break;
00129 
00130         case IRP_MJ_QUERY_INFORMATION:
00131 
00132             /* Get the length inputted and do the request */
00133             Length = IoStack->Parameters.QueryFile.Length;
00134             Irp->IoStatus.Status = NullQueryFileInformation(Irp->AssociatedIrp.
00135                                                             SystemBuffer,
00136                                                             &Length,
00137                                                             IoStack->
00138                                                             Parameters.
00139                                                             QueryFile.
00140                                                             FileInformationClass);
00141 
00142             /* Return the actual length */
00143             Irp->IoStatus.Information = Length;
00144             break;
00145     }
00146 
00147     /* Complete the request */
00148     Status = Irp->IoStatus.Status;
00149     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00150     return Status;
00151 }
00152 
00153 NTSTATUS
00154 NTAPI
00155 DriverEntry(IN PDRIVER_OBJECT DriverObject,
00156             IN PUNICODE_STRING RegistryPath)
00157 {
00158     PDEVICE_OBJECT DeviceObject;
00159     UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\Null");
00160     NTSTATUS Status;
00161     PFAST_IO_DISPATCH FastIoDispatch;
00162     PAGED_CODE();
00163 
00164     /* Page the driver */
00165     MmPageEntireDriver(DriverEntry);
00166 
00167     /* Create null device */
00168     Status = IoCreateDevice(DriverObject,
00169                             0,
00170                             &DeviceName,
00171                             FILE_DEVICE_NULL,
00172                             0,
00173                             FALSE,
00174                             &DeviceObject);
00175     if (!NT_SUCCESS(Status)) return Status;
00176 
00177     /* Register driver routines */
00178     DriverObject->MajorFunction[IRP_MJ_CLOSE] = NullDispatch;
00179     DriverObject->MajorFunction[IRP_MJ_CREATE] = NullDispatch;
00180     DriverObject->MajorFunction[IRP_MJ_WRITE] = NullDispatch;
00181     DriverObject->MajorFunction[IRP_MJ_READ] = NullDispatch;
00182     DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = NullDispatch;
00183     DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = NullDispatch;
00184 
00185     /* Allocate the fast I/O dispatch table */
00186     FastIoDispatch = ExAllocatePool(NonPagedPool, sizeof(FAST_IO_DISPATCH));
00187     if (!FastIoDispatch)
00188     {
00189         /* Failed, cleanup */
00190         IoDeleteDevice(DeviceObject);
00191         return STATUS_INSUFFICIENT_RESOURCES;
00192     }
00193 
00194     /* Initialize it */
00195     RtlZeroMemory(FastIoDispatch, sizeof(FAST_IO_DISPATCH));
00196     FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
00197 
00198     /* Setup our pointers */
00199     FastIoDispatch->FastIoRead = NullRead;
00200     FastIoDispatch->FastIoWrite = NullWrite;
00201     DriverObject->FastIoDispatch = FastIoDispatch;
00202 
00203     /* Return success */
00204     return STATUS_SUCCESS;
00205 }
00206 
00207 /* EOF */

Generated on Sun May 27 2012 04:27:13 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.