Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenisapnp.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS ISA PnP Bus driver 00003 * FILE: isapnp.c 00004 * PURPOSE: Driver entry 00005 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) 00006 */ 00007 #include <isapnp.h> 00008 00009 #define NDEBUG 00010 #include <debug.h> 00011 00012 static 00013 NTSTATUS 00014 NTAPI 00015 ForwardIrpCompletion( 00016 IN PDEVICE_OBJECT DeviceObject, 00017 IN PIRP Irp, 00018 IN PVOID Context) 00019 { 00020 if (Irp->PendingReturned) 00021 KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); 00022 00023 return STATUS_MORE_PROCESSING_REQUIRED; 00024 } 00025 00026 NTSTATUS 00027 NTAPI 00028 IsaForwardIrpSynchronous( 00029 IN PISAPNP_FDO_EXTENSION FdoExt, 00030 IN PIRP Irp) 00031 { 00032 KEVENT Event; 00033 NTSTATUS Status; 00034 00035 KeInitializeEvent(&Event, NotificationEvent, FALSE); 00036 IoCopyCurrentIrpStackLocationToNext(Irp); 00037 00038 IoSetCompletionRoutine(Irp, ForwardIrpCompletion, &Event, TRUE, TRUE, TRUE); 00039 00040 Status = IoCallDriver(FdoExt->Ldo, Irp); 00041 if (Status == STATUS_PENDING) 00042 { 00043 Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); 00044 if (NT_SUCCESS(Status)) 00045 Status = Irp->IoStatus.Status; 00046 } 00047 00048 return Status; 00049 } 00050 00051 00052 static 00053 NTSTATUS 00054 NTAPI 00055 IsaCreateClose( 00056 IN PDEVICE_OBJECT DeviceObject, 00057 IN PIRP Irp) 00058 { 00059 Irp->IoStatus.Status = STATUS_SUCCESS; 00060 Irp->IoStatus.Information = FILE_OPENED; 00061 00062 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); 00063 00064 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00065 00066 return STATUS_SUCCESS; 00067 } 00068 00069 static 00070 NTSTATUS 00071 NTAPI 00072 IsaIoctl( 00073 IN PDEVICE_OBJECT DeviceObject, 00074 IN PIRP Irp) 00075 { 00076 PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); 00077 NTSTATUS Status; 00078 00079 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); 00080 00081 switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) 00082 { 00083 default: 00084 DPRINT1("Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); 00085 Status = STATUS_NOT_SUPPORTED; 00086 break; 00087 } 00088 00089 Irp->IoStatus.Status = Status; 00090 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00091 00092 return Status; 00093 } 00094 00095 static 00096 NTSTATUS 00097 NTAPI 00098 IsaReadWrite( 00099 IN PDEVICE_OBJECT DeviceObject, 00100 IN PIRP Irp) 00101 { 00102 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); 00103 00104 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; 00105 Irp->IoStatus.Information = 0; 00106 00107 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00108 00109 return STATUS_NOT_SUPPORTED; 00110 } 00111 00112 static 00113 NTSTATUS 00114 NTAPI 00115 IsaAddDevice( 00116 IN PDRIVER_OBJECT DriverObject, 00117 IN PDEVICE_OBJECT PhysicalDeviceObject) 00118 { 00119 PDEVICE_OBJECT Fdo; 00120 PISAPNP_FDO_EXTENSION FdoExt; 00121 NTSTATUS Status; 00122 00123 DPRINT("%s(%p, %p)\n", __FUNCTION__, DriverObject, PhysicalDeviceObject); 00124 00125 Status = IoCreateDevice(DriverObject, 00126 sizeof(*FdoExt), 00127 NULL, 00128 FILE_DEVICE_BUS_EXTENDER, 00129 FILE_DEVICE_SECURE_OPEN, 00130 TRUE, 00131 &Fdo); 00132 if (!NT_SUCCESS(Status)) 00133 { 00134 DPRINT1("Failed to create FDO (0x%x)\n", Status); 00135 return Status; 00136 } 00137 00138 FdoExt = Fdo->DeviceExtension; 00139 RtlZeroMemory(FdoExt, sizeof(*FdoExt)); 00140 00141 FdoExt->Common.Self = Fdo; 00142 FdoExt->Common.IsFdo = TRUE; 00143 FdoExt->Common.State = dsStopped; 00144 FdoExt->Pdo = PhysicalDeviceObject; 00145 FdoExt->Ldo = IoAttachDeviceToDeviceStack(Fdo, 00146 PhysicalDeviceObject); 00147 00148 InitializeListHead(&FdoExt->DeviceListHead); 00149 KeInitializeSpinLock(&FdoExt->Lock); 00150 00151 Fdo->Flags &= ~DO_DEVICE_INITIALIZING; 00152 00153 return STATUS_SUCCESS; 00154 } 00155 00156 static 00157 NTSTATUS 00158 NTAPI 00159 IsaPnp( 00160 IN PDEVICE_OBJECT DeviceObject, 00161 IN PIRP Irp) 00162 { 00163 PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); 00164 PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; 00165 00166 DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); 00167 00168 if (DevExt->IsFdo) 00169 { 00170 return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt, 00171 Irp, 00172 IrpSp); 00173 } 00174 else 00175 { 00176 return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE)DevExt, 00177 Irp, 00178 IrpSp); 00179 } 00180 } 00181 00182 NTSTATUS 00183 NTAPI 00184 DriverEntry( 00185 IN PDRIVER_OBJECT DriverObject, 00186 IN PUNICODE_STRING RegistryPath) 00187 { 00188 DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath); 00189 00190 DriverObject->MajorFunction[IRP_MJ_CREATE] = IsaCreateClose; 00191 DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsaCreateClose; 00192 DriverObject->MajorFunction[IRP_MJ_READ] = IsaReadWrite; 00193 DriverObject->MajorFunction[IRP_MJ_WRITE] = IsaReadWrite; 00194 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsaIoctl; 00195 DriverObject->MajorFunction[IRP_MJ_PNP] = IsaPnp; 00196 DriverObject->DriverExtension->AddDevice = IsaAddDevice; 00197 00198 return STATUS_SUCCESS; 00199 } 00200 00201 /* EOF */ Generated on Sat May 26 2012 04:26:01 for ReactOS by
1.7.6.1
|