27#if defined(SARCH_PC98)
29#elif defined(SARCH_XBOX)
32 0x1F0, 0x170, 0x1E8, 0x168
35#define CHANNEL_MAX_CHANNELS RTL_NUMBER_OF(AtapChannelBaseArray)
47#if defined(SARCH_PC98)
71 IdeStatus =
ATA_READ(Registers->Status);
75 if (IdeStatus == 0xFF)
90#if defined(ATA_SUPPORT_32_BIT_IO)
93 DeviceUnit->CdbSize /
sizeof(
USHORT));
109#if defined(ATA_SUPPORT_32_BIT_IO)
113 (
PULONG)DeviceUnit->DataBuffer,
120 (
PUSHORT)DeviceUnit->DataBuffer,
125 DeviceUnit->BytesToTransfer -=
ByteCount;
142 ATA_WRITE(Registers->ByteCountLow, 0xAA);
143 ATA_WRITE(Registers->ByteCountLow, 0x55);
144 ATA_WRITE(Registers->ByteCountLow, 0xAA);
145 if (
ATA_READ(Registers->ByteCountLow) == 0xAA)
174 for (
i = 0;
i < 0x10000 /
sizeof(
USHORT); ++
i)
176 IdeStatus =
ATA_READ(Registers->Status);
192 ERR(
"Reset device at %X:%u\n", Registers->
Data, DeviceUnit->DeviceNumber);
221 UCHAR InterruptReason;
223 InterruptReason =
ATA_READ(DeviceUnit->Registers.InterruptReason);
234 IdeStatus =
AtapWait(&DeviceUnit->Registers,
239 InterruptReason =
ATA_READ(DeviceUnit->Registers.InterruptReason);
244 switch (InterruptReason)
251 Request->Flags &= ~REQUEST_FLAG_AWAIT_CDB;
320 IdeStatus =
AtapWait(&DeviceUnit->Registers,
331 if (DeviceUnit->BytesToTransfer != 0)
335 IdeStatus =
AtapWait(&DeviceUnit->Registers,
373 UCHAR OldInterruptReason, NewInterruptReason;
376 OldInterruptReason =
ATA_READ(DeviceUnit->Registers.InterruptReason);
381 NewInterruptReason =
ATA_READ(DeviceUnit->Registers.InterruptReason);
382 if (NewInterruptReason != OldInterruptReason)
433 ATA_WRITE(DeviceUnit->Registers.Features, TaskFile->
Data[
i].Feature);
434 ATA_WRITE(DeviceUnit->Registers.SectorCount, TaskFile->
Data[
i].SectorCount);
435 ATA_WRITE(DeviceUnit->Registers.LbaLow, TaskFile->
Data[
i].LowLba);
436 ATA_WRITE(DeviceUnit->Registers.LbaMid, TaskFile->
Data[
i].MidLba);
437 ATA_WRITE(DeviceUnit->Registers.LbaHigh, TaskFile->
Data[
i].HighLba);
447 BlockCount = DeviceUnit->MultiSectorTransfer;
450 DeviceUnit->DrqByteCount = BlockCount * DeviceUnit->P.SectorSize;
459 UCHAR IdeStatus, AtaStatus;
461 DeviceUnit->BytesToTransfer =
Request->DataTransferLength;
462 DeviceUnit->DataBuffer =
Request->DataBuffer;
501 Request->DataBuffer = SenseData;
502 Request->DataTransferLength =
sizeof(*SenseData);
519 ERR(
"SK %02X, ASC %02X, ASCQ %02X\n",
535 for (RetryCount = 0; RetryCount < 3; ++RetryCount)
544 ERR(
"ATA%s command %02X failed %u %02X:%02X at %X:%u\n",
549 ATA_READ(DeviceUnit->Registers.Status),
550 ATA_READ(DeviceUnit->Registers.Error),
551 DeviceUnit->Registers.Data,
552 DeviceUnit->DeviceNumber);
572 if (
ATA_READ(DeviceUnit->Registers.Status) == 0)
607 static const UCHAR AtapReadCommandMap[2][2] =
631 if (DeviceUnit->MultiSectorTransfer != 0)
642 TaskFile->
Data[0].MidLba = (
UCHAR)(Lba >> 8);
643 TaskFile->
Data[0].HighLba = (
UCHAR)(Lba >> 16);
651 TaskFile->
Data[1].LowLba = (
UCHAR)(Lba >> 24);
652 TaskFile->
Data[1].MidLba = (
UCHAR)(Lba >> 32);
653 TaskFile->
Data[1].HighLba = (
UCHAR)(Lba >> 40);
662 DriveSelect |= ((Lba >> 24) & 0x0F);
667 ULONG ChsTemp, Cylinder, Head, Sector;
669 ChsTemp = (
ULONG)Lba / DeviceUnit->P.SectorsPerTrack;
672 Cylinder = ChsTemp / DeviceUnit->P.Heads;
673 Head = ChsTemp % DeviceUnit->P.Heads;
674 Sector = ((
ULONG)Lba % DeviceUnit->P.SectorsPerTrack) + 1;
676 ASSERT(Cylinder <= 65535 && Head <= 15 && Sector <= 255);
679 TaskFile->
Data[0].LowLba = (
UCHAR)Sector;
680 TaskFile->
Data[0].MidLba = (
UCHAR)Cylinder;
681 TaskFile->
Data[0].HighLba = (
UCHAR)(Cylinder >> 8);
685 TaskFile->
DriveSelect = DeviceUnit->DeviceSelect | DriveSelect;
741 if (IdeStatus == 0xFF || IdeStatus == 0x7F)
758 ERR(
"Device %X:%u is busy %02x\n", Registers->
Data, DeviceUnit->DeviceNumber, IdeStatus);
780 Request.DataTransferLength =
sizeof(*Id);
820 Request.DataBuffer = CapacityData;
821 Request.DataTransferLength =
sizeof(*CapacityData);
824 Request.Cdb[13] =
sizeof(*CapacityData);
839 Request.DataBuffer = CapacityData;
840 Request.DataTransferLength =
sizeof(*CapacityData);
877 *TotalSectors = LastLba + 1;
984 for (
i = 0;
i < 5; ++
i)
1011 for (
i = 4;
i > 0;
i--)
1018 ERR(
"Device not ready\n");
1024 &DeviceUnit->P.TotalSectors,
1025 &DeviceUnit->P.SectorSize);
1026 if (DeviceUnit->P.SectorSize == 0 || DeviceUnit->P.TotalSectors == 0)
1028 TRACE(
"No media found\n");
1032 DeviceUnit->P.Cylinders =
MAXULONG;
1034 DeviceUnit->P.SectorsPerTrack =
MAXULONG;
1036 DeviceUnit->MaximumTransferLength = 0xFFFF;
1048#if !defined(ATA_ENABLE_MULTIPLE_MODE)
1051 if (DeviceUnit->MultiSectorTransfer != 0)
1057 if (DeviceUnit->MultiSectorTransfer == 0)
1061 Request.TaskFile.Data[0].SectorCount = DeviceUnit->MultiSectorTransfer;
1064 DeviceUnit->MultiSectorTransfer = 0;
1077 DeviceUnit->MaximumTransferLength = 0xFF;
1096 DeviceUnit->MaximumTransferLength = 0x10000;
1111 if (TotalSectors == 0)
1113 ERR(
"Unknown geometry\n");
1117 DeviceUnit->P.TotalSectors = TotalSectors;
1118 DeviceUnit->P.Cylinders = Cylinders;
1119 DeviceUnit->P.Heads = Heads;
1122 ASSERT(DeviceUnit->P.SectorSize >= 512);
1123 DeviceUnit->P.SectorSize =
max(DeviceUnit->P.SectorSize, 512);
1127 TRACE(
"Multiple sector setting %u\n", DeviceUnit->MultiSectorTransfer);
1144 ERR(
"Identify data CRC error\n");
1153 if (
Id->ModelNumber[0] ==
'N' &&
1154 Id->ModelNumber[1] ==
'E' &&
1155 Id->ModelNumber[2] ==
'C' &&
1156 Id->ModelNumber[3] ==
' ')
1163 for (
i = 0;
i <
sizeof(
Id->SerialNumber) / 2; ++
i)
1166 for (
i = 0;
i <
sizeof(
Id->FirmwareRevision) / 2; ++
i)
1169 for (
i = 0;
i <
sizeof(
Id->ModelNumber) / 2; ++
i)
1172 TRACE(
"MN '%.*s'\n",
sizeof(
Id->ModelNumber),
Id->ModelNumber);
1173 TRACE(
"FR '%.*s'\n",
sizeof(
Id->FirmwareRevision),
Id->FirmwareRevision);
1174 TRACE(
"S/N '%.*s'\n",
sizeof(
Id->SerialNumber),
Id->SerialNumber);
1203#if defined(SARCH_PC98)
1208#if defined(SARCH_PC98)
1210 Registers->Control = 0x74C;
1213 Registers->Control = IoBase + 0x206;
1215 Registers->Data = IoBase + 0 * Spare;
1216 Registers->Error = IoBase + 1 * Spare;
1217 Registers->SectorCount = IoBase + 2 * Spare;
1218 Registers->LbaLow = IoBase + 3 * Spare;
1219 Registers->LbaMid = IoBase + 4 * Spare;
1220 Registers->LbaHigh = IoBase + 5 * Spare;
1221 Registers->Device = IoBase + 6 * Spare;
1222 Registers->Status = IoBase + 7 * Spare;
1250 Request.DataTransferLength = BlockCount *
Unit->P.SectorSize;
1260 SectorNumber += BlockCount;
1283 ULONG ChannelNumber;
1306 ERR(
"Failed to allocate device unit!\n");
1327 TRACE(
"Total sectors %I64u of size %lu, CHS %lu:%lu:%lu, %lx\n",
1335 AtapUnits[(*DetectedCount)++] = DeviceUnit;
1343 return (*DetectedCount > 0);
#define IDE_COMMAND_READ_MULTIPLE_EXT
#define IDE_STATUS_DEVICE_FAULT
#define IDE_COMMAND_READ_EXT
#define IDE_COMMAND_ATAPI_IDENTIFY
#define IDE_DC_RESET_CONTROLLER
#define IDE_COMMAND_IDENTIFY
#define IDE_COMMAND_READ_MULTIPLE
#define IDE_COMMAND_ATAPI_PACKET
#define IDE_COMMAND_SET_MULTIPLE
#define IDE_DC_DISABLE_INTERRUPTS
#define DBG_DEFAULT_CHANNEL(ch)
VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
#define SCSI_ADSENSE_LUN_NOT_READY
#define SCSIOP_REQUEST_SENSE
#define SCSIOP_TEST_UNIT_READY
#define SCSIOP_READ_CAPACITY
#define SCSI_SENSEQ_BECOMING_READY
#define SCSI_SENSE_UNIT_ATTENTION
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE
#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED
#define SCSI_SENSE_NOT_READY
#define SCSI_ADSENSE_BUS_RESET
_In_ PCHAR _In_ ULONG DeviceNumber
#define RtlUlongByteSwap(_x)
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
USHORT NTAPI READ_PORT_USHORT(IN PUSHORT Port)
static PHW_DEVICE_UNIT AtapUnits[CHANNEL_MAX_CHANNELS *CHANNEL_MAX_DEVICES]
static VOID AtapPioDataIn(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ ULONG ByteCount)
static BOOLEAN AtapAtapiReadyCheck(_In_ PHW_DEVICE_UNIT DeviceUnit)
static BOOLEAN AtapAtapiHandleError(_In_ PHW_DEVICE_UNIT DeviceUnit)
static BOOLEAN AtapIsDevicePresent(_In_ PHW_DEVICE_UNIT DeviceUnit)
static VOID AtapLoadTaskFile(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request)
static UCHAR AtapProcessAtapiRequest(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR IdeStatus)
static BOOLEAN AtapWaitForRegisterAccess(_In_ PIDE_REGISTERS Registers, _In_range_(0, 3) UCHAR DeviceNumber)
PDEVICE_UNIT AtaGetDevice(_In_ UCHAR UnitNumber)
static BOOLEAN AtapAtapiReadToc(_In_ PHW_DEVICE_UNIT DeviceUnit)
#define CHANNEL_MAX_CHANNELS
static VOID AtapSelectDevice(_In_ PIDE_REGISTERS Registers, _In_range_(0, 3) UCHAR DeviceNumber)
static VOID AtapSoftwareReset(_In_ PIDE_REGISTERS Registers)
static VOID AtapAtapiDetectCapacity(_In_ PHW_DEVICE_UNIT DeviceUnit, _Out_ PULONG64 TotalSectors, _Out_ PULONG SectorSize)
static BOOLEAN AtapAtapiReadCapacity10(_In_ PHW_DEVICE_UNIT DeviceUnit, _Out_ PREAD_CAPACITY_DATA CapacityData)
static BOOLEAN AtapAtapiRequestSense(_In_ PHW_DEVICE_UNIT DeviceUnit, _Out_ PSENSE_DATA SenseData)
static UCHAR AtapSendCommand(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request)
static BOOLEAN AtapIdentifyChannel(_In_ ULONG ChannelNumber, _Out_ PIDE_REGISTERS Registers)
static VOID AtapBuildReadPacketCommand(_In_ PATA_DEVICE_REQUEST Request, _In_ ULONG64 Lba, _In_ ULONG SectorCount)
static VOID AtapBuildReadTaskFile(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request, _In_ ULONG64 Lba, _In_ ULONG SectorCount)
static UCHAR AtapProcessAtaRequest(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR IdeStatus)
static BOOLEAN AtapAtaInitDevice(_In_ PHW_DEVICE_UNIT DeviceUnit)
static BOOLEAN AtapReadIdentifyData(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ UCHAR Command)
static BOOLEAN AtapIssueCommand(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request)
static UCHAR AtapWait(_In_ PIDE_REGISTERS Registers, _In_range_(>, 0) ULONG Timeout, _In_ UCHAR Mask, _In_ UCHAR Value)
static VOID AtapDrainDeviceBuffer(_In_ PIDE_REGISTERS Registers)
static VOID AtapSendCdb(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request)
static VOID AtapAtaSetMultipleMode(_In_ PHW_DEVICE_UNIT DeviceUnit)
static BOOLEAN AtapAtapiReadCapacity16(_In_ PHW_DEVICE_UNIT DeviceUnit, _Out_ PREAD_CAPACITY16_DATA CapacityData)
static BOOLEAN AtapAnalyzeIdentifyData(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ ATA_DEVICE_CLASS DeviceClass)
static UCHAR AtapProcessRequest(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR IdeStatus)
static VOID AtapAtapiClearUnitAttention(_In_ PHW_DEVICE_UNIT DeviceUnit)
static UCHAR AtapGetReadCommand(_In_ PATA_DEVICE_REQUEST Request)
static BOOLEAN AtapAtapiInitDevice(_In_ PHW_DEVICE_UNIT DeviceUnit)
static VOID AtapAtapiBuildRequestSense(_In_ PATA_DEVICE_REQUEST Request, _Out_ PSENSE_DATA SenseData)
static BOOLEAN AtapAtapiTestUnitReady(_In_ PHW_DEVICE_UNIT DeviceUnit)
static const IDE_REG AtapChannelBaseArray[]
BOOLEAN AtaInit(_Out_ PUCHAR DetectedCount)
static VOID AtapIssuePacketCommand(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request)
static BOOLEAN AtapInitDevice(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ ATA_DEVICE_CLASS DeviceClass)
BOOLEAN AtaReadLogicalSectors(_In_ PDEVICE_UNIT DeviceUnit, _In_ ULONG64 SectorNumber, _In_ ULONG SectorCount, _Out_writes_bytes_all_(SectorCount *DeviceUnit->SectorSize) PVOID Buffer)
static ATA_DEVICE_CLASS AtapIdentifyDevice(_In_ PHW_DEVICE_UNIT DeviceUnit)
static BOOLEAN AtapPerformSoftwareReset(_In_ PHW_DEVICE_UNIT DeviceUnit)
#define ATA_DEVICE_IS_NEC_CDR260
#define REQUEST_FLAG_AWAIT_CDB
FORCEINLINE VOID AtaDevDefaultChsTranslation(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PUSHORT Cylinders, _Out_ PUSHORT Heads, _Out_ PUSHORT SectorsPerTrack)
FORCEINLINE ULONG AtaDevBytesPerLogicalSector(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define ATAPI_INT_REASON_STATUS_NEC
#define REQUEST_FLAG_LBA48
#define MAXIMUM_CDROM_SIZE
enum _ATA_DEVICE_CLASS ATA_DEVICE_CLASS
struct _HW_DEVICE_UNIT * PHW_DEVICE_UNIT
#define ATA_WRITE_BLOCK_16(Port, Buffer, Count)
FORCEINLINE BOOLEAN AtaDevIsIdentifyDataValid(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevCurrentSectorsPerDrq(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaCommandUseLba48(_In_ ULONG64 SectorNumber, _In_ ULONG SectorCount)
#define ATA_TIME_DRQ_ASSERT
150 us
#define ATAPI_INT_REASON_IO
#define ATAPI_INT_REASON_COD
FORCEINLINE BOOLEAN AtaDevHas48BitAddressFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define ATA_TIME_BUSY_RESET
10 s
FORCEINLINE ULONG64 AtaDevUserAddressableSectors48Bit(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define ATA_TIME_BUSY_POLL
5 s
#define REQUEST_FLAG_READ_COMMAND
#define REQUEST_FLAG_IDENTIFY_COMMAND
#define ATA_TIME_BUSY_ENUM
1 ms
FORCEINLINE BOOLEAN AtaDevHasLbaTranslation(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define ATAPI_INT_REASON_STATUS
#define REQUEST_FLAG_READ_WRITE_MULTIPLE
#define ATAPI_INT_REASON_MASK
FORCEINLINE ULONG AtaDevUserAddressableSectors28Bit(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevMaximumSectorsPerDrq(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define REQUEST_FLAG_PACKET_COMMAND
#define CHANNEL_MAX_DEVICES
#define ATA_TIME_DRQ_CLEAR
10 ms
#define ATA_WRITE(Port, Value)
#define ATAPI_INT_REASON_AWAIT_CDB
#define ATA_READ_BLOCK_16(Port, Buffer, Count)
#define ATA_TIME_RESET_SELECT
2 s
#define DEV_SLAVE(DeviceNumber)
#define ATA_READ_BLOCK_32(Port, Buffer, Count)
#define ATAPI_INT_REASON_DATA_IN
#define ATA_TIME_BUSY_SELECT
20 ms
FORCEINLINE BOOLEAN AtaDevIsCurrentGeometryValid(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define REQUEST_FLAG_SET_DEVICE_REGISTER
FORCEINLINE VOID AtaDevCurrentChsTranslation(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PUSHORT Cylinders, _Out_ PUSHORT Heads, _Out_ PUSHORT SectorsPerTrack)
#define ATA_STATUS_PENDING
#define ATA_STATUS_SUCCESS
#define ATA_WRITE_BLOCK_32(Port, Buffer, Count)
FORCEINLINE UCHAR AtaDevCdbSizeInWords(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
unsigned __int64 * PULONG64
#define _Out_writes_bytes_all_(s)
VOID StallExecutionProcessor(ULONG Microseconds)
#define SERVICE_ACTION_READ_CAPACITY16
#define READ_TOC_FORMAT_SESSION
#define SCSIOP_SERVICE_ACTION_IN16
struct _ATA_TASKFILE::@186 Data[2]
Data structure for the ATA device.
UCHAR AdditionalSenseCode
UCHAR AdditionalSenseCodeQualifier
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_In_ ULONG _In_ ULONG SectorsPerTrack
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount
#define RtlUlonglongByteSwap(_x)
#define RtlUshortByteSwap(_x)