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

Go to the source code of this file.

Functions

static NTSTATUS AtaPdoStartDevice (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
 
static NTSTATUS AtaPdoStopDevice (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
 
static NTSTATUS AtaPdoRemoveDevice (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp, _In_ BOOLEAN FinalRemove)
 
static NTSTATUS AtaPdoQueryStopRemoveDevice (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
 
NTSTATUS NTAPI AtaPdoCompletionRoutine (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
 
static NTSTATUS AtaPdoQueryCapabilities (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
 
static NTSTATUS AtaPdoQueryTargetDeviceRelations (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
 
static NTSTATUS AtaPdoQueryId (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
 
static NTSTATUS AtaPdoQueryDeviceText (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
 
static NTSTATUS AtaPdoPnp (_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp)
 
NTSTATUS NTAPI AtaDispatchPnp (_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
 
VOID AtaPdoFreeDevice (_In_ PATAPORT_DEVICE_EXTENSION DevExt)
 
PATAPORT_DEVICE_EXTENSION AtaPdoCreateDevice (_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress)
 

Function Documentation

◆ AtaDispatchPnp()

NTSTATUS NTAPI AtaDispatchPnp ( _In_ PDEVICE_OBJECT  DeviceObject,
_Inout_ PIRP  Irp 
)

Definition at line 644 of file pdo.c.

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}
#define PAGED_CODE()
NTSTATUS AtaFdoPnp(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PIRP Irp)
Definition: fdo.c:510
#define IS_FDO(p)
Definition: atapi.h:173
_In_ PIRP Irp
Definition: csq.h:116
static NTSTATUS AtaPdoPnp(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _Inout_ PIRP Irp)
Definition: pdo.c:547
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061

Referenced by DriverEntry().

◆ AtaPdoCompletionRoutine()

NTSTATUS NTAPI AtaPdoCompletionRoutine ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_reads_opt_(_Inexpressible_("varies")) PVOID  Context 
)

Definition at line 135 of file pdo.c.

139{
141
142 if (Irp->PendingReturned)
144
146}
#define FALSE
Definition: types.h:117
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
_In_ PVOID Context
Definition: storport.h:2269
#define IO_NO_INCREMENT
Definition: iotypes.h:598

◆ AtaPdoCreateDevice()

PATAPORT_DEVICE_EXTENSION AtaPdoCreateDevice ( _In_ PATAPORT_CHANNEL_EXTENSION  ChanExt,
_In_ ATA_SCSI_ADDRESS  AtaScsiAddress 
)

Definition at line 685 of file pdo.c.

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}
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
VOID AtaPnpInitializeCommonExtension(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PDEVICE_OBJECT SelfDeviceObject, _In_ ULONG Flags)
Definition: atapi.c:572
#define DEVICE_PIO_ONLY
Definition: atapi.h:82
#define DO_IS_FDO
Definition: atapi.h:430
#define PORT_FLAG_PIO_FOR_LBA48_XFER
Definition: atapi.h:345
#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
#define NUM_TO_BITMAP(num)
Definition: atapi.h:179
#define PORT_FLAG_IS_AHCI
Definition: atapi.h:340
#define DEVICE_PIO_FOR_LBA48_XFER
Definition: atapi.h:95
#define PORT_FLAG_IS_EXTERNAL
Definition: atapi.h:338
#define ATAPORT_TAG
Definition: atapi.h:171
#define DEVICE_UNINITIALIZED
Definition: atapi.h:91
#define DEVICE_PIO_VIA_DMA
Definition: atapi.h:94
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
#define INFO
Definition: debug.h:89
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#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
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
#define ASSERT(a)
Definition: mode.c:44
#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
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
@ NotificationEvent
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
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
short WCHAR
Definition: pedump.c:58
VOID AtaPdoFreeDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: pdo.c:658
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
ULONG PortFlags
Definition: atapi.h:335
ULONG QueueDepth
Definition: atapi.h:395
PATA_IO_CONTEXT_COMMON Device
Definition: ata_shared.h:223
#define max(a, b)
Definition: svc.c:63
#define MAXULONG
Definition: typedefs.h:251
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_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

Referenced by AtaFdoEnumeratePort().

◆ AtaPdoFreeDevice()

VOID AtaPdoFreeDevice ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt)

Definition at line 658 of file pdo.c.

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}
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1252
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

Referenced by AtaFdoEnumeratePort(), AtaFdoRemoveDevice(), AtaPdoCreateDevice(), and AtaPdoRemoveDevice().

◆ AtaPdoPnp()

static NTSTATUS AtaPdoPnp ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_Inout_ PIRP  Irp 
)
static

Definition at line 547 of file pdo.c.

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}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
NTSTATUS AtaPnpQueryPnpDeviceState(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
Definition: atapi.c:555
NTSTATUS AtaPnpQueryDeviceUsageNotification(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
Definition: atapi.c:503
FORCEINLINE PCHAR GetIRPMinorFunctionString(UCHAR MinorFunction)
Definition: driverdbg.h:13
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IoCompleteRequest
Definition: irp.c:1240
#define STATUS_SUCCESS
Definition: shellext.h:65
static NTSTATUS AtaPdoStartDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp)
Definition: pdo.c:17
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
static NTSTATUS AtaPdoQueryDeviceText(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PIRP Irp, _In_ PIO_STACK_LOCATION IoStack)
Definition: pdo.c:472
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
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@4366::@4391 QueryDeviceRelations
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1705
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2764
#define IRP_MN_CANCEL_STOP_DEVICE
@ TargetDeviceRelation
Definition: iotypes.h:2158
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#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
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_REMOVE_DEVICE

Referenced by AtaDispatchPnp().

◆ AtaPdoQueryCapabilities()

static NTSTATUS AtaPdoQueryCapabilities ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IoStack 
)
static

Definition at line 151 of file pdo.c.

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}
NTSTATUS AtaPnpRepeatRequest(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp, _In_opt_ PDEVICE_CAPABILITIES DeviceCapabilities)
Definition: atapi.c:445
_In_ PIOMMU_DEVICE_PATH _In_ PIOMMU_SVM_CAPABILITIES DeviceCapabilities
Definition: haltypes.h:1824
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
UCHAR TargetId
Definition: atapi.h:60
#define DeviceCapabilities
Definition: wingdi.h:4895
DEVICE_CAPABILITIES
Definition: iotypes.h:965
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965

Referenced by AtaPdoPnp().

◆ AtaPdoQueryDeviceText()

static NTSTATUS AtaPdoQueryDeviceText ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IoStack 
)
static

Definition at line 472 of file pdo.c.

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}
#define ExAllocatePoolUninitialized
Definition: bufpool.h:45
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
#define ULONG_PTR
Definition: config.h:101
#define PagedPool
Definition: env_spec_w32.h:308
#define ANSI_NULL
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
uint16_t * PWCHAR
Definition: typedefs.h:56
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
UCHAR PathId
Definition: atapi.h:65
@ DeviceTextLocationInformation
Definition: iotypes.h:2948
@ DeviceTextDescription
Definition: iotypes.h:2947

Referenced by AtaPdoPnp().

◆ AtaPdoQueryId()

static NTSTATUS AtaPdoQueryId ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IoStack 
)
static

Definition at line 224 of file pdo.c.

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}
PCSTR AtaTypeCodeToName(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ DEVICE_TYPE_NAME Type)
Definition: atapi.c:42
PCSTR GenericType
Definition: atapi.c:21
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 ATAPORT_RN_FIELD
Definition: atapi.h:197
@ GetGenericType
Definition: atapi.h:567
@ GetDeviceType
Definition: atapi.h:566
#define ATAPORT_FN_FIELD
The maximum length of identifier strings for ATA devices excluding the terminating NULL.
Definition: atapi.h:195
DeviceType
Definition: mmdrv.h:42
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:331
#define UNICODE_NULL
char CHAR
Definition: pedump.c:57
const char * PCSTR
Definition: typedefs.h:52
unsigned char * PUCHAR
Definition: typedefs.h:53
@ BusQueryCompatibleIDs
Definition: iotypes.h:2940
@ BusQueryInstanceID
Definition: iotypes.h:2941
@ BusQueryDeviceID
Definition: iotypes.h:2938
@ BusQueryHardwareIDs
Definition: iotypes.h:2939

Referenced by AtaPdoPnp().

◆ AtaPdoQueryStopRemoveDevice()

static NTSTATUS AtaPdoQueryStopRemoveDevice ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp 
)
static

Definition at line 117 of file pdo.c.

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}
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129

Referenced by AtaPdoPnp().

◆ AtaPdoQueryTargetDeviceRelations()

static NTSTATUS AtaPdoQueryTargetDeviceRelations ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp 
)
static

Definition at line 199 of file pdo.c.

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}
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2165
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by AtaPdoPnp().

◆ AtaPdoRemoveDevice()

static NTSTATUS AtaPdoRemoveDevice ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_Inout_ PIRP  Irp,
_In_ BOOLEAN  FinalRemove 
)
static

Definition at line 81 of file pdo.c.

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}
unsigned char BOOLEAN
Definition: actypes.h:127
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFlushDeviceQueue(_In_ PATAPORT_IO_CONTEXT Device)
Definition: scsi.c:1451
NTSTATUS AtaPdoWmiRegistration(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ BOOLEAN Register)
Definition: wmi.c:189
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFreezeQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
Definition: scsi.c:1351
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaFdoDeviceListInsert(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ BOOLEAN DoInsert)
Definition: fdo.c:699
#define QUEUE_FLAG_FROZEN_REMOVED
Definition: atapi.h:111
#define TRUE
Definition: types.h:120
ATAPORT_COMMON_EXTENSION Common
Definition: atapi.h:440
#define IoReleaseRemoveLockAndWait(_RemoveLock, _Tag)
Definition: iofuncs.h:2774

Referenced by AtaPdoPnp().

◆ AtaPdoStartDevice()

static NTSTATUS AtaPdoStartDevice ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp 
)
static

Definition at line 17 of file pdo.c.

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}
@ ACTION_DEVICE_CONFIG
Definition: atapi.h:248
#define QUEUE_FLAG_FROZEN_PNP
Definition: atapi.h:107
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqThawQueue(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ULONG ReasonFlags)
Definition: scsi.c:1365
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 DEVICE_PNP_STARTED
Definition: atapi.h:92
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
#define KernelMode
Definition: asm.h:38
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
@ Executive
Definition: ketypes.h:467

Referenced by AtaPdoPnp().

◆ AtaPdoStopDevice()

static NTSTATUS AtaPdoStopDevice ( _In_ PATAPORT_DEVICE_EXTENSION  DevExt,
_In_ PIRP  Irp 
)
static

Definition at line 66 of file pdo.c.

69{
70 PAGED_CODE();
71
74
75 return STATUS_SUCCESS;
76}
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqWaitForOutstandingIoToComplete(_In_ PATAPORT_IO_CONTEXT Device, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: scsi.c:1395

Referenced by AtaPdoPnp().