ReactOS 0.4.17-dev-116-ga4b6fe9
pciidex.c File Reference
#include "pciidex.h"
Include dependency graph for pciidex.c:

Go to the source code of this file.

Functions

BOOLEAN PciFindDevice (_In_ __callback PATA_PCI_MATCH_FN MatchFunction, _In_ PVOID Context)
 
VOID PciRead (_In_ PATA_CONTROLLER Controller, _Out_writes_bytes_all_(BufferLength) PVOID Buffer, _In_ ULONG ConfigDataOffset, _In_ ULONG BufferLength)
 
VOID PciWrite (_In_ PATA_CONTROLLER Controller, _In_reads_bytes_(BufferLength) PVOID Buffer, _In_ ULONG ConfigDataOffset, _In_ ULONG BufferLength)
 
VOID AtaSleep (VOID)
 
NTSTATUS NTAPI PciIdeXDispatchWmi (_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
 
VOID NTAPI PciIdeXUnload (_In_ PDRIVER_OBJECT DriverObject)
 
NTSTATUS PciIdeXPnpRepeatRequest (_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp, _In_opt_ PDEVICE_CAPABILITIES DeviceCapabilities)
 
NTSTATUS PciIdeXPnpQueryDeviceUsageNotification (_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp)
 
NTSTATUS PciIdeXPnpQueryPnpDeviceState (_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp)
 
NTSTATUS NTAPI PciIdeXPdoCompletionRoutine (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
 
static NTSTATUS PciIdeXPnpQueryInterface (_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ const GUID *Guid, _Out_ PVOID Interface, _In_ ULONG Version, _In_ ULONG Size)
 
static NTSTATUS PciIdeXAddDeviceEx (_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject, _Out_ PVOID *ControllerContext)
 
NTSTATUS NTAPI PciIdeXAddDevice (_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject)
 
static VOID PciIdeXCreateIdeDirectory (VOID)
 
NTSTATUS NTAPI PciIdeXInitialize (_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath, _In_ PCONTROLLER_PROPERTIES HwGetControllerProperties, _In_ ULONG ExtensionSize)
 
NTSTATUS NTAPI DriverEntry (_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
 

Variables

ULONG PciIdeControllerNumber = 0
 

Function Documentation

◆ AtaSleep()

VOID AtaSleep ( VOID  )

Definition at line 100 of file pciidex.c.

101{
104
106
107 DueTime.QuadPart = PORT_TIMER_TICK_MS * -10000LL;
108
112}
#define FALSE
Definition: types.h:117
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define ASSERT(a)
Definition: mode.c:44
#define KernelMode
Definition: asm.h:38
#define PORT_TIMER_TICK_MS
Definition: pciidex.h:54
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:282
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190
@ Executive
Definition: ketypes.h:467

Referenced by AtaAhciPhyCheckDevicePresence(), AtaAhciPmpPhyCheckDevicePresence(), AtaAhciPmpPhyWaitForReady(), AtaAhciPollRegister(), AtaAhciWaitForDeviceReady(), and PataResetChannel().

◆ DriverEntry()

NTSTATUS NTAPI DriverEntry ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PUNICODE_STRING  RegistryPath 
)

Definition at line 572 of file pciidex.c.

575{
578
579 PAGED_CODE();
580
581 return STATUS_SUCCESS;
582}
#define PAGED_CODE()
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define STATUS_SUCCESS
Definition: shellext.h:65
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213

◆ PciFindDevice()

BOOLEAN PciFindDevice ( _In_ __callback PATA_PCI_MATCH_FN  MatchFunction,
_In_ PVOID  Context 
)

Definition at line 13 of file pciidex.c.

16{
17 ULONG BusNumber, DeviceNumber, FunctionNumber;
18
19 for (BusNumber = 0; BusNumber < 0xFF; ++BusNumber)
20 {
22 {
23 for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; ++FunctionNumber)
24 {
29
30 PciSlot.u.AsULONG = 0;
31 PciSlot.u.bits.DeviceNumber = DeviceNumber;
32 PciSlot.u.bits.FunctionNumber = FunctionNumber;
33
37 &Buffer,
38 0,
39 sizeof(Buffer));
40 if (BytesRead != sizeof(Buffer) ||
41 PciConfig->VendorID == PCI_INVALID_VENDORID ||
42 PciConfig->VendorID == 0)
43 {
44 if (FunctionNumber == 0)
45 {
46 /* This slot has no single- or a multi-function device */
47 break;
48 }
49 else
50 {
51 /* Continue scanning the functions */
52 continue;
53 }
54 }
55
56 if (MatchFunction(Context, BusNumber, PciSlot, PciConfig))
57 return TRUE;
58
60 {
61 /* The device is a single function device */
62 break;
63 }
64 }
65 }
66 }
67
68 return FALSE;
69}
Definition: bufpool.h:45
_In_ PCHAR _In_ ULONG DeviceNumber
Definition: classpnp.h:1230
#define TRUE
Definition: types.h:120
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:73
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
Definition: ntbasedef.h:684
_In_ ULONG _In_ PCI_SLOT_NUMBER PciSlot
Definition: pciidex.h:66
_In_ ULONG BusNumber
Definition: pciidex.h:65
_In_ ULONG _In_ PCI_SLOT_NUMBER _In_ PPCI_COMMON_HEADER PciConfig
Definition: pciidex.h:67
@ PCIConfiguration
Definition: miniport.h:93
_In_ PVOID Context
Definition: storport.h:2269
struct _PCI_SLOT_NUMBER::@4498::@4499 bits
union _PCI_SLOT_NUMBER::@4498 u
unsigned char UCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
Definition: wdfiotarget.h:870
#define PCI_INVALID_VENDORID
Definition: iotypes.h:3603
#define PCI_MAX_FUNCTION
Definition: iotypes.h:3601
struct _PCI_COMMON_HEADER * PPCI_COMMON_HEADER
#define PCI_MAX_DEVICES
Definition: iotypes.h:3600
_In_ USHORT _In_ UCHAR RevisionID
Definition: iotypes.h:893
#define PCI_MULTIFUNCTION_DEVICE(PciData)
Definition: iotypes.h:3614

Referenced by IntelGetControllerProperties(), SvwPataControllerStart(), and ViaPataGetControllerProperties().

◆ PciIdeXAddDevice()

NTSTATUS NTAPI PciIdeXAddDevice ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PDEVICE_OBJECT  PhysicalDeviceObject 
)

Definition at line 471 of file pciidex.c.

474{
475 PAGED_CODE();
476
478}
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define NULL
Definition: types.h:112
static NTSTATUS PciIdeXAddDeviceEx(_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PhysicalDeviceObject, _Out_ PVOID *ControllerContext)
Definition: pciidex.c:350

◆ PciIdeXAddDeviceEx()

static NTSTATUS PciIdeXAddDeviceEx ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PDEVICE_OBJECT  PhysicalDeviceObject,
_Out_ PVOID ControllerContext 
)
static

Definition at line 350 of file pciidex.c.

354{
357 ULONG DeviceExtensionSize;
360 WCHAR DeviceNameBuffer[sizeof("\\Device\\Ide\\PciIde99999")];
362
363 PAGED_CODE();
364
365 Status = RtlStringCbPrintfW(DeviceNameBuffer,
366 sizeof(DeviceNameBuffer),
367 L"\\Device\\Ide\\PciIde%lu",
370 RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
371
372 INFO("%s(%p, %p, %p) '%wZ'\n",
374
377
378 Status = RtlULongAdd(DriverExtension->MiniControllerExtensionSize,
379 sizeof(*FdoExtension),
380 &DeviceExtensionSize);
381 if (!NT_SUCCESS(Status))
382 {
383 ERR("Invalid miniport extension size %lx\n", DriverExtension->MiniControllerExtensionSize);
384 return Status;
385 }
386
388 DeviceExtensionSize,
389 &DeviceName,
392 FALSE,
393 &Fdo);
394 if (!NT_SUCCESS(Status))
395 {
396 ERR("Failed to create FDO 0x%lx\n", Status);
397 return Status;
398 }
399
400 FdoExtension = Fdo->DeviceExtension;
401
403 FdoExtension->Common.Flags = DO_IS_FDO;
404 FdoExtension->Common.Self = Fdo;
405 IoInitializeRemoveLock(&FdoExtension->Common.RemoveLock, TAG_PCIIDEX, 0, 0);
406
407 FdoExtension->DriverObject = DriverObject;
409 FdoExtension->ControllerNumber = PciIdeControllerNumber++;
410
411 ExInitializeFastMutex(&FdoExtension->PdoListSyncMutex);
412 InitializeListHead(&FdoExtension->PdoListHead);
413
414 KeInitializeSpinLock(&FdoExtension->Controller.Lock);
415
418 &FdoExtension->Common.LowerDeviceObject);
419 if (!NT_SUCCESS(Status))
420 {
421 ERR("Failed to attach FDO 0x%lx\n", Status);
422 goto Failure;
423 }
424
425 /* DMA buffers alignment */
426 Fdo->AlignmentRequirement = FdoExtension->Common.LowerDeviceObject->AlignmentRequirement;
427 Fdo->AlignmentRequirement = max(Fdo->AlignmentRequirement, ATA_MIN_BUFFER_ALIGNMENT);
428
429#if defined(ATA_DETECT_LEGACY_DEVICES)
430 if (ControllerContext)
431 {
432 FdoExtension->Controller.Flags |= CTRL_FLAG_NON_PNP;
433 *ControllerContext = FdoExtension;
434 }
435 else
436#endif
437 {
438 BUS_INTERFACE_STANDARD BusInterface;
439
441 &GUID_BUS_INTERFACE_STANDARD,
442 &BusInterface,
444 sizeof(BusInterface));
445 if (!NT_SUCCESS(Status))
446 {
447 ERR("No PCI bus interface 0x%lx\n", Status);
448 goto Failure;
449 }
450
451 FdoExtension->Controller.BusInterfaceContext = BusInterface.Context;
452 FdoExtension->Controller.SetBusData = BusInterface.SetBusData;
453 FdoExtension->Controller.GetBusData = BusInterface.GetBusData;
454 }
455
456 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
457 return STATUS_SUCCESS;
458
459Failure:
460 if (FdoExtension->Common.LowerDeviceObject)
461 IoDetachDevice(FdoExtension->Common.LowerDeviceObject);
462
464
465 return Status;
466}
#define ATA_MIN_BUFFER_ALIGNMENT
Definition: ata_shared.h:30
#define DO_IS_FDO
Definition: atapi.h:430
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: precomp.h:57
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
#define __FUNCTION__
Definition: types.h:116
#define INFO
Definition: debug.h:89
@ FdoExtension
Definition: precomp.h:48
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
Status
Definition: gdiplustypes.h:25
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
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
NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject)
Definition: device.c:981
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1297
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1252
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1916
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
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
static NTSTATUS PciIdeXPnpQueryInterface(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ const GUID *Guid, _Out_ PVOID Interface, _In_ ULONG Version, _In_ ULONG Size)
Definition: pciidex.c:299
ULONG PciIdeControllerNumber
Definition: pciidex.c:10
#define CTRL_FLAG_NON_PNP
Definition: pciidex.h:228
#define TAG_PCIIDEX
Definition: pciidex.h:32
short WCHAR
Definition: pedump.c:58
#define FILE_DEVICE_BUS_EXTENDER
Definition: winioctl.h:87
PGET_SET_DEVICE_DATA SetBusData
Definition: iotypes.h:915
PGET_SET_DEVICE_DATA GetBusData
Definition: iotypes.h:916
#define max(a, b)
Definition: svc.c:63
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ WDFDEVICE Fdo
Definition: wdffdo.h:461
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
#define IoInitializeRemoveLock(Lock, AllocateTag, MaxLockedMinutes, HighWatermark)
Definition: iofuncs.h:2833
#define PCI_BUS_INTERFACE_STANDARD_VERSION
Definition: iotypes.h:5339

Referenced by PciIdeXAddDevice(), and PciIdeXInitialize().

◆ PciIdeXCreateIdeDirectory()

static VOID PciIdeXCreateIdeDirectory ( VOID  )
static

Definition at line 483 of file pciidex.c.

484{
488 UNICODE_STRING DirectoryName = RTL_CONSTANT_STRING(L"\\Device\\Ide");
489
490 PAGED_CODE();
491
493 &DirectoryName,
495 NULL,
496 NULL);
497
499 if (NT_SUCCESS(Status))
500 {
501 /* We don't need a handle for a permanent object */
503 }
504 /*
505 * Ignore directory creation failures (don't report them as a driver initialization error)
506 * as the directory may have already been created by another driver.
507 * We will handle fatal errors later via IoCreateDevice() call.
508 */
509}
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
ULONG Handle
Definition: gdb_input.c:15
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject(_Out_ PHANDLE DirectoryHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define DIRECTORY_ALL_ACCESS
Definition: nt_native.h:1262
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define OBJ_PERMANENT
Definition: winternl.h:226

Referenced by PciIdeXInitialize().

◆ PciIdeXDispatchWmi()

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

Definition at line 117 of file pciidex.c.

120{
122
123 PAGED_CODE();
124
125 if (IS_FDO(DeviceObject->DeviceExtension))
126 {
128
130 Status = IoCallDriver(FdoExtension->Common.LowerDeviceObject, Irp);
131 }
132 else
133 {
134 Status = Irp->IoStatus.Status;
136 }
137
138 return Status;
139}
#define IS_FDO(p)
Definition: atapi.h:173
_In_ PIRP Irp
Definition: csq.h:116
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCompleteRequest
Definition: irp.c:1240
#define IoCallDriver
Definition: irp.c:1225
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by PciIdeXInitialize().

◆ PciIdeXInitialize()

NTSTATUS NTAPI PciIdeXInitialize ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ PUNICODE_STRING  RegistryPath,
_In_ PCONTROLLER_PROPERTIES  HwGetControllerProperties,
_In_ ULONG  ExtensionSize 
)

Definition at line 514 of file pciidex.c.

519{
522
523 PAGED_CODE();
524
525 INFO("PciIdeXInitialize(%p '%wZ' %p 0x%lx)\n",
526 DriverObject, RegistryPath, HwGetControllerProperties, ExtensionSize);
527
528 /* ReactOS-specific: Check for our legacy detection magic */
530 {
531#if defined(ATA_DETECT_LEGACY_DEVICES)
532 PPCIIDEX_LEGACY_CONTROLLER_INTERFACE ControllerInferface;
533
534 ControllerInferface = (PVOID)HwGetControllerProperties;
535 ControllerInferface->Version = PCIIDEX_INTERFACE_VERSION;
536 ControllerInferface->AddDevice = PciIdeXAddDeviceEx;
537 ControllerInferface->StartDevice = PciIdeXFdoStartDevice;
538 ControllerInferface->RemoveDevice = PciIdeXFdoRemoveDevice;
539
540 ExtensionSize = 0;
541#else
543#endif
544 }
545
548 sizeof(*DriverExtension),
550 if (!NT_SUCCESS(Status))
551 return Status;
552
554 DriverExtension->MiniControllerExtensionSize = ExtensionSize;
555 DriverExtension->HwGetControllerProperties = HwGetControllerProperties;
556
560 DriverObject->DriverExtension->AddDevice = PciIdeXAddDevice;
561 DriverObject->DriverUnload = PciIdeXUnload;
562
563 /* Create a directory to hold the driver's device objects */
565
566 return STATUS_SUCCESS;
567}
#define PCIIDEX_INTERFACE_VERSION
Definition: ata_shared.h:12
#define PCIIDEX_GET_CONTROLLER_INTERFACE_SIGNATURE
Definition: ata_shared.h:481
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
NTSTATUS NTAPI PciIdeXDispatchPower(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: power.c:53
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1838
static VOID PciIdeXCreateIdeDirectory(VOID)
Definition: pciidex.c:483
NTSTATUS NTAPI PciIdeXDispatchWmi(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: pciidex.c:117
CONTROLLER_PNP_START_DEVICE PciIdeXFdoStartDevice
Definition: pciidex.h:468
DRIVER_UNLOAD PciIdeXUnload
Definition: pciidex.h:512
DRIVER_ADD_DEVICE PciIdeXAddDevice
Definition: pciidex.h:515
CONTROLLER_PNP_REMOVE_DEVICE PciIdeXFdoRemoveDevice
Definition: pciidex.h:471
WORD ExtensionSize
Definition: apisets.c:17
NTSTATUS NTAPI PciIdeXDispatchPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: pdo.c:1083
Legacy detection interface with the PCIIDEX driver.
Definition: ata_shared.h:489
PCONTROLLER_PNP_REMOVE_DEVICE RemoveDevice
Definition: ata_shared.h:493
PCONTROLLER_PNP_START_DEVICE StartDevice
Definition: ata_shared.h:492
PCONTROLLER_PNP_ADD_DEVICE AddDevice
Definition: ata_shared.h:491
void * PVOID
Definition: typedefs.h:50
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_POWER

Referenced by AtaLegacyDetectChannel(), and DriverEntry().

◆ PciIdeXPdoCompletionRoutine()

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

Definition at line 283 of file pciidex.c.

287{
289
290 if (Irp->PendingReturned)
292
294}
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68

◆ PciIdeXPnpQueryDeviceUsageNotification()

NTSTATUS PciIdeXPnpQueryDeviceUsageNotification ( _In_ PCOMMON_DEVICE_EXTENSION  CommonExt,
_In_ PIRP  Irp 
)

Definition at line 214 of file pciidex.c.

217{
218 PIO_STACK_LOCATION IoStack;
220 volatile LONG* Counter;
221
222 PAGED_CODE();
223
224 if (!IS_FDO(CommonExt))
225 {
226 Status = PciIdeXPnpRepeatRequest(CommonExt, Irp, NULL);
227 }
228 else
229 {
230 if (!NT_VERIFY(IoForwardIrpSynchronously(CommonExt->LowerDeviceObject, Irp)))
231 return STATUS_UNSUCCESSFUL;
232 Status = Irp->IoStatus.Status;
233 }
234 if (!NT_SUCCESS(Status))
235 return Status;
236
238 switch (IoStack->Parameters.UsageNotification.Type)
239 {
241 Counter = &CommonExt->PageFiles;
242 break;
243
245 Counter = &CommonExt->HibernateFiles;
246 break;
247
249 Counter = &CommonExt->DumpFiles;
250 break;
251
252 default:
253 return Status;
254 }
255
257
258 if (!IS_FDO(CommonExt))
259 IoInvalidateDeviceState(CommonExt->Self);
260
261 return STATUS_SUCCESS;
262}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1625
NTSTATUS PciIdeXPnpRepeatRequest(_In_ PCOMMON_DEVICE_EXTENSION CommonExt, _In_ PIRP Irp, _In_opt_ PDEVICE_CAPABILITIES DeviceCapabilities)
Definition: pciidex.c:156
long LONG
Definition: pedump.c:60
VOID NTAPI IoInvalidateDeviceState(IN PDEVICE_OBJECT DeviceObject)
Definition: pnpmgr.c:1847
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@4454::@4487 UsageNotification
static LARGE_INTEGER Counter
Definition: clock.c:43
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define IoAdjustPagingPathCount(_Count, _Increment)
@ DeviceUsageTypeHibernation
Definition: iotypes.h:1171
@ DeviceUsageTypeDumpFile
Definition: iotypes.h:1172
@ DeviceUsageTypePaging
Definition: iotypes.h:1170
#define NT_VERIFY(exp)
Definition: rtlfuncs.h:3304

Referenced by PciIdeXFdoDispatchPnp(), and PciIdeXPdoDispatchPnp().

◆ PciIdeXPnpQueryInterface()

static NTSTATUS PciIdeXPnpQueryInterface ( _In_ PCOMMON_DEVICE_EXTENSION  CommonExt,
_In_ const GUID Guid,
_Out_ PVOID  Interface,
_In_ ULONG  Version,
_In_ ULONG  Size 
)
static

Definition at line 299 of file pciidex.c.

305{
308 PIRP Irp;
311
312 PAGED_CODE();
313
315
317 CommonExt->LowerDeviceObject,
318 NULL,
319 0,
320 NULL,
321 &Event,
322 &IoStatus);
323 if (!Irp)
325
326 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
327 Irp->IoStatus.Information = 0;
328
330 Stack->MinorFunction = IRP_MN_QUERY_INTERFACE;
331 Stack->Parameters.QueryInterface.InterfaceType = Guid;
332 Stack->Parameters.QueryInterface.Version = Version;
333 Stack->Parameters.QueryInterface.Size = Size;
334 Stack->Parameters.QueryInterface.Interface = Interface;
335 Stack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
336
337 Status = IoCallDriver(CommonExt->LowerDeviceObject, Irp);
338 if (Status == STATUS_PENDING)
339 {
341 Status = IoStatus.Status;
342 }
343
344 return Status;
345}
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
nsresult QueryInterface(nsIIDRef riid, void **result)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
@ SynchronizationEvent
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:1069
#define STATUS_PENDING
Definition: telnetd.h:14
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
#define IRP_MN_QUERY_INTERFACE

Referenced by PciIdeXAddDeviceEx().

◆ PciIdeXPnpQueryPnpDeviceState()

NTSTATUS PciIdeXPnpQueryPnpDeviceState ( _In_ PCOMMON_DEVICE_EXTENSION  CommonExt,
_In_ PIRP  Irp 
)

Definition at line 266 of file pciidex.c.

269{
270 PAGED_CODE();
271
272 if (CommonExt->PageFiles || CommonExt->HibernateFiles || CommonExt->DumpFiles)
273 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
274
275 if (IS_FDO(CommonExt))
276 Irp->IoStatus.Status = STATUS_SUCCESS;
277
278 return STATUS_SUCCESS;
279}
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:1006

Referenced by PciIdeXFdoDispatchPnp(), and PciIdeXPdoDispatchPnp().

◆ PciIdeXPnpRepeatRequest()

NTSTATUS PciIdeXPnpRepeatRequest ( _In_ PCOMMON_DEVICE_EXTENSION  CommonExt,
_In_ PIRP  Irp,
_In_opt_ PDEVICE_CAPABILITIES  DeviceCapabilities 
)

Definition at line 156 of file pciidex.c.

160{
161 PCOMMON_DEVICE_EXTENSION FdoExt = CommonExt->FdoExt;
162 PDEVICE_OBJECT TopDeviceObject;
163 PIO_STACK_LOCATION IoStack, SubStack;
164 PIRP SubIrp;
167
168 PAGED_CODE();
169 ASSERT(!IS_FDO(CommonExt));
170
171 TopDeviceObject = IoGetAttachedDeviceReference(FdoExt->Self);
172
173 SubIrp = IoAllocateIrp(TopDeviceObject->StackSize, FALSE);
174 if (!SubIrp)
175 {
176 ObDereferenceObject(TopDeviceObject);
178 }
179
181
183 SubStack = IoGetNextIrpStackLocation(SubIrp);
184 RtlCopyMemory(SubStack, IoStack, sizeof(*SubStack));
185
187 SubStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities;
188
191 &Event,
192 TRUE,
193 TRUE,
194 TRUE);
195
197
198 Status = IoCallDriver(TopDeviceObject, SubIrp);
199 if (Status == STATUS_PENDING)
200 {
202 }
203
204 ObDereferenceObject(TopDeviceObject);
205
206 Status = SubIrp->IoStatus.Status;
207 IoFreeIrp(SubIrp);
208
209 return Status;
210}
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
_In_ PIOMMU_DEVICE_PATH _In_ PIOMMU_SVM_CAPABILITIES DeviceCapabilities
Definition: haltypes.h:1824
@ NotificationEvent
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
Definition: device.c:1407
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:615
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1666
IO_COMPLETION_ROUTINE PciIdeXPdoCompletionRoutine
Definition: pciidex.h:521
PDEVICE_OBJECT Self
Definition: pciidex.h:376
struct _IO_STACK_LOCATION::@4454::@4481 DeviceCapabilities
IO_STATUS_BLOCK IoStatus
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define DeviceCapabilities
Definition: wingdi.h:4895
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by PciIdeXPdoQueryCapabilities(), and PciIdeXPnpQueryDeviceUsageNotification().

◆ PciIdeXUnload()

VOID NTAPI PciIdeXUnload ( _In_ PDRIVER_OBJECT  DriverObject)

Definition at line 144 of file pciidex.c.

146{
148
149 PAGED_CODE();
150
151 NOTHING;
152}
#define NOTHING
Definition: input_list.c:10

◆ PciRead()

VOID PciRead ( _In_ PATA_CONTROLLER  Controller,
_Out_writes_bytes_all_(BufferLength) PVOID  Buffer,
_In_ ULONG  ConfigDataOffset,
_In_ ULONG  BufferLength 
)

Definition at line 72 of file pciidex.c.

77{
78 Controller->GetBusData(Controller->BusInterfaceContext,
80 Buffer,
81 ConfigDataOffset,
83}
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777
#define PCI_WHICHSPACE_CONFIG
Definition: iotypes.h:3646

Referenced by IntelInitChannel(), PciRead16(), PciRead32(), and PciRead8().

◆ PciWrite()

VOID PciWrite ( _In_ PATA_CONTROLLER  Controller,
_In_reads_bytes_(BufferLength) PVOID  Buffer,
_In_ ULONG  ConfigDataOffset,
_In_ ULONG  BufferLength 
)

Definition at line 86 of file pciidex.c.

91{
92 Controller->SetBusData(Controller->BusInterfaceContext,
94 Buffer,
95 ConfigDataOffset,
97}

Referenced by PciWrite16(), PciWrite32(), and PciWrite8().

Variable Documentation

◆ PciIdeControllerNumber

ULONG PciIdeControllerNumber = 0

Definition at line 10 of file pciidex.c.

Referenced by PciIdeXAddDeviceEx().