27#if defined(SARCH_PC98)
29#elif defined(SARCH_XBOX)
32 0x1F0, 0x170, 0x1E8, 0x168
35#define CHANNEL_MAX_CHANNELS RTL_NUMBER_OF(AtapChannelBaseArray)
41#if defined(ATA_SUPPORT_32_BIT_IO)
45AtapIs32BitIoSupported(
48#if defined(ATA_ALWAYS_DO_32_BIT_IO)
62#if defined(SARCH_PC98)
85 IdeStatus =
ATA_READ(Registers->Status);
93 if (IdeStatus == 0xFF)
115 IdeStatus =
ATA_READ(Registers->Status);
135#if defined(ATA_SUPPORT_32_BIT_IO)
136 if (AtapIs32BitIoSupported(DeviceUnit))
140 DeviceUnit->CdbSize /
sizeof(
USHORT));
147 DeviceUnit->CdbSize);
163 UCHAR InterruptReason =
ATA_READ(DeviceUnit->Registers.InterruptReason);
180#if defined(ATA_SUPPORT_32_BIT_IO)
181 if (AtapIs32BitIoSupported(DeviceUnit))
184 (
PULONG)DeviceUnit->DataBuffer,
191 (
PUSHORT)DeviceUnit->DataBuffer,
196 DeviceUnit->BytesToTransfer -=
ByteCount;
213 ATA_WRITE(Registers->ByteCountLow, 0xAA);
214 ATA_WRITE(Registers->ByteCountLow, 0x55);
215 ATA_WRITE(Registers->ByteCountLow, 0xAA);
216 if (
ATA_READ(Registers->ByteCountLow) == 0xAA)
243 ERR(
"Reset device at %X:%u\n", Registers->
Data, DeviceUnit->DeviceNumber);
269 UCHAR InterruptReason;
271 InterruptReason =
ATA_READ(DeviceUnit->Registers.InterruptReason);
275 switch (InterruptReason)
282 Request->Flags &= ~REQUEST_FLAG_AWAIT_CDB;
350 if (DeviceUnit->BytesToTransfer != 0)
415 ATA_WRITE(DeviceUnit->Registers.Features, TaskFile->
Data[
i].Feature);
416 ATA_WRITE(DeviceUnit->Registers.SectorCount, TaskFile->
Data[
i].SectorCount);
417 ATA_WRITE(DeviceUnit->Registers.LbaLow, TaskFile->
Data[
i].LowLba);
418 ATA_WRITE(DeviceUnit->Registers.LbaMid, TaskFile->
Data[
i].MidLba);
419 ATA_WRITE(DeviceUnit->Registers.LbaHigh, TaskFile->
Data[
i].HighLba);
429 BlockCount = DeviceUnit->MultiSectorTransfer;
432 DeviceUnit->DrqByteCount = BlockCount * DeviceUnit->P.SectorSize;
443 DeviceUnit->BytesToTransfer =
Request->DataTransferLength;
444 DeviceUnit->DataBuffer =
Request->DataBuffer;
483 Request->DataBuffer = SenseData;
484 Request->DataTransferLength =
sizeof(*SenseData);
501 ERR(
"SK %02X, ASC %02X, ASCQ %02X\n",
517 for (RetryCount = 0; RetryCount < 3; ++RetryCount)
526 ERR(
"ATA%s command %02X failed %u %02X:%02X at %X:%u\n",
531 ATA_READ(DeviceUnit->Registers.Status),
532 ATA_READ(DeviceUnit->Registers.Error),
533 DeviceUnit->Registers.Data,
534 DeviceUnit->DeviceNumber);
554 if (
ATA_READ(DeviceUnit->Registers.Status) == 0)
559 DeviceUnit->MultiSectorTransfer = 0;
560 DeviceUnit->P.Flags &= ~ATA_DEVICE_FLAG_IO32;
593 static const UCHAR AtapReadCommandMap[2][2] =
617 if (DeviceUnit->MultiSectorTransfer != 0)
628 TaskFile->
Data[0].MidLba = (
UCHAR)(Lba >> 8);
629 TaskFile->
Data[0].HighLba = (
UCHAR)(Lba >> 16);
637 TaskFile->
Data[1].LowLba = (
UCHAR)(Lba >> 24);
638 TaskFile->
Data[1].MidLba = (
UCHAR)(Lba >> 32);
639 TaskFile->
Data[1].HighLba = (
UCHAR)(Lba >> 40);
648 DriveSelect |= ((Lba >> 24) & 0x0F);
653 ULONG ChsTemp, Cylinder, Head, Sector;
655 ChsTemp = (
ULONG)Lba / DeviceUnit->P.SectorsPerTrack;
658 Cylinder = ChsTemp / DeviceUnit->P.Heads;
659 Head = ChsTemp % DeviceUnit->P.Heads;
660 Sector = ((
ULONG)Lba % DeviceUnit->P.SectorsPerTrack) + 1;
662 ASSERT(Cylinder <= 65535 && Head <= 15 && Sector <= 255);
665 TaskFile->
Data[0].LowLba = (
UCHAR)Sector;
666 TaskFile->
Data[0].MidLba = (
UCHAR)Cylinder;
667 TaskFile->
Data[0].HighLba = (
UCHAR)(Cylinder >> 8);
671 TaskFile->
DriveSelect = DeviceUnit->DeviceSelect | DriveSelect;
727 if (IdeStatus == 0xFF || IdeStatus == 0x7F)
743 ERR(
"Device %X:%u is busy %02x\n", Registers->
Data, DeviceUnit->DeviceNumber, IdeStatus);
765 Request.DataTransferLength =
sizeof(*Id);
805 Request.DataBuffer = CapacityData;
806 Request.DataTransferLength =
sizeof(*CapacityData);
809 Request.Cdb[13] =
sizeof(*CapacityData);
824 Request.DataBuffer = CapacityData;
825 Request.DataTransferLength =
sizeof(*CapacityData);
862 *TotalSectors = LastLba + 1;
969 for (
i = 0;
i < 5; ++
i)
996 for (
i = 4;
i > 0;
i--)
1003 ERR(
"Device not ready\n");
1009 &DeviceUnit->P.TotalSectors,
1010 &DeviceUnit->P.SectorSize);
1011 if (DeviceUnit->P.SectorSize == 0 || DeviceUnit->P.TotalSectors == 0)
1013 TRACE(
"No media found\n");
1017 DeviceUnit->P.Cylinders =
MAXULONG;
1019 DeviceUnit->P.SectorsPerTrack =
MAXULONG;
1021 DeviceUnit->MaximumTransferLength = 0xFFFF;
1033#if !defined(ATA_ENABLE_MULTIPLE_MODE)
1036 if (DeviceUnit->MultiSectorTransfer != 0)
1042 if (DeviceUnit->MultiSectorTransfer == 0)
1046 Request.TaskFile.Data[0].SectorCount = DeviceUnit->MultiSectorTransfer;
1049 DeviceUnit->MultiSectorTransfer = 0;
1062 DeviceUnit->MaximumTransferLength = 0xFF;
1081 DeviceUnit->MaximumTransferLength = 0x10000;
1096 if (TotalSectors == 0)
1098 ERR(
"Unknown geometry\n");
1102 DeviceUnit->P.TotalSectors = TotalSectors;
1103 DeviceUnit->P.Cylinders = Cylinders;
1104 DeviceUnit->P.Heads = Heads;
1107 ASSERT(DeviceUnit->P.SectorSize >= 512);
1108 DeviceUnit->P.SectorSize =
max(DeviceUnit->P.SectorSize, 512);
1112 TRACE(
"Multiple sector setting %u\n", DeviceUnit->MultiSectorTransfer);
1129 ERR(
"Identify data CRC error\n");
1138 if (
Id->ModelNumber[0] ==
'N' &&
1139 Id->ModelNumber[1] ==
'E' &&
1140 Id->ModelNumber[2] ==
'C' &&
1141 Id->ModelNumber[3] ==
' ')
1148 for (
i = 0;
i <
sizeof(
Id->SerialNumber) / 2; ++
i)
1151 for (
i = 0;
i <
sizeof(
Id->FirmwareRevision) / 2; ++
i)
1154 for (
i = 0;
i <
sizeof(
Id->ModelNumber) / 2; ++
i)
1157 TRACE(
"MN '%.*s'\n",
sizeof(
Id->ModelNumber),
Id->ModelNumber);
1158 TRACE(
"FR '%.*s'\n",
sizeof(
Id->FirmwareRevision),
Id->FirmwareRevision);
1159 TRACE(
"S/N '%.*s'\n",
sizeof(
Id->SerialNumber),
Id->SerialNumber);
1188#if defined(SARCH_PC98)
1193#if defined(SARCH_PC98)
1195 Registers->Control = 0x74C;
1198 Registers->Control = IoBase + 0x206;
1200 Registers->Data = IoBase + 0 * Spare;
1201 Registers->Error = IoBase + 1 * Spare;
1202 Registers->SectorCount = IoBase + 2 * Spare;
1203 Registers->LbaLow = IoBase + 3 * Spare;
1204 Registers->LbaMid = IoBase + 4 * Spare;
1205 Registers->LbaHigh = IoBase + 5 * Spare;
1206 Registers->Device = IoBase + 6 * Spare;
1207 Registers->Status = IoBase + 7 * Spare;
1234 Request.DataTransferLength = BlockCount *
Unit->P.SectorSize;
1244 SectorNumber += BlockCount;
1267 ULONG ChannelNumber;
1290 ERR(
"Failed to allocate device unit!\n");
1311 TRACE(
"Total sectors %I64u of size %lu, CHS %lu:%lu:%lu, %lx\n",
1319 AtapUnits[(*DetectedCount)++] = DeviceUnit;
1327 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
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 BOOLEAN AtapWaitForNotBusy(_In_ PIDE_REGISTERS Registers, _In_range_(>, 0) ULONG Timeout, _Out_opt_ PUCHAR Result)
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 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 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 BOOLEAN AtapWaitForIdle(_In_ PIDE_REGISTERS Registers, _Out_ PUCHAR Result)
static VOID AtapIssuePacketCommand(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request)
static BOOLEAN AtapProcessRequest(_In_ PHW_DEVICE_UNIT DeviceUnit, _In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR IdeStatus)
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 ATA_DEVICE_FLAG_IO32
#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_PHASE_CHANGE
1 ms
#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
200 us
#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::@169 Data[2]
Data structure for the ATA device.
UCHAR AdditionalSenseCode
UCHAR AdditionalSenseCodeQualifier
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
_In_ ULONG _In_ ULONG SectorsPerTrack
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount
#define RtlUlonglongByteSwap(_x)
#define RtlUshortByteSwap(_x)