1 /* $Id: cdrom.c,v 1.1 2002/01/31 15:00:00 ekohl Exp $
5 // -------------------------------------------------------------------------
9 #include "../include/scsi.h"
10 #include "../include/class2.h"
11 #include "../include/ntddscsi.h"
16 #define VERSION "V0.0.1"
21 CdromFindDevices(PDRIVER_OBJECT DriverObject
,
22 PUNICODE_STRING RegistryPath
,
23 PCLASS_INIT_DATA InitializationData
,
24 PDEVICE_OBJECT PortDeviceObject
,
29 CdromDeviceControl(IN PDEVICE_OBJECT DeviceObject
,
33 CdromShutdownFlush(IN PDEVICE_OBJECT DeviceObject
,
42 // This function initializes the driver, locates and claims
43 // hardware resources, and creates various NT objects needed
44 // to process I/O requests.
50 // IN PDRIVER_OBJECT DriverObject System allocated Driver Object
52 // IN PUNICODE_STRING RegistryPath Name of registry driver service
59 DriverEntry(IN PDRIVER_OBJECT DriverObject
,
60 IN PUNICODE_STRING RegistryPath
)
62 CLASS_INIT_DATA InitData
;
64 DbgPrint("CD-ROM Class Driver %s\n",
66 DPRINT("RegistryPath '%wZ'\n",
69 InitData
.InitializationDataSize
= sizeof(CLASS_INIT_DATA
);
70 InitData
.DeviceExtensionSize
= sizeof(DEVICE_EXTENSION
); // + sizeof(DISK_DATA)
71 InitData
.DeviceType
= FILE_DEVICE_CD_ROM
;
72 InitData
.DeviceCharacteristics
= 0;
74 InitData
.ClassError
= NULL
; // CdromProcessError;
75 InitData
.ClassReadWriteVerification
= NULL
; // CdromReadWriteVerification;
76 InitData
.ClassFindDeviceCallBack
= NULL
; // CdromDeviceVerification;
77 InitData
.ClassFindDevices
= CdromFindDevices
;
78 InitData
.ClassDeviceControl
= CdromDeviceControl
;
79 InitData
.ClassShutdownFlush
= CdromShutdownFlush
;
80 InitData
.ClassCreateClose
= NULL
;
81 InitData
.ClassStartIo
= NULL
;
83 return(ScsiClassInitialize(DriverObject
,
92 // This function searches for device that are attached to the given scsi port.
98 // IN PDRIVER_OBJECT DriverObject System allocated Driver Object for this driver
99 // IN PUNICODE_STRING RegistryPath Name of registry driver service key
100 // IN PCLASS_INIT_DATA InitializationData Pointer to the main initialization data
101 // IN PDEVICE_OBJECT PortDeviceObject Scsi port device object
102 // IN ULONG PortNumber Port number
105 // TRUE: At least one disk drive was found
106 // FALSE: No disk drive found
110 CdromFindDevices(PDRIVER_OBJECT DriverObject
,
111 PUNICODE_STRING RegistryPath
,
112 PCLASS_INIT_DATA InitializationData
,
113 PDEVICE_OBJECT PortDeviceObject
,
116 PIO_SCSI_CAPABILITIES PortCapabilities
;
117 PSCSI_ADAPTER_BUS_INFO AdapterBusInfo
;
124 // PCONFIGURATION_INFORMATION ConfigInfo;
126 DPRINT1("CdromFindDevices() called.\n");
128 /* Get port capabilities */
129 Status
= ScsiClassGetCapabilities(PortDeviceObject
,
131 if (!NT_SUCCESS(Status
))
133 DPRINT("ScsiClassGetCapabilities() failed! (Status 0x%lX)\n", Status
);
137 DPRINT1("MaximumTransferLength: %lu\n", PortCapabilities
->MaximumTransferLength
);
139 /* Get inquiry data */
140 Status
= ScsiClassGetInquiryData(PortDeviceObject
,
141 (PSCSI_ADAPTER_BUS_INFO
*)&Buffer
);
142 if (!NT_SUCCESS(Status
))
144 DPRINT("ScsiClassGetInquiryData() failed! (Status 0x%lX)\n", Status
);
148 /* Check whether there are unclaimed devices */
149 AdapterBusInfo
= (PSCSI_ADAPTER_BUS_INFO
)Buffer
;
151 DeviceCount
= ScsiClassFindUnclaimedDevices(InitializationData
,
153 if (DeviceCount
== 0)
155 DPRINT("ScsiClassFindUnclaimedDevices() returned 0!");
160 // ConfigInfo = IoGetConfigurationInformation();
161 // DPRINT1("Number of SCSI ports: %lu\n", ConfigInfo->ScsiPortCount);
163 /* Search each bus of this adapter */
164 for (ScsiBus
= 0; ScsiBus
< (ULONG
)AdapterBusInfo
->NumberOfBuses
; ScsiBus
++)
166 DPRINT("Searching bus %lu\n", ScsiBus
);
168 lunInfo
= (PVOID
)(Buffer
+ adapterInfo
->BusData
[scsiBus
].InquiryDataOffset
);
171 while (AdapterBusInfo
->BusData
[ScsiBus
].InquiryDataOffset
)
179 ExFreePool(PortCapabilities
);
185 // CdromDeviceControl
188 // Answer requests for device control calls
194 // Standard dispatch arguments
201 CdromDeviceControl(IN PDEVICE_OBJECT DeviceObject
,
204 DPRINT("CdromDeviceControl() called!\n");
206 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
207 Irp
->IoStatus
.Information
= 0;
208 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
210 return(STATUS_SUCCESS
);
214 // CdromShutdownFlush
217 // Answer requests for shutdown and flush calls
223 // Standard dispatch arguments
230 CdromShutdownFlush(IN PDEVICE_OBJECT DeviceObject
,
233 DPRINT("CdromShutdownFlush() called!\n");
235 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
236 Irp
->IoStatus
.Information
= 0;
237 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
239 return(STATUS_SUCCESS
);