Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennull.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
1.7.6.1
|