ReactOS 0.4.16-dev-2633-g8dc9e50
identify_funcs.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Storage Stack
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * or MIT (https://spdx.org/licenses/MIT)
5 * PURPOSE: ATA IDENTIFY DEVICE and IDENTIFY PACKET DEVICE data helper functions
6 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
7 */
8
9#pragma once
10
14 _In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
15{
16 /* Bits 5:6 of word 0 */
17 return (IdentifyPacketData->GeneralConfiguration.DrqDelay == 1);
18}
19
23 _In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
24{
25 /* Bits 0:2 of word 0 */
26 return (IdentifyPacketData->GeneralConfiguration.PacketType != 0) ? 8 : 6;
27}
28
32 _In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
33{
34 /* Bits 0:2 of word 126 */
35 USHORT LastLunIdentifier = IdentifyPacketData->ReservedWord126 & 7;
36
37 /*
38 * We perform additional validation because
39 * most ATAPI devices ignore the LUN field in the CDB and respond to each LUN.
40 */
41
42 /* Make sure this field has no value that represents all bits set */
43 if (LastLunIdentifier != 7)
44 return LastLunIdentifier + 1;
45
46 return 1;
47}
48
52 _In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
53{
54 /* Bit 15 of word 62 */
55 if (IdentifyPacketData->DMADIR.DMADIRBitRequired)
56 {
57 return !(IdentifyPacketData->MultiWordDMASupport & 0x7) && // Bits 0:2 of word 63
58 !IdentifyPacketData->Capabilities.DmaSupported && // Bit 8 of word 49
59 !IdentifyPacketData->Capabilities.InterleavedDmaSupported && // Bit 15 of word 49
60 !(IdentifyPacketData->UltraDMASupport & 0x7F); // Bits 0:6 of word 88
61 }
62
63 return FALSE;
64}
65
69 _In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
70{
71 /* Bits 8:12 of word 0 (sequential-access device) */
72 return (IdentifyPacketData->GeneralConfiguration.CommandPacketType == 1);
73}
74
78 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
79{
80 ULONG i;
81 UCHAR Crc;
82
83 /* Bits 0:8 of word 255 */
84 if (IdentifyData->Signature != 0xA5)
85 {
86 /* The integrity word is missing, assume the data provided by the device is valid */
87 return TRUE;
88 }
89
90 /* Verify the checksum */
91 Crc = 0;
92 for (i = 0; i < sizeof(*IdentifyData); ++i)
93 {
94 Crc += ((PUCHAR)IdentifyData)[i];
95 }
96
97 return (Crc == 0);
98}
99
103 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
104{
105 /* Bit 9 of word 49 */
106 return IdentifyData->Capabilities.LbaSupported;
107}
108
110ULONG
112 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
113{
114 /* Words 60-61 */
115 return IdentifyData->UserAddressableSectors;
116}
117
121 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
122{
123 /* Words 100-103 */
124 return ((ULONG64)IdentifyData->Max48BitLBA[1] << 32) | IdentifyData->Max48BitLBA[0];
125}
126
130 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
131{
132 /* Word 83: 15 = 0, 14 = 1 */
133 if (IdentifyData->CommandSetSupport.WordValid83 == 1)
134 {
135 /* Bit 10 of word 83 */
136 return IdentifyData->CommandSetSupport.BigLba;
137 }
138
139 return FALSE;
140}
141
145 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
146{
147 return ((IdentifyData->TranslationFieldsValid & 1) &&
148 (IdentifyData->NumberOfCurrentCylinders != 0) &&
149 (IdentifyData->NumberOfCurrentCylinders <= 63) &&
150 (IdentifyData->NumberOfCurrentHeads != 0) &&
151 (IdentifyData->NumberOfCurrentHeads <= 16) &&
152 (IdentifyData->CurrentSectorsPerTrack != 0));
153}
154
156VOID
158 _In_ PIDENTIFY_DEVICE_DATA IdentifyData,
159 _Out_ PUSHORT Cylinders,
160 _Out_ PUSHORT Heads,
162{
163 /* Word 1 */
164 *Cylinders = IdentifyData->NumCylinders;
165 /* Word 3 */
166 *Heads = IdentifyData->NumHeads;
167 /* Word 6 */
168 *SectorsPerTrack = IdentifyData->NumSectorsPerTrack;
169}
170
172VOID
174 _In_ PIDENTIFY_DEVICE_DATA IdentifyData,
175 _Out_ PUSHORT Cylinders,
176 _Out_ PUSHORT Heads,
178{
179 /* Word 54 */
180 *Cylinders = IdentifyData->NumberOfCurrentCylinders;
181 /* Word 55 */
182 *Heads = IdentifyData->NumberOfCurrentHeads;
183 /* Word 55 */
184 *SectorsPerTrack = IdentifyData->CurrentSectorsPerTrack;
185}
186
188UCHAR
190 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
191{
192 UCHAR MultiSectorCurrent;
193
194 /* Bit 8 of word 59 */
195 if (!(IdentifyData->MultiSectorSettingValid))
196 return 0;
197
198 /* The word 59 should be a power of 2 */
199 MultiSectorCurrent = IdentifyData->CurrentMultiSectorSetting;
200 if ((MultiSectorCurrent > 0) && ((MultiSectorCurrent & (MultiSectorCurrent - 1)) == 0))
201 return MultiSectorCurrent;
202
203 return 0;
204}
205
207UCHAR
209 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
210{
211 UCHAR MultiSectorMax;
212
213 /* The word 47 should be a power of 2 */
214 MultiSectorMax = IdentifyData->MaximumBlockTransfer;
215 if ((MultiSectorMax > 0) && ((MultiSectorMax & (MultiSectorMax - 1)) == 0))
216 return MultiSectorMax;
217
218 return 0;
219}
220
222ULONG
224 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
225{
226 ULONG WordCount;
227
228 /* Word 106: 15 = 0, 14 = 1, 12 = 1 */
229 if (IdentifyData->PhysicalLogicalSectorSize.Reserved1 == 1 &&
230 IdentifyData->PhysicalLogicalSectorSize.LogicalSectorLongerThan256Words)
231 {
232 /* Words 116-117 */
233 WordCount = IdentifyData->WordsPerLogicalSector[0];
234 WordCount |= (ULONG)IdentifyData->WordsPerLogicalSector[1] << 16;
235 }
236 else
237 {
238 /* 256 words = 512 bytes */
239 WordCount = 256;
240 }
241
242 return WordCount * sizeof(USHORT);
243}
244
246ULONG
248 _In_ PIDENTIFY_DEVICE_DATA IdentifyData,
249 _Out_ PULONG Exponent)
250{
251 /* Word 106: 15 = 0, 14 = 1, 13 = 1 */
252 if (IdentifyData->PhysicalLogicalSectorSize.Reserved1 == 1 &&
253 IdentifyData->PhysicalLogicalSectorSize.MultipleLogicalSectorsPerPhysicalSector)
254 {
255 /* Bits 0:3 of word 106 */
256 *Exponent = IdentifyData->PhysicalLogicalSectorSize.LogicalSectorsPerPhysicalSector;
257
258 return 1 << *Exponent;
259 }
260
261 *Exponent = 0;
262 return 1 << 0;
263}
264
266ULONG
268 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
269{
270 /* Word 209: 15 = 0, 14 = 1 */
271 if (IdentifyData->BlockAlignment.Word209Supported &&
272 IdentifyData->BlockAlignment.Reserved0 == 0)
273 {
274 /* Bits 0:13 of word 209 */
275 return IdentifyData->BlockAlignment.AlignmentOfLogicalWithinPhysical;
276 }
277
278 return 0;
279}
280
284 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
285{
286 /* Word 2 */
287 return (IdentifyData->SpecificConfiguration == 0x37C8) ||
288 (IdentifyData->SpecificConfiguration == 0x738C);
289}
290
294 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
295{
296 /* Bit 2 of word 0 */
297 return IdentifyData->GeneralConfiguration.ResponseIncomplete;
298}
299
303 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
304{
305 /* Bit 7 of word 0 */
306 return IdentifyData->GeneralConfiguration.RemovableMedia;
307}
308
312 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
313{
314 if (AtaDevIsRemovable(IdentifyData))
315 {
316 /* Word 83: 15 = 0, 14 = 1 */
317 if (IdentifyData->CommandSetSupport.WordValid == 1)
318 {
319 /* Bit 2 of word 82 */
320 return IdentifyData->CommandSetSupport.RemovableMediaFeature;
321 }
322 }
323
324 return FALSE;
325}
326
328ULONG
330 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
331{
332 /* Bit 8 of word 76 */
333 if (IdentifyData->SerialAtaCapabilities.NCQ)
334 {
335 /* Bits 0:4 of word 75 */
336 return IdentifyData->QueueDepth + 1;
337 }
338
339 return 0;
340}
341
345 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
346{
347 USHORT Word76 = ((PUSHORT)IdentifyData)[76]; // IdentifyData->SerialAtaCapabilities
348
349 if (Word76 != 0x0000 && Word76 != 0xFFFF)
350 {
351 /* Bit 7 of word 78 */
352 return IdentifyData->SerialAtaFeaturesSupported.NCQAutosense;
353 }
354
355 return FALSE;
356}
357
361 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
362{
363 if (IdentifyData->CommandSetActive.Words119_120Valid && // Word 86: bit 15 = 1
364 IdentifyData->CommandSetSupportExt.WordValid == 1) // Word 119: 15 = 0, 14 = 1
365 {
366 /* Bit 6 of word 119 */
367 return IdentifyData->CommandSetSupportExt.SenseDataReporting;
368 }
369
370 return FALSE;
371}
372
376 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
377{
378 /* Word 127: bit 0 = 1, bit 1 = 0 */
379 return (IdentifyData->MsnSupport == 1);
380}
381
385 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
386{
387 // TODO: Verify word 48
388
389 /* Bit 0 of word 48 */
390 if (IdentifyData->TrustedComputing.FeatureSupported)
391 {
392 /* Bit 7 of word 69 */
393 return IdentifyData->AdditionalSupported.IEEE1667;
394 }
395
396 return FALSE;
397}
398
402 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
403{
404 /* Word 87: 15 = 0, 14 = 1 */
405 if (IdentifyData->CommandSetActive.Reserved4 == 1)
406 {
407 /* Bit 8 of word 87 */
408 return IdentifyData->CommandSetActive.WWN64Bit;
409 }
410
411 return FALSE;
412}
413
417 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
418{
419 /* Bits 0:1 of word 69 */
420 return (IdentifyData->AdditionalSupported.ZonedCapabilities != 0);
421}
422
424UCHAR
426 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
427{
428 /* Bits 0:1 of word 69 */
429 return IdentifyData->AdditionalSupported.ZonedCapabilities;
430}
431
435 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
436{
437 /* Word 83: 15 = 0, 14 = 1 */
438 if (IdentifyData->CommandSetSupport.WordValid == 1)
439 {
440 /* Bit 1 of word 82 */
441 return IdentifyData->CommandSetSupport.SecurityMode;
442 }
443
444 return FALSE;
445}
446
450 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
451{
452 /* Bit 0 of word 82 */
453 return IdentifyData->CommandSetSupport.SmartCommands;
454}
455
459 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
460{
461 /* Word 83: 15 = 0, 14 = 1 */
462 if (IdentifyData->CommandSetSupport.WordValid == 1)
463 {
464 /* Bit 5 of word 82 and bit 5 of word 85 */
465 return (IdentifyData->CommandSetSupport.WriteCache &&
466 IdentifyData->CommandSetActive.WriteCache);
467 }
468
469 return FALSE;
470}
471
475 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
476{
477 /* Word 83: 15 = 0, 14 = 1 */
478 if (IdentifyData->CommandSetSupport.WordValid == 1)
479 {
480 /* Bit 6 of word 82 and bit 6 of word 85 */
481 return (IdentifyData->CommandSetSupport.LookAhead &&
482 IdentifyData->CommandSetActive.LookAhead);
483 }
484
485 return FALSE;
486}
487
489UCHAR
491 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
492{
493 /* Bits 0:3 of word 168 */
494 return IdentifyData->NominalFormFactor;
495}
496
498USHORT
500 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
501{
502 /* Word 217 */
503 return IdentifyData->NominalMediaRotationRate;
504}
505
509 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
510{
511 /* Word 217 */
512 return (IdentifyData->NominalMediaRotationRate >= 0x0401 &&
513 IdentifyData->NominalMediaRotationRate <= 0xFFFE);
514}
515
519 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
520{
521 /* Word 217 */
522 return (IdentifyData->NominalMediaRotationRate == 1);
523}
524
528 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
529{
530 /* Bit 0 of word 169 */
531 return IdentifyData->DataSetManagementFeature.SupportsTrim;
532}
533
537 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
538{
539 /* Bit 5 of word 69 */
540 return IdentifyData->AdditionalSupported.ReadZeroAfterTrimSupported;
541}
542
546 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
547{
548 /* Bit 14 of word 69 */
549 return IdentifyData->AdditionalSupported.DeterministicReadAfterTrimSupported;
550}
551
555 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
556{
557 /* Word 83: 15 = 0, 14 = 1 */
558 if (IdentifyData->CommandSetSupport.WordValid83 == 1)
559 {
560 /* Bit 6 of word 84 */
561 return IdentifyData->CommandSetSupport.WriteFua;
562 }
563
564 return FALSE;
565}
566
570 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
571{
572 /* Word 83: 15 = 0, 14 = 1 */
573 if (IdentifyData->CommandSetSupport.WordValid == 1)
574 {
575 /* Bit 12 of word 83 */
576 return IdentifyData->CommandSetSupport.FlushCache;
577 }
578
579 return FALSE;
580}
581
585 _In_ PIDENTIFY_DEVICE_DATA IdentifyData)
586{
587 /* Word 83: 15 = 0, 14 = 1 */
588 if (IdentifyData->CommandSetSupport.WordValid == 1)
589 {
590 /* Bit 13 of word 83 */
591 return IdentifyData->CommandSetSupport.FlushCacheExt;
592 }
593
594 return FALSE;
595}
unsigned char BOOLEAN
Definition: actypes.h:127
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
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
FORCEINLINE BOOLEAN AtaDevIsIdentifyDataIncomplete(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevNominalFormFactor(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
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 AtaDevIsReadLookAHeadEnabled(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasIeee1667(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasSmartFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasCdbInterrupt(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE BOOLEAN AtaDevHasFlushCache(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevInPuisState(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevLogicalSectorsPerPhysicalSector(_In_ PIDENTIFY_DEVICE_DATA IdentifyData, _Out_ PULONG Exponent)
FORCEINLINE BOOLEAN AtaDevIsIdentifyDataValid(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevCurrentSectorsPerDrq(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevZonedCapabilities(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasRemovableMediaStatusNotification(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasRzatFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasRemovableMediaFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasForceUnitAccessCommands(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasTrimFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasWorldWideName(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHas48BitAddressFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsRotatingDevice(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE USHORT AtaDevMediumRotationRate(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG64 AtaDevUserAddressableSectors48Bit(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsSsd(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasSenseDataReporting(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasNcqAutosense(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsRemovable(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasLbaTranslation(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsVolatileWriteCacheEnabled(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevLogicalSectorAlignment(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsTape(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE ULONG AtaDevUserAddressableSectors28Bit(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevMaximumSectorsPerDrq(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevIsDmaDirectionRequired(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE BOOLEAN AtaDevHasDratFunction(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE ULONG AtaDevQueueDepth(_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 AtaDevMaxLun(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE BOOLEAN AtaDevHasFlushCacheExt(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE BOOLEAN AtaDevHasSecurityModeFeature(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
FORCEINLINE UCHAR AtaDevCdbSizeInWords(_In_ PIDENTIFY_PACKET_DATA IdentifyPacketData)
FORCEINLINE BOOLEAN AtaDevIsZonedDevice(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
unsigned __int64 ULONG64
Definition: imports.h:198
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
unsigned short USHORT
Definition: pedump.c:61
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
uint16_t * PUSHORT
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define FORCEINLINE
Definition: wdftypes.h:67
_In_ ULONG _In_ ULONG SectorsPerTrack
Definition: iofuncs.h:2071