Handler for the IOCTL_ATA_PASS_THROUGH and IOCTL_ATA_PASS_THROUGH_DIRECT requests.
787{
797
799
801
804
806
809 IoStack,
810 IsDirectMemoryAccess,
812 MaximumPhysicalPages,
813 Apt,
814 &AptData,
815 &TaskFile,
816 &DataBuffer);
819
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],
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
835 DataBuffer,
837 IsDirectMemoryAccess,
839 if (!IrpContext)
841
845
847
849
852
853
855 if (IsDirectMemoryAccess)
856 {
858 }
859 else
860 {
863 else
865 }
866
867 DPRINT(
"APT: Return %lx, DTL %lu, %lu bytes\n",
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
882 SptiFreeIrpContext(IrpContext);
884}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define NT_SUCCESS(StatCode)
_In_opt_ WDFREQUEST _In_ ULONG MaximumTransferLength
#define IOCTL_ATA_PASS_THROUGH_DIRECT
#define IOCTL_ATA_PASS_THROUGH
static NTSTATUS SptiTranslateAptToSrb(_Out_ SCSI_REQUEST_BLOCK *__restrict Srb, _In_ ATA_PASS_THROUGH_EX *__restrict Apt, _In_ PUCHAR TaskFile)
static NTSTATUS SptiCallDriver(_In_ PDEVICE_OBJECT DeviceObject, _In_ PPASSTHROUGH_IRP_CONTEXT IrpContext)
static BOOLEAN SptiTranslateAtaStatusReturnToTaskFile(_In_ SCSI_REQUEST_BLOCK *__restrict Srb, _In_ DESCRIPTOR_SENSE_DATA *__restrict SenseData, _Out_ UCHAR *__restrict TaskFile)
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)
#define GET_IOCTL(IoStack)
#define ATA_FLAGS_DATA_OUT
#define ATA_FLAGS_DATA_IN
#define ATA_FLAGS_48BIT_COMMAND
#define STATUS_INSUFFICIENT_RESOURCES