27 WCHAR ChannelNameBuffer[
sizeof(
"\\Device\\Ide\\IdePort99999")];
37 sizeof(ChannelNameBuffer),
39 ChanExt->DeviceObjectNumber);
48 WCHAR SymLinkNameBuffer[
sizeof(
"\\DosDevices\\Scsi99999:")];
52 sizeof(SymLinkNameBuffer),
63 INFO(
"Symlink created '%wZ' -> '%wZ'\n", &SymLinkName, &ChannelName);
66 sizeof(SymLinkNameBuffer),
76 INFO(
"Symlink created '%wZ' -> '%wZ'\n", &SymLinkName, &ChannelName);
103 if (PortData->LocalBuffer)
114 if (!PortData->LocalBuffer)
119 PortData->LocalSgList.NumberOfElements = 1;
138 if (PortData->Worker.Thread)
157 (
PVOID*)&PortData->Worker.Thread,
198 WCHAR SymLinkNameBuffer[
sizeof(
"\\DosDevices\\Scsi99999:")];
207 sizeof(SymLinkNameBuffer),
208 AtapDevSymLinkFormat,
209 ChanExt->ScsiPortNumber);
216 sizeof(SymLinkNameBuffer),
217 AtapDosSymLinkFormat,
218 ChanExt->ScsiPortNumber);
239 INFO(
"Starting channel %lu\n", ChanExt->DeviceObjectNumber);
243 &GUID_PCIIDE_INTERFACE_ROS,
246 sizeof(ChannelInterface));
249 ERR(
"Failed to query channel interface %lx\n",
Status);
350 &GUID_DEVINTERFACE_STORAGEPORT,
352 &ChanExt->StorageInterfaceName);
355 INFO(
"InterfaceName: '%wZ'\n", &ChanExt->StorageInterfaceName);
361 ChanExt->StorageInterfaceName.Buffer =
NULL;
415 if (ChanExt->StorageInterfaceName.Buffer)
433 if (ChanExt->StorageInterfaceName.Buffer)
438 ChanExt->StorageInterfaceName.Buffer =
NULL;
446 ChanExt->PortData.PortFlags &= ~PORT_FLAG_IO_TIMER_ACTIVE;
452 ChanExt->PortData.PortFlags &= ~PORT_FLAG_CHANNEL_ATTACHED;
476 if (ChanExt->PortData.LocalBuffer)
481 ChanExt->PortData.LocalBuffer =
NULL;
484 if (ChanExt->PortData.ReservedVaSpace)
486 MmFreeMappingAddress(ChanExt->PortData.ReservedVaSpace,
ATAPORT_TAG);
487 ChanExt->PortData.ReservedVaSpace =
NULL;
519 INFO(
"(%p, %p) Ch.%lu %s\n",
520 ChanExt->Common.Self,
522 ChanExt->DeviceObjectNumber,
712 for (
Entry = ChanExt->PdoList.Next, PrevEntry =
NULL;
740 DevExt->ListEntry.Next = PrevEntry->
Next;
741 PrevEntry->
Next = &DevExt->ListEntry;
745 PrevEntry->
Next = DevExt->ListEntry.
Next;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PCIIDEX_INTERFACE_VERSION
#define ATA_CHANNEL_FLAG_IS_EXTERNAL
#define ATA_CHANNEL_FLAG_PIO_VIA_DMA
#define ATA_CHANNEL_FLAG_PIO_FOR_LBA48_XFER
#define ATA_CHANNEL_FLAG_NCQ
#define ATA_CHANNEL_FLAG_IS_AHCI
#define DD_ATA_REG_MAX_TARGET_ID
NTSTATUS AtaPnpQueryPnpDeviceState(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
VOID AtaSetPortRegistryKey(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PCWSTR KeyName, _In_ ULONG KeyValue)
NTSTATUS AtaPnpQueryInterface(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ const GUID *Guid, _Out_ PVOID Interface, _In_ ULONG Version, _In_ ULONG Size)
NTSTATUS AtaPnpQueryDeviceUsageNotification(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
IO_TIMER_ROUTINE AtaPortIoTimer
#define PORT_FLAG_PIO_FOR_LBA48_XFER
#define PORT_FLAG_PIO_ONLY
#define PORT_FLAG_EXIT_THREAD
#define PORT_FLAG_PIO_VIA_DMA
VOID AtaPdoFreeDevice(_In_ PATAPORT_DEVICE_EXTENSION DevExt)
#define PORT_INT_FLAG_IS_IO_ACTIVE
KDEFERRED_ROUTINE AtaPortWorkerSignalDpc
#define DECLARE_PAGED_WSTRING(v, n)
#define PORT_FLAG_SYMLINK_CREATED
#define PORT_FLAG_IO_TIMER_ACTIVE
KSTART_ROUTINE AtaPortWorkerThread
NTSTATUS AtaFdoQueryBusRelations(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp)
#define NUM_TO_BITMAP(num)
#define ATA_RESERVED_PAGES
KDEFERRED_ROUTINE AtaStorageNotificationlDpc
#define PORT_FLAG_IS_SIMPLEX
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaReqFlushDeviceQueue(_In_ PATAPORT_IO_CONTEXT Device)
#define PORT_FLAG_IS_AHCI
#define PORT_FLAG_CHANNEL_ATTACHED
REQUEST_COMPLETION_ROUTINE AtaPortCompleteInternalRequest
PORT_NOTIFICATION AtaPortNotification
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaPortSignalWorkerThread(_In_ PATAPORT_PORT_DATA PortData)
#define PORT_FLAG_IS_EXTERNAL
#define ATA_LOCAL_BUFFER_SIZE
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
PVOID NTAPI MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL, IN PHYSICAL_ADDRESS HighestAcceptableAddress, IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, IN MEMORY_CACHING_TYPE CacheType OPTIONAL)
VOID NTAPI MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
#define NT_SUCCESS(StatCode)
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
FORCEINLINE PCHAR GetIRPMinorFunctionString(UCHAR MinorFunction)
VOID CompleteIrp(IN PIRP Irp, IN NTSTATUS Status, IN ULONG_PTR Information)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeReleaseSpinLock(sl, irql)
#define KeAcquireSpinLock(sl, irql)
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] STATPROPSETSTG *rgelt, [out] ULONG *pceltFetched)
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Returns a pointer to the I/O manager's global configuration information structure.
NTSTATUS NTAPI IoInitializeTimer(IN PDEVICE_OBJECT DeviceObject, IN PIO_TIMER_ROUTINE TimerRoutine, IN PVOID Context)
VOID NTAPI IoStartTimer(IN PDEVICE_OBJECT DeviceObject)
VOID NTAPI IoStopTimer(PDEVICE_OBJECT DeviceObject)
_Out_ PNDIS_HANDLE _Out_ PUINT _In_ PNDIS_STRING _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
static BOOL StartDevice(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DevInfoData OPTIONAL, IN BOOL bEnable, IN DWORD HardwareProfile OPTIONAL, OUT BOOL *bNeedReboot OPTIONAL)
#define THREAD_ALL_ACCESS
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define RTL_BITS_OF(sizeOfArg)
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
#define IRP_MN_SURPRISE_REMOVAL
#define IoSkipCurrentIrpStackLocation(Irp)
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
#define IoCompleteRequest
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
NTSTATUS NTAPI IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName)
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress(IN PVOID Address)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define OBJ_KERNEL_HANDLE
#define DECLSPEC_NOINLINE_FROM_PAGED
static NTSTATUS AtaFdoRemoveDevice(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp, _In_ BOOLEAN FinalRemove)
NTSTATUS AtaFdoPnp(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PIRP Irp)
static NTSTATUS AtaFdoStopDevice(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PIRP Irp)
static NTSTATUS AtaFdoAllocateLocalBuffer(_In_ PATAPORT_PORT_DATA PortData)
static NTSTATUS AtaFdoCreateSymLinks(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt)
static VOID AtaFdoRemoveSymLinks(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt)
static VOID AtaFdoDetachChannel(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt)
NTSTATUS AtaFdoStartDevice(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PCM_RESOURCE_LIST ResourcesTranslated)
static VOID AtaFdoDestroyPortThread(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt)
static NTSTATUS AtaFdoCreatePortThread(_In_ PATAPORT_PORT_DATA PortData)
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindNextDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _Inout_ PATA_SCSI_ADDRESS AtaScsiAddress, _In_ BOOLEAN SearchRemoveDev, _In_ PVOID ReferenceTag)
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress, _In_ PVOID ReferenceTag)
DECLSPEC_NOINLINE_FROM_PAGED VOID AtaFdoDeviceListInsert(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ BOOLEAN DoInsert)
IO_REMOVE_LOCK RemoveLock
ATAPORT_IO_CONTEXT Device
ATAPORT_COMMON_EXTENSION Common
ATA_SCSI_ADDRESS AtaScsiAddress
PCHANNEL_SET_MODE SetTransferMode
PCHANNEL_ENUMERATE_CHANNEL EnumerateChannel
ULONG MaximumPhysicalPages
PDEVICE_OBJECT ChannelObject
ULONG MaximumTransferLength
PCHANNEL_IDENTIFY_DEVICE IdentifyDevice
PCHANNEL_PREPARE_PRD_TABLE PreparePrdTable
PCHANNEL_SET_DEVICE_DATA SetDeviceData
PATA_DEVICE_REQUEST Slots[MAX_SLOTS]
PCHANNEL_GET_INIT_TASK_FILE GetInitTaskFile
PCHANNEL_START_IO StartIo
PCHANNEL_ABORT_CHANNEL AbortChannel
PCHANNEL_RESET_CHANNEL ResetChannel
volatile LONG InterruptFlags
PCHANNEL_PREPARE_IO PrepareIo
PCHANNEL_DOWNGRADE_INTERFACE_SPEED DowngradeInterfaceSpeed
PKINTERRUPT InterruptObject
ATA_WORKER_CONTEXT Worker
PCONTROLLER_ATTACH_CHANNEL AttachChannel
PCHANNEL_ALLOCATE_SLOT AllocateSlot
PCONTROLLER_OBJECT HwSyncObject
PREQUEST_COMPLETION_ROUTINE Complete
ATA_DEVICE_REQUEST InternalRequest
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@4366::@4391 QueryDeviceRelations
Channel interface with the PCIIDEX driver.
PPORT_NOTIFICATION * PortNotification
PCHANNEL_SET_MODE SetTransferMode
PCHANNEL_ALLOCATE_SLOT AllocateSlot
ULONG MaximumTransferLength
PCHANNEL_RESET_CHANNEL ResetChannel
PCHANNEL_DOWNGRADE_INTERFACE_SPEED DowngradeInterfaceSpeed
PCHANNEL_IDENTIFY_DEVICE IdentifyDevice
PCHANNEL_GET_INIT_TASK_FILE GetInitTaskFile
PCHANNEL_ABORT_CHANNEL AbortChannel
PCHANNEL_SET_DEVICE_DATA SetDeviceData
ULONG MaximumPhysicalPages
PCHANNEL_START_IO StartIo
PCONTROLLER_OBJECT HwSyncObject
PKINTERRUPT InterruptObject
PCHANNEL_PREPARE_IO PrepareIo
PCONTROLLER_ATTACH_CHANNEL AttachChannel
PCHANNEL_PREPARE_PRD_TABLE PreparePrdTable
PATA_DEVICE_REQUEST ** Slots
PDEVICE_OBJECT ChannelObject
PCHANNEL_ENUMERATE_CHANNEL EnumerateChannel
ULONG TransferModeSupported
struct _SINGLE_LIST_ENTRY * Next
#define CONTAINING_RECORD(address, type, field)
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
_In_ UCHAR _In_ UCHAR MinorFunction
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLockAndWait(_RemoveLock, _Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
#define IRP_MN_CANCEL_STOP_DEVICE
#define IRP_MN_QUERY_PNP_DEVICE_STATE
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
#define IRP_MN_START_DEVICE
#define IRP_MN_DEVICE_USAGE_NOTIFICATION
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_REMOVE_DEVICE
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS LowestAcceptableAddress
#define ObDereferenceObject
FORCEINLINE VOID PushEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry)
FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead)