14#define AtaVerifyInBuffer(IoStack, Length) \
15 ((IoStack)->Parameters.DeviceIoControl.InputBufferLength >= (Length))
17#define AtaVerifyOutBuffer(IoStack, Length) \
18 ((IoStack)->Parameters.DeviceIoControl.OutputBufferLength >= (Length))
72 Irp->IoStatus.Information =
sizeof(*DescriptorHeader);
126 DevExt->FriendlyName,
132 DevExt->RevisionNumber,
138 DevExt->SerialNumber,
153 ULONG LogicalSectorsPerPhysicalSector, Dummy;
164 AccessAlignmentDescriptor =
Irp->AssociatedIrp.SystemBuffer;
165 AccessAlignmentDescriptor->Version =
sizeof(*AccessAlignmentDescriptor);
166 AccessAlignmentDescriptor->Size =
sizeof(*AccessAlignmentDescriptor);
167 AccessAlignmentDescriptor->BytesPerCacheLine = 0;
168 AccessAlignmentDescriptor->BytesOffsetForCacheAlignment = 0;
169 AccessAlignmentDescriptor->BytesPerLogicalSector = DevExt->Device.SectorSize;
171 LogicalSectorsPerPhysicalSector =
174 AccessAlignmentDescriptor->BytesPerPhysicalSector =
175 DevExt->Device.SectorSize * LogicalSectorsPerPhysicalSector;
177 AccessAlignmentDescriptor->BytesOffsetForSectorAlignment =
180 Irp->IoStatus.Information =
sizeof(*AccessAlignmentDescriptor);
207 PenaltyDescriptor =
Irp->AssociatedIrp.SystemBuffer;
208 PenaltyDescriptor->
Version =
sizeof(*PenaltyDescriptor);
209 PenaltyDescriptor->
Size =
sizeof(*PenaltyDescriptor);
212 Irp->IoStatus.Information =
sizeof(*PenaltyDescriptor);
234 TrimDescriptor =
Irp->AssociatedIrp.SystemBuffer;
235 TrimDescriptor->
Version =
sizeof(*TrimDescriptor);
236 TrimDescriptor->
Size =
sizeof(*TrimDescriptor);
239 Irp->IoStatus.Information =
sizeof(*TrimDescriptor);
260 ERR(
"Buffer too small\n");
264 PropertyQuery =
Irp->AssociatedIrp.SystemBuffer;
284 *ForwardToFdo =
TRUE;
288 *ForwardToFdo =
FALSE;
309 ERR(
"Buffer too small\n");
314 AtaScsiAddress = DevExt->Device.AtaScsiAddress;
316 ScsiAddress =
Irp->AssociatedIrp.SystemBuffer;
317 ScsiAddress->
Length =
sizeof(*ScsiAddress);
321 ScsiAddress->
Lun = AtaScsiAddress.
Lun;
323 Irp->IoStatus.Information =
sizeof(*ScsiAddress);
370 Srb->
TargetId = DevExt->Device.AtaScsiAddress.TargetId;
371 Srb->
Lun = DevExt->Device.AtaScsiAddress.Lun;
372 Srb->
PathId = DevExt->Device.AtaScsiAddress.PathId;
408 return Irp->IoStatus.Status;
428 ERR(
"Buffer too small\n");
432 SrbControl =
Irp->AssociatedIrp.SystemBuffer;
442 ERR(
"Too large buffer 0x%lx\n", SrbControl->
Length);
446 CmdBufferSize = IoStack->Parameters.DeviceIoControl.InputBufferLength;
447 CmdBufferSize =
max(CmdBufferSize, IoStack->Parameters.DeviceIoControl.OutputBufferLength);
450 ERR(
"Cmd buffer too small\n");
494 if ((IoStack->MinorFunction == 0) && DevExt->DeviceClaimed)
518 Irp->IoStatus.Information = 0;
597 AdapterDescriptor =
Irp->AssociatedIrp.SystemBuffer;
605 RtlZeroMemory(AdapterDescriptor,
sizeof(*AdapterDescriptor));
607 AdapterDescriptor->
Version =
sizeof(*AdapterDescriptor);
608 AdapterDescriptor->
Size =
sizeof(*AdapterDescriptor);
611 AdapterDescriptor->
AlignmentMask = ChanExt->Common.Self->AlignmentRequirement;
622#if (NTDDI_VERSION >= NTDDI_WIN8)
627 Irp->IoStatus.Information =
sizeof(*AdapterDescriptor);
647 ERR(
"Buffer too small\n");
651 PropertyQuery =
Irp->AssociatedIrp.SystemBuffer;
681 ERR(
"Buffer too small\n");
687 Capabilities->MaximumTransferLength = ChanExt->PortData.MaximumTransferLength;
688 Capabilities->MaximumPhysicalPages = ChanExt->PortData.MaximumPhysicalPages;
690 Capabilities->AlignmentMask = ChanExt->Common.Self->AlignmentRequirement;
695 Irp->IoStatus.Information =
sizeof(*Capabilities);
729 TotalSize =
sizeof(*ScsiAdapterBusInfo) +
EntrySize * PdoCount;
730 TRACE(
"Total size %lu\n", TotalSize);
735 Irp->IoStatus.Information = TotalSize;
737 ScsiAdapterBusInfo =
Irp->AssociatedIrp.SystemBuffer;
759 ScsiInquiryData->
Lun = AtaScsiAddress.
Lun;
778 if (++ScsiAdapterBusInfo->BusData[0].NumberOfLogicalUnits >= PdoCount)
839 ERR(
"Buffer too small\n");
843 Spt =
Irp->AssociatedIrp.SystemBuffer;
870 Irp->IoStatus.Information = 0;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PORT_FLAG_PIO_ONLY
#define PORT_FLAG_IS_AHCI
FORCEINLINE ATA_SCSI_ADDRESS AtaMarshallScsiAddress(_In_ ULONG PathId, _In_ ULONG TargetId, _In_ ULONG Lun)
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindNextDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PATA_SCSI_ADDRESS AtaScsiAddress, _In_ BOOLEAN SearchRemoveDev, _In_ PVOID ReferenceTag)
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress, _In_ PVOID ReferenceTag)
_In_ PSCSI_REQUEST_BLOCK Srb
struct _INQUIRYDATA * PINQUIRYDATA
#define INQUIRYDATABUFFERSIZE
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
#define STATUS_NOT_SUPPORTED
#define NT_SUCCESS(StatCode)
_ACRTIMP size_t __cdecl strlen(const char *)
static const WCHAR Cleanup[]
static NTSTATUS IncursSeekPenalty(_In_ USHORT MediumRotationRate, _In_ PBOOLEAN IncursSeekPenalty)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaFdoHandleScsiMiniport(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaPdoHandleScsiPassthrough(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaPdoHandleGetScsiAddress(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaPdoHandleAtaPassthrough(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp)
static NTSTATUS AtaPdoQueryStorageAccessAlignmentProperty(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaPdoHandleStorageManageDataSetAttributes(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaFdoHandleStorageQueryProperty(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static NTSTATUS AtaFdoQueryStorageAdapterProperty(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp)
NTSTATUS NTAPI AtaDispatchDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
static NTSTATUS AtaPdoQueryStorageDeviceTrimProperty(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaFdoHandleGetScsiInquiryData(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static NTSTATUS AtaPdoSendHbaControl(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PSRB_IO_CONTROL SrbControl, _In_ ULONG BufferSize)
#define AtaVerifyOutBuffer(IoStack, Length)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaPdoHandleScsiMiniport(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static NTSTATUS AtaPdoQueryStorageDeviceSeekPenaltyProperty(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
static NTSTATUS AtaPdoQueryStorageDeviceProperty(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaFdoHandleGetScsiCapabilities(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
#define AtaVerifyInBuffer(IoStack, Length)
static NTSTATUS AtaFdoDeviceControl(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PIRP Irp)
static NTSTATUS AtaPdoDeviceControl(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp)
static BOOLEAN AtaCheckPropertyQuery(_Inout_ PIRP Irp, _In_ ULONG DescriptorSize, _Out_ NTSTATUS *Status)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaFdoHandleScsiPassthrough(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
static DECLSPEC_NOINLINE_FROM_NOT_PAGED NTSTATUS AtaPdoHandleStorageQueryProperty(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack, _Out_ PBOOLEAN ForwardToFdo)
#define SRB_FUNCTION_IO_CONTROL
#define SRB_FLAGS_DATA_IN
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
_Must_inspect_result_ typedef _Out_ PHIDP_CAPS Capabilities
FORCEINLINE ULONG AtaDevLogicalSectorsPerPhysicalSector(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PULONG Exponent)
FORCEINLINE BOOLEAN AtaDevHasTrimFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsRotatingDevice(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsSsd(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevLogicalSectorAlignment(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define RtlEqualMemory(dst, src, len)
#define ExFreePoolWithTag(_P, _T)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define IoSkipCurrentIrpStackLocation(Irp)
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
#define IoCompleteRequest
#define STATUS_REVISION_MISMATCH
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
#define IOCTL_STORAGE_QUERY_PROPERTY
#define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
* PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR
@ StorageDeviceSeekPenaltyProperty
@ StorageDeviceTrimProperty
@ StorageAccessAlignmentProperty
#define IOCTL_SCSI_PASS_THROUGH
#define IOCTL_SCSI_GET_ADDRESS
#define IOCTL_SCSI_GET_CAPABILITIES
#define IOCTL_SCSI_PASS_THROUGH_DIRECT
#define IOCTL_SCSI_MINIPORT
struct _SCSI_INQUIRY_DATA * PSCSI_INQUIRY_DATA
#define IOCTL_SCSI_RESCAN_BUS
#define IOCTL_SCSI_GET_INQUIRY_DATA
#define STORAGE_ADDRESS_TYPE_BTL8
#define SRB_TYPE_SCSI_REQUEST_BLOCK
#define IOCTL_ATA_PASS_THROUGH_DIRECT
#define IOCTL_ATA_PASS_THROUGH
#define DECLSPEC_NOINLINE_FROM_NOT_PAGED
#define STATUS_MORE_PROCESSING_REQUIRED
#define STATUS_BUFFER_TOO_SMALL
const KSDEVICE_DESCRIPTOR DeviceDescriptor
NTSTATUS SptiHandleAtaPassthru(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _In_ ULONG MaximumTransferLength, _In_ ULONG MaximumPhysicalPages)
Handler for the IOCTL_ATA_PASS_THROUGH and IOCTL_ATA_PASS_THROUGH_DIRECT requests.
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.
ATAPORT_PORT_DATA PortData
ATAPORT_COMMON_EXTENSION Common
IO_REMOVE_LOCK RemoveLock
ATAPORT_IO_CONTEXT Device
ATAPORT_COMMON_EXTENSION Common
ATA_SCSI_ADDRESS AtaScsiAddress
ULONG MaximumPhysicalPages
ULONG MaximumTransferLength
BOOLEAN IncursSeekPenalty
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@1696::@1697 DeviceIoControl
struct _IO_STACK_LOCATION::@4366::@4388 Scsi
UCHAR NumberOfLogicalUnits
ULONG NextInquiryDataOffset
ULONG MaximumTransferLength
ULONG MaximumPhysicalPages
BOOLEAN AcceleratedTransfer
STORAGE_QUERY_TYPE QueryType
STORAGE_PROPERTY_ID PropertyId
_In_ SIZE_T DescriptorSize
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INFO_LENGTH_MISMATCH
#define STATUS_INSUFFICIENT_RESOURCES
#define ALIGN_UP(size, type)
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
struct _STORAGE_DESCRIPTOR_HEADER * PSTORAGE_DESCRIPTOR_HEADER
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)