ReactOS 0.4.16-dev-1948-gd260c1d
sptilib.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define ATA_PASSTHROUGH_PROTOCOL_HARDWARE_RESET   0x0
 
#define ATA_PASSTHROUGH_PROTOCOL_SOFTWARE_RESET   0x1
 
#define ATA_PASSTHROUGH_PROTOCOL_NON_DATA   0x3
 
#define ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_IN   0x4
 
#define ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_OUT   0x5
 
#define ATA_PASSTHROUGH_PROTOCOL_DMA   0x6
 
#define ATA_PASSTHROUGH_PROTOCOL_DEVICE_DIAG   0x8
 
#define ATA_PASSTHROUGH_PROTOCOL_DEVICE_RESET   0x9
 
#define ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_IN   0xA
 
#define ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_OUT   0xB
 
#define ATA_PASSTHROUGH_PROTOCOL_NCQ   0xC
 
#define ATA_PASSTHROUGH_PROTOCOL_RETURN_RESPONSE   0xF
 
#define SCSI_SENSEQ_ATA_PASS_THROUGH_INFORMATION_AVAILABLE   0x1D
 

Functions

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.
 

Macro Definition Documentation

◆ ATA_PASSTHROUGH_PROTOCOL_DEVICE_DIAG

#define ATA_PASSTHROUGH_PROTOCOL_DEVICE_DIAG   0x8

Definition at line 21 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_DEVICE_RESET

#define ATA_PASSTHROUGH_PROTOCOL_DEVICE_RESET   0x9

Definition at line 22 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_DMA

#define ATA_PASSTHROUGH_PROTOCOL_DMA   0x6

Definition at line 20 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_HARDWARE_RESET

#define ATA_PASSTHROUGH_PROTOCOL_HARDWARE_RESET   0x0

ATA Protocol field definitions for the ATA passthrough commands (SCSIOP_ATA_PASSTHROUGH12 and SCSIOP_ATA_PASSTHROUGH16).

Definition at line 15 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_NCQ

#define ATA_PASSTHROUGH_PROTOCOL_NCQ   0xC

Definition at line 25 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_NON_DATA

#define ATA_PASSTHROUGH_PROTOCOL_NON_DATA   0x3

Definition at line 17 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_IN

#define ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_IN   0x4

Definition at line 18 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_OUT

#define ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_OUT   0x5

Definition at line 19 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_RETURN_RESPONSE

#define ATA_PASSTHROUGH_PROTOCOL_RETURN_RESPONSE   0xF

Definition at line 26 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_SOFTWARE_RESET

#define ATA_PASSTHROUGH_PROTOCOL_SOFTWARE_RESET   0x1

Definition at line 16 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_IN

#define ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_IN   0xA

Definition at line 23 of file sptilib.h.

◆ ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_OUT

#define ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_OUT   0xB

Definition at line 24 of file sptilib.h.

◆ SCSI_SENSEQ_ATA_PASS_THROUGH_INFORMATION_AVAILABLE

#define SCSI_SENSEQ_ATA_PASS_THROUGH_INFORMATION_AVAILABLE   0x1D

Additional sense code for the successfully completed ATA passthrough commands with check condition enabled.

Definition at line 33 of file sptilib.h.

Function Documentation

◆ SptiHandleAtaPassthru()

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.

Parameters
[in]DeviceObjectPDO device object.
[in,out]IrpPointer to the IOCTL request.
[in]MaximumTransferLengthMaximum size of data transfer for a device.
[in]MaximumPhysicalPagesMaximum number of physical pages per data transfer for a device.
Returns
Status.

Definition at line 782 of file sptilib.c.

787{
788 PATA_PASS_THROUGH_EX Apt = Irp->AssociatedIrp.SystemBuffer;
789 PIO_STACK_LOCATION IoStack;
790 BOOLEAN IsDirectMemoryAccess;
791 PASSTHROUGH_DATA AptData;
792 PUCHAR TaskFile;
794 PVOID DataBuffer;
795 PPASSTHROUGH_IRP_CONTEXT IrpContext;
797
798 PAGED_CODE();
799
801
804
805 IsDirectMemoryAccess = (GET_IOCTL(IoStack) == IOCTL_ATA_PASS_THROUGH_DIRECT);
806
808 Irp,
809 IoStack,
810 IsDirectMemoryAccess,
812 MaximumPhysicalPages,
813 Apt,
814 &AptData,
815 &TaskFile,
816 &DataBuffer);
817 if (!NT_SUCCESS(Status))
818 return Status;
819
820 DPRINT("APT: Flags %x DTL %lu\n", Apt->AtaFlags, Apt->DataTransferLength);
821 DPRINT("APT: Curr %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
822 TaskFile[8 + 0], TaskFile[8 + 1], TaskFile[8 + 2], TaskFile[8 + 3],
823 TaskFile[8 + 4], TaskFile[8 + 5], TaskFile[8 + 6],
824 Apt->AtaFlags,
825 Apt->DataTransferLength);
827 {
828 DPRINT("APT: Prev %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
829 TaskFile[0], TaskFile[1], TaskFile[2], TaskFile[3],
830 TaskFile[4], TaskFile[5], TaskFile[6]);
831 }
832
833 IrpContext = SptiCreateIrpContext(DeviceObject,
834 Irp,
835 DataBuffer,
837 IsDirectMemoryAccess,
838 !!(Apt->AtaFlags & ATA_FLAGS_DATA_OUT));
839 if (!IrpContext)
841
842 Status = SptiTranslateAptToSrb(&IrpContext->Srb, Apt, TaskFile);
843 if (!NT_SUCCESS(Status))
844 goto Cleanup;
845
846 Status = SptiCallDriver(DeviceObject, IrpContext);
847
848 Srb = &IrpContext->Srb;
849
852
853 /* Update the output buffer size */
855 if (IsDirectMemoryAccess)
856 {
857 Irp->IoStatus.Information = Apt->Length;
858 }
859 else
860 {
861 if ((Apt->AtaFlags & ATA_FLAGS_DATA_IN) && (AptData.BufferOffset != 0))
862 Irp->IoStatus.Information = AptData.BufferOffset + Apt->DataTransferLength;
863 else
864 Irp->IoStatus.Information = Apt->Length;
865 }
866
867 DPRINT("APT: Return %lx, DTL %lu, %lu bytes\n",
868 Status,
870 (ULONG)Irp->IoStatus.Information);
871 DPRINT("APT: Return curr %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
872 TaskFile[8 + 0], TaskFile[8 + 1], TaskFile[8 + 2], TaskFile[8 + 3],
873 TaskFile[8 + 4], TaskFile[8 + 5], TaskFile[8 + 6]);
875 {
876 DPRINT("APT: Return prev %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
877 TaskFile[0], TaskFile[1], TaskFile[2], TaskFile[3],
878 TaskFile[4], TaskFile[5], TaskFile[6]);
879 }
880
881Cleanup:
882 SptiFreeIrpContext(IrpContext);
883 return Status;
884}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
_In_ PIRP Irp
Definition: csq.h:116
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
static const WCHAR Cleanup[]
Definition: register.c:80
Status
Definition: gdiplustypes.h:25
#define ASSERT(a)
Definition: mode.c:44
_In_opt_ WDFREQUEST _In_ ULONG MaximumTransferLength
Definition: scratch.h:54
#define IOCTL_ATA_PASS_THROUGH_DIRECT
Definition: ntddscsi.h:41
#define IOCTL_ATA_PASS_THROUGH
Definition: ntddscsi.h:40
#define DPRINT
Definition: sndvol32.h:73
static NTSTATUS SptiTranslateAptToSrb(_Out_ SCSI_REQUEST_BLOCK *__restrict Srb, _In_ ATA_PASS_THROUGH_EX *__restrict Apt, _In_ PUCHAR TaskFile)
Definition: sptilib.c:351
static NTSTATUS SptiCallDriver(_In_ PDEVICE_OBJECT DeviceObject, _In_ PPASSTHROUGH_IRP_CONTEXT IrpContext)
Definition: sptilib.c:167
return STATUS_SUCCESS
Definition: sptilib.c:223
static BOOLEAN SptiTranslateAtaStatusReturnToTaskFile(_In_ SCSI_REQUEST_BLOCK *__restrict Srb, _In_ DESCRIPTOR_SENSE_DATA *__restrict SenseData, _Out_ UCHAR *__restrict TaskFile)
Definition: sptilib.c:294
static NTSTATUS SptiInitializeApt(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack, _In_ BOOLEAN IsDirectMemoryAccess, _In_ ULONG MaximumTransferLength, _In_ ULONG MaximumPhysicalPages, _In_ PATA_PASS_THROUGH_EX Apt, _Out_ PPASSTHROUGH_DATA AptData, _Out_ PUCHAR *TaskFile, _Out_ PVOID *DataBuffer)
Definition: sptilib.c:385
#define GET_IOCTL(IoStack)
Definition: sptilibp.h:23
ULONG DataTransferLength
Definition: ntddscsi.h:198
SCSI_REQUEST_BLOCK Srb
Definition: sptilibp.h:33
PVOID SenseInfoBuffer
Definition: srb.h:264
ULONG DataTransferLength
Definition: srb.h:261
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define ATA_FLAGS_DATA_OUT
Definition: uata_ctl.h:221
#define ATA_FLAGS_DATA_IN
Definition: uata_ctl.h:222
#define ATA_FLAGS_48BIT_COMMAND
Definition: uata_ctl.h:223
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
ULONG_PTR BufferOffset
Definition: sptilibp.h:28
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061

◆ SptiHandleScsiPassthru()

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.

Parameters
[in]DeviceObjectPDO device object.
[in,out]IrpPointer to the IOCTL request.
[in]MaximumTransferLengthMaximum size of data transfer for a device.
[in]MaximumPhysicalPagesMaximum number of physical pages per data transfer for a device.
Returns
Status.

Definition at line 888 of file sptilib.c.

893{
894 PSCSI_PASS_THROUGH Spt = Irp->AssociatedIrp.SystemBuffer;
895 PIO_STACK_LOCATION IoStack;
896 BOOLEAN IsDirectMemoryAccess;
897 PASSTHROUGH_DATA SptData;
898 ULONG SenseInfoOffset;
899 PUCHAR Cdb;
901 PVOID DataBuffer;
902 PPASSTHROUGH_IRP_CONTEXT IrpContext;
904
905 PAGED_CODE();
906
908
911
912 IsDirectMemoryAccess = (GET_IOCTL(IoStack) == IOCTL_SCSI_PASS_THROUGH_DIRECT);
913
915 Irp,
916 IoStack,
917 IsDirectMemoryAccess,
919 MaximumPhysicalPages,
920 Spt,
921 &SptData,
922 &SenseInfoOffset,
923 &Cdb,
924 &DataBuffer);
925 if (!NT_SUCCESS(Status))
926 return Status;
927
928 DPRINT("SPT: Flags %u, DTL %lu, sense len %u\n",
929 Spt->DataIn,
931 Spt->SenseInfoLength);
932 DPRINT("SPT: CDB %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
933 Cdb[0], Cdb[1], Cdb[2], Cdb[3], Cdb[4], Cdb[5], Cdb[6], Cdb[7], Cdb[8], Cdb[9]);
934
935 IrpContext = SptiCreateIrpContext(DeviceObject,
936 Irp,
937 DataBuffer,
939 IsDirectMemoryAccess,
940 !!(Spt->DataIn == SCSI_IOCTL_DATA_OUT));
941 if (!IrpContext)
943
944 Status = SptiTranslateSptToSrb(&IrpContext->Srb, Spt, Cdb);
945 if (!NT_SUCCESS(Status))
946 goto Cleanup;
947
948 Status = SptiCallDriver(DeviceObject, IrpContext);
949
950 Srb = &IrpContext->Srb;
951
952 /*
953 * Low-level storage drivers map SRB_STATUS_DATA_OVERRUN to STATUS_BUFFER_OVERFLOW.
954 * This SRB status is usually set on an underrun and means success in that case.
955 */
958
960 {
962
964
965 /* Copy the sense buffer back */
966 RtlCopyMemory((PVOID)((ULONG_PTR)Spt + SenseInfoOffset),
969 }
970 else
971 {
972 Spt->SenseInfoLength = 0;
973 }
974
975 Spt->ScsiStatus = Srb->ScsiStatus;
976
977 /* Update the output buffer size */
979 if (IsDirectMemoryAccess)
980 {
981 if (Spt->SenseInfoLength != 0)
982 Irp->IoStatus.Information = SenseInfoOffset + Spt->SenseInfoLength;
983 else
984 Irp->IoStatus.Information = Spt->Length;
985 }
986 else
987 {
988 if ((Srb->SrbFlags & SRB_FLAGS_DATA_IN) && (SptData.BufferOffset != 0))
989 Irp->IoStatus.Information = SptData.BufferOffset + Spt->DataTransferLength;
990 else if (Spt->SenseInfoLength != 0)
991 Irp->IoStatus.Information = SenseInfoOffset + Spt->SenseInfoLength;
992 else
993 Irp->IoStatus.Information = Spt->Length;
994 }
995
996 DPRINT("SPT: Return %lx, DTL %lu, "
997 "Srb status %02x, SCSI status %02x, sense len %u, %lu bytes\n",
998 Status,
1000 Srb->SrbStatus,
1001 Spt->ScsiStatus,
1002 Spt->SenseInfoLength,
1003 (ULONG)Irp->IoStatus.Information);
1004
1005Cleanup:
1006 SptiFreeIrpContext(IrpContext);
1007 return Status;
1008}
#define SRB_STATUS_DATA_OVERRUN
Definition: srb.h:357
#define SRB_STATUS_AUTOSENSE_VALID
Definition: srb.h:387
#define SRB_FLAGS_DATA_IN
Definition: srb.h:400
#define SRB_STATUS(Status)
Definition: srb.h:389
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
Definition: scratch.h:159
#define IOCTL_SCSI_PASS_THROUGH
Definition: scsi_port.h:47
#define IOCTL_SCSI_PASS_THROUGH_DIRECT
Definition: scsi_port.h:51
#define SCSI_IOCTL_DATA_OUT
Definition: scsi_port.h:171
static NTSTATUS SptiInitializeSpt(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack, _In_ BOOLEAN IsDirectMemoryAccess, _In_ ULONG MaximumTransferLength, _In_ ULONG MaximumPhysicalPages, _In_ PSCSI_PASS_THROUGH Spt, _Out_ PPASSTHROUGH_DATA SptData, _Out_ PULONG SenseInfoOffset, _Out_ PUCHAR *Cdb, _Out_ PVOID *DataBuffer)
Definition: sptilib.c:580
static NTSTATUS SptiTranslateSptToSrb(_Out_ SCSI_REQUEST_BLOCK *__restrict Srb, _In_ SCSI_PASS_THROUGH *__restrict Spt, _In_ PUCHAR Cdb)
Definition: sptilib.c:536
UCHAR SenseInfoLength
Definition: scsi_port.h:65
ULONG DataTransferLength
Definition: scsi_port.h:67
UCHAR SenseInfoBufferLength
Definition: srb.h:259
UCHAR ScsiStatus
Definition: srb.h:252
ULONG SrbFlags
Definition: srb.h:260
UCHAR SrbStatus
Definition: srb.h:251
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by PdoHandleScsiPassthrough(), and USBSTOR_HandleDeviceControl().