23 ULONG InquiryDataSize;
30 DPRINT(
"SpiGetInquiryData() called\n");
37 BusCount = DeviceExtension->NumberOfBuses;
45 Length += InquiryDataSize * DeviceExtension->TotalLUCount;
68 for (
UINT8 pathId = 0; pathId < DeviceExtension->NumberOfBuses; pathId++)
76 BusData->
InitiatorBusId = DeviceExtension->Buses[pathId].BusIdentifier;
86 lunEntry = lunEntry->
Flink)
96 InquiryData->
Lun = lunExt->
Lun;
130 UINT32 LastCharacterPosition = 0;
138 LastCharacterPosition =
Index;
143 return LastCharacterPosition + 1;
202 + FieldLengthRevision
227 deviceDescriptor->DeviceType = inquiryData->
DeviceType;
230 deviceDescriptor->CommandQueueing = inquiryData->
CommandQueue;
232 deviceDescriptor->VendorIdOffset =
234 deviceDescriptor->ProductIdOffset =
235 deviceDescriptor->VendorIdOffset + FieldLengthVendor + 1;
236 deviceDescriptor->ProductRevisionOffset =
237 deviceDescriptor->ProductIdOffset + FieldLengthProduct + 1;
238 deviceDescriptor->SerialNumberOffset = 0;
239 deviceDescriptor->RawPropertiesLength =
240 FieldLengthVendor + FieldLengthProduct + FieldLengthRevision + 3;
246 Buffer[FieldLengthVendor] =
'\0';
247 Buffer += FieldLengthVendor + 1;
250 Buffer[FieldLengthProduct] =
'\0';
251 Buffer += FieldLengthProduct + 1;
254 Buffer[FieldLengthRevision] =
'\0';
255 Buffer += FieldLengthRevision + 1;
258 (
LPCSTR)((
ULONG_PTR)deviceDescriptor + deviceDescriptor->VendorIdOffset));
260 (
LPCSTR)((
ULONG_PTR)deviceDescriptor + deviceDescriptor->ProductIdOffset));
262 (
LPCSTR)((
ULONG_PTR)deviceDescriptor + deviceDescriptor->ProductRevisionOffset));
331 ASSERT(portExt->Common.IsFDO);
333 spt =
Irp->AssociatedIrp.SystemBuffer;
353 ASSERT(portExt->Common.IsFDO);
419 .AcceleratedTransfer =
TRUE,
421 .BusMajorVersion = 2,
465 DPRINT(
"ScsiPortDeviceControl()\n");
467 Irp->IoStatus.Information = 0;
476 DPRINT(
" IOCTL_STORAGE_QUERY_PROPERTY\n");
491 DPRINT(
" IOCTL_SCSI_GET_ADDRESS\n");
510 address->PortNumber = portExt->PortNumber;
521 DPRINT(
" IOCTL_SCSI_GET_DUMP_POINTERS\n");
545 DPRINT(
" IOCTL_SCSI_GET_CAPABILITIES\n");
571 DPRINT(
" IOCTL_SCSI_GET_INQUIRY_DATA\n");
584 DPRINT1(
"IOCTL_SCSI_MINIPORT unimplemented!\n");
591 DPRINT(
" IOCTL_SCSI_PASS_THROUGH%s\n",
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define INQUIRYDATABUFFERSIZE
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
#define STATUS_NOT_SUPPORTED
#define STATUS_NOT_IMPLEMENTED
static NTSTATUS SpiGetInquiryData(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, _In_ PIRP Irp)
static NTSTATUS FdoHandleQueryProperty(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
static UINT32 GetFieldLength(_In_ PUCHAR Name, _In_ UINT32 MaxLength)
static NTSTATUS FdoHandleScsiPassthrough(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
static NTSTATUS PdoHandleScsiPassthrough(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
static NTSTATUS PdoHandleQueryProperty(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
NTSTATUS NTAPI ScsiPortDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
#define KeGetCurrentIrql()
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IOCTL_STORAGE_QUERY_PROPERTY
* PSTORAGE_DESCRIPTOR_HEADER
STORAGE_DESCRIPTOR_HEADER
* PSTORAGE_DEVICE_DESCRIPTOR
@ StorageDeviceIdProperty
STORAGE_DEVICE_DESCRIPTOR
#define IoSkipCurrentIrpStackLocation(Irp)
#define IoCompleteRequest
#define STATUS_INVALID_PARAMETER_2
#define STATUS_INVALID_PARAMETER_1
FORCEINLINE BOOLEAN VerifyIrpInBufferSize(_In_ PIRP Irp, _In_ SIZE_T Size)
FORCEINLINE BOOLEAN VerifyIrpOutBufferSize(_In_ PIRP Irp, _In_ SIZE_T Size)
#define IOCTL_SCSI_GET_DUMP_POINTERS
#define IOCTL_SCSI_PASS_THROUGH
#define IOCTL_SCSI_GET_ADDRESS
#define IOCTL_SCSI_GET_CAPABILITIES
struct _SCSI_ADAPTER_BUS_INFO SCSI_ADAPTER_BUS_INFO
#define IOCTL_SCSI_PASS_THROUGH_DIRECT
#define IOCTL_SCSI_MINIPORT
struct _SCSI_INQUIRY_DATA * PSCSI_INQUIRY_DATA
struct _SCSI_BUS_DATA SCSI_BUS_DATA
struct _SCSI_ADDRESS SCSI_ADDRESS
#define IOCTL_SCSI_GET_INQUIRY_DATA
struct _IO_SCSI_CAPABILITIES IO_SCSI_CAPABILITIES
struct _SCSI_ADAPTER_BUS_INFO * PSCSI_ADAPTER_BUS_INFO
struct _DUMP_POINTERS DUMP_POINTERS
struct _STORAGE_ADAPTER_DESCRIPTOR_WIN8 STORAGE_ADAPTER_DESCRIPTOR_WIN8
#define IOCTL_ATA_PASS_THROUGH_DIRECT
#define IOCTL_ATA_PASS_THROUGH
#define STATUS_BUFFER_TOO_SMALL
NTSTATUS SptiHandleScsiPassthru(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _In_ ULONG MaximumTransferLength, _In_ ULONG MaximumPhysicalPages)
Handler for the IOCTL_SCSI_PASS_THROUGH and IOCTL_SCSI_PASS_THROUGH_DIRECT requests.
PSCSI_PORT_LUN_EXTENSION GetLunByPath(_In_ PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, _In_ UCHAR PathId, _In_ UCHAR TargetId, _In_ UCHAR Lun)
IO_SCSI_CAPABILITIES PortCapabilities
UCHAR ProductRevisionLevel[4]
ULONG MaximumTransferLength
ULONG MaximumPhysicalPages
struct _IO_STACK_LOCATION::@1701::@1702 DeviceIoControl
union _IO_STACK_LOCATION::@1701 Parameters
struct _LIST_ENTRY * Flink
UCHAR NumberOfLogicalUnits
ULONG NextInquiryDataOffset
PDEVICE_OBJECT LowerDevice
PDEVICE_OBJECT DeviceObject
SCSI_PORT_COMMON_EXTENSION Common
STORAGE_QUERY_TYPE QueryType
STORAGE_PROPERTY_ID PropertyId
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_NO_SUCH_DEVICE
#define ALIGN_UP(size, type)
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_In_ UCHAR _In_ UCHAR MinorFunction
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack