ReactOS 0.4.16-dev-2633-g8dc9e50
pdo.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Port Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Child device object (PDO) dispatch routines
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "atapi.h"
11
12/* GLOBALS ********************************************************************/
13
14static
15CODE_SEG("PAGE")
20{
21 PAGED_CODE();
22
23 if (!(DevExt->Device.DeviceFlags & DEVICE_PNP_STARTED))
24 {
25 PATAPORT_PORT_DATA PortData = DevExt->Device.PortData;
26
28
29 /* Update the type of device connected to the port */
30 PortData->SetDeviceData(PortData->ChannelContext,
31 DevExt->Common.Self,
32 &DevExt->IdentifyDeviceData);
33
34 /* Get the ATA initialization commands to restore the boot up defaults */
35 if (!DevExt->GtfDataBuffer)
36 {
37 DevExt->GtfDataBuffer = PortData->GetInitTaskFile(PortData->ChannelContext,
38 DevExt->Common.Self);
39 }
40
41 /* Use the standard power policy for mass storage devices */
42 DevExt->Device.PowerIdleCounter = PoRegisterDeviceForIdleDetection(DevExt->Common.Self,
43 (ULONG)-1,
44 (ULONG)-1,
46
47 /* Set the new ATA volatile settings */
48 KeClearEvent(&DevExt->Worker.ConfigureEvent);
49 AtaDeviceQueueEvent(DevExt->Device.PortData, DevExt, ACTION_DEVICE_CONFIG);
50 KeWaitForSingleObject(&DevExt->Worker.ConfigureEvent,
53 FALSE,
54 NULL);
55
56 DevExt->Device.DeviceFlags |= DEVICE_PNP_STARTED;
57 }
58
60 return STATUS_SUCCESS;
61}
62
63static
64CODE_SEG("PAGE")
69{
70 PAGED_CODE();
71
74
75 return STATUS_SUCCESS;
76}
77
78static
79CODE_SEG("PAGE")
84 _In_ BOOLEAN FinalRemove)
85{
88 BOOLEAN WasRemoved = FALSE;
89
90 PAGED_CODE();
91
93 AtaReqFlushDeviceQueue(&DevExt->Device);
95
96 if (FinalRemove && DevExt->ReportedMissing)
97 {
98 IoReleaseRemoveLockAndWait(&DevExt->Common.RemoveLock, Irp);
99
100 AtaFdoDeviceListInsert(ChanExt, DevExt, FALSE);
101 AtaPdoFreeDevice(DevExt);
102 WasRemoved = TRUE;
103 }
104
106 Irp->IoStatus.Status = Status;
108
109 if (!WasRemoved)
110 IoReleaseRemoveLock(&DevExt->Common.RemoveLock, Irp);
111 return Status;
112}
113
114static
115CODE_SEG("PAGE")
119 _In_ PIRP Irp)
120{
121 PAGED_CODE();
122
123 if (DevExt->Common.PageFiles ||
124 DevExt->Common.HibernateFiles ||
125 DevExt->Common.DumpFiles)
126 {
127 return STATUS_DEVICE_BUSY;
128 }
129
130 return STATUS_SUCCESS;
131}
132
134NTAPI
137 _In_ PIRP Irp,
138 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
139{
141
142 if (Irp->PendingReturned)
144
146}
147
148static
149CODE_SEG("PAGE")
153 _In_ PIRP Irp,
154 _In_ PIO_STACK_LOCATION IoStack)
155{
156 DEVICE_CAPABILITIES ParentCapabilities;
159 ATA_SCSI_ADDRESS AtaScsiAddress;
160
161 PAGED_CODE();
162
163 /* Get the capabilities of the parent device */
164 RtlZeroMemory(&ParentCapabilities, sizeof(ParentCapabilities));
165 ParentCapabilities.Size = sizeof(ParentCapabilities);
166 ParentCapabilities.Version = 1;
167 ParentCapabilities.Address = MAXULONG;
168 ParentCapabilities.UINumber = MAXULONG;
169 Status = AtaPnpRepeatRequest(&DevExt->Common, Irp, &ParentCapabilities);
170 if (!NT_SUCCESS(Status))
171 return Status;
172
173 DeviceCapabilities = IoStack->Parameters.DeviceCapabilities.Capabilities;
174 RtlCopyMemory(DeviceCapabilities, &ParentCapabilities, sizeof(*DeviceCapabilities));
175
176 AtaScsiAddress = DevExt->Device.AtaScsiAddress;
177
178 /* Override some fields */
179 DeviceCapabilities->UINumber = AtaScsiAddress.TargetId;
180 DeviceCapabilities->UniqueID = FALSE;
181 DeviceCapabilities->SurpriseRemovalOK = FALSE;
182 DeviceCapabilities->Removable = !!(DevExt->Device.DeviceFlags & DEVICE_IS_PDO_REMOVABLE);
183 DeviceCapabilities->D1Latency =
184 DeviceCapabilities->D2Latency =
185 DeviceCapabilities->D3Latency = 31 * 10000; // 31 seconds (legacy ATA timeout)
186 /*
187 * See ACPI specification, _ADR (Address).
188 * The goal of the LUN field here is to hide devices with LUN>0 from the ACPI driver,
189 * since these devices are not mentioned in the ACPI spec at all.
190 */
191 DeviceCapabilities->Address = (AtaScsiAddress.Lun << 4) | AtaScsiAddress.TargetId;
192
193 return STATUS_SUCCESS;
194}
195
196static
197CODE_SEG("PAGE")
201 _In_ PIRP Irp)
202{
203 PDEVICE_RELATIONS DeviceRelations;
204
205 PAGED_CODE();
206
207 DeviceRelations = ExAllocatePoolUninitialized(PagedPool,
208 sizeof(*DeviceRelations),
210 if (!DeviceRelations)
212
213 DeviceRelations->Count = 1;
214 DeviceRelations->Objects[0] = DevExt->Common.Self;
215 ObReferenceObject(DevExt->Common.Self);
216
217 Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
218 return STATUS_SUCCESS;
219}
220
221static
222CODE_SEG("PAGE")
226 _In_ PIRP Irp,
227 _In_ PIO_STACK_LOCATION IoStack)
228{
231 PWCHAR Buffer, End;
233 size_t CharCount, Remaining;
234
235 PAGED_CODE();
236
237 switch (IoStack->Parameters.QueryId.IdType)
238 {
239 case BusQueryDeviceID:
240 {
242
243 /* 'IDE\CdRomVBOX_CD-ROM_____________________________1.0_____' */
244 CharCount = (sizeof("IDE\\") - 1) + strlen(DeviceType) +
246 sizeof(ANSI_NULL);
247
249 CharCount * sizeof(WCHAR),
251 if (!Buffer)
253
254 AtaCopyIdStringSafe(LocalBuffer,
255 (PUCHAR)DevExt->FriendlyName,
257 '_');
258
260 (PUCHAR)DevExt->RevisionNumber,
262 '_');
263
265 CharCount,
266 NULL,
267 NULL,
268 0,
269 L"IDE\\%hs%.48hs",
271 LocalBuffer);
273
274 INFO("DeviceID: '%S'\n", Buffer);
275 break;
276 }
277
279 {
280 PWCHAR IdStart;
281
283
286
287 /*
288 * |------------------ 40 -----------------|-- 8 --|
289 * v v v
290 * 1) 'IDE\CdRomVBOX_CD-ROM_____________________________1.0_____'
291 * 2) 'IDE\VBOX_CD-ROM_____________________________1.0_____'
292 * 3) 'IDE\CdRomVBOX_CD-ROM_____________________________'
293 * 4) 'VBOX_CD-ROM_____________________________1.0_____'
294 * 5) 'GenCdRom'
295 */
296 CharCount = strlen(DeviceType) * 2 +
298 (sizeof("IDE\\") - 1) * 3 +
299 ATAPORT_FN_FIELD * 4 +
300 ATAPORT_RN_FIELD * 3 +
301 5 * sizeof(ANSI_NULL) +
302 sizeof(ANSI_NULL); /* multi-string */
303
305 CharCount * sizeof(WCHAR),
307 if (!Buffer)
309
310 AtaCopyIdStringSafe(LocalBuffer,
311 (PUCHAR)DevExt->FriendlyName,
313 '_');
314
316 (PUCHAR)DevExt->RevisionNumber,
318 '_');
319
320 INFO("HardwareIDs:\n");
321
322 /* ID 1 */
324 CharCount,
325 &End,
326 &Remaining,
327 0,
328 L"IDE\\%hs%.48hs",
330 LocalBuffer);
332
333 INFO(" '%S'\n", Buffer);
334
335 ++End;
336 --Remaining;
337
338 /* ID 2 */
339 IdStart = End;
341 Remaining,
342 &End,
343 &Remaining,
344 0,
345 L"IDE\\%.48hs",
346 LocalBuffer);
348
349 INFO(" '%S'\n", IdStart);
350
351 ++End;
352 --Remaining;
353
354 /* ID 3 */
355 IdStart = End;
357 Remaining,
358 &End,
359 &Remaining,
360 0,
361 L"IDE\\%hs%.40hs",
363 LocalBuffer);
365
366 INFO(" '%S'\n", IdStart);
367
368 ++End;
369 --Remaining;
370
371 /* ID 4 */
372 IdStart = End;
374 Remaining,
375 &End,
376 &Remaining,
377 0,
378 L"%.48hs",
379 LocalBuffer);
381
382 INFO(" '%S'\n", IdStart);
383
384 ++End;
385 --Remaining;
386
387 /* ID 5 */
388 IdStart = End;
390 Remaining,
391 &End,
392 &Remaining,
393 0,
394 L"%hs",
397
398 *++End = UNICODE_NULL; /* multi-string */
399
400 INFO(" '%S'\n", IdStart);
401 break;
402 }
403
405 {
407
408 /* 'GenCdRom' */
409 CharCount = strlen(GenericType) + 2 * sizeof(ANSI_NULL); /* multi-string */
410
412 CharCount * sizeof(WCHAR),
414 if (!Buffer)
416
418 CharCount,
419 &End,
420 &Remaining,
421 0,
422 L"%hs",
425
426 *++End = UNICODE_NULL; /* multi-string */
427
428 INFO("CompatibleIDs: '%S'\n", Buffer);
429 break;
430 }
431
433 {
434 ATA_SCSI_ADDRESS AtaScsiAddress;
435
436 /* 'Path.Larget.Lun' */
437 CharCount = sizeof("FF.FF.FF");
438
440 CharCount * sizeof(WCHAR),
442 if (!Buffer)
444
445 AtaScsiAddress = DevExt->Device.AtaScsiAddress;
447 CharCount,
448 &End,
449 &Remaining,
450 0,
451 L"%x.%x.%x",
452 AtaScsiAddress.PathId,
453 AtaScsiAddress.TargetId,
454 AtaScsiAddress.Lun);
456
457 INFO("InstanceID: '%S'\n", Buffer);
458 break;
459 }
460
461 default:
462 return Irp->IoStatus.Status;
463 }
464
465 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
466 return STATUS_SUCCESS;
467}
468
469static
470CODE_SEG("PAGE")
474 _In_ PIRP Irp,
475 _In_ PIO_STACK_LOCATION IoStack)
476{
479 size_t CharCount;
480
481 PAGED_CODE();
482
483 switch (IoStack->Parameters.QueryDeviceText.DeviceTextType)
484 {
486 {
487 CharCount = strlen(DevExt->FriendlyName) + sizeof(ANSI_NULL);
488
490 CharCount * sizeof(WCHAR),
492 if (!Buffer)
494
496 CharCount,
497 NULL,
498 NULL,
499 0,
500 L"%hs",
501 DevExt->FriendlyName);
503
504 INFO("TextDescription: '%S'\n", Buffer);
505 break;
506 }
507
509 {
510 ATA_SCSI_ADDRESS AtaScsiAddress;
511
512 CharCount = sizeof("Channel 255, Target 255, Lun 255");
513
515 CharCount * sizeof(WCHAR),
517 if (!Buffer)
519
520 AtaScsiAddress = DevExt->Device.AtaScsiAddress;
522 CharCount,
523 NULL,
524 NULL,
525 0,
526 L"Channel %u, Target %u, Lun %u",
527 AtaScsiAddress.PathId,
528 AtaScsiAddress.TargetId,
529 AtaScsiAddress.Lun);
531
532 INFO("TextLocationInformation: '%S'\n", Buffer);
533 break;
534 }
535
536 default:
537 return Irp->IoStatus.Status;
538 }
539
540 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
541 return STATUS_SUCCESS;
542}
543
544static
545CODE_SEG("PAGE")
550{
552 PIO_STACK_LOCATION IoStack;
553
554 PAGED_CODE();
555
556 INFO("(%p, %p) Tid.%lu %s\n",
557 DevExt->Common.Self,
558 Irp,
559 DevExt->Device.AtaScsiAddress.TargetId,
561
562 Status = IoAcquireRemoveLock(&DevExt->Common.RemoveLock, Irp);
563 if (!NT_SUCCESS(Status))
564 {
565 Irp->IoStatus.Status = Status;
567
568 return Status;
569 }
570
572
573 switch (IoStack->MinorFunction)
574 {
576 Status = AtaPdoStartDevice(DevExt, Irp);
577 break;
578
580 Status = AtaPdoStopDevice(DevExt, Irp);
581 break;
582
585 return AtaPdoRemoveDevice(DevExt,
586 Irp,
587 (IoStack->MinorFunction == IRP_MN_REMOVE_DEVICE));
588
592 break;
593
597 break;
598
600 Status = AtaPdoQueryCapabilities(DevExt, Irp, IoStack);
601 break;
602
604 Status = AtaPnpQueryPnpDeviceState(&DevExt->Common, Irp);
605 break;
606
607 case IRP_MN_QUERY_ID:
608 Status = AtaPdoQueryId(DevExt, Irp, IoStack);
609 break;
610
612 Status = AtaPdoQueryDeviceText(DevExt, Irp, IoStack);
613 break;
614
617 break;
618
620 {
623 else
624 Status = Irp->IoStatus.Status;
625 break;
626 }
627
628 default:
629 Status = Irp->IoStatus.Status;
630 break;
631 }
632
633 Irp->IoStatus.Status = Status;
635
636 IoReleaseRemoveLock(&DevExt->Common.RemoveLock, Irp);
637
638 return Status;
639}
640
641CODE_SEG("PAGE")
643NTAPI
647{
648 PAGED_CODE();
649
650 if (IS_FDO(DeviceObject->DeviceExtension))
651 return AtaFdoPnp(DeviceObject->DeviceExtension, Irp);
652 else
653 return AtaPdoPnp(DeviceObject->DeviceExtension, Irp);
654}
655
656VOID
657CODE_SEG("PAGE")
660{
661 PAGED_CODE();
662
663 if (DevExt->Device.PowerIdleCounter)
664 {
665 PoRegisterDeviceForIdleDetection(DevExt->Common.Self,
666 0,
667 0,
669 }
670
671 if (DevExt->GtfDataBuffer)
672 {
673 ExFreePoolWithTag(DevExt->GtfDataBuffer, ATAPORT_TAG);
674 DevExt->GtfDataBuffer = NULL;
675 }
676
677 if (DevExt->Device.Requests)
678 ExFreePoolWithTag(DevExt->Device.Requests, ATAPORT_TAG);
679
680 IoDeleteDevice(DevExt->Common.Self);
681}
682
683CODE_SEG("PAGE")
687 _In_ ATA_SCSI_ADDRESS AtaScsiAddress)
688{
689 PATAPORT_PORT_DATA PortData = &ChanExt->PortData;
694 WCHAR DeviceNameBuffer[sizeof("\\Device\\Ide\\IdeDeviceP99999T9L9-FFF")];
695 ULONG i;
696 DECLARE_PAGED_WSTRING(PdoFormat, L"\\Device\\Ide\\IdeDeviceP%luT%luL%lu-%lx");
697 static ULONG AtapPdoNumber = 0;
698
699 PAGED_CODE();
700
701 Status = RtlStringCbPrintfW(DeviceNameBuffer,
702 sizeof(DeviceNameBuffer),
703 PdoFormat,
704 ChanExt->DeviceObjectNumber,
705 AtaScsiAddress.TargetId,
706 AtaScsiAddress.Lun,
707 AtapPdoNumber++);
709 RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
710
711 Status = IoCreateDevice(ChanExt->Common.Self->DriverObject,
712 sizeof(*DevExt),
713 &DeviceName,
716 FALSE,
717 &Pdo);
718 if (!NT_SUCCESS(Status))
719 {
720 ERR("Failed to create PDO '%wZ' with status 0x%lx\n", &DeviceName, Status);
721 return NULL;
722 }
723
724 INFO("Created device object %p '%wZ'\n", Pdo, &DeviceName);
725
726 /* DMA buffers alignment */
727 Pdo->AlignmentRequirement = ChanExt->Common.Self->AlignmentRequirement;
728 Pdo->AlignmentRequirement = max(Pdo->AlignmentRequirement, ATA_MIN_BUFFER_ALIGNMENT);
729
730 Pdo->Flags |= DO_DIRECT_IO;
731
732 DevExt = Pdo->DeviceExtension;
733
734 RtlZeroMemory(DevExt, sizeof(*DevExt));
735 AtaPnpInitializeCommonExtension(&DevExt->Common, Pdo, ChanExt->Common.Flags & ~DO_IS_FDO);
736 DevExt->Common.FdoExt = ChanExt;
738 DevExt->Device.SectorSize = ATA_MIN_SECTOR_SIZE;
739 DevExt->Device.PortData = PortData;
740 DevExt->Device.LocalBuffer = PortData->LocalBuffer;
741
742 DevExt->Device.AtaScsiAddress = AtaScsiAddress;
743 DevExt->Device.TransportFlags = AtaScsiAddress.TargetId;
744 DevExt->Device.DeviceSelect = IDE_DRIVE_SELECT | AtaScsiAddress.Lun;
745
746 if (!(PortData->PortFlags & PORT_FLAG_IS_AHCI))
747 {
748 /* Master/Slave select bit */
749 DevExt->Device.DeviceSelect |= ((AtaScsiAddress.TargetId & 1) << 4);
750 }
751
753
754 if (PortData->PortFlags & PORT_FLAG_IS_EXTERNAL)
756
757 if (PortData->PortFlags & PORT_FLAG_PIO_VIA_DMA)
759
762
763 /* Device's capability not explored, yet */
765
766 DevExt->Device.FreeRequestsBitmap =
768
770 sizeof(ATA_DEVICE_REQUEST) * PortData->QueueDepth,
772 if (!DevExt->Device.Requests)
773 goto Failure;
774
775 for (i = 0; i < PortData->QueueDepth; ++i)
776 {
778
780#if DBG
781 Request->Signature = ATA_DEVICE_REQUEST_SIGNATURE;
782#endif
783 }
784
791
792 return DevExt;
793
794Failure:
795 AtaPdoFreeDevice(DevExt);
796
797 return NULL;
798}
#define ExAllocatePoolUninitialized
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
#define CODE_SEG(...)
unsigned char BOOLEAN
Definition: actypes.h:127
struct _ATA_IO_CONTEXT_COMMON * PATA_IO_CONTEXT_COMMON
#define ATA_MIN_SECTOR_SIZE
256 sectors of 512 bytes (128 kB).
Definition: ata_shared.h:24
#define ATA_MIN_BUFFER_ALIGNMENT
Definition: ata_shared.h:30
NTSTATUS AtaPnpQueryPnpDeviceState(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
Definition: atapi.c:555
NTSTATUS AtaPnpRepeatRequest(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp, _In_opt_ PDEVICE_CAPABILITIES DeviceCapabilities)
Definition: atapi.c:445
VOID AtaPnpInitializeCommonExtension(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PDEVICE_OBJECT SelfDeviceObject, _In_ ULONG Flags)
Definition: atapi.c:572
PCSTR AtaTypeCodeToName(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ DEVICE_TYPE_NAME Type)
Definition: atapi.c:42
NTSTATUS AtaPnpQueryDeviceUsageNotification(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
Definition: atapi.c:503
PCSTR GenericType
Definition: atapi.c:21
#define DEVICE_PIO_ONLY
Definition: atapi.h:82
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
#define DO_IS_FDO
Definition: atapi.h:430
#define PORT_FLAG_PIO_FOR_LBA48_XFER
Definition: atapi.h:345
#define ATAPORT_RN_FIELD
Definition: atapi.h:197
NTSTATUS AtaFdoPnp(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PIRP Irp)
Definition: fdo.c:510
#define PORT_FLAG_PIO_VIA_DMA
Definition: atapi.h:337
#define DEVICE_IS_PDO_REMOVABLE
Definition: atapi.h:90
#define DECLARE_PAGED_WSTRING(v, n)
Definition: atapi.h:162
@ ACTION_DEVICE_CONFIG
Definition: atapi.h:248
#define NUM_TO_BITMAP(num)
Definition: atapi.h:179
#define IS_FDO(p)
Definition: atapi.h:173
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFlushDeviceQueue(_In_ PATAPORT_IO_CONTEXT Device)
Definition: scsi.c:1451
#define PORT_FLAG_IS_AHCI
Definition: atapi.h:340
NTSTATUS AtaPdoWmiRegistration(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ BOOLEAN Register)
Definition: wmi.c:189
#define QUEUE_FLAG_FROZEN_PNP
Definition: atapi.h:107
#define DEVICE_PIO_FOR_LBA48_XFER
Definition: atapi.h:95
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqThawQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
Definition: scsi.c:1365
@ GetGenericType
Definition: atapi.h:567
@ GetDeviceType
Definition: atapi.h:566
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaDeviceQueueEvent(_In_ PATAPORT_PORT_DATA PortData, _In_opt_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ATA_PORT_ACTION Action)
Definition: portstate.c:992
#define PORT_FLAG_IS_EXTERNAL
Definition: atapi.h:338
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqWaitForOutstandingIoToComplete(_In_ PATAPORT_IO_CONTEXT Device, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: scsi.c:1395
#define ATAPORT_TAG
Definition: atapi.h:171
#define DEVICE_UNINITIALIZED
Definition: atapi.h:91
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFreezeQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
Definition: scsi.c:1351
#define DEVICE_PNP_STARTED
Definition: atapi.h:92
#define DEVICE_PIO_VIA_DMA
Definition: atapi.h:94
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaFdoDeviceListInsert(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ BOOLEAN DoInsert)
Definition: fdo.c:699
#define ATAPORT_FN_FIELD
The maximum length of identifier strings for ATA devices excluding the terminating NULL.
Definition: atapi.h:195
IO_COMPLETION_ROUTINE AtaPdoCompletionRoutine
Definition: atapi.h:859
#define QUEUE_FLAG_FROZEN_REMOVED
Definition: atapi.h:111
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
Definition: bufpool.h:45
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
FORCEINLINE PCHAR GetIRPMinorFunctionString(UCHAR MinorFunction)
Definition: driverdbg.h:13
#define L(x)
Definition: resources.c:13
#define INFO
Definition: debug.h:89
#define ULONG_PTR
Definition: config.h:101
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define DO_DIRECT_IO
Definition: env_spec_w32.h:396
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define PagedPool
Definition: env_spec_w32.h:308
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
Status
Definition: gdiplustypes.h:25
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 IDE_DRIVE_SELECT
Definition: hwidep.h:56
DeviceType
Definition: mmdrv.h:42
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define FILE_DEVICE_MASS_STORAGE
Definition: imports.h:60
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
#define DBG(x)
Definition: moztest.c:12
_In_ PIOMMU_DEVICE_PATH _In_ PIOMMU_SVM_CAPABILITIES DeviceCapabilities
Definition: haltypes.h:1824
#define KernelMode
Definition: asm.h:38
#define _Inout_
Definition: no_sal2.h:162
#define _In_reads_opt_(s)
Definition: no_sal2.h:222
#define _In_
Definition: no_sal2.h:158
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:331
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define ANSI_NULL
@ NotificationEvent
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1032
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1252
#define IoCompleteRequest
Definition: irp.c:1240
PULONG NTAPI PoRegisterDeviceForIdleDetection(IN PDEVICE_OBJECT DeviceObject, IN ULONG ConservationIdleTime, IN ULONG PerformanceIdleTime, IN DEVICE_POWER_STATE State)
Definition: power.c:633
@ PowerDeviceD3
Definition: ntpoapi.h:52
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
NTSTRSAFEVAPI RtlStringCchPrintfExW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, _Out_opt_ size_t *pcchRemaining, _In_ STRSAFE_DWORD dwFlags, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1246
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
#define STATUS_SUCCESS
Definition: shellext.h:65
static NTSTATUS AtaPdoStartDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
Definition: pdo.c:17
VOID AtaPdoFreeDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: pdo.c:658
static NTSTATUS AtaPdoStopDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
Definition: pdo.c:66
static NTSTATUS AtaPdoQueryTargetDeviceRelations(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
Definition: pdo.c:199
NTSTATUS NTAPI AtaDispatchPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: pdo.c:644
static NTSTATUS AtaPdoQueryDeviceText(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
Definition: pdo.c:472
PATAPORT_DEVICE_EXTENSION AtaPdoCreateDevice(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress)
Definition: pdo.c:685
static NTSTATUS AtaPdoQueryCapabilities(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
Definition: pdo.c:151
static NTSTATUS AtaPdoQueryStopRemoveDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
Definition: pdo.c:117
static NTSTATUS AtaPdoQueryId(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
Definition: pdo.c:224
static NTSTATUS AtaPdoRemoveDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:81
static NTSTATUS AtaPdoPnp(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp)
Definition: pdo.c:547
_In_ PVOID Context
Definition: storport.h:2269
ATAPORT_COMMON_EXTENSION Common
Definition: atapi.h:440
ATA_WORKER_DEVICE_CONTEXT Worker
Definition: atapi.h:458
LIST_ENTRY PowerIrpQueueList
Definition: atapi.h:469
ATAPORT_IO_CONTEXT Device
Definition: atapi.h:457
ULONG TransferModeAllowedMask
Definition: atapi.h:533
ATAPORT_COMMON_EXTENSION Common
Definition: atapi.h:455
PATAPORT_PORT_DATA PortData
Definition: atapi.h:101
LIST_ENTRY DeviceQueueList
Definition: atapi.h:133
ULONG DeviceFlags
Definition: atapi.h:81
ULONG FreeRequestsBitmap
Definition: atapi.h:131
PATA_DEVICE_REQUEST Requests
Definition: atapi.h:132
ATA_SCSI_ADDRESS AtaScsiAddress
Definition: atapi.h:100
KEVENT QueueStoppedEvent
Definition: atapi.h:134
PVOID LocalBuffer
Definition: atapi.h:99
KSPIN_LOCK QueueLock
Definition: atapi.h:102
ULONG MaxRequestsBitmap
Definition: atapi.h:130
PVOID LocalBuffer
Definition: atapi.h:398
PVOID ChannelContext
Definition: atapi.h:348
PCHANNEL_SET_DEVICE_DATA SetDeviceData
Definition: atapi.h:387
PCHANNEL_GET_INIT_TASK_FILE GetInitTaskFile
Definition: atapi.h:388
ULONG PortFlags
Definition: atapi.h:335
ULONG QueueDepth
Definition: atapi.h:395
PATA_IO_CONTEXT_COMMON Device
Definition: ata_shared.h:223
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2165
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@4366::@4391 QueryDeviceRelations
#define max(a, b)
Definition: svc.c:63
#define MAXULONG
Definition: typedefs.h:251
#define NTAPI
Definition: typedefs.h:36
const char * PCSTR
Definition: typedefs.h:52
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint16_t * PWCHAR
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
UCHAR PathId
Definition: atapi.h:65
UCHAR TargetId
Definition: atapi.h:60
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1705
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_ WDFDRIVER _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT Pdo
Definition: wdfminiport.h:72
#define DeviceCapabilities
Definition: wingdi.h:4895
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLockAndWait(_RemoveLock, _Tag)
Definition: iofuncs.h:2774
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2764
#define IRP_MN_CANCEL_STOP_DEVICE
DEVICE_CAPABILITIES
Definition: iotypes.h:965
@ TargetDeviceRelation
Definition: iotypes.h:2158
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_START_DEVICE
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define IRP_MN_QUERY_ID
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MN_QUERY_CAPABILITIES
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
@ DeviceTextLocationInformation
Definition: iotypes.h:2948
@ DeviceTextDescription
Definition: iotypes.h:2947
@ BusQueryCompatibleIDs
Definition: iotypes.h:2940
@ BusQueryInstanceID
Definition: iotypes.h:2941
@ BusQueryDeviceID
Definition: iotypes.h:2938
@ BusQueryHardwareIDs
Definition: iotypes.h:2939
#define IRP_MN_QUERY_REMOVE_DEVICE
@ Executive
Definition: ketypes.h:467
#define ObReferenceObject
Definition: obfuncs.h:204