ReactOS 0.4.16-dev-2633-g8dc9e50
dev_identify.c File Reference
#include "atapi.h"
Include dependency graph for dev_identify.c:

Go to the source code of this file.

Functions

static BOOLEAN AtaDeviceIdentifyDataEqual (_In_ PIDENTIFY_DEVICE_DATA IdentifyData1, _In_ PIDENTIFY_DEVICE_DATA IdentifyData2)
 
NTSTATUS AtaDeviceSendIdentify (_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ UCHAR Command)
 
static NTSTATUS AtaDeviceSpinUp (_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
 
static BOOLEAN AtaDeviceIsXboxDrive (_In_ PATAPORT_DEVICE_EXTENSION DevExt)
 
static VOID AtaCreateAtapiStandardInquiryData (_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PINQUIRYDATA InquiryData)
 
static NTSTATUS AtaDeviceSendInquiry (_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
 
ATA_DEVICE_STATUS AtaPortIdentifyDevice (_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
 

Function Documentation

◆ AtaCreateAtapiStandardInquiryData()

static VOID AtaCreateAtapiStandardInquiryData ( _In_ PIDENTIFY_DEVICE_DATA  IdentifyData,
_Out_ PINQUIRYDATA  InquiryData 
)
static

Definition at line 132 of file dev_identify.c.

135{
136 InquiryData->DeviceType = READ_ONLY_DIRECT_ACCESS_DEVICE;
137 InquiryData->RemovableMedia = AtaDevIsRemovable(IdentifyData);
138 InquiryData->Versions = 0x04; // SPC-2
139 InquiryData->ResponseDataFormat = 2; // This means "Complies to this standard"
140 InquiryData->AdditionalLength =
142
143 /* Copy ModelNumber from a byte-swapped ATA string */
144 AtaCopyIdStringSafe((PCHAR)InquiryData->VendorId,
145 IdentifyData->ModelNumber,
146 sizeof(IdentifyData->ModelNumber),
147 ' ');
148 AtaSwapIdString(InquiryData->VendorId, sizeof(IdentifyData->ModelNumber) / 2);
149
150 /* Copy FirmwareRevision from a byte-swapped ATA string */
151 AtaCopyIdStringSafe((PCHAR)InquiryData->ProductRevisionLevel,
152 IdentifyData->FirmwareRevision,
153 sizeof(InquiryData->ProductRevisionLevel),
154 ' ');
155 AtaSwapIdString(InquiryData->ProductRevisionLevel,
156 sizeof(InquiryData->ProductRevisionLevel) / 2);
157}
PCHAR AtaCopyIdStringSafe(_Out_writes_bytes_all_(MaxLength) PCHAR Destination, _In_reads_bytes_(MaxLength) PUCHAR Source, _In_ ULONG MaxLength, _In_ CHAR DefaultCharacter)
Definition: enum.c:35
VOID AtaSwapIdString(_Inout_updates_bytes_(WordCount *sizeof(USHORT)) PVOID Buffer, _In_range_(>, 0) ULONG WordCount)
Definition: enum.c:64
#define READ_ONLY_DIRECT_ACCESS_DEVICE
Definition: cdrw_hw.h:1149
#define INQUIRYDATABUFFERSIZE
Definition: cdrw_hw.h:1113
FORCEINLINE BOOLEAN AtaDevIsRemovable(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:684
char * PCHAR
Definition: typedefs.h:51

Referenced by AtaDeviceSendInquiry().

◆ AtaDeviceIdentifyDataEqual()

static BOOLEAN AtaDeviceIdentifyDataEqual ( _In_ PIDENTIFY_DEVICE_DATA  IdentifyData1,
_In_ PIDENTIFY_DEVICE_DATA  IdentifyData2 
)
static

Definition at line 16 of file dev_identify.c.

19{
20 if (!RtlEqualMemory(IdentifyData1->SerialNumber,
21 IdentifyData2->SerialNumber,
23 {
24 return FALSE;
25 }
26
27 if (!RtlEqualMemory(IdentifyData1->FirmwareRevision,
28 IdentifyData2->FirmwareRevision,
29 RTL_FIELD_SIZE(IDENTIFY_DEVICE_DATA, FirmwareRevision)))
30 {
31 return FALSE;
32 }
33
34 if (!RtlEqualMemory(IdentifyData1->ModelNumber,
35 IdentifyData2->ModelNumber,
37 {
38 return FALSE;
39 }
40
41 return TRUE;
42}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define RTL_FIELD_SIZE(type, field)
Definition: kdb_expr.c:86
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
ULONG SerialNumber
Definition: rxce.c:117

Referenced by AtaPortIdentifyDevice().

◆ AtaDeviceIsXboxDrive()

static BOOLEAN AtaDeviceIsXboxDrive ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt)
static

Definition at line 101 of file dev_identify.c.

103{
104 static const PCSTR AtapBrokenInquiryDrive[] =
105 {
106 "THOMSON-DVD",
107 "PHILIPS XBOX DVD DRIVE",
108 "PHILIPS J5 3235C",
109 "SAMSUNG DVD-ROM SDG-605B"
110 // TODO: Xbox 360 drives are also affected.
111 };
112 CHAR ModelNumber[26];
113 PUCHAR End;
114 ULONG i;
115
116 End = AtaCopyIdStringUnsafe((PUCHAR)ModelNumber,
117 DevExt->IdentifyDeviceData.ModelNumber,
118 sizeof(ModelNumber));
119 *End = ANSI_NULL;
120
121 for (i = 0; i < RTL_NUMBER_OF(AtapBrokenInquiryDrive); ++i)
122 {
123 if (strcmp(ModelNumber, AtapBrokenInquiryDrive[i]) == 0)
124 return TRUE;
125 }
126
127 return FALSE;
128}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
PUCHAR AtaCopyIdStringUnsafe(_Out_writes_bytes_all_(Length) PUCHAR Destination, _In_reads_bytes_(Length) PUCHAR Source, _In_ ULONG Length)
Definition: enum.c:15
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
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 ANSI_NULL
char CHAR
Definition: pedump.c:57
const char * PCSTR
Definition: typedefs.h:52
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59

Referenced by AtaDeviceSendInquiry().

◆ AtaDeviceSendIdentify()

NTSTATUS AtaDeviceSendIdentify ( _In_ PATAPORT_PORT_DATA  PortData,
_In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ UCHAR  Command 
)

Definition at line 45 of file dev_identify.c.

49{
50 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
51
52 TRACE("CH %lu: Send %s identify device %u\n",
53 PortData->PortNumber,
54 Command == IDE_COMMAND_IDENTIFY ? "ATA" : "ATAPI",
55 DevExt->Device.AtaScsiAddress.TargetId);
56
57 /*
58 * For PATA devices, disable interrupts for the identify command and use polling instead.
59 *
60 * On some single device 1 configurations or non-existent IDE channels
61 * the status register stuck permanently at a value of 0,
62 * and we incorrectly assume that the device is present.
63 * This will result in a taskfile timeout
64 * which must be avoided as it would cause hangs at boot time.
65 */
67
69 Request->TimeOut = 10;
70 Request->DataTransferLength = sizeof(DevExt->IdentifyDeviceData);
71
72 RtlZeroMemory(&Request->TaskFile, sizeof(Request->TaskFile));
73 Request->TaskFile.Command = Command;
74
75 return AtaPortSendRequest(PortData, DevExt);
76}
#define REQUEST_FLAG_HAS_LOCAL_BUFFER
Definition: ata_shared.h:327
#define REQUEST_FLAG_DATA_IN
Definition: ata_shared.h:287
#define REQUEST_FLAG_POLL
Definition: ata_shared.h:353
NTSTATUS AtaPortSendRequest(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: portstate.c:831
#define IDE_COMMAND_IDENTIFY
Definition: atapi.h:118
#define TRACE(s)
Definition: solgame.cpp:4
Definition: shell.h:41
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547

Referenced by AtaPortDeviceProcessConfig(), and AtaPortIdentifyDevice().

◆ AtaDeviceSendInquiry()

static NTSTATUS AtaDeviceSendInquiry ( _In_ PATAPORT_PORT_DATA  PortData,
_In_ PATAPORT_DEVICE_EXTENSION  DevExt 
)
static

Definition at line 161 of file dev_identify.c.

164{
165 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
167 PCDB Cdb;
168
169 TRACE("CH %lx: Send inquiry device %u\n",
170 PortData->PortNumber,
171 DevExt->Device.AtaScsiAddress.TargetId);
172
176 Request->TimeOut = 3;
177 Request->DataTransferLength = INQUIRYDATABUFFERSIZE;
178
179 RtlZeroMemory(Request->Cdb, sizeof(Request->Cdb));
180 Cdb = (PCDB)&Request->Cdb;
181 Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY;
182 Cdb->CDB6INQUIRY.LogicalUnitNumber = DevExt->Device.AtaScsiAddress.Lun;
183 Cdb->CDB6INQUIRY.AllocationLength = INQUIRYDATABUFFERSIZE;
184
185 Status = AtaPortSendRequest(PortData, DevExt);
187 return Status;
188
189 if (!NT_SUCCESS(Status))
190 {
191 if (DevExt->Device.AtaScsiAddress.Lun == 0 && AtaDeviceIsXboxDrive(DevExt))
192 {
193 DevExt->Device.DeviceFlags |= DEVICE_CACHE_INQUIRY;
194
195 /*
196 * The INQUIRY command is mandatory to be implemented by ATAPI devices,
197 * but some Xbox drives violate this.
198 */
199 AtaCreateAtapiStandardInquiryData(&DevExt->IdentifyDeviceData,
200 DevExt->Device.LocalBuffer);
202 }
203 else
204 {
206 }
207 }
208
209 return STATUS_SUCCESS;
210}
@ DEV_STATUS_NO_DEVICE
Definition: atapi.h:255
@ DEV_STATUS_NEW_DEVICE
Definition: atapi.h:256
#define DEVICE_CACHE_INQUIRY
Definition: atapi.h:96
LONG NTSTATUS
Definition: precomp.h:26
#define SCSIOP_INQUIRY
Definition: cdrw_hw.h:888
union _CDB * PCDB
static BOOLEAN AtaDeviceIsXboxDrive(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_identify.c:101
static VOID AtaCreateAtapiStandardInquiryData(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PINQUIRYDATA InquiryData)
Definition: dev_identify.c:132
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
Status
Definition: gdiplustypes.h:25
#define REQUEST_FLAG_PACKET_COMMAND
Definition: hwidep.h:169
#define STATUS_ADAPTER_HARDWARE_ERROR
Definition: ntstatus.h:524
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
Definition: scratch.h:159
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: cdrw_hw.h:28
struct _CDB::_CDB6INQUIRY CDB6INQUIRY

Referenced by AtaPortIdentifyDevice().

◆ AtaDeviceSpinUp()

static NTSTATUS AtaDeviceSpinUp ( _In_ PATAPORT_PORT_DATA  PortData,
_In_ PATAPORT_DEVICE_EXTENSION  DevExt 
)
static

Definition at line 80 of file dev_identify.c.

83{
84 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
85
86 TRACE("CH %lu: Spin-up device %u\n",
87 PortData->PortNumber,
88 DevExt->Device.AtaScsiAddress.TargetId);
89
90 Request->Flags = 0;
91 Request->TimeOut = 20;
92
93 Request->TaskFile.Command = IDE_COMMAND_SET_FEATURE;
94 Request->TaskFile.Feature = IDE_FEATURE_PUIS_SPIN_UP;
95
96 return AtaPortSendRequest(PortData, DevExt);
97}
#define IDE_FEATURE_PUIS_SPIN_UP
Definition: ata.h:720
#define IDE_COMMAND_SET_FEATURE
Definition: ata.h:702

Referenced by AtaPortIdentifyDevice().

◆ AtaPortIdentifyDevice()

ATA_DEVICE_STATUS AtaPortIdentifyDevice ( _In_ PATAPORT_PORT_DATA  PortData,
_In_ PATAPORT_DEVICE_EXTENSION  DevExt 
)

Definition at line 213 of file dev_identify.c.

216{
217 PIDENTIFY_DEVICE_DATA IdentifyData = DevExt->Device.LocalBuffer;
218 ATA_CONNECTION_STATUS ConnectionStatus;
220 BOOLEAN StartFromAtapi, IsSameDevice;
221 ULONG Attempt, RetryCount;
223
224 _InterlockedOr(&PortData->InterruptFlags, PORT_INT_FLAG_IGNORE_LINK_IRQ);
225
226 ConnectionStatus = PortData->IdentifyDevice(PortData->ChannelContext,
227 DevExt->Device.AtaScsiAddress.TargetId);
228
229 _InterlockedAnd(&PortData->InterruptFlags, ~PORT_INT_FLAG_IGNORE_LINK_IRQ);
230
231 if (ConnectionStatus == CONN_STATUS_FAILURE)
232 return DEV_STATUS_FAILED;
233
234 if (ConnectionStatus == CONN_STATUS_NO_DEVICE)
236
237 /* Power up the device if needed */
238 Status = AtaPortCheckDevicePowerState(PortData, DevExt);
240 return DEV_STATUS_FAILED;
241
242 /*
243 * Try the known device type first.
244 * This may speed up device detection by eliminating I/O errors.
245 */
246 if (DevExt->Device.DeviceFlags & DEVICE_UNINITIALIZED)
247 StartFromAtapi = (ConnectionStatus == CONN_STATUS_DEV_ATAPI);
248 else
249 StartFromAtapi = IS_ATAPI(&DevExt->Device);
250
251 /* Look for ATA/ATAPI devices */
252 for (RetryCount = 0; RetryCount < 2; ++RetryCount)
253 {
254 /* Send the identify command */
255 for (Attempt = 0; Attempt < 2; ++Attempt)
256 {
257 if (StartFromAtapi)
259 else
261
262 /* Swap device types */
263 if (Attempt != 0)
265
266 Status = AtaDeviceSendIdentify(PortData,
267 DevExt,
271 return DEV_STATUS_FAILED;
272
273 if (NT_SUCCESS(Status))
274 break;
275 }
276 if (!NT_SUCCESS(Status))
278
279 /*
280 * The drive needs to be spun up
281 * or the device was unable to return complete identity data.
282 */
283 if (AtaDevInPuisState(IdentifyData) || AtaDevIsIdentifyDataIncomplete(IdentifyData))
284 {
285
286 Status = AtaDeviceSpinUp(PortData, DevExt);
288 return DEV_STATUS_FAILED;
289
290 if (!NT_SUCCESS(Status))
291 ERR("Failed to spin-up device\n");
292 continue;
293 }
294 }
295
296 /* Verify the checksum */
297 if (!AtaDevIsIdentifyDataValid(IdentifyData))
298 {
299 ERR("Identify data CRC error\n");
300 return DEV_STATUS_FAILED;
301 }
302
303 if (DevExt->Device.DeviceFlags & DEVICE_UNINITIALIZED)
304 {
305 IsSameDevice = FALSE;
306 }
307 else
308 {
309 IsSameDevice = (DeviceType == DevExt->DeviceType) &&
310 (AtaDeviceIdentifyDataEqual(&DevExt->IdentifyDeviceData,
311 DevExt->Device.LocalBuffer));
312 }
313
314 /* Update identify data */
315 RtlCopyMemory(&DevExt->IdentifyDeviceData,
316 DevExt->Device.LocalBuffer,
317 sizeof(DevExt->IdentifyDeviceData));
318 DevExt->DeviceType = DeviceType;
319
320 if (IsSameDevice)
322
323 DevExt->Device.TransportFlags &= ~(DEVICE_IS_ATAPI |
327
328 if (DeviceType == DEV_ATAPI)
329 {
330 DevExt->Device.TransportFlags |= DEVICE_IS_ATAPI;
331
332 DevExt->Device.CdbSize = AtaDevCdbSizeInWords(&DevExt->IdentifyPacketData);
333 TRACE("Device has CDB size of %u bytes\n", DevExt->Device.CdbSize * 2);
334
335 if (AtaDevHasCdbInterrupt(&DevExt->IdentifyPacketData))
336 {
337 TRACE("Device has CDB interrupt\n");
338 DevExt->Device.TransportFlags |= DEVICE_HAS_CDB_INTERRUPT;
339 }
340
341 if (AtaDevIsDmaDirectionRequired(&DevExt->IdentifyPacketData))
342 {
343 TRACE("Device needs DMA DIR\n");
344 DevExt->Device.TransportFlags |= DEVICE_NEED_DMA_DIRECTION;
345 }
346
347 /* The NEC CDR-260 string is not byteswapped */
348 if (DevExt->IdentifyPacketData.ModelNumber[0] == 'N' &&
349 DevExt->IdentifyPacketData.ModelNumber[1] == 'E' &&
350 DevExt->IdentifyPacketData.ModelNumber[2] == 'C')
351 {
352 TRACE("Device is a NEC CDR-260 drive\n");
353 DevExt->Device.TransportFlags |= DEVICE_IS_NEC_CDR260;
354 }
355
356 Status = AtaDeviceSendInquiry(PortData, DevExt);
358 return DEV_STATUS_FAILED;
359
360 /* Update the inquiry data */
361 RtlCopyMemory(&DevExt->InquiryData,
362 DevExt->Device.LocalBuffer,
363 sizeof(DevExt->InquiryData));
364 }
365
367}
unsigned char BOOLEAN
Definition: actypes.h:127
@ CONN_STATUS_FAILURE
Definition: ata_shared.h:83
@ CONN_STATUS_DEV_ATAPI
Definition: ata_shared.h:87
@ CONN_STATUS_NO_DEVICE
Definition: ata_shared.h:84
#define DEVICE_IS_NEC_CDR260
Definition: ata_shared.h:168
#define DEVICE_HAS_CDB_INTERRUPT
Definition: ata_shared.h:166
enum _ATA_CONNECTION_STATUS ATA_CONNECTION_STATUS
#define DEVICE_NEED_DMA_DIRECTION
Definition: ata_shared.h:167
#define DEVICE_IS_ATAPI
Definition: ata_shared.h:165
enum _ATA_DEVICE_TYPE ATA_DEVICE_TYPE
Private enum between the ATA driver and storprop.dll.
@ DEV_STATUS_FAILED
Definition: atapi.h:258
@ DEV_STATUS_SAME_DEVICE
Definition: atapi.h:257
#define PORT_INT_FLAG_IGNORE_LINK_IRQ
Definition: atapi.h:361
NTSTATUS AtaPortCheckDevicePowerState(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_power.c:218
#define DEVICE_UNINITIALIZED
Definition: atapi.h:91
#define IS_ATAPI(Device)
Definition: atapi.h:176
#define IDE_COMMAND_ATAPI_IDENTIFY
Definition: atapi.h:110
#define ERR(fmt,...)
Definition: precomp.h:57
static BOOLEAN AtaDeviceIdentifyDataEqual(_In_ PIDENTIFY_DEVICE_DATA IdentifyData1, _In_ PIDENTIFY_DEVICE_DATA IdentifyData2)
Definition: dev_identify.c:16
static NTSTATUS AtaDeviceSendInquiry(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_identify.c:161
static NTSTATUS AtaDeviceSpinUp(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_identify.c:80
NTSTATUS AtaDeviceSendIdentify(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ UCHAR Command)
Definition: dev_identify.c:45
FORCEINLINE BOOLEAN AtaDevIsIdentifyDataValid(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
Definition: hwidep.h:201
@ DEV_ATA
Definition: hwidep.h:100
@ DEV_ATAPI
Definition: hwidep.h:101
FORCEINLINE UCHAR AtaDevCdbSizeInWords(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
Definition: hwidep.h:226
FORCEINLINE BOOLEAN AtaDevIsIdentifyDataIncomplete(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasCdbInterrupt(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE BOOLEAN AtaDevInPuisState(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsDmaDirectionRequired(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
volatile char *const const char modify _InterlockedAnd
Definition: intrin_ppc.h:267
DeviceType
Definition: mmdrv.h:42
long _InterlockedOr(_Interlocked_operand_ long volatile *_Value, long _Mask)
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by AtaPortEnumerateDevice().