20 #pragma alloc_text(PAGE, ScsiClassGetInquiryData) 21 #pragma alloc_text(PAGE, ScsiClassInitialize) 22 #pragma alloc_text(PAGE, ScsiClassGetCapabilities) 23 #pragma alloc_text(PAGE, ScsiClassSendSrbSynchronous) 24 #pragma alloc_text(PAGE, ScsiClassClaimDevice) 25 #pragma alloc_text(PAGE, ScsiClassSendSrbAsynchronous) 29 #define INQUIRY_DATA_SIZE 2048 30 #define START_UNIT_TIMEOUT 30 37 #define DEFAULT_SECTORS_PER_TRACK 63 38 #define DEFAULT_TRACKS_PER_CYLINDER 255 189 ULONG portNumber = 0;
195 CCHAR deviceNameBuffer[256];
207 DebugPrint((0,
"ScsiClassInitialize: Class driver wrong version\n"));
222 "ScsiClassInitialize: Class device-specific driver missing required entry\n"));
251 sprintf(deviceNameBuffer,
"\\Device\\ScsiPort%lu", portNumber);
253 DebugPrint((2,
"ScsiClassInitialize: Open Port %s\n", deviceNameBuffer));
277 portDeviceObject, portNumber)) {
331 if (deviceExtension->ClassCreateClose) {
377 ULONG maximumTransferLength = deviceExtension->PortCapabilities->MaximumTransferLength;
393 Irp->IoStatus.Information = 0;
404 ASSERT(deviceExtension->ClassReadWriteVerification);
427 if (transferByteCount == 0) {
429 Irp->IoStatus.Information = 0;
435 if (deviceExtension->ClassStartIo) {
458 currentIrpStack->
Parameters.Read.ByteOffset.QuadPart += (deviceExtension->StartingOffset.QuadPart +
459 deviceExtension->DMByteSkew);
473 if (currentIrpStack->
Parameters.Read.Length > maximumTransferLength ||
474 transferPages > deviceExtension->PortCapabilities->MaximumPhysicalPages) {
476 DebugPrint((2,
"ScsiClassReadWrite: Request greater than maximum\n"));
477 DebugPrint((2,
"ScsiClassReadWrite: Maximum is %lx\n",
478 maximumTransferLength));
479 DebugPrint((2,
"ScsiClassReadWrite: Byte count is %lx\n",
483 deviceExtension->PortCapabilities->MaximumPhysicalPages - 1;
485 if (maximumTransferLength > transferPages <<
PAGE_SHIFT ) {
486 maximumTransferLength = transferPages <<
PAGE_SHIFT;
493 if (maximumTransferLength == 0) {
754 if (!readCapacityBuffer) {
790 ((
PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte0 =
793 ((
PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte1 =
796 ((
PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte2 =
799 ((
PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte3 =
822 WHICH_BIT(deviceExtension->DiskGeometry->Geometry.BytesPerSector, deviceExtension->SectorShift);
824 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n",
825 deviceExtension->DiskGeometry->Geometry.BytesPerSector));
827 DebugPrint((2,
"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n",
840 deviceExtension->PartitionLength.QuadPart = (
LONGLONG)(lastSector + 1);
841 deviceExtension->PartitionLength.QuadPart =
842 (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
843 deviceExtension->DiskGeometry->DiskSize.QuadPart = deviceExtension->PartitionLength.QuadPart;
851 deviceExtension->DiskGeometry->Geometry.MediaType =
RemovableMedia;
859 deviceExtension->DiskGeometry->Geometry.MediaType =
FixedMedia;
903 deviceExtension->DiskGeometry->Geometry.BytesPerSector = 512;
904 deviceExtension->SectorShift = 9;
905 deviceExtension->PartitionLength.QuadPart = (
LONGLONG) 0;
906 deviceExtension->DiskGeometry->DiskSize.QuadPart = (
LONGLONG) 0;
914 deviceExtension->DiskGeometry->Geometry.MediaType =
RemovableMedia;
922 deviceExtension->DiskGeometry->Geometry.MediaType =
FixedMedia;
1004 srb->
PathId = deviceExtension->PathId;
1005 srb->
TargetId = deviceExtension->TargetId;
1006 srb->
Lun = deviceExtension->Lun;
1151 srb->
PathId = deviceExtension->PathId;
1152 srb->
TargetId = deviceExtension->TargetId;
1153 srb->
Lun = deviceExtension->Lun;
1277 if (
Irp->MdlAddress !=
NULL) {
1337 ULONG irpCount = (transferByteCount + MaximumBytes - 1) / MaximumBytes;
1341 DebugPrint((2,
"ScsiClassSplitRequest: Requires %d IRPs\n", irpCount));
1342 DebugPrint((2,
"ScsiClassSplitRequest: Original IRP %lx\n",
Irp));
1356 Irp->IoStatus.Information = transferByteCount;
1365 for (
i = 0;
i < irpCount;
i++) {
1376 if (newIrp ==
NULL) {
1378 DebugPrint((1,
"ScsiClassSplitRequest: Can't allocate Irp\n"));
1389 Irp->IoStatus.Information = 0;
1398 DebugPrint((2,
"ScsiClassSplitRequest: New IRP %lx\n", newIrp));
1407 newIrp->MdlAddress =
Irp->MdlAddress;
1420 newIrpStack->
Parameters.Read.ByteOffset = startingOffset;
1435 srb = newIrpStack->
Parameters.Others.Argument1;
1442 newIrp->AssociatedIrp.MasterIrp =
Irp;
1459 IoCallDriver(deviceExtension->PortDeviceObject, newIrp);
1467 transferByteCount -= MaximumBytes;
1469 if (transferByteCount > MaximumBytes) {
1538 DebugPrint((2,
"ScsiClassIoComplete: IRP %lx, SRB %lx\n",
Irp, srb));
1592 ExFreeToNPagedLookasideList(&deviceExtension->SrbLookasideListHead,
1616 Irp->IoStatus.Information = 0;
1624 if (
Irp->PendingReturned) {
1628 if (deviceExtension->ClassStartIo) {
1679 PIRP originalIrp =
Irp->AssociatedIrp.MasterIrp;
1692 DebugPrint((2,
"ScsiClassIoCompleteAssociated: IRP %lx, SRB %lx",
Irp, srb));
1760 ExFreeToNPagedLookasideList(&deviceExtension->SrbLookasideListHead,
1769 DebugPrint((2,
"ScsiClassIoCompleteAssociated: Partial xfer IRP %lx\n",
Irp));
1812 DebugPrint((2,
"ScsiClassIoCompleteAssociated: Partial IRPs left %d\n",
1821 if (irpCount == 0) {
1828 "ScsiClassIoCompleteAssociated: All partial IRPs complete %lx\n",
1838 if (deviceExtension->ClassStartIo) {
1895 ULONG controlType, mjFunction;
1921 Srb->PathId = deviceExtension->PathId;
1922 Srb->TargetId = deviceExtension->TargetId;
1923 Srb->Lun = deviceExtension->Lun;
1933 Srb->Cdb[1] |= deviceExtension->Lun << 5;
1950 "ScsiClassSendSrbSynchronous: Can't allocate request sense buffer\n"));
2002 deviceExtension->DeviceObject,
2010 DebugPrint((1,
"ScsiClassSendSrbSynchronous: Can't allocate Irp\n"));
2033 Srb->ScsiStatus =
Srb->SrbStatus = 0;
2052 irpStack->
Parameters.DeviceIoControl.IoControlCode = controlType;
2186 PDEVICE_EXTENSION physicalExtension = deviceExtension->PhysicalDevice->DeviceExtension;
2190 ULONG badSector = 0;
2208 for (
i = 1;
i < 12;
i++) {
2217 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Error code is %x\n",
2219 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Sense key is %x\n",
2221 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Additional sense code is %x\n",
2223 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Additional sense code qualifier is %x\n",
2234 if (readSector >
Srb->SenseInfoBufferLength) {
2235 readSector =
Srb->SenseInfoBufferLength;
2246 switch (senseBuffer->
SenseKey & 0xf) {
2250 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Device not ready\n"));
2257 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Lun not ready\n"));
2263 DebugPrint((1,
"ScsiClassInterpretSenseInfo:" 2264 " In process of becoming ready\n"));
2269 DebugPrint((1,
"ScsiClassInterpretSenseInfo:" 2270 " Manual intervention required\n"));
2277 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Format in progress\n"));
2285 DebugPrint((1,
"ScsiClassInterpretSenseInfo:" 2286 " Initializing command required\n"));
2308 "ScsiClassInterpretSenseInfo:" 2309 " No Media in device.\n"));
2317 if((deviceExtension->MediaChangeEvent !=
NULL)&&
2318 (!deviceExtension->MediaChangeNoMedia)) {
2319 KeSetEvent(deviceExtension->MediaChangeEvent,
2322 DebugPrint((0,
"ScsiClassInterpretSenseInfo:" 2323 "Detected No Media In Device " 2324 "[irp = 0x%lx]\n",
Srb->OriginalRequest));
2325 deviceExtension->MediaChangeNoMedia =
TRUE;
2335 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Media write protected\n"));
2342 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Bad media\n"));
2353 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Hardware error\n"));
2364 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Illegal SCSI request\n"));
2370 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Illegal command\n"));
2375 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Illegal block address\n"));
2381 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Invalid LUN\n"));
2387 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Music area\n"));
2392 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Data area\n"));
2397 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Volume overflow\n"));
2402 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Invalid CDB\n"));
2431 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Media changed\n"));
2433 if(deviceExtension->MediaChangeEvent !=
NULL) {
2435 KeSetEvent(deviceExtension->MediaChangeEvent,
2438 DebugPrint((0,
"ScsiClassInterpretSenseInfo:" 2439 "New Media Found - Setting MediaChanged event" 2440 " [irp = 0x%lx]\n",
Srb->OriginalRequest));
2441 deviceExtension->MediaChangeNoMedia =
FALSE;
2447 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Bus reset\n"));
2451 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Unit attention\n"));
2480 physicalExtension->MediaChangeCount++;
2482 DebugPrint((2,
"ScsiClassInterpretSenseInfo - Media change " 2483 "count for device %d is %d\n",
2484 physicalExtension->DeviceNumber,
2485 physicalExtension->MediaChangeCount));
2491 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Command aborted\n"));
2497 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Recovered error\n"));
2522 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Incorrect length detected.\n"));
2536 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Incorrect length detected.\n"));
2542 DebugPrint((1,
"ScsiClassInterpretSenseInfo: No specific sense key\n"));
2551 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Unrecognized sense code\n"));
2571 readSector = (readSector << 8) |
Srb->Cdb[
index+2];
2574 index = (((
PCDB)
Srb->Cdb)->CDB10.TransferBlocksMsb << 8) |
2575 ((
PCDB)
Srb->Cdb)->CDB10.TransferBlocksLsb;
2581 if (!(badSector >= readSector && badSector < readSector +
index)) {
2582 badSector = readSector;
2593 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Request sense info not valid. SrbStatus %2x\n",
2615 deviceExtension->ErrorCount++;
2638 deviceExtension->ErrorCount++;
2646 if (RetryCount > 1 ) {
2687 deviceExtension->ErrorCount++;
2700 if (
Srb->ScsiStatus == 0) {
2707 deviceExtension->ErrorCount++;
2737 if (deviceExtension->ErrorCount == 4) {
2748 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Too many errors disabling tagged queuing and synchronous data tranfers.\n"));
2750 }
else if (deviceExtension->ErrorCount == 8) {
2757 DebugPrint((1,
"ScsiClassInterpretSenseInfo: Too many errors disabling disconnects.\n"));
2765 if (deviceExtension->ClassError !=
NULL) {
2783 if (errorLogEntry ==
NULL) {
2803 if (deviceExtension->DiskGeometry !=
NULL) {
2808 deviceExtension->DiskGeometry->Geometry.BytesPerSector);
2822 errorLogEntry->
DumpData[4] =
Srb->SrbStatus << 8 |
Srb->ScsiStatus;
2824 if (senseBuffer !=
NULL) {
2879 ULONG transferByteCount;
2893 transferByteCount = currentIrpStack->
Parameters.Read.Length;
2895 }
else if (
Irp->MdlAddress !=
NULL) {
2905 transferByteCount =
Irp->MdlAddress->ByteCount;
2909 transferByteCount = 0;
2916 Srb->DataTransferLength = transferByteCount;
2922 Srb->SrbStatus =
Srb->ScsiStatus = 0;
3011 ULONG logicalBlockAddress;
3026 srb = ExAllocateFromNPagedLookasideList(&deviceExtension->SrbLookasideListHead);
3046 srb->
PathId = deviceExtension->PathId;
3047 srb->
TargetId = deviceExtension->TargetId;
3048 srb->
Lun = deviceExtension->Lun;
3082 deviceExtension->TimeOutValue;
3109 cdb->
CDB10.LogicalUnitNumber = deviceExtension->Lun;
3110 transferBlocks = (
USHORT)(currentIrpStack->
Parameters.Read.Length >> deviceExtension->SectorShift);
3116 cdb->
CDB10.LogicalBlockByte0 = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte3;
3117 cdb->
CDB10.LogicalBlockByte1 = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte2;
3118 cdb->
CDB10.LogicalBlockByte2 = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte1;
3119 cdb->
CDB10.LogicalBlockByte3 = ((
PFOUR_BYTE)&logicalBlockAddress)->Byte0;
3130 DebugPrint((3,
"ScsiClassBuildRequest: Read Command\n"));
3137 DebugPrint((3,
"ScsiClassBuildRequest: Write Command\n"));
3167 srb->
SrbFlags |= deviceExtension->SrbFlags;
3327 ULONG parameterHeaderLength;
3337 if (
Length < parameterHeaderLength) {
3355 return(ModeSenseBuffer);
3425 Srb->PathId = deviceExtension->PathId;
3426 Srb->TargetId = deviceExtension->TargetId;
3427 Srb->Lun = deviceExtension->Lun;
3436 Srb->Cdb[1] |= deviceExtension->Lun << 5;
3442 Srb->SenseInfoBuffer = deviceExtension->SenseData;
3452 if (
Irp->MdlAddress ==
NULL) {
3505 Srb->ScsiStatus =
Srb->SrbStatus = 0;
3595 ASSERT(deviceExtension->ClassDeviceControl);
3636 ULONG modifiedIoControlCode;
3640 if (irpStack->
Parameters.DeviceIoControl.IoControlCode ==
3646 goto SetStatusAndReturn;
3670 goto SetStatusAndReturn;
3677 scsiPass =
Irp->AssociatedIrp.SystemBuffer;
3678 scsiPass->
PathId = deviceExtension->PathId;
3679 scsiPass->
TargetId = deviceExtension->TargetId;
3680 scsiPass->
Lun = deviceExtension->Lun;
3689 scsiPass->
Cdb[1] |= deviceExtension->Lun << 5;
3696 goto SetStatusAndReturn;
3703 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
3711 Irp->IoStatus.Information = 0;
3714 goto SetStatusAndReturn;
3719 scsiAddress->
PortNumber = deviceExtension->PortNumber;
3720 scsiAddress->
PathId = deviceExtension->PathId;
3721 scsiAddress->
TargetId = deviceExtension->TargetId;
3722 scsiAddress->
Lun = deviceExtension->Lun;
3727 goto SetStatusAndReturn;
3733 Irp->IoStatus.Information = 0;
3737 goto SetStatusAndReturn;
3759 Irp->IoStatus.Information = 0;
3763 goto SetStatusAndReturn;
3783 goto SetStatusAndReturn;
3801 goto SetStatusAndReturn;
3810 Irp->IoStatus.Information = 0;
3814 goto SetStatusAndReturn;
3818 name->NameLength = deviceExtension->DeviceName.Length;
3826 goto SetStatusAndReturn;
3835 goto SetStatusAndReturn;
3845 goto SetStatusAndReturn;
3860 modifiedIoControlCode = (irpStack->
Parameters.DeviceIoControl.IoControlCode
3863 switch (modifiedIoControlCode) {
3870 DebugPrint((1,
"ScsiDeviceIoControl: Check verify\n"));
3877 if(irpStack->
Parameters.DeviceIoControl.OutputBufferLength) {
3884 if(irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
3887 DebugPrint((3,
"ScsiDeviceIoControl: media count " 3888 "buffer too small\n"));
3891 Irp->IoStatus.Information = 0;
3895 goto SetStatusAndReturn;
3906 DebugPrint((2,
"ScsiDeviceIoControl: Check verify wants " 3917 Irp->IoStatus.Information = 0;
3921 goto SetStatusAndReturn;
3924 irp2->Tail.Overlay.Thread =
Irp->Tail.Overlay.Thread;
4002 DebugPrint((3,
"DiskIoControl: Prevent/Allow media removal\n"));
4004 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
4012 Irp->IoStatus.Information = 0;
4016 goto SetStatusAndReturn;
4024 deviceExtension = deviceExtension->PhysicalDevice->DeviceExtension;
4040 "ScsiClassDeviceControl: Lock media, lock count %x on disk %x\n",
4041 deviceExtension->LockCount,
4042 deviceExtension->DeviceNumber));
4050 if (!deviceExtension->LockCount ||
4054 "ScsiClassDeviceControl: Unlock media, lock count %x on disk %x\n",
4055 deviceExtension->LockCount,
4056 deviceExtension->DeviceNumber));
4066 goto SetStatusAndReturn;
4070 "ScsiClassDeviceControl: Unlock media, lock count %x on disk %x\n",
4071 deviceExtension->LockCount,
4072 deviceExtension->DeviceNumber));
4190 DebugPrint((3,
"CdRomDeviceControl: Load media\n"));
4220 DebugPrint((3,
"CdRomDeviceControl: Find devices\n"));
4233 DebugPrint((3,
"ScsiIoDeviceControl: Unsupported device IOCTL\n"));
4295 if (deviceExtension->ClassShutdownFlush) {
4323 ULONG scsiBus,deviceCount = 0;
4328 for (scsiBus=0; scsiBus < (
ULONG)AdapterInformation->NumberOfBuses; scsiBus++) {
4334 lunInfo = (
PVOID) (
buffer + AdapterInformation->BusData[scsiBus].InquiryDataOffset);
4340 while (AdapterInformation->BusData[scsiBus].InquiryDataOffset) {
4409 "ScsiClassCreateDeviceObject: Create device object %s\n",
4422 "CreateDiskDeviceObjects: Cannot convert string %s\n",
4441 "CreateDiskDeviceObjects: Can not create device object %s\n",
4455 deviceExtension->ClassReadWriteVerification =
InitializationData->ClassReadWriteVerification;
4462 deviceExtension->MediaChangeCount = 0;
4476 deviceExtension->DeviceName = ntUnicodeString;
4530 if (NewPortDeviceObject !=
NULL) {
4531 *NewPortDeviceObject =
NULL;
4550 srb.
PathId = LunInfo->PathId;
4552 srb.
Lun = LunInfo->Lun;
4580 DebugPrint((1,
"ScsiClassClaimDevice: Can't allocate Irp\n"));
4646 if (NewPortDeviceObject !=
NULL) {
4702 srb->
PathId = deviceExtension->PathId;
4703 srb->
TargetId = deviceExtension->TargetId;
4704 srb->
Lun = deviceExtension->Lun;
4713 srb->
Cdb[1] |= deviceExtension->Lun << 5;
4768 if (
Irp->PendingReturned) {
4773 return Irp->IoStatus.Status;
4880 parameters[0].
Name =
L"TimeOutValue";
4900 "ScsiClassQueryTimeOutRegistryValue: Timeout value %d\n",
4943 deviceExtension->PhysicalDevice->DeviceExtension;
4949 originalIrp = irpStack->
Parameters.Others.Argument1;
4955 *((
PULONG) (originalIrp->AssociatedIrp.SystemBuffer)) =
4956 physicalExtension->MediaChangeCount;
4958 DebugPrint((2,
"ScsiClassInterpretSenseInfo - Media change count for" 4959 "device %d is %d\n",
4960 physicalExtension->DeviceNumber,
4961 physicalExtension->MediaChangeCount));
#define IOCTL_SCSI_EXECUTE_OUT
#define DO_DEVICE_INITIALIZING
#define KeGetCurrentIrql()
#define STATUS_REVISION_MISMATCH
#define SRB_STATUS_INVALID_REQUEST
#define SRB_FLAGS_DISABLE_AUTOSENSE
#define SRB_STATUS_BUS_RESET
#define SCSIOP_RESERVE_UNIT
#define SCSI_SENSEQ_FORMAT_IN_PROGRESS
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
return STATUS_NOT_SUPPORTED
NTSTATUS NTAPI ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define STATUS_NO_MEDIA_IN_DEVICE
#define KeRaiseIrql(irql, oldIrql)
#define IOCTL_DISK_EJECT_MEDIA
NTSTATUS NTAPI ScsiClassDeviceControlDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_INSUFFICIENT_RESOURCES
#define KeLowerIrql(oldIrql)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IOCTL_SCSI_GET_ADDRESS
_In_ size_t _In_ UCHAR PageMode
_IRQL_requires_same_ _In_opt_ PVOID Argument1
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define IRP_MJ_FLUSH_BUFFERS
struct _MODE_DISCONNECT_PAGE * PMODE_DISCONNECT_PAGE
struct _CDB::_MEDIA_REMOVAL MEDIA_REMOVAL
#define STATUS_DATA_OVERRUN
NTSTATUS NTAPI ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject, OUT PSCSI_ADAPTER_BUS_INFO *ConfigInfo)
#define SCSIOP_RELEASE_UNIT
#define STATUS_MORE_PROCESSING_REQUIRED
#define MmGetMdlVirtualAddress(_Mdl)
#define SRB_STATUS_AUTOSENSE_VALID
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define SCSIOP_MODE_SENSE
#define UNREFERENCED_PARAMETER(P)
#define STATUS_INVALID_PARAMETER
GLsizei const GLchar ** path
NTSTATUS NTAPI ScsiClassCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension, IN ULONG NumberElements)
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
#define IoIsErrorUserInduced(Status)
#define SRB_STATUS_REQUEST_FLUSHED
#define IOCTL_DISK_CHECK_VERIFY
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
#define SCSIOP_TEST_UNIT_READY
#define IOCTL_STORAGE_RESET_DEVICE
ULONG NTAPI ScsiClassInitialize(IN PVOID Argument1, IN PVOID Argument2, IN PCLASS_INIT_DATA InitializationData)
#define SCSI_ADSENSE_MUSIC_AREA
#define SCSI_ADSENSE_DATA_AREA
#define SRB_STATUS_COMMAND_TIMEOUT
#define STATUS_INVALID_DEVICE_REQUEST
VOID NTAPI RetryRequest(PDEVICE_OBJECT DeviceObject, PIRP Irp, PSCSI_REQUEST_BLOCK Srb, BOOLEAN Associated)
NTSTATUS NTAPI ScsiClassAsynchronousCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context)
#define SRB_FUNCTION_FLUSH_QUEUE
#define SRB_STATUS_NO_DEVICE
#define SRB_STATUS_PHASE_SEQUENCE_FAILURE
ULONG LogicalBlockAddress
#define SRB_FUNCTION_RELEASE_QUEUE
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
VOID NTAPI ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG MaximumBytes)
#define SRB_FUNCTION_CLAIM_DEVICE
#define SCSI_ADSENSE_LUN_NOT_READY
ULONG NextInquiryDataOffset
struct _SCSI_REQUEST_BLOCK * NextSrb
PDEVICE_OBJECT PhysicalDeviceObject
struct _CDB::_CDB10 CDB10
#define SRB_FLAGS_DATA_IN
NTSTATUS NTAPI ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define STATUS_VERIFY_REQUIRED
NTSTATUS NTAPI ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
#define SCSI_SENSE_NOT_READY
#define SRB_STATUS_INVALID_TARGET_ID
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
NTSTATUS NTAPI ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject, IN PSCSI_INQUIRY_DATA LunInfo, IN BOOLEAN Release, OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL)
#define SRB_STATUS(Status)
NTSTATUS NTAPI ScsiClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define STATUS_INVALID_BLOCK_LENGTH
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
#define SENSE_BUFFER_SIZE
_In_ size_t _In_ UCHAR _In_ BOOLEAN Use6Byte
LARGE_INTEGER DeviceOffset
#define STATUS_NONEXISTENT_SECTOR
#define STATUS_BUFFER_TOO_SMALL
#define SCSI_ADSENSE_VOLUME_OVERFLOW
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define IOCTL_DISK_FIND_NEW_DEVICES
#define STATUS_IO_DEVICE_ERROR
#define sprintf(buf, format,...)
NTSTATUS NTAPI ClassIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define SCSI_SENSE_MEDIUM_ERROR
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
#define SCSI_ADSENSE_REC_DATA_NOECC
#define IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
NTSTATUS NTAPI ScsiClassCheckVerifyComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define IO_DISK_INCREMENT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define SRB_STATUS_PARITY_ERROR
#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED
VOID NTAPI ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
PVOID NTAPI ScsiClassFindModePage(IN PCHAR ModeSenseBuffer, IN ULONG Length, IN UCHAR PageMode, IN BOOLEAN Use6Byte)
#define FILE_REMOVABLE_MEDIA
#define DEFAULT_SECTORS_PER_TRACK
NTSTATUS NTAPI KeDelayExecutionThread(IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval OPTIONAL)
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE
struct _MOUNTDEV_NAME MOUNTDEV_NAME
VOID NTAPI IoStartPacket(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PULONG Key, IN PDRIVER_CANCEL CancelFunction)
#define SRB_FUNCTION_RELEASE_DEVICE
_In_z_ PCCHAR ObjectNameBuffer
#define SRB_STATUS_NO_HBA
#define SRB_STATUS_ABORTED
NTSTATUS NTAPI ClassCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define IoCompleteRequest
IN PSCSI_REQUEST_BLOCK IN OUT NTSTATUS IN OUT BOOLEAN * Retry
#define SL_OVERRIDE_VERIFY_VOLUME
#define STATUS_MEDIA_WRITE_PROTECTED
struct _MODE_PARAMETER_HEADER10 MODE_PARAMETER_HEADER10
NTSTATUS NTAPI ObReferenceObjectByPointer(IN PVOID Object, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode)
#define RTL_REGISTRY_OPTIONAL
_In_ ULONG _In_ UCHAR PageCode
struct _CDB::_START_STOP START_STOP
#define DEV_SAFE_START_UNIT
_In_ UCHAR _Out_opt_ PUCHAR _Out_opt_ PUCHAR _Out_opt_ PUCHAR AdditionalSenseCodeQualifier
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
NTSTATUS NTAPI ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, IN PCCHAR ObjectNameBuffer, IN OPTIONAL PDEVICE_OBJECT PhysicalDeviceObject, IN OUT PDEVICE_OBJECT *DeviceObject, IN PCLASS_INIT_DATA InitializationData)
struct _CDB::_MODE_SENSE MODE_SENSE
#define STATUS_DEVICE_NOT_CONNECTED
#define INQUIRY_DATA_SIZE
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
UCHAR AdditionalSenseCodeQualifier
struct _MOUNTDEV_UNIQUE_ID MOUNTDEV_UNIQUE_ID
#define SCSI_ADSENSE_SEEK_ERROR
#define SCSI_ADSENSE_ILLEGAL_BLOCK
VOID NTAPI ExInitializeNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside, IN PALLOCATE_FUNCTION Allocate OPTIONAL, IN PFREE_FUNCTION Free OPTIONAL, IN ULONG Flags, IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth)
ULONG NTAPI ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject, IN PCHAR ModeSenseBuffer, IN ULONG Length, IN UCHAR PageMode)
#define SCSI_SENSEQ_BECOMING_READY
#define NT_SUCCESS(StatCode)
#define STATUS_NO_SUCH_DEVICE
#define ARGUMENT_PRESENT(ArgumentPointer)
#define IRP_MN_START_DEVICE
#define ObDereferenceObject
PFIXED_SENSE_DATA senseInfoBuffer
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
#define SCSI_ADSENSE_REC_DATA_ECC
PIRP NTAPI IoBuildAsynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PIO_STATUS_BLOCK IoStatusBlock)
PDEVICE_OBJECT DeviceObject
#define SCSISTAT_RESERVATION_CONFLICT
_In_opt_ PIRP _In_ PSCSI_REQUEST_BLOCK _In_ UCHAR MajorFunctionCode
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define SRB_STATUS_DATA_OVERRUN
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
VOID NTAPI IoFreeMdl(PMDL Mdl)
NTSTATUS NTAPI ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
NTSYSAPI LONGLONG WINAPI RtlExtendedIntegerMultiply(LONGLONG, INT)
#define FILE_READ_ATTRIBUTES
#define STATUS_UNSUCCESSFUL
#define SCSI_SENSE_HARDWARE_ERROR
#define SRB_FLAGS_DISABLE_DISCONNECT
#define SRB_FLAGS_NO_DATA_TRANSFER
#define SRB_STATUS_QUEUE_FROZEN
#define InterlockedDecrement
_In_ PVOID _In_ PCLASS_INIT_DATA InitializationData
#define ExAllocatePool(type, size)
#define SCSIOP_MEDIUM_REMOVAL
#define SCSI_ADSENSE_BUS_RESET
#define SRB_STATUS_SELECTION_TIMEOUT
ULONG NTAPI ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData, IN PSCSI_ADAPTER_BUS_INFO AdapterInformation)
#define SCSI_SENSE_RECOVERED_ERROR
#define SCSI_SENSE_ABORTED_COMMAND
#define RTL_REGISTRY_ABSOLUTE
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
BOOLEAN NTAPI ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject, IN PSCSI_REQUEST_BLOCK Srb, IN UCHAR MajorFunctionCode, IN ULONG IoDeviceCode, IN ULONG RetryCount, OUT NTSTATUS *Status)
#define SCSI_SENSE_NO_SENSE
#define SRB_STATUS_INVALID_LUN
MxDeviceObject deviceObject
#define IOCTL_SCSI_EXECUTE_IN
ULONG NTAPI DebugPrint(IN PSTRING DebugString, IN ULONG ComponentId, IN ULONG Level)
NTSYSAPI VOID NTAPI RtlInitString(PSTRING DestinationString, PCSZ SourceString)
#define MDL_PARTIAL_HAS_BEEN_MAPPED
_In_ PSCSI_REQUEST_BLOCK _In_opt_ PVOID _In_ ULONG _In_ BOOLEAN WriteToDevice
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
#define IOCTL_SCSI_EXECUTE_NONE
#define IOCTL_SCSI_PASS_THROUGH
#define Int64ShrlMod32(a, b)
#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED
NTSTATUS NTAPI ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject, OUT PIO_SCSI_CAPABILITIES *PortCapabilities)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
UCHAR SenseInfoBufferLength
VOID NTAPI StartUnit(IN PDEVICE_OBJECT DeviceObject)
_In_ UCHAR _Out_opt_ PUCHAR _Out_opt_ PUCHAR AdditionalSenseCode
NTSTATUS NTAPI ScsiClassSendSrbAsynchronous(PDEVICE_OBJECT DeviceObject, PSCSI_REQUEST_BLOCK Srb, PIRP Irp, PVOID BufferAddress, ULONG BufferLength, BOOLEAN WriteToDevice)
#define KeInitializeEvent(pEvt, foo, foo2)
#define IOCTL_SCSI_GET_INQUIRY_DATA
#define InterlockedIncrement
#define STATUS_BUFFER_OVERFLOW
#define IOCTL_SCSI_PASS_THROUGH_DIRECT
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define IOCTL_DISK_LOAD_MEDIA
#define IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
#define SRB_STATUS_TIMEOUT
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
#define START_UNIT_TIMEOUT
_In_ PIO_STACK_LOCATION IrpSp
struct _CDB::_CDB6GENERIC CDB6GENERIC
#define STATUS_DEVICE_BUSY
#define FIELD_OFFSET(t, f)
#define SRB_SIMPLE_TAG_REQUEST
#define SCSI_REQUEST_BLOCK_SIZE
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define SRB_FLAGS_DATA_OUT
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
#define STATUS_IO_TIMEOUT
#define SRB_FLAGS_ADAPTER_CACHE_ENABLE
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
#define SCSIOP_READ_CAPACITY
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
_In_ ULONG NumberElements
VOID NTAPI ScsiClassBuildRequest(PDEVICE_OBJECT DeviceObject, PIRP Irp)
struct _IO_ERROR_LOG_PACKET * PIO_ERROR_LOG_PACKET
#define IOCTL_SCSI_GET_CAPABILITIES
struct tagContext Context
#define SCSI_ADSENSE_INVALID_LUN
VOID NTAPI IoFreeIrp(IN PIRP Irp)
struct _SCSI_ADDRESS SCSI_ADDRESS
#define SRB_FUNCTION_EXECUTE_SCSI
#define SCSI_ADSENSE_TRACK_ERROR
NTSTATUS NTAPI ScsiClassPlugPlay(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
#define SRB_STATUS_UNEXPECTED_BUS_FREE
#define RtlZeroMemory(Destination, Length)
#define SCSI_SENSE_DATA_PROTECT
UCHAR AdditionalSenseLength
#define SRB_STATUS_SUCCESS
NTSTATUS NTAPI ScsiClassDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define RtlCopyMemory(Destination, Source, Length)
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
#define SRB_STATUS_INVALID_PATH_ID
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
#define IRP_MN_SCSI_CLASS
#define IOCTL_DISK_MEDIA_REMOVAL
IN PSCSI_REQUEST_BLOCK Srb
#define IOCTL_DISK_RESERVE
UCHAR AdditionalSenseCode
#define SCSI_SENSE_ILLEGAL_REQUEST
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define SCSI_ADSENSE_ILLEGAL_COMMAND