45 while (MaxLength != 0)
50 if (Char >
' ' && Char <=
'~' && Char !=
',')
53 *Dest = DefaultCharacter;
87 PCHAR Current = End - 1;
92 while (Current >=
Start && *Current ==
' ')
123 DevExt->InquiryData.VendorId,
129 DevExt->InquiryData.ProductId,
136 DevExt->InquiryData.ProductRevisionLevel,
160 End = DevExt->SerialNumber;
161 Remaining =
sizeof(DevExt->SerialNumber);
176 INFO(
"FriendlyName: '%s'\n", DevExt->FriendlyName);
177 INFO(
"RevisionNumber: '%s'\n", DevExt->RevisionNumber);
178 INFO(
"SerialNumber: '%s'\n", DevExt->SerialNumber);
226 DevExt->Device.Cylinders = Cylinders;
227 DevExt->Device.Heads = Heads;
238 if (TotalSectors == 0)
240 ERR(
"Unknown geometry\n");
246 DevExt->Device.SectorsPerTrack = 1;
247 DevExt->Device.Heads = 1;
250 DevExt->Device.TotalSectors = TotalSectors;
256 INFO(
"Total sectors %I64u of size %lu, CHS %u:%u:%u\n",
257 DevExt->Device.TotalSectors,
258 DevExt->Device.SectorSize,
259 DevExt->Device.Cylinders,
260 DevExt->Device.Heads,
261 DevExt->Device.SectorsPerTrack);
270 ULONG DeviceQueueDepth;
275 if (DeviceQueueDepth == 0)
279 DeviceQueueDepth =
min(DeviceQueueDepth, DevExt->Device.PortData->QueueDepth);
285 INFO(
"NCQ enabled, queue depth %lu/%lu\n",
287 DevExt->Device.PortData->QueueDepth);
301 return (
strstr(DevExt->FriendlyName,
" LS-120") ||
302 strstr(DevExt->FriendlyName,
" LS-240"));
326 INFO(
"Tape drive detected '%s'\n", DevExt->FriendlyName);
338 if (DevExt->Device.AtaScsiAddress.Lun == 0)
341 DevExt->Device.AtaScsiAddress.TargetId,
346 DevExt->Device.AtaScsiAddress.TargetId,
348 DevExt->InquiryData.DeviceType);
351 DevExt->Device.AtaScsiAddress.TargetId,
353 &DevExt->TransferModeUserAllowedMask,
365 if (DevExt->InquiryData.RemovableMedia)
370 DevExt->Common.Self->Flags &= ~DO_DEVICE_INITIALIZING;
372 DevExt->Device.DeviceFlags &= ~DEVICE_UNINITIALIZED;
390 return PortData->Worker.DeviceCount;
410 return DevExt->Worker.EnumStatus;
443 ERR(
"Failed to allocate PDO extension\n");
504 DiscoveredNewDevice =
TRUE;
508 if (DiscoveredNewDevice)
524 DeviceRelations->Count = 0;
535 if (AtaScsiAddress.
Lun == 0)
547 if (AtaScsiAddress.
Lun == 0)
559 DeviceRelations->Objects[DeviceRelations->Count++] = DevExt->
Common.
Self;
623 if (!DeviceRelations)
625 ERR(
"Failed to allocate device relations\n");
634 if (EnumTimeMs >= 5000)
636 WARN(
"%lu: QBR request took %lu ms, %lu devices\n",
637 ChanExt->ScsiPortNumber,
639 DeviceRelations->
Count);
643 INFO(
"%lu: QBR request took %lu ms, %lu devices\n",
644 ChanExt->ScsiPortNumber,
646 DeviceRelations->
Count);
#define ExAllocatePoolUninitialized
#define DEVICE_QUEUE_DEPTH_SHIFT
#define ATA_MIN_SECTOR_SIZE
256 sectors of 512 bytes (128 kB).
#define DD_ATA_REG_ATA_DEVICE_TYPE
#define DD_ATA_REG_XFER_MODE_SELECTED
#define DD_ATA_REG_XFER_MODE_SUPPORTED
#define DD_ATA_REG_XFER_MODE_ALLOWED
#define DD_ATA_REG_SCSI_DEVICE_TYPE
VOID AtaSetRegistryKey(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ UCHAR TargetId, _In_ PCWSTR KeyName, _In_ ULONG KeyValue)
VOID AtaGetRegistryKey(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ UCHAR TargetId, _In_ PCWSTR KeyName, _Out_ PULONG KeyValue, _In_ ULONG DefaultValue)
VOID AtaPdoFreeDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
enum _ATA_PORT_ACTION ATA_PORT_ACTION
FORCEINLINE ATA_SCSI_ADDRESS AtaMarshallScsiAddress(_In_ ULONG PathId, _In_ ULONG TargetId, _In_ ULONG Lun)
#define DEVICE_IS_SUPER_FLOPPY
#define QUEUE_FLAG_FROZEN_PNP
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindNextDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PATA_SCSI_ADDRESS AtaScsiAddress, _In_ BOOLEAN SearchRemoveDev, _In_ PVOID ReferenceTag)
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress, _In_ PVOID ReferenceTag)
PATAPORT_DEVICE_EXTENSION AtaPdoCreateDevice(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaDeviceQueueEvent(_In_ PATAPORT_PORT_DATA PortData, _In_opt_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ATA_PORT_ACTION Action)
enum _ATA_DEVICE_STATUS ATA_DEVICE_STATUS
#define DEVICE_UNINITIALIZED
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFreezeQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaFdoDeviceListInsert(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ BOOLEAN DoInsert)
VOID AtaCreateStandardInquiryData(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
#define ATAPORT_FN_FIELD
The maximum length of identifier strings for ATA devices excluding the terminating NULL.
#define DIRECT_ACCESS_DEVICE
#define NT_SUCCESS(StatCode)
_ACRTIMP char *__cdecl strstr(const char *, const char *)
static const WCHAR Cleanup[]
PCHAR AtaCopyIdStringSafe(_Out_writes_bytes_all_(MaxLength) PCHAR Destination, _In_reads_bytes_(MaxLength) PUCHAR Source, _In_ ULONG MaxLength, _In_ CHAR DefaultCharacter)
VOID AtaDeviceSetAddressingMode(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
static VOID AtaPdoInit(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
static VOID AtaFdoEnumeratePort(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt)
static VOID AtaDeviceEnableQueuedCommands(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
static VOID AtaPdoFillIdentificationStrings(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
NTSTATUS AtaFdoQueryBusRelations(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp)
static ULONG AtaFdoQueryDeviceCount(_In_ PATAPORT_PORT_DATA PortData)
static VOID AtaFdoInitializeDeviceRelations(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PDEVICE_RELATIONS DeviceRelations)
static ATA_DEVICE_STATUS AtaFdoQueryDeviceStatus(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ATA_PORT_ACTION Action)
VOID AtaSwapIdString(_Inout_updates_bytes_(WordCount *sizeof(USHORT)) PVOID Buffer, _In_range_(>, 0) ULONG WordCount)
static PCHAR AtaTrimIdString(_In_ _Post_z_ PCHAR Start, _In_ PCHAR End)
static BOOLEAN AtaDeviceIsSuperFloppy(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
PUCHAR AtaCopyIdStringUnsafe(_Out_writes_bytes_all_(Length) PUCHAR Destination, _In_reads_bytes_(Length) PUCHAR Source, _In_ ULONG Length)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeQuerySystemTime(t)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
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
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)
FORCEINLINE BOOLEAN AtaDevHas48BitAddressFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG64 AtaDevUserAddressableSectors48Bit(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasLbaTranslation(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevUserAddressableSectors28Bit(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsCurrentGeometryValid(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE VOID AtaDevCurrentChsTranslation(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PUSHORT Cylinders, _Out_ PUSHORT Heads, _Out_ PUSHORT SectorsPerTrack)
FORCEINLINE BOOLEAN AtaDevHasForceUnitAccessCommands(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsSsd(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsTape(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE ULONG AtaDevQueueDepth(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define RTL_FIELD_SIZE(type, field)
#define ExFreePoolWithTag(_P, _T)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
#define _In_reads_bytes_(s)
#define _Out_writes_bytes_all_(s)
#define _Inout_updates_bytes_(s)
#define FILE_REMOVABLE_MEDIA
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTRSAFEVAPI RtlStringCchPrintfExA(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cchDest, _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, _Out_opt_ size_t *pcchRemaining, _In_ STRSAFE_DWORD dwFlags, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
ULONG TransferModeSelectedBitmap
ULONG TransferModeSupportedBitmap
ATAPORT_IO_CONTEXT Device
ATAPORT_COMMON_EXTENSION Common
ULONG TransferModeUserAllowedMask
ATA_SCSI_ADDRESS AtaScsiAddress
ATA_WORKER_CONTEXT Worker
volatile PATAPORT_DEVICE_EXTENSION EnumDevExt
UCHAR FirmwareRevision[8]
#define FIELD_OFFSET(t, f)
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
_In_ ULONG _In_ ULONG SectorsPerTrack
#define ObReferenceObject
#define RtlUshortByteSwap(_x)