21 #define CDB12GENERIC_LENGTH 12 137 SHORT MediaChangeIrpTimeInUse;
169 #define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(CDROM_DATA) 170 #define SCSI_CDROM_TIMEOUT 10 171 #define SCSI_CHANGER_BONUS_TIMEOUT 10 172 #define HITACHI_MODE_DATA_SIZE 12 173 #define MODE_DATA_SIZE 64 174 #define RAW_SECTOR_SIZE 2352 175 #define COOKED_SECTOR_SIZE 2048 176 #define MEDIA_CHANGE_DEFAULT_TIME 4 177 #define CDROM_SRB_LIST_SIZE 4 186 #define MEDIA_CHANGE_TIMEOUT_TIME 300 190 #define PLAY_ACTIVE(DeviceExtension) (((PCDROM_DATA)(DeviceExtension + 1))->PlayActive) 192 #define MSF_TO_LBA(Minutes,Seconds,Frames) \ 193 (ULONG)((60 * 75 * (Minutes)) + (75 * (Seconds)) + ((Frames) - 150)) 195 #define LBA_TO_MSF(Lba,Minutes,Seconds,Frames) \ 197 (Minutes) = (UCHAR)(Lba / (60 * 75)); \ 198 (Seconds) = (UCHAR)((Lba % (60 * 75)) / 75); \ 199 (Frames) = (UCHAR)((Lba % (60 * 75)) % 75); \ 202 #define DEC_TO_BCD(x) (((x / 10) << 4) + (x % 10)) 208 #define XA_USE_6_BYTE 0x01 209 #define XA_USE_10_BYTE 0x02 210 #define XA_USE_READ_CD 0x04 211 #define XA_NOT_SUPPORTED 0x08 213 #define PLEXTOR_CDDA 0x10 214 #define NEC_CDDA 0x20 221 #define CD_DA_SECTOR 1 222 #define YELLOW_MODE1_SECTOR 2 223 #define YELLOW_MODE2_SECTOR 3 224 #define FORM2_MODE1_SECTOR 4 225 #define FORM2_MODE2_SECTOR 5 229 #ifdef ExAllocatePool 230 #undef ExAllocatePool 232 #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'CscS') 440 #pragma alloc_text(PAGE, DriverEntry) 441 #pragma alloc_text(PAGE, ScsiCdRomFindDevices) 442 #pragma alloc_text(PAGE, CreateCdRomDeviceObject) 443 #pragma alloc_text(PAGE, ScanForSpecial) 445 #pragma alloc_text(PAGE, HitachProcessError) 446 #pragma alloc_text(PAGE, CdRomIsPlayActive) 447 #pragma alloc_text(PAGE, ScsiCdRomReadVerification) 448 #pragma alloc_text(INIT, CdRomCheckRegistryForMediaChangeValue) 449 #pragma alloc_text(INIT, IsThisAnAtapiChanger) 450 #pragma alloc_text(INIT, IsThisASanyo) 451 #pragma alloc_text(INIT, IsThisAMultiLunDevice) 452 #pragma alloc_text(INIT, CdRomCreateNamedEvent) 454 #pragma alloc_text(PAGE, FindScsiAdapter) 575 DebugPrint((1,
"FindScsiDevices: ScsiClassGetCapabilities failed\n"));
586 DebugPrint((1,
"FindScsiDevices: ScsiClassGetInquiryData failed\n"));
601 for (scsiBus=0; scsiBus < adapterInfo->
NumberOfBuses; scsiBus++) {
621 DebugPrint((1,
"FindScsiDevices: Vendor string is %.24s\n",
705 sprintf(eventNameBuffer,
"\\Device\\MediaChangeEvent%ld",
727 DeviceExtension->MediaChangeEventHandle =
handle;
780 "ReportToMountMgr: Can't get MountMgr pointers %lx\n",
786 deviceExtension = CdDeviceObject->DeviceExtension;
787 cdLen = deviceExtension->DeviceName.Length;
799 "ReportToMountMgr: Allocation of mountTarget failed\n"));
827 "ReportToMountMgr: Allocation of irp failed\n"));
893 CHAR ntNameBuffer[64];
929 "\\Device\\CdRom%lu",
939 DebugPrint((1,
"CreateCdRomDeviceObjects: Can not create device %s\n",
942 goto CreateCdRomDeviceObjectExit;
955 deviceObject->StackSize = PortDeviceObject->StackSize + 2;
976 deviceExtension->LockCount = 0;
988 deviceExtension->PortDeviceObject = PortDeviceObject;
995 if (PortDeviceObject->AlignmentRequirement >
deviceObject->AlignmentRequirement) {
996 deviceObject->AlignmentRequirement = PortDeviceObject->AlignmentRequirement;
1003 deviceExtension->PortCapabilities = PortCapabilities;
1009 deviceExtension->SrbFlags = 0;
1018 if (senseData ==
NULL) {
1025 goto CreateCdRomDeviceObjectExit;
1032 deviceExtension->SenseData = senseData;
1038 deviceExtension->StartingOffset.LowPart = 0;
1039 deviceExtension->StartingOffset.HighPart = 0;
1047 deviceExtension->PathId = LunInfo->PathId;
1048 deviceExtension->TargetId = LunInfo->TargetId;
1049 deviceExtension->Lun = LunInfo->Lun;
1057 deviceExtension->TimeOutValue = timeOut;
1070 srbListInitialized =
TRUE;
1082 deviceExtension->DiskGeometry =
1085 if (deviceExtension->DiskGeometry ==
NULL) {
1088 goto CreateCdRomDeviceObjectExit;
1110 deviceExtension->MediaChangeNoMedia =
TRUE;
1113 cddata->MediaChangeIrpTimeInUse = 0;
1114 cddata->MediaChangeIrpLost =
FALSE;
1134 bps = deviceExtension->DiskGeometry->Geometry.BytesPerSector;
1139 "CreateCdRomDeviceObjects: Can't read capacity for device %s\n",
1147 deviceExtension->SectorShift = 11;
1148 deviceExtension->PartitionLength.QuadPart = (
LONGLONG)(0x7fffffff);
1157 lastBit = (
ULONG) -1;
1165 deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps;
1166 DebugPrint((2,
"CreateCdRomDeviceObject: Calc'd bps = %x\n", bps));
1172 changerDevice =
FALSE;
1179 if (deviceExtension->Lun > 0) {
1180 changerDevice =
TRUE;
1183 if (!changerDevice) {
1185 deviceExtension->TargetId);
1188 if (!changerDevice) {
1193 if (!changerDevice) {
1212 if (deviceExtension->MediaChangeEvent) {
1219 if (!changerDevice) {
1268 srb->
PathId = deviceExtension->PathId;
1269 srb->
TargetId = deviceExtension->TargetId;
1270 srb->
Lun = deviceExtension->Lun;
1287 cdb->
CDB6GENERIC.LogicalUnitNumber = deviceExtension->Lun;
1308 deviceExtension->MediaChangeEvent =
NULL;
1311 deviceExtension->MediaChangeEvent =
NULL;
1351 goto CreateCdRomDeviceObjectExit;
1462 CreateCdRomDeviceObjectExit:
1473 if (senseData !=
NULL) {
1477 if (deviceExtension->DiskGeometry !=
NULL) {
1482 if (srbListInitialized) {
1506 ULONG transferPages;
1508 ULONG maximumTransferLength = deviceExtension->PortCapabilities->MaximumTransferLength;
1528 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] Volume needs verified\n",
Irp));
1531 if (
Irp->Tail.Overlay.Thread) {
1537 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] Calling UpdateCapacity - " 1538 "ioctl event = %lx\n",
1571 currentIrpStack->
Parameters.Read.ByteOffset.QuadPart += (deviceExtension->StartingOffset.QuadPart);
1597 Irp->IoStatus.Information = 0;
1606 Irp->IoStatus.Information = 0;
1625 Irp->IoStatus.Information = 0;
1642 irp2->UserBuffer =
NULL;
1649 irpStack->
DeviceObject = deviceExtension->DeviceObject;
1657 if (!(nextIrpStack->
Parameters.Others.Argument1)) {
1678 srb->
PathId = deviceExtension->PathId;
1679 srb->
TargetId = deviceExtension->TargetId;
1680 srb->
Lun = deviceExtension->Lun;
1682 srb->
Cdb[1] |= deviceExtension->Lun << 5;
1692 Irp->IoStatus.Information = 0;
1709 if (!irp2->MdlAddress) {
1710 Irp->IoStatus.Information = 0;
1747 srb->
SrbFlags = deviceExtension->SrbFlags;
1781 if ((currentIrpStack->
Parameters.Read.Length > maximumTransferLength) ||
1783 deviceExtension->PortCapabilities->MaximumPhysicalPages)) {
1792 deviceExtension->PortCapabilities->MaximumPhysicalPages - 1;
1794 if(maximumTransferLength > transferPages <<
PAGE_SHIFT) {
1795 maximumTransferLength = transferPages <<
PAGE_SHIFT;
1802 if(maximumTransferLength == 0) {
1830 Irp->IoStatus.Information = 0;
1834 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] bailing with status %lx at line %s\n",
Irp,
Irp->IoStatus.Status, __LINE__));
1840 Irp->IoStatus.Information = 0;
1845 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] bailing with status %lx at line %s\n",
Irp,
Irp->IoStatus.Status, __LINE__));
1860 Irp->IoStatus.Information = 0;
1866 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] bailing with status %lx at line %s\n",
Irp,
Irp->IoStatus.Status, __LINE__));
1878 irp2->UserBuffer =
NULL;
1885 irpStack->
DeviceObject = deviceExtension->DeviceObject;
1893 if (!(nextIrpStack->
Parameters.Others.Argument1)) {
1924 srb->
PathId = deviceExtension->PathId;
1925 srb->
TargetId = deviceExtension->TargetId;
1926 srb->
Lun = deviceExtension->Lun;
1928 srb->
Cdb[1] |= deviceExtension->Lun << 5;
1935 switch (currentIrpStack->
Parameters.DeviceIoControl.IoControlCode) {
1948 ULONG maximumTransferLength;
1949 ULONG transferPages;
1953 ULONG startingSector;
1970 maximumTransferLength = deviceExtension->PortCapabilities->MaximumTransferLength;
1978 if (transferByteCount > maximumTransferLength ||
1979 transferPages > deviceExtension->PortCapabilities->MaximumPhysicalPages) {
1988 Irp->IoStatus.Information = 0;
1999 srb->
SrbFlags = deviceExtension->SrbFlags;
2039 cdb->
CDB10.LogicalUnitNumber = deviceExtension->Lun;
2044 cdb->
CDB10.LogicalBlockByte3 = (
UCHAR) (startingSector & 0xFF);
2045 cdb->
CDB10.LogicalBlockByte2 = (
UCHAR) ((startingSector >> 8) & 0xFF);
2046 cdb->
CDB10.LogicalBlockByte1 = (
UCHAR) ((startingSector >> 16) & 0xFF);
2047 cdb->
CDB10.LogicalBlockByte0 = (
UCHAR) ((startingSector >> 24) & 0xFF);
2057 if (!(nextIrpStack->
Parameters.Others.Argument1)) {
2087 Irp->IoStatus.Information = 0;
2104 if (!irp2->MdlAddress) {
2105 Irp->IoStatus.Information = 0;
2151 srb->
SrbFlags = deviceExtension->SrbFlags;
2187 ULONG startingSector;
2208 srb->
SrbFlags = deviceExtension->SrbFlags;
2228 cdb->
READ_CD.StartingLBA[3] = (
UCHAR) (startingSector & 0xFF);
2229 cdb->
READ_CD.StartingLBA[2] = (
UCHAR) ((startingSector >> 8));
2230 cdb->
READ_CD.StartingLBA[1] = (
UCHAR) ((startingSector >> 16));
2231 cdb->
READ_CD.StartingLBA[0] = (
UCHAR) ((startingSector >> 24));
2241 cdb->
READ_CD.IncludeUserData = 1;
2243 cdb->
READ_CD.IncludeSyncData = 1;
2249 cdb->
READ_CD.IncludeUserData = 1;
2251 cdb->
READ_CD.IncludeSyncData = 1;
2257 cdb->
READ_CD.IncludeUserData = 1;
2259 cdb->
READ_CD.IncludeSyncData = 1;
2263 Irp->IoStatus.Information = 0;
2269 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] bailing with status %lx at line %s\n",
Irp,
Irp->IoStatus.Status, __LINE__));
2278 if (!(nextIrpStack->
Parameters.Others.Argument1)) {
2321 "CdRomStartIo: Get drive capacity\n"));
2327 srb->
SrbFlags = deviceExtension->SrbFlags;
2335 Irp->IoStatus.Information = 0;
2342 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] bailing with status %lx at line %s\n",
Irp,
Irp->IoStatus.Status, __LINE__));
2353 if (!irp2->MdlAddress) {
2354 Irp->IoStatus.Information = 0;
2362 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] bailing with status %lx at line %s\n",
Irp,
Irp->IoStatus.Status, __LINE__));
2395 srb->
SrbFlags = deviceExtension->SrbFlags;
2398 DebugPrint((2,
"ScsiCdRomStartIo: [%lx] Sending CHECK_VERIFY irp %lx\n",
Irp, irp2));
2436 cdb->
READ_TOC.AllocationLength[0] = (
UCHAR) (transferByteCount >> 8);
2437 cdb->
READ_TOC.AllocationLength[1] = (
UCHAR) (transferByteCount & 0xFF);
2451 srb->
SrbFlags = deviceExtension->SrbFlags;
2459 Irp->IoStatus.Information = 0;
2476 if (!irp2->MdlAddress) {
2477 Irp->IoStatus.Information = 0;
2522 srb->
SrbFlags = deviceExtension->SrbFlags;
2533 Irp->AssociatedIrp.SystemBuffer;
2543 Irp->IoStatus.Information = 0;
2560 if (!irp2->MdlAddress) {
2561 Irp->IoStatus.Information = 0;
2613 switch( inputBuffer->
Format ) {
2628 cdb->
SUBCHANNEL.AllocationLength[0] = (
UCHAR) (transferByteCount >> 8);
2629 cdb->
SUBCHANNEL.AllocationLength[1] = (
UCHAR) (transferByteCount & 0xFF);
2631 srb->
SrbFlags = deviceExtension->SrbFlags;
2649 srb->
SrbFlags = deviceExtension->SrbFlags;
2663 srb->
SrbFlags = deviceExtension->SrbFlags;
2673 ULONG logicalBlockAddress;
2675 logicalBlockAddress =
MSF_TO_LBA(inputBuffer->
M, inputBuffer->
S, inputBuffer->
F);
2678 cdb->
SEEK.LogicalBlockAddress[0] = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte3;
2679 cdb->
SEEK.LogicalBlockAddress[1] = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte2;
2680 cdb->
SEEK.LogicalBlockAddress[2] = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte1;
2681 cdb->
SEEK.LogicalBlockAddress[3] = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte0;
2685 srb->
SrbFlags = deviceExtension->SrbFlags;
2703 srb->
SrbFlags = deviceExtension->SrbFlags;
2719 Irp->IoStatus.Information = 0;
2736 if (!irp2->MdlAddress) {
2737 Irp->IoStatus.Information = 0;
2792 srb->
SrbFlags = deviceExtension->SrbFlags;
2807 Irp->IoStatus.Information = 0;
2823 if (!irp2->MdlAddress) {
2824 Irp->IoStatus.Information = 0;
2864 srb->
SrbFlags = deviceExtension->SrbFlags;
2964 if (!deviceExtension->DiskGeometry->Geometry.BytesPerSector) {
2965 deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048;
2968 if ((startingOffset.
QuadPart > deviceExtension->PartitionLength.QuadPart) ||
2969 (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1))) {
2971 DebugPrint((1,
"ScsiCdRomRead: Invalid I/O parameters\n"));
2972 DebugPrint((1,
"\toffset %x:%x, Length %x:%x\n",
2973 startingOffset.
u.HighPart,
2974 startingOffset.
u.LowPart,
2975 deviceExtension->PartitionLength.u.HighPart,
2976 deviceExtension->PartitionLength.u.LowPart));
2977 DebugPrint((1,
"\tbps %x\n", deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3003 PDEVICE_EXTENSION physicalExtension = deviceExtension->PhysicalDevice->DeviceExtension;
3029 "CdRomDeviceControlCompletion: Irp %lx, Srb %lx Real Irp %lx Status %lx\n",
3040 DebugPrint((2,
"CdRomDeviceControlCompletion: Releasing Queue\n"));
3048 irpStack->
Parameters.DeviceIoControl.IoControlCode,
3052 DebugPrint((2,
"CdRomDeviceControlCompletion: IRP will %sbe retried\n",
3053 (retry ?
"" :
"not ")));
3093 if (
Irp->MdlAddress) {
3106 DebugPrint((2,
"CdRomDeviceControlCompletion: [%lx] CdRomUpdateCapacity completed with status %lx\n", realIrp,
status));
3128 DebugPrint((1,
"Retry request %lx - Calling StartIo\n",
Irp));
3136 if (
Irp->MdlAddress) {
3168 switch (realIrpStack->
Parameters.DeviceIoControl.IoControlCode) {
3198 lastBit = (
ULONG) -1;
3206 deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps;
3209 "CdRomDeviceControlCompletion: Calculated bps %#x\n",
3210 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3226 WHICH_BIT(bps, deviceExtension->SectorShift);
3228 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n",
3229 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3231 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n",
3238 deviceExtension->PartitionLength.QuadPart = (
LONGLONG)(lastSector + 1);
3244 deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (
LONGLONG)((lastSector + 1)/(32 * 64));
3246 deviceExtension->PartitionLength.QuadPart =
3247 (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
3255 deviceExtension->DiskGeometry->Geometry.MediaType =
RemovableMedia;
3263 deviceExtension->DiskGeometry->Geometry.MediaType =
FixedMedia;
3270 deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32;
3276 deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64;
3283 &deviceExtension->PartitionLength,
3324 lastBit = (
ULONG) -1;
3332 deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps;
3335 "CdRomDeviceControlCompletion: Calculated bps %#x\n",
3336 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3352 WHICH_BIT(bps, deviceExtension->SectorShift);
3354 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n",
3355 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3357 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n",
3364 deviceExtension->PartitionLength.QuadPart = (
LONGLONG)(lastSector + 1);
3370 deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (
LONGLONG)((lastSector + 1)/(32 * 64));
3372 deviceExtension->PartitionLength.QuadPart =
3373 (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
3381 deviceExtension->DiskGeometry->Geometry.MediaType =
RemovableMedia;
3389 deviceExtension->DiskGeometry->Geometry.MediaType =
FixedMedia;
3396 deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32;
3402 deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64;
3408 geometryEx = realIrp->AssociatedIrp.SystemBuffer;
3410 &deviceExtension->DiskGeometry->Geometry,
3417 geometryEx->
DiskSize = deviceExtension->PartitionLength;
3456 lastBit = (
ULONG) -1;
3464 deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps;
3467 "CdRomDeviceControlCompletion: Calculated bps %#x\n",
3468 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3484 WHICH_BIT(bps, deviceExtension->SectorShift);
3486 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n",
3487 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
3489 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n",
3496 deviceExtension->PartitionLength.QuadPart = (
LONGLONG)(lastSector + 1);
3502 deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (
LONGLONG)((lastSector + 1)/(32 * 64));
3504 deviceExtension->PartitionLength.QuadPart =
3505 (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
3513 deviceExtension->DiskGeometry->Geometry.MediaType =
RemovableMedia;
3521 deviceExtension->DiskGeometry->Geometry.MediaType =
FixedMedia;
3528 deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32;
3534 deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64;
3541 deviceExtension->DiskGeometry,
3555 (realIrpStack->
Parameters.DeviceIoControl.OutputBufferLength)) {
3557 *((
PULONG)realIrp->AssociatedIrp.SystemBuffer) =
3558 physicalExtension->MediaChangeCount;
3564 DebugPrint((2,
"CdRomDeviceControlCompletion: [%lx] completing CHECK_VERIFY buddy irp %lx\n", realIrp,
Irp));
3603 switch( inputBuffer->
Format ) {
3647 if (realIrpStack->
Parameters.DeviceIoControl.OutputBufferLength <
3651 realIrpStack->
Parameters.DeviceIoControl.OutputBufferLength;
3693 ULONG bytesTransferred;
3703 bytesTransferred = (
PCHAR) audioOutput - (
PCHAR) audioControl +
3706 if (audioOutput !=
NULL &&
3711 audioControl->LogicalBlocksPerSecond =
3728 ULONG i,bytesTransferred;
3739 bytesTransferred = (
PCHAR) audioOutput - (
PCHAR) volumeControl +
3742 if (audioOutput !=
NULL &&
3745 for (
i=0;
i<4;
i++) {
3746 volumeControl->PortVolume[
i] =
3792 if (realIrp->PendingReturned) {
3796 if (
Irp->MdlAddress) {
3819 DebugPrint((1,
"CdRomDeviceCompletion - Setting Hard Error on realIrp %lx\n",
3866 "CdRomSetVolumeIntermediateCompletion: Irp %lx, Srb %lx Real Irp\n",
3883 irpStack->
Parameters.DeviceIoControl.IoControlCode,
3912 DebugPrint((1,
"Retry request %lx - Calling StartIo\n",
Irp));
3918 if (
Irp->MdlAddress) {
3952 ULONG i,bytesTransferred,headerLength;
3965 if(audioInput ==
NULL) {
3967 DebugPrint((1,
"Mode Sense Page %d not found\n",
3986 bytesTransferred =
sizeof(
AUDIO_OUTPUT) + headerLength;
4013 for (
i=0;
i<4;
i++) {
4039 srb->
SrbFlags = deviceExtension->SrbFlags;
4068 if (!
Irp->MdlAddress) {
4121 if (
Irp->PendingReturned) {
4125 if (realIrp->PendingReturned) {
4129 if (
Irp->MdlAddress) {
4197 "CdRomSetVolumeIntermediateCompletion: Irp %lx, Srb %lx Real Irp\n",
4214 irpStack->
Parameters.DeviceIoControl.IoControlCode,
4238 DebugPrint((1,
"Retry request %lx - Calling StartIo\n",
Irp));
4244 if (
Irp->MdlAddress) {
4275 ULONG sectorSize, startingSector, transferByteCount;
4309 ULONG maximumTransferLength;
4310 ULONG transferPages;
4318 maximumTransferLength = deviceExtension->PortCapabilities->MaximumTransferLength;
4327 if (transferByteCount > maximumTransferLength ||
4328 transferPages > deviceExtension->PortCapabilities->MaximumPhysicalPages) {
4343 srb->
SrbFlags = deviceExtension->SrbFlags;
4382 cdb->
CDB10.LogicalUnitNumber = deviceExtension->Lun;
4387 cdb->
CDB10.LogicalBlockByte3 = (
UCHAR) (startingSector & 0xFF);
4388 cdb->
CDB10.LogicalBlockByte2 = (
UCHAR) ((startingSector >> 8) & 0xFF);
4389 cdb->
CDB10.LogicalBlockByte1 = (
UCHAR) ((startingSector >> 16) & 0xFF);
4390 cdb->
CDB10.LogicalBlockByte0 = (
UCHAR) ((startingSector >> 24) & 0xFF);
4402 if (!(irpStack->
Parameters.Others.Argument1)) {
4425 ULONG maximumTransferLength = deviceExtension->PortCapabilities->MaximumTransferLength;
4434 if ((realIrpStack->
Parameters.Read.Length > maximumTransferLength) ||
4435 (transferPages > deviceExtension->PortCapabilities->MaximumPhysicalPages)) {
4460 IoCallDriver(deviceExtension->PortDeviceObject, realIrp);
4485 if (
Irp->PendingReturned) {
4489 if (realIrp->PendingReturned) {
4493 if (
Irp->MdlAddress) {
4573 DebugPrint((2,
"ScsiClassIoComplete: IRP %lx, SRB %lx\n",
Irp, srb));
4611 DebugPrint((1,
"CdRomXACompletion: Retry request %lx - Calling StartIo\n",
Irp));
4666 Irp->IoStatus.Information = 0;
4674 if (
Irp->PendingReturned) {
4731 Irp->IoStatus.Information = 0;
4741 ioctlCode = irpStack->
Parameters.DeviceIoControl.IoControlCode;
4742 baseCode = ioctlCode >> 16;
4743 functionCode = (ioctlCode & (~0xffffc003)) >> 2;
4745 DebugPrint((1,
"CdRomDeviceControl: Ioctl Code = %#08lx, Base Code = %#lx," 4746 " Function Code = %#lx\n",
4752 if((functionCode >= 0x200) && (functionCode <= 0x300)) {
4756 DebugPrint((1,
"CdRomDeviceControl: Class Code - new ioctl code is %#08lx\n",
4759 irpStack->
Parameters.DeviceIoControl.IoControlCode = ioctlCode;
4763 switch (ioctlCode) {
4768 ULONG transferBytes;
4779 "CdRomDeviceControl: XA Reads not supported. Flags (%x)\n",
4791 if (rawReadInfo ==
NULL) {
4798 irpStack->
Parameters.DeviceIoControl.Type3InputBuffer = (
PVOID)userData;
4800 if (rawReadInfo ==
NULL) {
4802 DebugPrint((1,
"CdRomDeviceControl: Invalid I/O parameters for XA Read (No extent info\n"));
4812 DebugPrint((1,
"CdRomDeviceControl: Invalid I/O parameters for XA Read (Invalid info buffer\n"));
4824 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength < transferBytes) {
4826 DebugPrint((1,
"CdRomDeviceControl: Invalid I/O parameters for XA Read (Bad buffer size)\n"));
4838 if ((startingOffset.
QuadPart + transferBytes) > deviceExtension->PartitionLength.QuadPart) {
4840 DebugPrint((1,
"CdRomDeviceControl: Invalid I/O parameters for XA Read (Request Out of Bounds)\n"));
4859 DebugPrint((2,
"CdRomDeviceControl: Get drive geometry\n"));
4861 if ( irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
4877 DebugPrint((2,
"CdRomDeviceControl: Get drive geometry ex\n"));
4879 if ( irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
4894 DebugPrint((2,
"CdRomDeviceControl: Get length info\n"));
4896 if ( irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
4934 DebugPrint((2,
"CdRomDeviceControl: Play audio MSF\n"));
4936 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
4960 DebugPrint((2,
"CdRomDeviceControl: Seek audio MSF\n"));
4962 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
4986 DebugPrint((2,
"CdRomDeviceControl: Pause audio\n"));
5002 DebugPrint((2,
"CdRomDeviceControl: Resume audio\n"));
5012 if(irpStack->
Parameters.DeviceIoControl.InputBufferLength <
5016 Irp->IoStatus.Information = 0;
5028 DebugPrint((2,
"CdRomDeviceControl: Get audio control\n"));
5034 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
5042 Irp->IoStatus.Information = 0;
5056 DebugPrint((2,
"CdRomDeviceControl: Get volume control\n"));
5062 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
5070 Irp->IoStatus.Information = 0;
5083 DebugPrint((2,
"CdRomDeviceControl: Set volume control\n"));
5085 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
5109 DebugPrint((2,
"CdRomDeviceControl: Stop audio\n"));
5118 DebugPrint((1,
"CdRomDeviceControl: [%lx] Check Verify\n",
Irp));
5121 if((irpStack->
Parameters.DeviceIoControl.OutputBufferLength) &&
5122 (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
sizeof(
ULONG))) {
5124 DebugPrint((1,
"CdRomDeviceControl: Check Verify: media count " 5125 "buffer too small\n"));
5144 if(!deviceControlEvent) {
5161 *nextStack = *currentStack;
5175 Irp->IoStatus.Information = 0;
5204 DebugPrint((2,
"CdRomDeviceControl: irp %#08lx synchronized\n",
Irp));
5311 DebugPrint((1,
"CdRom ScanForSpecial: Found Hitachi CDR-1750S.\n"));
5329 deviceExtension->TimeOutValue = 20;
5408 "Cdrom.ScanForSpecial: Setting density code on Toshiba failed [%x]\n",