ReactOS 0.4.16-dev-2633-g8dc9e50
satl.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Port Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: SCSI/ATA Translation layer
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "atapi.h"
11
12/* GLOBALS ********************************************************************/
13
14static const UCHAR AtapReadWriteCommandMap[12][2] =
15{
16 /* Write EXT Read EXT */
20
21 /* Write FUA EXT Read FUA EXT */
22 { 0, 0 }, // PIO single
23 { IDE_COMMAND_WRITE_MULTIPLE_FUA_EXT, 0 }, // PIO multiple
25
26 /* Write Read */
27 { IDE_COMMAND_WRITE, IDE_COMMAND_READ, }, // PIO single
30
31 /* Write FUA Read FUA */
32 { 0, 0 }, // PIO single
33 { 0, 0 }, // PIO multiple
34 { 0, 0 }, // DMA
35};
36
37/* FUNCTIONS ******************************************************************/
38
39static
40inline
45{
46 ULONG CmdEntry;
47
48 if (Request->Flags & REQUEST_FLAG_LBA48)
49 {
50 if (Device->DeviceFlags & DEVICE_PIO_FOR_LBA48_XFER)
51 Request->Flags &= ~REQUEST_FLAG_DMA;
52
53 CmdEntry = 0;
54 }
55 else
56 {
57 CmdEntry = 6;
58 }
59
60 if (Request->Flags & REQUEST_FLAG_FUA)
61 {
62 CmdEntry += 3;
63 }
64
65 if (Request->Flags & REQUEST_FLAG_DMA)
66 {
67 CmdEntry += 2;
68 }
70 {
71 CmdEntry += 1;
72 }
73
74 return AtapReadWriteCommandMap[CmdEntry][(Request->Flags & REQUEST_FLAG_DATA_IN) ? 1 : 0];
75}
76
80{
82
83 ASSERT(!(Device->DeviceFlags & DEVICE_PIO_VIA_DMA));
85
86 /* ATAPI commands */
88 {
89 Request->Flags &= ~REQUEST_DMA_FLAGS;
90 return TRUE;
91 }
92
93 /*
94 * For ATA commands there is no simple way to achieve this,
95 * we have to fix the command opcode.
96 * Determine if it is safe or allowed to change the command.
97 */
99 {
100 Request->Flags &= ~REQUEST_DMA_FLAGS;
101
102 Request->TaskFile.Command = AtaReadWriteCommand(Request, Device);
103 if (Request->TaskFile.Command == 0)
104 {
105 /* PIO is not available */
106 Request->Flags |= REQUEST_DMA_FLAGS;
107 return FALSE;
108 }
109
110 return TRUE;
111 }
112
113 /* PIO is not available */
114 return FALSE;
115}
116
117static
121{
122 PATA_TASKFILE TaskFile = &Request->TaskFile;
124 ULONG64 Lba;
125
126 if (Device->DeviceFlags & DEVICE_LBA_MODE)
127 {
128 Lba = ((ULONG64)TaskFile->LowLba << 0) |
129 ((ULONG64)TaskFile->MidLba << 8) |
130 ((ULONG64)TaskFile->HighLba << 16);
131
132 if (Request->Flags & REQUEST_FLAG_LBA48)
133 {
134 /* 48-bit command */
135 Lba |= ((ULONG64)TaskFile->LowLbaEx << 24) |
136 ((ULONG64)TaskFile->MidLbaEx << 32) |
137 ((ULONG64)TaskFile->HighLbaEx << 40);
138 }
139 else
140 {
141 /* 28-bit command */
142 Lba |= (ULONG64)(TaskFile->DriveSelect & 0x0F) << 24;
143 }
144 }
145 else
146 {
147 ULONG Cylinder, Head, Sector;
148
149 /* Legacy CHS translation */
150 Cylinder = TaskFile->LowLba;
151 Head = TaskFile->DriveSelect & 0x0F;
152 Sector = ((ULONG64)TaskFile->HighLba << 8) | TaskFile->MidLba;
153
154 // TODO: Use 64bit math?
155 Lba = (((Cylinder * Device->Heads) + Head) * Device->SectorsPerTrack) + (Sector - 1);
156 }
157
158 return Lba;
159}
160
161static
165 _Out_ PUCHAR SK,
166 _Out_ PUCHAR ASK,
167 _Out_ PUCHAR ASCQ)
168{
169 if (Request->Output.Status & IDE_STATUS_DEVICE_FAULT)
170 {
174 }
175 else if (Request->Output.Error & IDE_ERROR_DATA_ERROR)
176 {
177 if (Request->Flags & REQUEST_FLAG_DATA_OUT)
178 {
181 *ASCQ = 0;
182 }
183 else
184 {
188 }
189 }
190 else if (Request->Output.Error & IDE_ERROR_ID_NOT_FOUND)
191 {
195 }
196 else if (Request->Output.Error & IDE_ERROR_CRC_ERROR)
197 {
201 }
202 /* Return vendor specific codes for obsolete bits */
203 else if (Request->Output.Error & IDE_ERROR_MEDIA_CHANGE)
204 {
207 *ASCQ = 0;
208 }
209 else if (Request->Output.Error & IDE_ERROR_MEDIA_CHANGE_REQ)
210 {
214 }
215 else if (Request->Output.Error & IDE_ERROR_END_OF_MEDIA)
216 {
219 *ASCQ = 0;
220 }
221 else if (Request->Output.Error & IDE_ERROR_ADDRESS_NOT_FOUND)
222 {
225 *ASCQ = 0;
226 }
227 /* The ABORT bit has low priority and indicates unknown error */
228 else if (Request->Output.Error & IDE_ERROR_COMMAND_ABORTED)
229 {
232 *ASCQ = 0;
233 }
234 else
235 {
238 *ASCQ = 0;
239
240 /* No sense data */
241 return FALSE;
242 }
243
244 return TRUE;
245}
246
247UCHAR
250{
251 SCSI_SENSE_CODE SenseCode;
252 UCHAR SrbStatus, SK, ASK, ASCQ;
253
255
256 if (!AtaReqTranslateFixedError(Request, &SK, &ASK, &ASCQ))
257 return Request->SrbStatus;
258
259 SenseCode.SrbStatus = Request->SrbStatus;
260 SenseCode.SenseKey = SK;
261 SenseCode.AdditionalSenseCode = ASK;
262 SenseCode.AdditionalSenseCodeQualifier = ASCQ;
263
264 SrbStatus = AtaReqSetFixedSenseData(Request->Srb, SenseCode);
266
267 return SrbStatus;
268}
269
270static
271ULONG
276{
278 PMDL Mdl;
281 ULONG BytesCount;
282
283 /* The driver can overwrite the Request->Mdl field during translation */
284 Mdl = Request->Irp->MdlAddress;
285 ASSERT(Mdl);
286
288 if (!BaseAddress)
290
291 if (Length < Srb->DataTransferLength)
292 {
293 /* This indicates a residual underrun */
294 BytesCount = Length;
295 Request->SrbStatus = SRB_STATUS_DATA_OVERRUN;
296 }
297 else
298 {
299 BytesCount = Srb->DataTransferLength;
300 Request->SrbStatus = SRB_STATUS_SUCCESS;
301 }
302 Request->DataTransferLength = BytesCount;
303
304 /* Calculate the offset within DataBuffer */
308
309 RtlCopyMemory((PVOID)Offset, Buffer, BytesCount);
310 return Request->SrbStatus;
311}
312
313static
314UCHAR
317{
318 SCSI_SENSE_CODE SenseCode;
319
323 SenseCode.AdditionalSenseCodeQualifier = 0;
324
325 return AtaReqSetFixedSenseData(Srb, SenseCode);
326}
327
328static
329UCHAR
332{
333 SCSI_SENSE_CODE SenseCode;
334
338 SenseCode.AdditionalSenseCodeQualifier = 0;
339
340 return AtaReqSetFixedSenseData(Srb, SenseCode);
341}
342
343/* static */
344UCHAR
347{
348 SCSI_SENSE_CODE SenseCode;
349
353 SenseCode.AdditionalSenseCodeQualifier = 0;
354
355 return AtaReqSetFixedSenseData(Srb, SenseCode);
356}
357
358static
359UCHAR
362{
363 SCSI_SENSE_CODE SenseCode;
364
365 /*
366 * This normally should not happen and only used
367 * to aid in detecting bugs in the class drivers or software.
368 */
369 ASSERT(FALSE);
370
374 SenseCode.AdditionalSenseCodeQualifier = 0;
375
376 return AtaReqSetFixedSenseData(Srb, SenseCode);
377}
378
379static
384{
386 Request->DataBuffer = &DevExt->IdentifyDeviceData;
387 Request->DataTransferLength = sizeof(DevExt->IdentifyDeviceData);
388
390 return FALSE;
391
392 RtlZeroMemory(&Request->TaskFile, sizeof(Request->TaskFile));
393 Request->TaskFile.Command = IDE_COMMAND_IDENTIFY;
394
395 return TRUE;
396}
397
398VOID
401 _In_ UCHAR LogAddress,
402 _In_ UCHAR PageNumber,
403 _In_ USHORT LogPageCount)
404{
405 PATA_TASKFILE TaskFile = &Request->TaskFile;
406
407 /* PIO Data-In command */
409 Request->DataTransferLength = LogPageCount * IDE_GP_LOG_SECTOR_SIZE;
410
411 TaskFile->Feature = 0;
412 TaskFile->FeatureEx = 0;
413
414 /* LOG PAGE COUNT */
415 TaskFile->SectorCount = (UCHAR)LogPageCount;
416 TaskFile->SectorCountEx = (UCHAR)(LogPageCount >> 8);
417
418 TaskFile->LowLba = LogAddress; // LOG ADDRESS
419 TaskFile->MidLba = PageNumber; // PAGE NUMBER
420 TaskFile->HighLba = 0; // Reserved
421 TaskFile->LowLbaEx = 0; // Reserved
422 TaskFile->MidLbaEx = 0; // PAGE NUMBER EX
423 TaskFile->HighLbaEx = 0; // Reserved
425}
426
427static
432 _In_ ULONG64 Lba,
434{
435 PATA_TASKFILE TaskFile = &Request->TaskFile;
436 UCHAR DriveSelect;
437
438 /* Sector count must not exceed the maximum transfer length */
440
442 return FALSE;
443
445
446 /* 28-bit or 48-bit command */
447 if (DevExt->Device.DeviceFlags & DEVICE_LBA_MODE)
448 {
449 DriveSelect = IDE_LBA_MODE;
450
451 TaskFile->Feature = 0;
452 TaskFile->SectorCount = (UCHAR)SectorCount;
453 TaskFile->LowLba = (UCHAR)Lba; // LBA bits 0-7
454 TaskFile->MidLba = (UCHAR)(Lba >> 8); // LBA bits 8-15
455 TaskFile->HighLba = (UCHAR)(Lba >> 16); // LBA bits 16-23
456
457 if ((DevExt->Device.DeviceFlags & DEVICE_LBA48) &&
459 {
460 if ((Lba + SectorCount) > ATA_MAX_LBA_48)
461 return FALSE;
462
463 /* 48-bit command */
464 TaskFile->FeatureEx = 0;
465 TaskFile->SectorCountEx = (UCHAR)(SectorCount >> 8);
466 TaskFile->LowLbaEx = (UCHAR)(Lba >> 24); // LBA bits 24-31
467 TaskFile->MidLbaEx = (UCHAR)(Lba >> 32); // LBA bits 32-39
468 TaskFile->HighLbaEx = (UCHAR)(Lba >> 40); // LBA bits 40-47
469
470 Request->Flags |= REQUEST_FLAG_LBA48;
471 }
472 else
473 {
474 if ((Lba + SectorCount) > ATA_MAX_LBA_28)
475 return FALSE;
476
477 /* 28-bit command */
478 DriveSelect |= ((Lba >> 24) & 0x0F); // LBA bits 24-27
479 }
480 }
481 else
482 {
483 ULONG ChsTemp, Cylinder, Head, Sector;
484
485 if ((Lba + SectorCount) > ATA_MAX_LBA_28)
486 return FALSE;
487
488 ChsTemp = (ULONG)Lba / DevExt->Device.SectorsPerTrack;
489
490 /* Legacy CHS translation */
491 Cylinder = ChsTemp / DevExt->Device.Heads;
492 Head = ChsTemp % DevExt->Device.Heads;
493 Sector = ((ULONG)Lba % DevExt->Device.SectorsPerTrack) + 1;
494
495 /* Check for the 137 GB limit */
496 if (Cylinder > 65535 || Head > 15 || Sector > 255)
497 return FALSE;
498
499 TaskFile->Feature = 0;
500 TaskFile->SectorCount = (UCHAR)SectorCount;
501 TaskFile->LowLba = (UCHAR)Sector;
502 TaskFile->MidLba = (UCHAR)Cylinder;
503 TaskFile->HighLba = (UCHAR)(Cylinder >> 8);
504
505 DriveSelect = Head;
506 }
507 TaskFile->DriveSelect = DevExt->Device.DeviceSelect | DriveSelect;
508
509 return TRUE;
510}
511
512static
517 _In_ ULONG64 Lba,
519{
520 PATA_TASKFILE TaskFile = &Request->TaskFile;
521
522 ASSERT(DevExt->Device.PortData->PortFlags & PORT_FLAG_NCQ);
523 ASSERT(!(DevExt->Device.DeviceFlags & DEVICE_PIO_ONLY));
524
525 /* Sector count must not exceed the maximum transfer length */
527
529 return FALSE;
530
531 if ((Lba + SectorCount) > ATA_MAX_LBA_48)
532 return FALSE;
533
534 Request->Flags |= REQUEST_FLAG_NCQ |
538
539 TaskFile->Feature = (UCHAR)SectorCount;
540 TaskFile->FeatureEx = (UCHAR)(SectorCount >> 8);
541
542 // TODO: RARC, PRIO, ICC, AUX
543 TaskFile->SectorCount = 0;
544 TaskFile->SectorCountEx = 0;
545
546 TaskFile->LowLba = (UCHAR)Lba; // LBA bits 0-7
547 TaskFile->MidLba = (UCHAR)(Lba >> 8); // LBA bits 8-15
548 TaskFile->HighLba = (UCHAR)(Lba >> 16); // LBA bits 16-23
549 TaskFile->LowLbaEx = (UCHAR)(Lba >> 24); // LBA bits 24-31
550 TaskFile->MidLbaEx = (UCHAR)(Lba >> 32); // LBA bits 32-39
551 TaskFile->HighLbaEx = (UCHAR)(Lba >> 40); // LBA bits 40-47
552
553 TaskFile->DriveSelect = IDE_LBA_MODE;
554 if (Request->Flags & REQUEST_FLAG_FUA)
555 TaskFile->DriveSelect |= IDE_DEVICE_FUA_NCQ;
556
557 if (Request->Flags & REQUEST_FLAG_DATA_OUT)
559 else
561
562 return TRUE;
563}
564
565static
566UCHAR
571{
572 PCDB Cdb;
573 ULONG64 Lba;
575
577
578 Cdb = (PCDB)Srb->Cdb;
579 switch (Cdb->AsByte[0])
580 {
581 case SCSIOP_READ6:
582 case SCSIOP_WRITE6:
583 {
585 break;
586 }
587
588 case SCSIOP_READ:
589 case SCSIOP_WRITE:
590 {
592
593 if (Cdb->CDB10.ForceUnitAccess)
594 Request->Flags |= REQUEST_FLAG_FUA;
595 break;
596 }
597
598 case SCSIOP_READ12:
599 case SCSIOP_WRITE12:
600 {
602
603 if (Cdb->CDB12.ForceUnitAccess)
604 Request->Flags |= REQUEST_FLAG_FUA;
605 break;
606 }
607
608 case SCSIOP_READ16:
609 case SCSIOP_WRITE16:
610 {
612
613 if (Cdb->CDB16.ForceUnitAccess)
614 Request->Flags |= REQUEST_FLAG_FUA;
615 break;
616 }
617
618 default:
619 ASSERT(FALSE);
621 }
622
623 /* Check for write operations */
624 if (Cdb->AsByte[0] & 0x02)
626 else
628
629 // FIXME: HACK Workaround for disk.sys which incorrectly enables FUA support
630 if (!(DevExt->Device.DeviceFlags & DEVICE_NCQ))
631 Request->Flags &= ~REQUEST_FLAG_FUA;
632
633 SectorCount = Request->DataTransferLength + (DevExt->Device.SectorSize - 1);
634 SectorCount /= DevExt->Device.SectorSize;
635
636 if (DevExt->Device.DeviceFlags & DEVICE_NCQ)
637 {
640 }
641 else
642 {
643 if (!AtaReqBuildLbaTaskFile(DevExt, Request, Lba, SectorCount))
645
646 if (!(DevExt->Device.DeviceFlags & DEVICE_PIO_ONLY) &&
648 {
649 Request->Flags |= REQUEST_DMA_FLAGS;
650 }
651 else if (DevExt->Device.MultiSectorCount != 0)
652 {
654 }
655
656 /* Choose the command opcode */
657 Request->TaskFile.Command = AtaReadWriteCommand(Request, &DevExt->Device);
658 if (Request->TaskFile.Command == 0)
660 }
661
662 return SRB_STATUS_PENDING;
663}
664
665static
666UCHAR
671{
673
674 if (!AtaDevIsVolatileWriteCacheEnabled(&DevExt->IdentifyDeviceData))
675 return SRB_STATUS_SUCCESS;
676
678 if (Command == 0)
679 return SRB_STATUS_SUCCESS;
680
681 /* Prepare a non-data command */
682 Request->TaskFile.Command = Command;
683
684 /* NOTE: This command may take longer than 30 seconds to complete */
685 return SRB_STATUS_PENDING;
686}
687
688static
689UCHAR
694{
695 PCDB Cdb;
696 ULONG64 Lba;
697 ULONG VerificationLength;
698
699 Cdb = (PCDB)Srb->Cdb;
700
701 /* Byte-by-byte comparison not supported */
702 if (Cdb->VERIFY16.ByteCheck || Cdb->VERIFY16.BlockVerify)
704
705 /* Prepare a non-data command */
706 switch (Cdb->AsByte[0])
707 {
708 case SCSIOP_VERIFY:
709 {
711 VerificationLength = CdbGetTransferLength10(Cdb);
712 break;
713 }
714
715 case SCSIOP_VERIFY12:
716 {
718 VerificationLength = CdbGetTransferLength12(Cdb);
719 break;
720 }
721
722 case SCSIOP_VERIFY16:
723 {
725 VerificationLength = CdbGetTransferLength16(Cdb);
726 break;
727 }
728
729 default:
730 ASSERT(FALSE);
732 }
733
734 if (!AtaReqBuildLbaTaskFile(DevExt, Request, Lba, VerificationLength))
736
737 /* Choose the command opcode */
738 if (Request->Flags & REQUEST_FLAG_LBA48)
739 Request->TaskFile.Command = IDE_COMMAND_VERIFY_EXT;
740 else
741 Request->TaskFile.Command = IDE_COMMAND_VERIFY;
742
743 return SRB_STATUS_PENDING;
744}
745
746static
750{
754
756
758
759 if (DevExt->Device.TotalSectors == 1)
760 {
761 SCSI_SENSE_CODE SenseCode;
762
763 SenseCode.SrbStatus = SRB_STATUS_ERROR;
764 SenseCode.SenseKey = SCSI_SENSE_NOT_READY;
766 SenseCode.AdditionalSenseCodeQualifier = 0;
767
768 Request->SrbStatus = AtaReqSetFixedSenseData(Srb, SenseCode);
769 return COMPLETE_IRP;
770 }
771
772 if (Srb->Cdb[0] == SCSIOP_READ_CAPACITY)
773 {
774 PREAD_CAPACITY_DATA CapacityData;
775 ULONG MaximumLba;
776
777 MaximumLba = min(DevExt->Device.TotalSectors - 1, MAXULONG);
778
779 CapacityData = DevExt->Device.LocalBuffer;
780 CapacityData->LogicalBlockAddress = RtlUlongByteSwap(MaximumLba);
781 CapacityData->BytesPerBlock = RtlUlongByteSwap(DevExt->Device.SectorSize);
782
783 Length = sizeof(*CapacityData);
784 }
785 else // SCSIOP_READ_CAPACITY16
786 {
787 PREAD_CAPACITY16_DATA CapacityData;
788 ULONG LogicalPerPhysicalExponent, LogicalSectorsPerPhysicalSector;
789 ULONG LogicalSectorAlignment, LowestAlignedBlock;
790 ULONG64 MaximumLba;
791
792 LogicalSectorAlignment = AtaDevLogicalSectorAlignment(&DevExt->IdentifyDeviceData);
793 if (LogicalSectorAlignment != 0)
794 {
795 LogicalSectorsPerPhysicalSector =
797 &LogicalPerPhysicalExponent);
798
799
800 LowestAlignedBlock = (LogicalSectorsPerPhysicalSector - LogicalSectorAlignment);
801 LowestAlignedBlock %= LogicalSectorsPerPhysicalSector;
802 }
803 else
804 {
805 LowestAlignedBlock = 0;
806 }
807
808 MaximumLba = DevExt->Device.TotalSectors - 1;
809
810 CapacityData = DevExt->Device.LocalBuffer;
811
812 RtlZeroMemory(CapacityData, sizeof(*CapacityData));
813 CapacityData->LogicalBlockAddress.QuadPart = RtlUlonglongByteSwap(MaximumLba);
814 CapacityData->BytesPerBlock = RtlUlongByteSwap(DevExt->Device.SectorSize);
815 CapacityData->LogicalPerPhysicalExponent = LogicalPerPhysicalExponent;
816 CapacityData->LowestAlignedBlock_MSB = (UCHAR)(LowestAlignedBlock >> 8);
817 CapacityData->LowestAlignedBlock_LSB = (UCHAR)LowestAlignedBlock;
818
820 {
822 {
823 CapacityData->LBPME = 1;
824
826 CapacityData->LBPRZ = 1;
827 }
828 }
829
831 }
832
834 return COMPLETE_IRP;
835}
836
837static
838UCHAR
843{
844 if (Srb->Cdb[0] == SCSIOP_READ_CAPACITY)
845 {
848 }
849 else // SCSIOP_READ_CAPACITY16
850 {
853 }
854
855 /* Update the identify data */
858
860 return SRB_STATUS_PENDING;
861}
862
863static
864ULONG
868{
869 PMODE_CONTROL_PAGE PageData = Buffer;
870
871 PageData->PageCode = MODE_PAGE_CONTROL;
872 PageData->PageLength =
873 sizeof(PageData) - RTL_SIZEOF_THROUGH_FIELD(MODE_CONTROL_PAGE, PageLength);
874
875 PageData->QERR = 0;
876 PageData->QueueAlgorithmModifier = 1;
877 PageData->BusyTimeoutPeriod[0] = 0xFF;
878 PageData->BusyTimeoutPeriod[1] = 0xFF;
879 PageData->D_SENSE = !!(DevExt->Device.DeviceFlags & DEVICE_DESCRIPTOR_SENSE);
880
881 return sizeof(PageData);
882}
883
884static
885ULONG
889{
891
892 PageData->SubPageFormat = 1;
893 PageData->SubPageCode = 0x00;
894 PageData->PageCode = MODE_PAGE_CONTROL;
895 PageData->PageLength[1] =
896 sizeof(PageData) - RTL_SIZEOF_THROUGH_FIELD(MODE_CONTROL_EXTENSION_PAGE, PageLength);
897
898 return sizeof(PageData);
899}
900
901static
902ULONG
906{
908
910 PageData->PageLength =
911 sizeof(PageData) - RTL_SIZEOF_THROUGH_FIELD(MODE_READ_WRITE_RECOVERY_PAGE, PageLength);
912
913 PageData->AWRE = 1;
914
915 return sizeof(PageData);
916}
917
918static
919ULONG
923{
925
926 PageData->PageCode = MODE_PAGE_CACHING;
927 PageData->PageLength =
928 sizeof(PageData) - RTL_SIZEOF_THROUGH_FIELD(MODE_CACHING_PAGE_SPC5, PageLength);
929
930 if (AtaDevIsVolatileWriteCacheEnabled(&DevExt->IdentifyDeviceData))
931 PageData->WriteCacheEnable = 1;
932
933 if (AtaDevIsReadLookAHeadEnabled(&DevExt->IdentifyDeviceData))
934 PageData->DisableReadAHead = 1;
935
936 return sizeof(PageData);
937}
938
939static
940ULONG
944{
945 PMODE_INFO_EXCEPTIONS PageData = Buffer;
946
948 PageData->PageLength =
949 sizeof(PageData) - RTL_SIZEOF_THROUGH_FIELD(MODE_INFO_EXCEPTIONS, PageLength);
950
951 /* Only report informational exception condition on request */
952 PageData->ReportMethod = 6;
953
954 return sizeof(PageData);
955}
956
957static
961{
964 USHORT ModeDataLength;
966 BOOLEAN Is6ByteCommand, IsWriteProtected;
967 PCDB Cdb;
968 union _HEADER
969 {
972 } ModeHeader;
973
975
976 // TODO: Handle MSN
977#if 0
978 /* Determine the media status */
979 if ((Request->TranslationState == 0) && (DevExt->Device.DeviceFlags & DEVICE_HAS_MEDIA_STATUS))
980 {
981 Request->Flags = 0;
982 Request->TaskFile.Command = IDE_COMMAND_GET_MEDIA_STATUS;
983
984 ++Request->TranslationState;
986 }
987#endif
988
990
991 Cdb = (PCDB)Request->Srb->Cdb;
992 Is6ByteCommand = (Cdb->AsByte[0] == SCSIOP_MODE_SENSE);
993
994 Buffer = DevExt->Device.LocalBuffer;
995
996 /* Media status outputs */
997 if (Request->TranslationState != 0)
998 {
999 IsWriteProtected = (Request->Output.Status & IDE_STATUS_ERROR) &&
1000 !(Request->Output.Error & IDE_ERROR_COMMAND_ABORTED) &&
1001 (Request->Output.Error & IDE_ERROR_WRITE_PROTECT);
1002 }
1003 else
1004 {
1005 IsWriteProtected = FALSE;
1006 }
1007
1008 ModeHeader.Header6 = (PMODE_PARAMETER_HEADER)Buffer;
1009
1010 /* Mode parameter header */
1011 if (Is6ByteCommand)
1012 {
1013 if (IsWriteProtected)
1014 ModeHeader.Header6->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
1015 if (DevExt->Device.DeviceFlags & DEVICE_HAS_FUA)
1016 ModeHeader.Header6->DeviceSpecificParameter |= MODE_DSP_FUA_SUPPORTED;
1017
1018 Buffer += sizeof(*ModeHeader.Header6);
1019 }
1020 else
1021 {
1022 if (IsWriteProtected)
1023 ModeHeader.Header10->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
1024 if (DevExt->Device.DeviceFlags & DEVICE_HAS_FUA)
1025 ModeHeader.Header10->DeviceSpecificParameter |= MODE_DSP_FUA_SUPPORTED;
1026
1027 Buffer += sizeof(*ModeHeader.Header10);
1028 }
1029
1030 /* Short LBA mode parameter block descriptor */
1031 if (!Cdb->MODE_SENSE.Dbd)
1032 {
1033 PFORMAT_DESCRIPTOR FormatDescriptor;
1034
1035 if (Is6ByteCommand)
1036 {
1037 ModeHeader.Header6->BlockDescriptorLength = sizeof(*FormatDescriptor);
1038 }
1039 else
1040 {
1041 ModeHeader.Header10->BlockDescriptorLength[0] = (UCHAR)(sizeof(*FormatDescriptor) >> 8);
1042 ModeHeader.Header10->BlockDescriptorLength[1] = (UCHAR)sizeof(*FormatDescriptor);
1043 }
1044
1045 FormatDescriptor = (PFORMAT_DESCRIPTOR)Buffer;
1046 FormatDescriptor->BlockLength[0] = (UCHAR)(DevExt->Device.SectorSize >> 16);
1047 FormatDescriptor->BlockLength[1] = (UCHAR)(DevExt->Device.SectorSize >> 8);
1048 FormatDescriptor->BlockLength[2] = (UCHAR)DevExt->Device.SectorSize;
1049
1050 Buffer += sizeof(*FormatDescriptor);
1051 }
1052
1053 PageCode = Cdb->MODE_SENSE.PageCode;
1054
1055 /* Return SCSI mode pages */
1057 {
1058 UCHAR SubPageCode = Cdb->MODE_SENSE.Reserved3;
1059
1060 if (SubPageCode == 0x00 || SubPageCode == 0xFF)
1062 if (SubPageCode == 0x01 || SubPageCode == 0xFF)
1064 }
1066 {
1068 }
1070 {
1072 }
1074 {
1076 }
1077
1078 ModeDataLength = Buffer - (PUCHAR)DevExt->Device.LocalBuffer;
1079
1080 if (Is6ByteCommand)
1081 {
1082 ModeDataLength -= RTL_SIZEOF_THROUGH_FIELD(MODE_PARAMETER_HEADER, MediumType);
1083
1084 ModeHeader.Header6->ModeDataLength = ModeDataLength;
1085 }
1086 else
1087 {
1088 ModeDataLength -= RTL_SIZEOF_THROUGH_FIELD(MODE_PARAMETER_HEADER10, MediumType);
1089
1090 ModeHeader.Header10->ModeDataLength[0] = (UCHAR)(ModeDataLength >> 8);
1091 ModeHeader.Header10->ModeDataLength[1] = (UCHAR)ModeDataLength;
1092 }
1093
1095 DevExt->Device.LocalBuffer,
1096 Buffer - (PUCHAR)DevExt->Device.LocalBuffer);
1097 return COMPLETE_IRP;
1098}
1099
1100static
1101UCHAR
1106 _In_ BOOLEAN Is6ByteCommand)
1107{
1108 PCDB Cdb = (PCDB)Srb->Cdb;
1109
1112
1113 switch (Cdb->MODE_SENSE.PageCode)
1114 {
1116 {
1117 if (!AtaDevHasSmartFeature(&DevExt->IdentifyDeviceData))
1119
1120 break;
1121 }
1122
1123 case MODE_PAGE_CONTROL:
1124 {
1125 UCHAR SubPageCode = Cdb->MODE_SENSE.Reserved3;
1126
1127 if (SubPageCode != 0x00 && SubPageCode != 0x01 && SubPageCode != 0xFF)
1129
1130 break;
1131 }
1132
1135 case MODE_PAGE_CACHING:
1137 break;
1138
1139 default:
1141 }
1142
1143 /* Update the identify data */
1144 if (!AtaReqBuildIdentifyCommand(DevExt, Request))
1146
1147 Request->Complete = AtaReqCompleteModeSense;
1148
1149 return SRB_STATUS_PENDING;
1150}
1151
1152static
1153UCHAR
1158 _In_ BOOLEAN Is6ByteCommand)
1159{
1160 // TODO: Implement
1162}
1163
1164CODE_SEG("PAGE")
1165VOID
1168{
1169 PIDENTIFY_DEVICE_DATA IdentifyData = &DevExt->IdentifyDeviceData;
1170 PINQUIRYDATA InquiryData = &DevExt->InquiryData;
1171 ULONG Offset;
1172 PUCHAR VersionDescriptor;
1173
1174 PAGED_CODE();
1175
1176 InquiryData->DeviceType = DIRECT_ACCESS_DEVICE;
1177 InquiryData->RemovableMedia = AtaDevIsRemovable(IdentifyData);
1178 InquiryData->Versions = 0x07; // SPC-5
1179 InquiryData->ResponseDataFormat = 2; // This means "Complies to this standard"
1180
1181 if (DevExt->Device.DeviceFlags & DEVICE_NCQ)
1182 InquiryData->CommandQueue = 1;
1183
1184 /* T10 vendor ID */
1185 RtlCopyMemory(InquiryData->VendorId, "ATA ", RTL_FIELD_SIZE(INQUIRYDATA, VendorId));
1186
1187 /* Product ID */
1188 AtaCopyIdStringUnsafe(InquiryData->ProductId,
1189 IdentifyData->ModelNumber,
1190 RTL_FIELD_SIZE(INQUIRYDATA, ProductId));
1191
1192 /* Product revision level */
1193 if (IdentifyData->FirmwareRevision[4] == ' ' &&
1194 IdentifyData->FirmwareRevision[5] == ' ' &&
1195 IdentifyData->FirmwareRevision[6] == ' ' &&
1196 IdentifyData->FirmwareRevision[7] == ' ')
1197 {
1198 Offset = 0;
1199 }
1200 else
1201 {
1202 Offset = 4;
1203 }
1205 &IdentifyData->FirmwareRevision[Offset],
1206 RTL_FIELD_SIZE(INQUIRYDATA, ProductRevisionLevel));
1207
1208 VersionDescriptor = &InquiryData->Reserved3[3];
1209
1210 /* SAM-5 (no version claimed) */
1211 *VersionDescriptor++ = 0x00;
1212 *VersionDescriptor++ = 0xA0;
1213
1214 /* SPC-5 (no version claimed) */
1215 *VersionDescriptor++ = 0x05;
1216 *VersionDescriptor++ = 0xC0;
1217
1218 /* SBC-4 (no version claimed) */
1219 *VersionDescriptor++ = 0x06;
1220 *VersionDescriptor++ = 0x00;
1221
1222 if (AtaDevHasIeee1667(IdentifyData))
1223 {
1224 /* IEEE 1667 (no version claimed) */
1225 *VersionDescriptor++ = 0xFF;
1226 *VersionDescriptor++ = 0xC0;
1227 }
1228
1229 if (IdentifyData->MajorRevision != 0xFFFF)
1230 {
1231 if (IdentifyData->MajorRevision & (1 << 8))
1232 {
1233 /* ATA/ATAPI-8 ATA8-ACS ATA/ATAPI Command Set (no version claimed) */
1234 *VersionDescriptor++ = 0x16;
1235 *VersionDescriptor++ = 0x23;
1236 }
1237 else if (IdentifyData->MajorRevision & (1 << 7))
1238 {
1239 if (IdentifyData->MinorRevision == 0x1D)
1240 {
1241 /* ATA/ATAPI-7 INCITS 397-2005 */
1242 *VersionDescriptor++ = 0x16;
1243 *VersionDescriptor++ = 0x1C;
1244 }
1245 else
1246 {
1247 /* ATA/ATAPI-7 (no version claimed) */
1248 *VersionDescriptor++ = 0x16;
1249 *VersionDescriptor++ = 0x00;
1250 }
1251 }
1252 else if (IdentifyData->MajorRevision & (1 << 6))
1253 {
1254 if (IdentifyData->MinorRevision == 0x22)
1255 {
1256 /* ATA/ATAPI-6 INCITS 361-2002 */
1257 *VersionDescriptor++ = 0x15;
1258 *VersionDescriptor++ = 0xFD;
1259 }
1260 else
1261 {
1262 /* ATA/ATAPI-6 (no version claimed) */
1263 *VersionDescriptor++ = 0x15;
1264 *VersionDescriptor++ = 0xE0;
1265 }
1266 }
1267 }
1268
1269 InquiryData->AdditionalLength =
1270 ((ULONG_PTR)VersionDescriptor - (ULONG_PTR)InquiryData) -
1271 RTL_SIZEOF_THROUGH_FIELD(INQUIRYDATA, AdditionalLength);
1272
1273 TRACE("VendorId: '%.*s'\n",
1274 RTL_FIELD_SIZE(INQUIRYDATA, VendorId), InquiryData->VendorId);
1275 TRACE("ProductId: '%.*s'\n",
1276 RTL_FIELD_SIZE(INQUIRYDATA, ProductId), InquiryData->ProductId);
1277 TRACE("ProductRevisionLevel: '%.*s'\n",
1278 RTL_FIELD_SIZE(INQUIRYDATA, ProductRevisionLevel), InquiryData->ProductRevisionLevel);
1279}
1280
1281static
1282ULONG
1287{
1288 PCDB Cdb = (PCDB)Srb->Cdb;
1289 PLUN_LIST LunList;
1290 ULONG Length, LunListLength;
1291
1292 Length = Cdb->REPORT_LUNS.AllocationLength[0] << 24 |
1293 Cdb->REPORT_LUNS.AllocationLength[1] << 16 |
1294 Cdb->REPORT_LUNS.AllocationLength[2] << 8 |
1295 Cdb->REPORT_LUNS.AllocationLength[3];
1296
1299
1300 LunList = DevExt->Device.LocalBuffer;
1301 LunListLength = RTL_FIELD_SIZE(LUN_LIST, Lun[0]);
1302
1303 RtlZeroMemory(LunList, sizeof(*LunList));
1304 LunList->LunListLength[0] = (UCHAR)(LunListLength >> 24);
1305 LunList->LunListLength[1] = (UCHAR)(LunListLength >> 16);
1306 LunList->LunListLength[2] = (UCHAR)(LunListLength >> 8);
1307 LunList->LunListLength[3] = (UCHAR)LunListLength;
1308
1309 return AtaReqCopySatlBuffer(Request, DevExt->Device.LocalBuffer, Length);
1310}
1311
1312static
1313ULONG
1316{
1317 PVPD_SUPPORTED_PAGES_PAGE SupportedPages = DevExt->Device.LocalBuffer;
1318 ULONG i = 0;
1319
1320 RtlZeroMemory(SupportedPages, sizeof(*SupportedPages));
1321 SupportedPages->SupportedPageList[i++] = VPD_SUPPORTED_PAGES;
1322 SupportedPages->SupportedPageList[i++] = VPD_SERIAL_NUMBER;
1323 SupportedPages->SupportedPageList[i++] = VPD_DEVICE_IDENTIFIERS;
1324 //SupportedPages->SupportedPageList[i++] = VPD_EXTENDED_INQUIRY_DATA; // TODO: Implement
1325 // SupportedPages->SupportedPageList[i++] = VPD_ATA_INFORMATION; // TODO: Implement
1326 SupportedPages->SupportedPageList[i++] = VPD_BLOCK_LIMITS;
1329 SupportedPages->PageLength = i;
1330
1331 return sizeof(*SupportedPages) + i;
1332}
1333
1334static
1335ULONG
1338{
1339 PVPD_SERIAL_NUMBER_PAGE SerialNumberPage = DevExt->Device.LocalBuffer;
1340
1343
1344 AtaCopyIdStringUnsafe(SerialNumberPage->SerialNumber,
1345 DevExt->IdentifyDeviceData.SerialNumber,
1347
1350}
1351
1352static
1353ULONG
1356{
1357 PVPD_IDENTIFICATION_PAGE DeviceIdentificationPage = DevExt->Device.LocalBuffer;
1359 UCHAR PageLength;
1360
1361 PageLength = FIELD_OFFSET(VPD_IDENTIFICATION_PAGE, Descriptors) +
1363
1364 if (AtaDevHasWorldWideName(&DevExt->IdentifyDeviceData))
1365 {
1366 PageLength += RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, WorldWideName);
1367 }
1368 else
1369 {
1370 PageLength += RTL_FIELD_SIZE(INQUIRYDATA, VendorId) +
1371 RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, ModelNumber) +
1373 }
1374
1375 RtlZeroMemory(DeviceIdentificationPage, PageLength);
1376 DeviceIdentificationPage->PageLength =
1377 PageLength - RTL_SIZEOF_THROUGH_FIELD(VPD_IDENTIFICATION_PAGE, PageLength);
1378
1379 Descriptor = (PVPD_IDENTIFICATION_DESCRIPTOR)&DeviceIdentificationPage->Descriptors[0];
1380
1381 if (AtaDevHasWorldWideName(&DevExt->IdentifyDeviceData))
1382 {
1383 /* NAA descriptor */
1384 Descriptor->CodeSet = VpdCodeSetBinary;
1385 Descriptor->IdentifierType = VpdIdentifierTypeFCPHName;
1386 Descriptor->IdentifierLength = RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, WorldWideName);
1387
1389 (PUCHAR)DevExt->IdentifyDeviceData.WorldWideName,
1390 RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, WorldWideName));
1391 }
1392 else
1393 {
1395
1396 /* T10 vendor ID based descriptor */
1397 Descriptor->CodeSet = VpdCodeSetAscii;
1398 Descriptor->IdentifierType = VpdIdentifierTypeVendorId;
1399 Descriptor->IdentifierLength = RTL_FIELD_SIZE(INQUIRYDATA, VendorId) +
1400 RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, ModelNumber) +
1402
1403 Identifier = &Descriptor->Identifier[0];
1404
1405 /* T10 vendor ID */
1408
1409 /* Model number field */
1411 DevExt->IdentifyDeviceData.ModelNumber,
1412 RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, ModelNumber));
1414
1415 /* Serial number field */
1417 DevExt->IdentifyDeviceData.SerialNumber,
1419 }
1420
1421 return PageLength + RTL_SIZEOF_THROUGH_FIELD(VPD_IDENTIFICATION_PAGE, PageLength);
1422}
1423
1424static
1425ULONG
1428{
1429 PVPD_BLOCK_LIMITS_PAGE BlockLimitsPage = DevExt->Device.LocalBuffer;
1430 USHORT PageLength;
1431
1432 PageLength = sizeof(*BlockLimitsPage) -
1434
1435 RtlZeroMemory(BlockLimitsPage, sizeof(*BlockLimitsPage));
1436 BlockLimitsPage->PageLength[0] = (UCHAR)(PageLength >> 8);
1437 BlockLimitsPage->PageLength[1] = (UCHAR)PageLength;
1438
1439 // TODO: Implement
1440#if 0
1441 if (AtaDevHasTrimFunction(&DevExt->IdentifyDeviceData))
1442 {
1443 BlockLimitsPage->MaximumUnmapLBACount[0] = 0;
1444 BlockLimitsPage->MaximumUnmapLBACount[1] = 0;
1445 BlockLimitsPage->MaximumUnmapLBACount[2] = 0;
1446 BlockLimitsPage->MaximumUnmapLBACount[4] = 0;
1447
1448 BlockLimitsPage->MaximumUnmapBlockDescriptorCount[0] = 0;
1449 BlockLimitsPage->MaximumUnmapBlockDescriptorCount[1] = 0;
1450 BlockLimitsPage->MaximumUnmapBlockDescriptorCount[2] = 0;
1451 BlockLimitsPage->MaximumUnmapBlockDescriptorCount[3] = 0;
1452 }
1453#endif
1454
1455 return sizeof(*BlockLimitsPage);
1456}
1457
1458static
1459ULONG
1462{
1463 PVPD_BLOCK_DEVICE_CHARACTERISTICS_PAGE Characteristics = DevExt->Device.LocalBuffer;
1464 USHORT MediumRotationRate;
1465
1466 RtlZeroMemory(Characteristics, sizeof(*Characteristics));
1467 Characteristics->PageLength =
1468 sizeof(*Characteristics) -
1470
1471 MediumRotationRate = AtaDevMediumRotationRate(&DevExt->IdentifyDeviceData);
1472 Characteristics->MediumRotationRateMsb = (UCHAR)(MediumRotationRate >> 8);
1473 Characteristics->MediumRotationRateLsb = (UCHAR)MediumRotationRate;
1474 Characteristics->NominalFormFactor = AtaDevNominalFormFactor(&DevExt->IdentifyDeviceData);
1475 Characteristics->ZONED = AtaDevZonedCapabilities(&DevExt->IdentifyDeviceData);
1476 return sizeof(*Characteristics);
1477}
1478
1479static
1480ULONG
1483{
1484 PVPD_LOGICAL_BLOCK_PROVISIONING_PAGE LogicalBlockProvisioningPage = DevExt->Device.LocalBuffer;
1485
1486 RtlZeroMemory(LogicalBlockProvisioningPage,
1487 FIELD_OFFSET(VPD_LOGICAL_BLOCK_PROVISIONING_PAGE, ProvisioningGroupDescr));
1488 LogicalBlockProvisioningPage->PageLength[1] =
1489 FIELD_OFFSET(VPD_LOGICAL_BLOCK_PROVISIONING_PAGE, ProvisioningGroupDescr) -
1491
1492 if (AtaDevHasTrimFunction(&DevExt->IdentifyDeviceData))
1493 {
1494 // TODO: Implement
1495#if 0
1496 LogicalBlockProvisioningPage->LBPU = 1; // UNMAP
1497 LogicalBlockProvisioningPage->LBPWS = 1; // WRITE SAME (16) + UNMAP
1498 LogicalBlockProvisioningPage->LBPWS10 = 1; // WRITE SAME (10) + UNMAP
1499#endif
1500
1501 if (AtaDevHasDratFunction(&DevExt->IdentifyDeviceData))
1502 LogicalBlockProvisioningPage->ANC_SUP = 1;
1503
1504 if (AtaDevHasRzatFunction(&DevExt->IdentifyDeviceData))
1505 LogicalBlockProvisioningPage->LBPRZ = 1;
1506 }
1507
1508 return FIELD_OFFSET(VPD_LOGICAL_BLOCK_PROVISIONING_PAGE, ProvisioningGroupDescr);
1509}
1510
1511static
1512UCHAR
1517{
1519 PCDB Cdb = (PCDB)Srb->Cdb;
1520 ULONG Length;
1521
1522 /* Return the standard INQUIRY data */
1523 if (!Cdb->CDB6INQUIRY3.EnableVitalProductData)
1524 {
1525 if (Cdb->CDB6INQUIRY3.PageCode != 0)
1527
1529 &DevExt->InquiryData,
1530 sizeof(DevExt->InquiryData));
1531 }
1532
1533 switch (Cdb->CDB6INQUIRY3.PageCode)
1534 {
1536 {
1538 break;
1539 }
1540 case VPD_SERIAL_NUMBER:
1541 {
1543 break;
1544 }
1546 {
1548 break;
1549 }
1551 {
1552 // TODO: Implement
1554 }
1556 {
1557 // TODO: Implement
1559 }
1560 case VPD_BLOCK_LIMITS:
1561 {
1563 break;
1564 }
1566 {
1568 break;
1569 }
1571 {
1573 break;
1574 }
1575
1576 default:
1578 }
1579
1580 /* Data bytes common to all VPD pages */
1581 Buffer = DevExt->Device.LocalBuffer;
1582 Buffer->DeviceType = DevExt->InquiryData.DeviceType;
1583 Buffer->DeviceTypeQualifier = DevExt->InquiryData.DeviceTypeQualifier;
1584 Buffer->PageCode = Cdb->CDB6INQUIRY3.PageCode;
1585
1586 return AtaReqCopySatlBuffer(Request, DevExt->Device.LocalBuffer, Length);
1587}
1588
1589static
1590UCHAR
1595{
1596 return SRB_STATUS_SUCCESS;
1597}
1598
1599static
1600UCHAR
1605{
1606 PCDB Cdb = (PCDB)Srb->Cdb;
1607
1608 if (AtaDevHasRemovableMediaFeature(&DevExt->IdentifyDeviceData))
1609 {
1610 if (Cdb->MEDIA_REMOVAL.Prevent)
1611 Request->TaskFile.Command = IDE_COMMAND_DOOR_LOCK;
1612 else
1613 Request->TaskFile.Command = IDE_COMMAND_DOOR_UNLOCK;
1614 return SRB_STATUS_PENDING;
1615 }
1616
1617 /* Pretend success */
1618 return SRB_STATUS_SUCCESS;
1619}
1620
1621static
1622UCHAR
1627{
1628 PCDB Cdb = (PCDB)Srb->Cdb;
1629
1630 if (Cdb->START_STOP.LoadEject)
1631 {
1632 Request->TaskFile.Command = IDE_COMMAND_MEDIA_EJECT;
1633 return SRB_STATUS_PENDING;
1634 }
1635
1636 /* Adding more handling will conflict with the power manager, assume success */
1637 return SRB_STATUS_SUCCESS;
1638}
1639
1640static
1641UCHAR
1646{
1647 SCSI_SENSE_CODE SenseCode;
1648
1649 SenseCode.SrbStatus = SRB_STATUS_SUCCESS;
1650 SenseCode.SenseKey = SCSI_SENSE_NO_SENSE;
1652 SenseCode.AdditionalSenseCodeQualifier = 0;
1653
1654 return AtaReqSetFixedSenseData(Srb, SenseCode);
1655}
1656
1657static
1658BOOLEAN
1660 _In_ PATA_TASKFILE TaskFile)
1661{
1662 switch (TaskFile->Command)
1663 {
1665 {
1666 if (TaskFile->Feature == IDE_FEATURE_SET_TRANSFER_MODE)
1667 return FALSE;
1668
1669 break;
1670 }
1671
1674 return FALSE;
1675
1676 // TODO: Anything else to check?
1677 default:
1678 break;
1679 }
1680
1681 return TRUE;
1682}
1683
1684static
1685VOID
1688 _In_ UCHAR SK,
1689 _In_ UCHAR ASK,
1690 _In_ UCHAR ASCQ)
1691{
1692 PATA_TASKFILE TaskFile = &Request->Output;
1694 PDESCRIPTOR_SENSE_DATA SenseData;
1697
1699
1701 BufferLength += sizeof(*Descriptor);
1703 return;
1704
1705 SenseData = Srb->SenseInfoBuffer;
1706 RtlZeroMemory(SenseData, BufferLength);
1707
1708 /* Descriptor format sense data */
1710 SenseData->SenseKey = SK;
1711 SenseData->AdditionalSenseCode = ASK;
1712 SenseData->AdditionalSenseCodeQualifier = ASCQ;
1713
1714 SenseData->AdditionalSenseLength =
1716
1717 /* ATA Status Return sense data descriptor */
1720 Descriptor->Header.AdditionalLength = 0x0C;
1721
1722 /* Return the 28-bit extended status */
1723 Descriptor->Error = TaskFile->Error;
1724 Descriptor->Device = TaskFile->DriveSelect;
1725 Descriptor->Status = TaskFile->Status;
1726 Descriptor->SectorCount7_0 = TaskFile->SectorCount;
1727 Descriptor->LbaLow7_0 = TaskFile->LowLba;
1728 Descriptor->LbaMid7_0 = TaskFile->MidLba;
1729 Descriptor->LbaHigh7_0 = TaskFile->HighLba;
1730 Descriptor->LbaLow15_8 = TaskFile->DriveSelect & 0x0F;
1731
1732 /* Return the 48-bit extended status */
1733 if (Request->Flags & REQUEST_FLAG_LBA48)
1734 {
1735 Descriptor->Extend = 1;
1736 Descriptor->SectorCount15_8 = TaskFile->SectorCountEx;
1737 Descriptor->LbaLow15_8 = TaskFile->LowLbaEx;
1738 Descriptor->LbaMid15_8 = TaskFile->MidLba;
1739 Descriptor->LbaHigh15_8 = TaskFile->HighLbaEx;
1740 }
1741
1742 Request->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID;
1743}
1744
1745static
1749{
1750 PCDB Cdb = (PCDB)Request->Srb->Cdb;
1751
1753 return COMPLETE_IRP;
1754
1755 if ((Cdb->ATA_PASSTHROUGH16.CkCond == 1) || (Request->SrbStatus != SRB_STATUS_SUCCESS))
1756 {
1757 UCHAR SK, ASK, ASCQ;
1758
1759 if (Request->SrbStatus != SRB_STATUS_SUCCESS)
1760 {
1761 AtaReqTranslateFixedError(Request, &SK, &ASK, &ASCQ);
1762 }
1763 else
1764 {
1768 }
1769
1770 AtaReqSetAtaStatusSenseData(Request, SK, ASK, ASCQ);
1771 }
1772
1773 return COMPLETE_IRP;
1774}
1775
1776static
1777UCHAR
1782{
1783 PATA_TASKFILE TaskFile = &Request->TaskFile;
1784 PCDB Cdb;
1785
1790
1791 Cdb = (PCDB)Srb->Cdb;
1792 switch (Cdb->ATA_PASSTHROUGH16.Protocol)
1793 {
1795 {
1796 /* Check for data transfer */
1797 if (Cdb->ATA_PASSTHROUGH16.TLength != 0)
1799 break;
1800 }
1801
1803 {
1804 /* Check for write operation */
1805 if (!Cdb->ATA_PASSTHROUGH16.TDir)
1807 break;
1808 }
1809
1811 {
1812 /* Check for read operation */
1813 if (Cdb->ATA_PASSTHROUGH16.TDir)
1815 break;
1816 }
1817
1821 {
1822 if (DevExt->Device.DeviceFlags & DEVICE_PIO_ONLY)
1824
1825 Request->Flags |= REQUEST_DMA_FLAGS;
1826 break;
1827 }
1828
1830 {
1831 if (!(DevExt->Device.DeviceFlags & DEVICE_NCQ))
1833
1834 /*
1835 * Do not set the REQUEST_FLAG_LBA48 flag.
1836 * We can get here even when the command is SCSIOP_ATA_PASSTHROUGH12.
1837 */
1839 break;
1840 }
1841
1842 default:
1844 }
1845
1846 /*
1847 * NOTE: We ignore the T_LENGTH field in the CDB
1848 * and use the DataTransferLength field instead.
1849 */
1852
1853 if (Srb->Cdb[0] == SCSIOP_ATA_PASSTHROUGH12)
1854 {
1855 TaskFile->Feature = Cdb->ATA_PASSTHROUGH12.Features;
1856 TaskFile->SectorCount = Cdb->ATA_PASSTHROUGH12.SectorCount;
1857 TaskFile->LowLba = Cdb->ATA_PASSTHROUGH12.LbaLow;
1858 TaskFile->MidLba = Cdb->ATA_PASSTHROUGH12.LbaMid;
1859 TaskFile->HighLba = Cdb->ATA_PASSTHROUGH12.LbaHigh;
1860 TaskFile->DriveSelect = Cdb->ATA_PASSTHROUGH12.Device;
1861 TaskFile->Command = Cdb->ATA_PASSTHROUGH12.Command;
1862 }
1863 else
1864 {
1865 TaskFile->Feature = Cdb->ATA_PASSTHROUGH16.Features7_0;
1866 TaskFile->SectorCount = Cdb->ATA_PASSTHROUGH16.SectorCount7_0;
1867 TaskFile->LowLba = Cdb->ATA_PASSTHROUGH16.LbaLow7_0;
1868 TaskFile->MidLba = Cdb->ATA_PASSTHROUGH16.LbaMid7_0;
1869 TaskFile->HighLba = Cdb->ATA_PASSTHROUGH16.LbaHigh7_0;
1870 TaskFile->DriveSelect = Cdb->ATA_PASSTHROUGH16.Device;
1871 TaskFile->Command = Cdb->ATA_PASSTHROUGH16.Command;
1872
1873 if (Cdb->ATA_PASSTHROUGH16.Extend)
1874 {
1875 TaskFile->FeatureEx = Cdb->ATA_PASSTHROUGH16.Features15_8;
1876 TaskFile->SectorCountEx = Cdb->ATA_PASSTHROUGH16.SectorCount15_8;
1877 TaskFile->LowLbaEx = Cdb->ATA_PASSTHROUGH16.LbaLow15_8;
1878 TaskFile->MidLbaEx = Cdb->ATA_PASSTHROUGH16.LbaMid15_8;
1879 TaskFile->HighLbaEx = Cdb->ATA_PASSTHROUGH16.LbaHigh15_8;
1880
1881 Request->Flags |= REQUEST_FLAG_LBA48;
1882 }
1883 }
1884
1885 if (!AtaReqFilterPassThrough(TaskFile))
1887
1888 /* We can set the unique queue tag only after having the slot allocation done */
1889 if (Request->Flags & REQUEST_FLAG_NCQ)
1890 TaskFile->SectorCount &= ~0xF8;
1891
1892 /* Set the master/slave bit to the correct value */
1893 TaskFile->DriveSelect &= ~IDE_DRIVE_SELECT_SLAVE;
1894 TaskFile->DriveSelect |= DevExt->Device.DeviceSelect & IDE_DRIVE_SELECT_SLAVE;
1895
1896 TRACE("TF: Send %02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
1897 TaskFile->Command,
1898 TaskFile->Feature,
1899 TaskFile->LowLba,
1900 TaskFile->MidLba,
1901 TaskFile->HighLba,
1902 TaskFile->DriveSelect,
1903 TaskFile->SectorCount);
1904
1906 return SRB_STATUS_PENDING;
1907}
1908
1909static
1910UCHAR
1915{
1916 switch (Srb->Cdb[0])
1917 {
1918 case SCSIOP_REPORT_LUNS:
1919 return AtaReqScsiReportLuns(DevExt, Request, Srb);
1920
1921 case SCSIOP_INQUIRY:
1922 return AtaReqScsiInquiry(DevExt, Request, Srb);
1923
1925 return AtaReqScsiTestUnitReady(DevExt, Request, Srb);
1926
1928 return AtaReqScsiMediumRemoval(DevExt, Request, Srb);
1929
1931 return AtaReqScsiStartStopUnit(DevExt, Request, Srb);
1932
1934 return AtaReqScsiRequestSense(DevExt, Request, Srb);
1935
1936 case SCSIOP_MODE_SENSE:
1938 return AtaReqScsiModeSense(DevExt,
1939 Request,
1940 Srb,
1941 (Srb->Cdb[0] == SCSIOP_MODE_SENSE));
1942
1943 case SCSIOP_MODE_SELECT:
1945 return AtaReqScsiModeSelect(DevExt,
1946 Request,
1947 Srb,
1948 (Srb->Cdb[0] == SCSIOP_MODE_SELECT));
1949
1951 {
1952 UCHAR ServiceAction = ((PCDB)Srb->Cdb)->READ_CAPACITY16.ServiceAction;
1953
1954 if (ServiceAction != SERVICE_ACTION_READ_CAPACITY16)
1955 break;
1956
1958 }
1960 return AtaReqScsiReadCapacity(DevExt, Request, Srb);
1961
1962 case SCSIOP_READ6:
1963 case SCSIOP_WRITE6:
1964 case SCSIOP_READ:
1965 case SCSIOP_WRITE:
1966 case SCSIOP_READ12:
1967 case SCSIOP_WRITE12:
1968 case SCSIOP_READ16:
1969 case SCSIOP_WRITE16:
1970 return AtaReqScsiReadWrite(DevExt, Request, Srb);
1971
1974 return AtaReqScsiSynchronizeCache(DevExt, Request, Srb);
1975
1976 case SCSIOP_VERIFY:
1977 case SCSIOP_VERIFY12:
1978 case SCSIOP_VERIFY16:
1979 return AtaReqScsiVerify(DevExt, Request, Srb);
1980
1983 return AtaReqScsiAtaPassThrough(DevExt, Request, Srb);
1984
1985 default:
1986 break;
1987 }
1988
1989 INFO("Unknown command %02x\n", Srb->Cdb[0]);
1990
1992}
1993
1994static
1995UCHAR
2000{
2001 /* Prepare a packet command */
2004
2007 !(DevExt->Device.DeviceFlags & DEVICE_PIO_ONLY) &&
2009 {
2010 Request->Flags |= REQUEST_DMA_FLAGS;
2011 }
2012
2014
2015 return SRB_STATUS_PENDING;
2016}
2017
2018static
2019UCHAR
2024{
2025 switch (Srb->Cdb[0])
2026 {
2029 return AtaReqScsiAtaPassThrough(DevExt, Request, Srb);
2030
2032 // FIXME: HACK NP21/W emulation bug
2033 if (IsNEC_98)
2035 break;
2036
2037 case SCSIOP_INQUIRY:
2038 if (DevExt->Device.DeviceFlags & DEVICE_CACHE_INQUIRY)
2039 {
2041 &DevExt->InquiryData,
2042 sizeof(DevExt->InquiryData));
2043 }
2044 break;
2045
2046 default:
2047 break;
2048 }
2049
2050 return AtaReqPreparePacketCommand(DevExt, Request, Srb);
2051}
2052
2053UCHAR
2058{
2059 if (IS_ATAPI(&DevExt->Device))
2060 return AtaReqExecuteScsiAtapi(DevExt, Request, Srb);
2061 else
2062 return AtaReqExecuteScsiAta(DevExt, Request, Srb);
2063}
#define PAGED_CODE()
#define CODE_SEG(...)
unsigned char BOOLEAN
Definition: actypes.h:127
@ Identifier
Definition: asmpp.cpp:95
#define IDE_GP_LOG_SECTOR_SIZE
Definition: ata.h:731
#define IDE_COMMAND_READ_DMA_EXT
Definition: ata.h:646
#define IDE_COMMAND_WRITE_EXT
Definition: ata.h:651
#define IDE_COMMAND_WRITE_FPDMA_QUEUED
Definition: ata.h:668
#define IDE_ERROR_CRC_ERROR
Definition: ata.h:638
#define IDE_COMMAND_WRITE_MULTIPLE_FUA_EXT
Definition: ata.h:690
#define IDE_COMMAND_WRITE_DMA_FUA_EXT
Definition: ata.h:655
#define IDE_LBA_MODE
Definition: ata.h:613
#define IDE_COMMAND_READ_MULTIPLE_EXT
Definition: ata.h:648
#define IDE_STATUS_DEVICE_FAULT
Definition: ata.h:624
#define IDE_COMMAND_WRITE_DMA_EXT
Definition: ata.h:652
#define IDE_COMMAND_VERIFY_EXT
Definition: ata.h:659
#define IDE_COMMAND_READ_LOG_EXT
Definition: ata.h:649
#define IDE_COMMAND_READ_FPDMA_QUEUED
Definition: ata.h:667
#define IDE_COMMAND_READ_EXT
Definition: ata.h:645
#define IDE_COMMAND_WRITE_MULTIPLE_EXT
Definition: ata.h:654
#define IDE_FEATURE_SET_TRANSFER_MODE
Definition: ata.h:718
#define IDE_COMMAND_SET_FEATURE
Definition: ata.h:702
#define IDE_ERROR_ADDRESS_NOT_FOUND
Definition: ata.h:630
ATA_COMPLETION_ACTION
Definition: ata_shared.h:148
@ COMPLETE_START_AGAIN
Definition: ata_shared.h:151
@ COMPLETE_IRP
Definition: ata_shared.h:149
#define REQUEST_FLAG_NCQ
Definition: ata_shared.h:284
#define REQUEST_FLAG_DATA_IN
Definition: ata_shared.h:287
#define REQUEST_FLAG_PASSTHROUGH
Definition: ata_shared.h:348
#define REQUEST_FLAG_EXCLUSIVE
Definition: ata_shared.h:324
#define REQUEST_FLAG_DATA_OUT
Definition: ata_shared.h:290
#define REQUEST_DMA_FLAGS
Definition: ata_shared.h:369
#define REQUEST_FLAG_SAVE_TASK_FILE
Definition: ata_shared.h:309
#define REQUEST_FLAG_POLL
Definition: ata_shared.h:353
#define REQUEST_FLAG_DMA
Definition: ata_shared.h:278
#define REQUEST_FLAG_FUA
Definition: ata_shared.h:306
#define REQUEST_FLAG_HAS_TASK_FILE
Definition: ata_shared.h:312
#define REQUEST_FLAG_READ_WRITE
Definition: ata_shared.h:303
#define ATA_MAX_SECTORS_PER_IO
Definition: ata_shared.h:25
#define DEVICE_PIO_ONLY
Definition: atapi.h:82
#define PORT_FLAG_NCQ
Definition: atapi.h:339
VOID AtaDeviceSetAddressingMode(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: enum.c:182
#define SRB_FLAG_PIO_RETRY
Definition: atapi.h:230
#define SRB_GET_FLAGS(Srb)
Definition: atapi.h:238
UCHAR AtaReqSetFixedSenseData(_In_ PSCSI_REQUEST_BLOCK Srb, _In_ SCSI_SENSE_CODE SenseCode)
Definition: scsi.c:411
VOID AtaReqSetLbaInformation(_In_ PSCSI_REQUEST_BLOCK Srb, _In_ ULONG64 Lba)
Definition: scsi.c:442
#define IDE_ERROR_WRITE_PROTECT
Definition: atapi.h:216
#define DEVICE_HAS_FUA
Definition: atapi.h:85
#define DEVICE_NCQ
Definition: atapi.h:86
struct _ATAPORT_IO_CONTEXT * PATAPORT_IO_CONTEXT
Definition: atapi.h:36
#define DEVICE_PIO_FOR_LBA48_XFER
Definition: atapi.h:95
#define IDE_DRIVE_SELECT_SLAVE
Definition: atapi.h:212
UCHAR AtaDeviceGetFlushCacheCommand(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_power.c:63
#define DEVICE_LBA48
Definition: atapi.h:84
BOOLEAN AtaReqAllocateMdl(_In_ PATA_DEVICE_REQUEST Request)
Definition: scsi.c:467
#define IDE_DEVICE_FUA_NCQ
Definition: atapi.h:222
#define DEVICE_LBA_MODE
Definition: atapi.h:83
#define DEVICE_DESCRIPTOR_SENSE
Definition: atapi.h:93
#define DEVICE_HAS_MEDIA_STATUS
Definition: atapi.h:87
FORCEINLINE BOOLEAN AtaPacketCommandUseDma(_In_ UCHAR OpCode)
Definition: atapi.h:613
#define DEVICE_PIO_VIA_DMA
Definition: atapi.h:94
#define DEVICE_CACHE_INQUIRY
Definition: atapi.h:96
PUCHAR AtaCopyIdStringUnsafe(_Out_writes_bytes_all_(Length) PUCHAR Destination, _In_reads_bytes_(Length) PUCHAR Source, _In_ ULONG Length)
Definition: enum.c:15
#define ATA_LOCAL_BUFFER_SIZE
Definition: atapi.h:205
#define IS_ATAPI(Device)
Definition: atapi.h:176
#define IDE_ERROR_END_OF_MEDIA
Definition: atapi.h:159
#define IDE_COMMAND_GET_MEDIA_STATUS
Definition: atapi.h:116
#define IDE_STATUS_ERROR
Definition: atapi.h:125
#define IDE_COMMAND_SET_DRIVE_PARAMETERS
Definition: atapi.h:108
#define IDE_COMMAND_WRITE_DMA
Definition: atapi.h:115
#define IDE_COMMAND_IDENTIFY
Definition: atapi.h:118
#define IDE_ERROR_COMMAND_ABORTED
Definition: atapi.h:158
#define IDE_COMMAND_WRITE_MULTIPLE
Definition: atapi.h:112
#define IDE_COMMAND_WRITE
Definition: atapi.h:105
#define IDE_COMMAND_VERIFY
Definition: atapi.h:106
#define IDE_ERROR_MEDIA_CHANGE
Definition: atapi.h:155
#define IDE_COMMAND_READ_MULTIPLE
Definition: atapi.h:111
#define IDE_COMMAND_READ_DMA
Definition: atapi.h:114
#define IDE_ERROR_MEDIA_CHANGE_REQ
Definition: atapi.h:157
#define IDE_COMMAND_MEDIA_EJECT
Definition: atapi.h:119
#define IDE_ERROR_DATA_ERROR
Definition: atapi.h:154
#define IDE_COMMAND_SET_MULTIPLE
Definition: atapi.h:113
#define IDE_COMMAND_READ
Definition: atapi.h:104
#define IDE_ERROR_ID_NOT_FOUND
Definition: atapi.h:156
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
_In_ ULONG _In_ UCHAR PageCode
Definition: cdrom.h:1317
#define SCSI_ADSENSE_ILLEGAL_BLOCK
Definition: cdrw_hw.h:1264
#define SCSISTAT_CHECK_CONDITION
Definition: cdrw_hw.h:1079
#define SCSIOP_MODE_SENSE10
Definition: cdrw_hw.h:946
#define SCSI_SENSE_NO_SENSE
Definition: cdrw_hw.h:1187
#define SCSIOP_INQUIRY
Definition: cdrw_hw.h:888
#define SCSIOP_REQUEST_SENSE
Definition: cdrw_hw.h:870
#define MODE_DSP_FUA_SUPPORTED
Definition: cdrw_hw.h:2522
#define SCSIOP_GET_CONFIGURATION
Definition: cdrw_hw.h:930
#define SCSIOP_TEST_UNIT_READY
Definition: cdrw_hw.h:866
#define SCSI_SENSE_DATA_PROTECT
Definition: cdrw_hw.h:1194
#define SCSI_ADSENSE_INVALID_CDB
Definition: cdrw_hw.h:1265
#define SCSI_ADSENSE_WRITE_PROTECT
Definition: cdrw_hw.h:1268
#define SCSIOP_WRITE6
Definition: cdrw_hw.h:876
#define SCSIOP_MEDIUM_REMOVAL
Definition: cdrw_hw.h:902
#define DIRECT_ACCESS_DEVICE
Definition: cdrw_hw.h:1144
#define SCSI_SENSE_MEDIUM_ERROR
Definition: cdrw_hw.h:1190
#define MODE_SENSE_SAVED_VALUES
Definition: cdrw_hw.h:862
#define SCSI_ADSENSE_ILLEGAL_COMMAND
Definition: cdrw_hw.h:1263
#define MODE_PAGE_CACHING
Definition: cdrw_hw.h:846
#define SCSIOP_VERIFY12
Definition: cdrw_hw.h:962
#define SCSIOP_READ_CAPACITY
Definition: cdrw_hw.h:904
#define SCSIOP_WRITE
Definition: cdrw_hw.h:906
#define SCSIOP_VERIFY
Definition: cdrw_hw.h:912
#define SCSIOP_READ6
Definition: cdrw_hw.h:874
#define MODE_SENSE_RETURN_ALL
Definition: cdrw_hw.h:857
#define SCSIOP_READ12
Definition: cdrw_hw.h:956
#define SCSI_SENSE_ILLEGAL_REQUEST
Definition: cdrw_hw.h:1192
#define SCSIOP_MODE_SENSE
Definition: cdrw_hw.h:896
#define SCSI_ADSENSE_NO_SENSE
Definition: cdrw_hw.h:1207
#define SCSI_SENSE_UNIT_ATTENTION
Definition: cdrw_hw.h:1193
#define SCSIOP_WRITE12
Definition: cdrw_hw.h:957
#define MODE_PAGE_ERROR_RECOVERY
Definition: cdrw_hw.h:842
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE
Definition: cdrw_hw.h:1221
#define SCSI_ADSENSE_MEDIUM_CHANGED
Definition: cdrw_hw.h:1288
#define MODE_PAGE_POWER_CONDITION
Definition: cdrw_hw.h:850
union _CDB * PCDB
#define MODE_DSP_WRITE_PROTECT
Definition: cdrw_hw.h:2523
#define SCSIOP_START_STOP_UNIT
Definition: cdrw_hw.h:897
#define SCSI_SENSE_HARDWARE_ERROR
Definition: cdrw_hw.h:1191
struct _MODE_PARAMETER_HEADER * PMODE_PARAMETER_HEADER
#define SCSI_SENSE_RECOVERED_ERROR
Definition: cdrw_hw.h:1188
#define SCSIOP_MODE_SELECT10
Definition: cdrw_hw.h:943
#define SCSIOP_READ
Definition: cdrw_hw.h:905
#define SCSIOP_MODE_SELECT
Definition: cdrw_hw.h:891
#define SCSI_SENSE_NOT_READY
Definition: cdrw_hw.h:1189
#define SCSI_SENSE_ABORTED_COMMAND
Definition: cdrw_hw.h:1198
#define SCSIOP_SYNCHRONIZE_CACHE
Definition: cdrw_hw.h:918
Definition: bufpool.h:45
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
Definition: classpnp.h:1315
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define RtlUlongByteSwap(_x)
Definition: compat.h:815
switch(r->id)
Definition: btrfs.c:3046
#define INFO
Definition: debug.h:89
#define ULONG_PTR
Definition: config.h:101
#define SCSIOP_READ16
Definition: scsi.h:914
#define SCSIOP_REPORT_LUNS
Definition: scsi.h:921
#define SCSIOP_VERIFY16
Definition: scsi.h:916
#define SCSIOP_WRITE16
Definition: scsi.h:915
#define SRB_STATUS_DATA_OVERRUN
Definition: srb.h:357
#define SRB_STATUS_PENDING
Definition: srb.h:340
#define SRB_STATUS_AUTOSENSE_VALID
Definition: srb.h:387
#define SRB_STATUS_ERROR
Definition: srb.h:344
#define SRB_FLAGS_UNSPECIFIED_DIRECTION
Definition: srb.h:403
#define SRB_STATUS_SUCCESS
Definition: srb.h:341
#define SRB_STATUS_INVALID_REQUEST
Definition: srb.h:346
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
Definition: glfuncs.h:248
#define REQUEST_FLAG_LBA48
Definition: hwidep.h:167
#define ATA_MAX_LBA_48
Definition: hwidep.h:50
FORCEINLINE BOOLEAN AtaCommandUseLba48(_In_ ULONG64 SectorNumber, _In_ ULONG SectorCount)
Definition: hwidep.h:386
#define REQUEST_FLAG_READ_WRITE_MULTIPLE
Definition: hwidep.h:168
#define ATA_MAX_LBA_28
Definition: hwidep.h:49
#define REQUEST_FLAG_PACKET_COMMAND
Definition: hwidep.h:169
#define REQUEST_FLAG_SET_DEVICE_REGISTER
Definition: hwidep.h:170
FORCEINLINE UCHAR AtaDevNominalFormFactor(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsReadLookAHeadEnabled(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasIeee1667(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasSmartFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevLogicalSectorsPerPhysicalSector(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PULONG Exponent)
FORCEINLINE UCHAR AtaDevZonedCapabilities(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasRzatFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasRemovableMediaFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasTrimFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasWorldWideName(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE USHORT AtaDevMediumRotationRate(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsRemovable(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsVolatileWriteCacheEnabled(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevLogicalSectorAlignment(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasDratFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define RTL_FIELD_SIZE(type, field)
Definition: kdb_expr.c:86
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
unsigned __int64 ULONG64
Definition: imports.h:198
@ HighPagePriority
Definition: imports.h:55
#define min(a, b)
Definition: monoChain.cc:55
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define UNREACHABLE
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:684
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
ULONG SectorCount
Definition: part_brfr.c:22
unsigned short USHORT
Definition: pedump.c:61
ULONG SerialNumber
Definition: rxce.c:117
#define __fallthrough
Definition: sal_old.h:314
UCHAR AtaReqTerminateInvalidFieldParameter(_In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:345
static ULONG AtaReqScsiInquirySerialNumber(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1336
static UCHAR AtaReadWriteCommand(_In_ PATA_DEVICE_REQUEST Request, _In_ PATAPORT_IO_CONTEXT Device)
Definition: satl.c:42
static const UCHAR AtapReadWriteCommandMap[12][2]
Definition: satl.c:14
static UCHAR AtaReqScsiMediumRemoval(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1601
static BOOLEAN AtaReqTranslateFixedError(_In_ PATA_DEVICE_REQUEST Request, _Out_ PUCHAR SK, _Out_ PUCHAR ASK, _Out_ PUCHAR ASCQ)
Definition: satl.c:163
static UCHAR AtaReqTerminateInvalidField(_In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:330
static UCHAR AtaReqScsiSynchronizeCache(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:667
static UCHAR AtaReqScsiReadWrite(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:567
UCHAR AtaReqExecuteScsi(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:2054
static ATA_COMPLETION_ACTION AtaReqCompleteAtaPassThrough(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:1747
static BOOLEAN AtaReqBuildLbaTaskFile(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ ULONG64 Lba, _In_ ULONG SectorCount)
Definition: satl.c:429
static ATA_COMPLETION_ACTION AtaReqCompleteModeSense(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:959
static ULONG AtaReqCachingModePage(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PVOID Buffer)
Definition: satl.c:920
static UCHAR AtaReqScsiStartStopUnit(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1623
static UCHAR AtaReqScsiAtaPassThrough(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1778
static ULONG AtaReqRwErrorRecoveryModePage(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PVOID Buffer)
Definition: satl.c:903
static ULONG AtaReqScsiInquiryBlockLimits(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1426
static ULONG AtaReqScsiInquiryBlockDeviceCharacteristics(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1460
VOID AtaReqBuildReadLogTaskFile(_In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR LogAddress, _In_ UCHAR PageNumber, _In_ USHORT LogPageCount)
Definition: satl.c:399
static ULONG AtaReqCopySatlBuffer(_In_ PATA_DEVICE_REQUEST Request, _In_ PVOID Buffer, _In_ ULONG Length)
Definition: satl.c:272
static UCHAR AtaReqExecuteScsiAta(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1911
static UCHAR AtaReqTerminateInvalidOpCode(_In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:315
static ATA_COMPLETION_ACTION AtaReqCompleteReadCapacity(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:748
static ULONG AtaReqScsiInquiryDeviceIdentifiers(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1354
static BOOLEAN AtaReqBuildIdentifyCommand(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:381
static ULONG AtaReqScsiInquirySupportedPages(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1314
static ULONG AtaReqScsiReportLuns(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1283
static VOID AtaReqSetAtaStatusSenseData(_In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR SK, _In_ UCHAR ASK, _In_ UCHAR ASCQ)
Definition: satl.c:1686
static UCHAR AtaReqScsiRequestSense(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1642
static ULONG AtaReqScsiInquiryLogicalBlockProvisioning(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1481
static UCHAR AtaReqScsiReadCapacity(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:839
UCHAR AtaReqSetFixedAtaSenseData(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:248
static UCHAR AtaReqPreparePacketCommand(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1996
static ULONG AtaReqInformationalExceptionsControlModePage(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PVOID Buffer)
Definition: satl.c:941
BOOLEAN AtaReqDmaTransferToPioTransfer(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:78
static ULONG AtaReqControlExtensionModePage(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PVOID Buffer)
Definition: satl.c:886
static ULONG64 AtaReqLbaFromTaskFile(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:119
static UCHAR AtaReqScsiInquiry(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1513
static UCHAR AtaReqTerminateInvalidRange(_In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:360
static ULONG AtaReqControlModePage(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PVOID Buffer)
Definition: satl.c:865
static UCHAR AtaReqExecuteScsiAtapi(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:2020
static UCHAR AtaReqScsiModeSense(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb, _In_ BOOLEAN Is6ByteCommand)
Definition: satl.c:1102
VOID AtaCreateStandardInquiryData(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: satl.c:1166
static UCHAR AtaReqScsiTestUnitReady(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:1591
static UCHAR AtaReqScsiVerify(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: satl.c:690
static UCHAR AtaReqScsiModeSelect(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ PSCSI_REQUEST_BLOCK Srb, _In_ BOOLEAN Is6ByteCommand)
Definition: satl.c:1154
static BOOLEAN AtaReqFilterPassThrough(_In_ PATA_TASKFILE TaskFile)
Definition: satl.c:1659
static BOOLEAN AtaReqBuildNcqReadWriteTaskFile(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ ULONG64 Lba, _In_ ULONG SectorCount)
Definition: satl.c:514
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
Definition: scratch.h:159
FORCEINLINE ULONG CdbGetTransferLength12(_In_ PCDB Cdb)
Definition: scsiex.h:140
FORCEINLINE ULONG CdbGetAllocationLength16(_In_ PCDB Cdb)
Definition: scsiex.h:119
FORCEINLINE ULONG CdbGetTransferLength16(_In_ PCDB Cdb)
Definition: scsiex.h:152
FORCEINLINE ULONG CdbGetLogicalBlockAddress6(_In_ PCDB Cdb)
Definition: scsiex.h:164
#define SCSI_ADSENSE_ADDRESS_MARK_NOT_FOUND_FOR_DATA_FIELD
Definition: scsiex.h:89
FORCEINLINE ULONG CdbGetLogicalBlockAddress10(_In_ PCDB Cdb)
Definition: scsiex.h:174
FORCEINLINE ULONG CdbGetLogicalBlockAddress12(_In_ PCDB Cdb)
Definition: scsiex.h:186
FORCEINLINE USHORT CdbGetTransferLength10(_In_ PCDB Cdb)
Definition: scsiex.h:130
FORCEINLINE ULONG64 CdbGetLogicalBlockAddress16(_In_ PCDB Cdb)
Definition: scsiex.h:198
#define SCSI_ADSENSE_INVALID_FIELD_PARAMETER_LIST
Definition: scsi.h:672
#define VPD_ATA_INFORMATION
Definition: scsi.h:2459
#define VPD_BLOCK_DEVICE_CHARACTERISTICS
Definition: scsi.h:2463
#define VPD_LOGICAL_BLOCK_PROVISIONING
Definition: scsi.h:2464
#define MODE_PAGE_CONTROL
Definition: scsi.h:202
#define SERVICE_ACTION_READ_CAPACITY16
Definition: scsi.h:474
#define VPD_EXTENDED_INQUIRY_DATA
Definition: scsi.h:2456
#define SCSIOP_SERVICE_ACTION_IN16
Definition: scsi.h:368
#define SCSI_SENSEQ_UNRECOVERED_READ_ERROR
Definition: scsi.h:765
#define MODE_PAGE_FAULT_REPORTING
Definition: scsi.h:218
#define SCSI_ADSENSE_UNRECOVERED_ERROR
Definition: scsi.h:658
#define SCSI_SESNEQ_COMM_CRC_ERROR
Definition: scsi.h:738
#define SCSI_ADSENSE_LUN_COMMUNICATION
Definition: scsi.h:653
struct _VPD_IDENTIFICATION_DESCRIPTOR * PVPD_IDENTIFICATION_DESCRIPTOR
#define VPD_SUPPORTED_PAGES
Definition: scsi.h:2450
#define SCSIOP_ATA_PASSTHROUGH12
Definition: scsi.h:373
#define VPD_BLOCK_LIMITS
Definition: scsi.h:2462
#define SCSI_SENSEQ_INTERNAL_TARGET_FAILURE
Definition: scsi.h:861
struct _SCSI_SENSE_DESCRIPTOR_ATA_STATUS_RETURN * PSCSI_SENSE_DESCRIPTOR_ATA_STATUS_RETURN
#define SCSI_SENSEQ_MEDIUM_REMOVAL
Definition: scsi.h:879
#define SCSI_SENSE_ERRORCODE_DESCRIPTOR_CURRENT
Definition: scsi.h:625
#define SCSIOP_SYNCHRONIZE_CACHE16
Definition: scsi.h:355
@ VpdIdentifierTypeVendorId
Definition: scsi.h:2502
@ VpdIdentifierTypeFCPHName
Definition: scsi.h:2504
#define SCSI_ADSENSE_OPERATOR_REQUEST
Definition: scsi.h:691
#define SCSIOP_ATA_PASSTHROUGH16
Definition: scsi.h:344
#define SCSI_SENSE_DESCRIPTOR_TYPE_ATA_STATUS_RETURN
Definition: scsi.h:639
#define SCSI_SENSEQ_LOGICAL_ADDRESS_OUT_OF_RANGE
Definition: scsi.h:786
#define SCSI_ADSENSE_INTERNAL_TARGET_FAILURE
Definition: scsi.h:687
_In_ UCHAR _Outptr_result_bytebuffer_ DescriptorBufferLength PVOID * DescriptorBuffer
Definition: scsi.h:3930
struct _FORMAT_DESCRIPTOR * PFORMAT_DESCRIPTOR
@ VpdCodeSetBinary
Definition: scsi.h:2487
@ VpdCodeSetAscii
Definition: scsi.h:2488
#define VPD_SERIAL_NUMBER
Definition: scsi.h:2451
#define VPD_DEVICE_IDENTIFIERS
Definition: scsi.h:2452
#define SRB_STATUS_INSUFFICIENT_RESOURCES
Definition: srb.h:142
#define TRACE(s)
Definition: solgame.cpp:4
#define ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_IN
Definition: sptilib.h:18
#define ATA_PASSTHROUGH_PROTOCOL_NON_DATA
Definition: sptilib.h:17
#define ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_IN
Definition: sptilib.h:23
#define ATA_PASSTHROUGH_PROTOCOL_NCQ
Definition: sptilib.h:25
#define ATA_PASSTHROUGH_PROTOCOL_PIO_DATA_OUT
Definition: sptilib.h:19
#define ATA_PASSTHROUGH_PROTOCOL_DMA
Definition: sptilib.h:20
#define ATA_PASSTHROUGH_PROTOCOL_UDMA_DATA_OUT
Definition: sptilib.h:24
#define SCSI_SENSEQ_ATA_PASS_THROUGH_INFORMATION_AVAILABLE
Definition: sptilib.h:33
Definition: shell.h:41
IDENTIFY_DEVICE_DATA IdentifyDeviceData
Definition: atapi.h:474
ATAPORT_IO_CONTEXT Device
Definition: atapi.h:457
ULONG DeviceFlags
Definition: atapi.h:81
ULONG64 TotalSectors
Definition: atapi.h:129
PVOID LocalBuffer
Definition: atapi.h:99
UCHAR SectorCountEx
Definition: ata_shared.h:200
UCHAR SectorCount
Definition: hwidep.h:151
UCHAR Feature
Definition: hwidep.h:150
UCHAR MidLba
LBA bits 8-15.
Definition: hwidep.h:153
UCHAR LowLbaEx
LBA bits 24-31.
Definition: ata_shared.h:195
UCHAR HighLba
LBA bits 16-23.
Definition: hwidep.h:154
UCHAR FeatureEx
Definition: ata_shared.h:198
UCHAR HighLbaEx
LBA bits 40-47.
Definition: ata_shared.h:197
UCHAR Command
Definition: hwidep.h:147
UCHAR DriveSelect
Definition: hwidep.h:146
UCHAR LowLba
LBA bits 0-7.
Definition: hwidep.h:152
UCHAR MidLbaEx
LBA bits 32-39.
Definition: ata_shared.h:196
UCHAR AdditionalSenseLength
Definition: scsi.h:2779
UCHAR DescriptorBuffer[ANYSIZE_ARRAY]
Definition: scsi.h:2780
UCHAR AdditionalSenseCodeQualifier
Definition: scsi.h:2777
UCHAR AdditionalSenseCode
Definition: scsi.h:2776
UCHAR BlockLength[3]
Definition: scsi.h:2152
UCHAR FirmwareRevision[8]
Definition: ata.h:25
USHORT MajorRevision
Definition: ata.h:138
UCHAR ModelNumber[40]
Definition: ata.h:26
USHORT MinorRevision
Definition: ata.h:139
UCHAR Versions
Definition: cdrw_hw.h:1120
UCHAR CommandQueue
Definition: cdrw_hw.h:1125
UCHAR RemovableMedia
Definition: cdrw_hw.h:1119
UCHAR ProductId[16]
Definition: cdrw_hw.h:1133
UCHAR ProductRevisionLevel[4]
Definition: cdrw_hw.h:1134
UCHAR VendorId[8]
Definition: cdrw_hw.h:1132
UCHAR ResponseDataFormat
Definition: cdrw_hw.h:1121
UCHAR DeviceType
Definition: cdrw_hw.h:1116
UCHAR AdditionalLength
Definition: cdrw_hw.h:1122
UCHAR Reserved3[40]
Definition: cdrw_hw.h:1136
UCHAR PageLength
Definition: scsi.h:3435
UCHAR BusyTimeoutPeriod[2]
Definition: scsi.h:3458
UCHAR QueueAlgorithmModifier
Definition: scsi.h:3445
UCHAR PageCode
Definition: scsi.h:3432
UCHAR LogicalPerPhysicalExponent
Definition: scsi.h:2809
UCHAR LowestAlignedBlock_MSB
Definition: scsi.h:2811
UCHAR LowestAlignedBlock_LSB
Definition: scsi.h:2814
ULONGLONG LogicalBlockAddress
Definition: scsi.h:1431
ULONG LogicalBlockAddress
Definition: cdrw_hw.h:1471
UCHAR SenseInfoBufferLength
Definition: srb.h:259
PVOID DataBuffer
Definition: srb.h:263
UCHAR Cdb[16]
Definition: srb.h:279
PVOID SenseInfoBuffer
Definition: srb.h:264
UCHAR ScsiStatus
Definition: srb.h:252
ULONG DataTransferLength
Definition: srb.h:261
ULONG SrbFlags
Definition: srb.h:260
UCHAR MaximumUnmapLBACount[4]
Definition: scsi.h:2586
UCHAR MaximumUnmapBlockDescriptorCount[4]
Definition: scsi.h:2587
UCHAR PageLength[2]
Definition: scsi.h:2577
UCHAR Descriptors[0]
Definition: scsi.h:2529
UCHAR SerialNumber[0]
Definition: scsi.h:2482
UCHAR SupportedPageList[0]
Definition: scsi.h:2679
#define MAXULONG
Definition: typedefs.h:251
unsigned char UCHAR
Definition: typedefs.h:53
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define IDE_COMMAND_DOOR_UNLOCK
Definition: atapi.h:394
#define IDE_COMMAND_DOOR_LOCK
Definition: atapi.h:393
Definition: cdrw_hw.h:28
struct _CDB::_CDB10 CDB10
struct _CDB::_MEDIA_REMOVAL MEDIA_REMOVAL
UCHAR AsByte[16]
Definition: scsi.h:2034
struct _CDB::_CDB6INQUIRY3 CDB6INQUIRY3
struct _CDB::_CDB12 CDB12
struct _CDB::_VERIFY16 VERIFY16
struct _CDB::_ATA_PASSTHROUGH16 ATA_PASSTHROUGH16
struct _CDB::_START_STOP START_STOP
struct _CDB::_MODE_SENSE MODE_SENSE
struct _CDB::_REPORT_LUNS REPORT_LUNS
struct _CDB::_CDB16 CDB16
struct _CDB::_ATA_PASSTHROUGH12 ATA_PASSTHROUGH12
UCHAR SenseKey
Definition: scsiex.h:17
UCHAR AdditionalSenseCodeQualifier
Definition: scsiex.h:19
UCHAR SrbStatus
Definition: scsiex.h:16
UCHAR AdditionalSenseCode
Definition: scsiex.h:18
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
#define IsNEC_98
Definition: ketypes.h:963
#define MmGetMdlVirtualAddress(_Mdl)
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define RtlUlonglongByteSwap(_x)
Definition: rtlfuncs.h:3216