ReactOS 0.4.16-dev-340-g0540c21
pdo.c File Reference
#include "isapnp.h"
#include <debug.h>
Include dependency graph for pdo.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define IS_READ_PORT(_d)   ((_d)->Type == CmResourceTypePort && (_d)->u.Port.Length > 1)
 

Functions

static NTSTATUS IsaPdoQueryDeviceRelations (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoQueryCapabilities (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoQueryPnpDeviceState (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
 
static NTSTATUS IsaPdoQueryId (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaReadPortQueryId (_Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoQueryDeviceText (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoQueryResources (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoQueryResourceRequirements (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoStartReadPort (_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ PCM_RESOURCE_LIST ResourceList)
 
static NTSTATUS IsaPdoFilterResourceRequirements (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoQueryBusInformation (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
 
static NTSTATUS IsaPdoQueryDeviceUsageNotification (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS IsaPdoRemoveDevice (_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
 
static NTSTATUS IsaReadPortRemoveDevice (_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
 
VOID IsaPnpRemoveLogicalDeviceDO (_In_ PDEVICE_OBJECT Pdo)
 
NTSTATUS IsaPdoPnp (_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
 

Macro Definition Documentation

◆ IS_READ_PORT

#define IS_READ_PORT (   _d)    ((_d)->Type == CmResourceTypePort && (_d)->u.Port.Length > 1)

Definition at line 542 of file pdo.c.

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file pdo.c.

Function Documentation

◆ IsaPdoFilterResourceRequirements()

static NTSTATUS IsaPdoFilterResourceRequirements ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 678 of file pdo.c.

682{
683 PAGED_CODE();
684
685 /* TODO: Handle */
688 return Irp->IoStatus.Status;
689}
#define PAGED_CODE()
_In_ PIRP Irp
Definition: csq.h:116
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
PUSBHUB_PORT_PDO_EXTENSION NTAPI PdoExt(IN PDEVICE_OBJECT DeviceObject)
Definition: usbhub.c:133

Referenced by IsaPdoPnp().

◆ IsaPdoPnp()

NTSTATUS IsaPdoPnp ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)

Definition at line 867 of file pdo.c.

871{
872 NTSTATUS Status = Irp->IoStatus.Status;
873
874 PAGED_CODE();
875
876 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
877 {
878 DPRINT("%s(%p, %p) CSN %u, LDN %u, Minor - %X\n",
880 PdoExt,
881 Irp,
882 PdoExt->IsaPnpDevice->CSN,
883 PdoExt->IsaPnpDevice->LDN,
885 }
886 else
887 {
888 DPRINT("%s(%p, %p) ReadPort, Minor - %X\n",
890 PdoExt,
891 Irp,
893 }
894
895 switch (IrpSp->MinorFunction)
896 {
898 {
899 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
900 {
901 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
902
904 PdoExt->IsaPnpDevice,
905 IrpSp->Parameters.StartDevice.AllocatedResources);
906 if (NT_SUCCESS(Status))
907 {
908 IsaHwActivateDevice(PdoExt->FdoExt, PdoExt->IsaPnpDevice);
909 }
910 else
911 {
912 DPRINT1("Failed to configure CSN %u, LDN %u with status 0x%08lx\n",
913 PdoExt->IsaPnpDevice->CSN, PdoExt->IsaPnpDevice->LDN, Status);
914 }
915
917 }
918 else
919 {
921 IrpSp->Parameters.StartDevice.AllocatedResources);
922 }
923
924 if (NT_SUCCESS(Status))
925 PdoExt->Common.State = dsStarted;
926 break;
927 }
928
930 {
931 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
932 {
933 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
934 IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
935
937 }
938 else
939 {
940 PdoExt->Flags &= ~ISAPNP_READ_PORT_ALLOW_FDO_SCAN;
941 }
942
944
945 if (NT_SUCCESS(Status))
946 PdoExt->Common.State = dsStopped;
947 break;
948 }
949
951 {
952 if (PdoExt->SpecialFiles > 0)
954 else if (PdoExt->Flags & ISAPNP_READ_PORT_NEED_REBALANCE)
956 else
958
959 break;
960 }
961
963 {
964 if (PdoExt->SpecialFiles > 0)
966 else
968 break;
969 }
970
973 break;
974
977 break;
978
981 {
983
984 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
985 Status = IsaPdoRemoveDevice(PdoExt, FinalRemove);
986 else
987 Status = IsaReadPortRemoveDevice(PdoExt, FinalRemove);
988 break;
989 }
990
993 break;
994
997 break;
998
1001 break;
1002
1003 case IRP_MN_QUERY_ID:
1004 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
1006 else
1008 break;
1009
1011 if (PdoExt->Common.Signature == IsaPnpLogicalDevice)
1013 break;
1014
1017 break;
1018
1021 break;
1022
1025 break;
1026
1030 break;
1031
1032 default:
1033 DPRINT("Unknown PnP code: %X\n", IrpSp->MinorFunction);
1034 break;
1035 }
1036
1037 Irp->IoStatus.Status = Status;
1039
1040 return Status;
1041}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
static NTSTATUS IsaPdoQueryDeviceUsageNotification(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:719
static NTSTATUS IsaPdoQueryDeviceText(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:411
static NTSTATUS IsaPdoQueryCapabilities(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:51
static NTSTATUS IsaReadPortQueryId(_Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:335
static NTSTATUS IsaReadPortRemoveDevice(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:785
static NTSTATUS IsaPdoQueryDeviceRelations(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:18
static NTSTATUS IsaPdoQueryResourceRequirements(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:507
static NTSTATUS IsaPdoQueryBusInformation(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
Definition: pdo.c:694
static NTSTATUS IsaPdoQueryResources(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:469
static NTSTATUS IsaPdoQueryId(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:115
static NTSTATUS IsaPdoStartReadPort(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ PCM_RESOURCE_LIST ResourceList)
Definition: pdo.c:547
static NTSTATUS IsaPdoQueryPnpDeviceState(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp)
Definition: pdo.c:90
static NTSTATUS IsaPdoFilterResourceRequirements(_In_ PISAPNP_PDO_EXTENSION PdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: pdo.c:678
static NTSTATUS IsaPdoRemoveDevice(_In_ PISAPNP_PDO_EXTENSION PdoExt, _In_ BOOLEAN FinalRemove)
Definition: pdo.c:748
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
VOID IsaHwWakeDevice(_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
Definition: hardware.c:1650
VOID IsaHwWaitForKey(VOID)
Definition: hardware.c:1684
VOID IsaHwDeactivateDevice(_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
Definition: hardware.c:1673
NTSTATUS IsaHwConfigureDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice, _In_ PCM_RESOURCE_LIST Resources)
Definition: hardware.c:1517
VOID IsaHwActivateDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
Definition: hardware.c:1661
#define __FUNCTION__
Definition: types.h:116
Status
Definition: gdiplustypes.h:25
@ dsStopped
Definition: isapnp.h:30
@ dsStarted
Definition: isapnp.h:31
@ IsaPnpLogicalDevice
Definition: isapnp.h:37
#define ISAPNP_READ_PORT_NEED_REBALANCE
The I/O resource requirements have changed.
Definition: isapnp.h:78
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IoCompleteRequest
Definition: irp.c:1240
#define STATUS_RESOURCE_REQUIREMENTS_CHANGED
Definition: ntstatus.h:103
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
union _IO_STACK_LOCATION::@1581 Parameters
struct _IO_STACK_LOCATION::@3980::@4017 StartDevice
COMMON_DEVICE_EXTENSION Common
Definition: usbhub.h:204
#define STATUS_DEVICE_BUSY
Definition: udferr_usr.h:129
#define IRP_MN_CANCEL_STOP_DEVICE
#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_RESOURCE_REQUIREMENTS
#define IRP_MN_QUERY_ID
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#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_QUERY_RESOURCES
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_BUS_INFORMATION
#define IRP_MN_QUERY_REMOVE_DEVICE

Referenced by _Dispatch_type_().

◆ IsaPdoQueryBusInformation()

static NTSTATUS IsaPdoQueryBusInformation ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp 
)
static

Definition at line 694 of file pdo.c.

697{
699
700 PAGED_CODE();
701
703 sizeof(PNP_BUS_INFORMATION),
704 TAG_ISAPNP);
705 if (!BusInformation)
707
708 BusInformation->BusTypeGuid = GUID_BUS_TYPE_ISAPNP;
709 BusInformation->LegacyBusType = Isa;
710 BusInformation->BusNumber = PdoExt->FdoExt->BusNumber;
711
712 Irp->IoStatus.Information = (ULONG_PTR)BusInformation;
713 return STATUS_SUCCESS;
714}
#define ULONG_PTR
Definition: config.h:101
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
@ Isa
Definition: hwresource.cpp:138
#define TAG_ISAPNP
Definition: isapnp.h:26
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
Definition: wdfdevice.h:3915

Referenced by IsaPdoPnp().

◆ IsaPdoQueryCapabilities()

static NTSTATUS IsaPdoQueryCapabilities ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 51 of file pdo.c.

55{
57 ULONG i;
58
60
61 PAGED_CODE();
62
64 if (DeviceCapabilities->Version != 1)
66
67 DeviceCapabilities->LockSupported =
68 DeviceCapabilities->EjectSupported =
69 DeviceCapabilities->Removable =
70 DeviceCapabilities->DockDevice = FALSE;
71
72 DeviceCapabilities->UniqueID = TRUE;
73
74 if (PdoExt->Common.Signature == IsaPnpReadDataPort)
75 {
76 DeviceCapabilities->RawDeviceOK = TRUE;
77 DeviceCapabilities->SilentInstall = TRUE;
78 }
79
80 for (i = 0; i < POWER_SYSTEM_MAXIMUM; i++)
81 DeviceCapabilities->DeviceState[i] = PowerDeviceD3;
83
84 return STATUS_SUCCESS;
85}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
@ IsaPnpReadDataPort
Definition: isapnp.h:38
#define POWER_SYSTEM_MAXIMUM
Definition: ntpoapi.h:45
@ PowerSystemWorking
Definition: ntpoapi.h:36
@ PowerDeviceD0
Definition: ntpoapi.h:49
@ PowerDeviceD3
Definition: ntpoapi.h:52
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
struct _IO_STACK_LOCATION::@3980::@4007 DeviceCapabilities
uint32_t ULONG
Definition: typedefs.h:59
#define DeviceCapabilities
Definition: wingdi.h:4449
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965

Referenced by IsaPdoPnp().

◆ IsaPdoQueryDeviceRelations()

static NTSTATUS IsaPdoQueryDeviceRelations ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 18 of file pdo.c.

22{
23 PDEVICE_RELATIONS DeviceRelations;
24
25 PAGED_CODE();
26
28 PdoExt->Common.Signature == IsaPnpReadDataPort)
29 {
30 return IsaPnpFillDeviceRelations(PdoExt->FdoExt, Irp, FALSE);
31 }
32
34 return Irp->IoStatus.Status;
35
36 DeviceRelations = ExAllocatePoolWithTag(PagedPool, sizeof(*DeviceRelations), TAG_ISAPNP);
37 if (!DeviceRelations)
38 return STATUS_NO_MEMORY;
39
40 DeviceRelations->Count = 1;
41 DeviceRelations->Objects[0] = PdoExt->Common.Self;
43
44 Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
45 return STATUS_SUCCESS;
46}
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
NTSTATUS IsaPnpFillDeviceRelations(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp, _In_ BOOLEAN IncludeDataPort)
Definition: isapnp.c:1054
PDEVICE_OBJECT Self
Definition: pciidex.h:60
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2163
struct _IO_STACK_LOCATION::@3980::@4005 QueryDeviceRelations
@ RemovalRelations
Definition: iotypes.h:2155
@ TargetDeviceRelation
Definition: iotypes.h:2156
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by IsaPdoPnp().

◆ IsaPdoQueryDeviceText()

static NTSTATUS IsaPdoQueryDeviceText ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 411 of file pdo.c.

415{
418 size_t CharCount;
419
420 PAGED_CODE();
421
422 switch (IrpSp->Parameters.QueryDeviceText.DeviceTextType)
423 {
425 {
426 if (!PdoExt->IsaPnpDevice->FriendlyName)
427 return Irp->IoStatus.Status;
428
429 CharCount = strlen(PdoExt->IsaPnpDevice->FriendlyName) +
430 sizeof(ANSI_NULL);
431
432 if (CharCount == sizeof(ANSI_NULL))
433 return Irp->IoStatus.Status;
434
436 CharCount * sizeof(WCHAR),
437 TAG_ISAPNP);
438 if (!Buffer)
440
442 CharCount,
443 NULL,
444 NULL,
445 0,
446 L"%hs",
447 PdoExt->IsaPnpDevice->FriendlyName);
449 {
451 return Status;
452 }
453
454 DPRINT("TextDescription: '%S'\n", Buffer);
455 break;
456 }
457
458 default:
459 return Irp->IoStatus.Status;
460 }
461
462 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
463 return STATUS_SUCCESS;
464}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
Definition: bufpool.h:45
#define NULL
Definition: types.h:112
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#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
#define L(x)
Definition: ntvdm.h:50
struct _IO_STACK_LOCATION::@3980::@4012 QueryDeviceText
uint16_t * PWCHAR
Definition: typedefs.h:56
@ DeviceTextDescription
Definition: iotypes.h:2945
#define NT_VERIFY(exp)
Definition: rtlfuncs.h:3304
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by IsaPdoPnp().

◆ IsaPdoQueryDeviceUsageNotification()

static NTSTATUS IsaPdoQueryDeviceUsageNotification ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 719 of file pdo.c.

723{
724 BOOLEAN InPath = IrpSp->Parameters.UsageNotification.InPath;
725
726 PAGED_CODE();
727
728 switch (IrpSp->Parameters.UsageNotification.Type)
729 {
733 IoAdjustPagingPathCount(&PdoExt->SpecialFiles, InPath);
735 break;
736
737 default:
738 return Irp->IoStatus.Status;
739 }
740
741 /* Do not send it to FDO for compatibility */
742 return STATUS_SUCCESS;
743}
VOID NTAPI IoInvalidateDeviceState(IN PDEVICE_OBJECT DeviceObject)
Definition: pnpmgr.c:1848
struct _IO_STACK_LOCATION::@3980::@4013 UsageNotification
#define IoAdjustPagingPathCount(_Count, _Increment)
@ DeviceUsageTypeHibernation
Definition: iotypes.h:1171
@ DeviceUsageTypeDumpFile
Definition: iotypes.h:1172
@ DeviceUsageTypePaging
Definition: iotypes.h:1170

Referenced by IsaPdoPnp().

◆ IsaPdoQueryId()

static NTSTATUS IsaPdoQueryId ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 115 of file pdo.c.

119{
120 PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
122 PWCHAR Buffer, End, IdStart;
123 size_t CharCount, Remaining;
124
125 PAGED_CODE();
126
127 switch (IrpSp->Parameters.QueryId.IdType)
128 {
129 case BusQueryDeviceID:
130 {
131 CharCount = sizeof("ISAPNP\\XXXFFFF");
132
134 {
135 CharCount += sizeof("_DEV1234") - sizeof(ANSI_NULL);
136 }
137
139 CharCount * sizeof(WCHAR),
140 TAG_ISAPNP);
141 if (!Buffer)
143
145 CharCount,
146 &End,
147 &Remaining,
148 0,
149 L"ISAPNP\\%.3S%04X",
150 LogDev->VendorId,
151 LogDev->ProdId);
153 goto Failure;
154
156 {
158 Remaining,
159 NULL,
160 NULL,
161 0,
162 L"_DEV%04X",
163 LogDev->LDN);
165 goto Failure;
166 }
167
168 DPRINT("Device ID: '%S'\n", Buffer);
169 break;
170 }
171
173 {
174 CharCount = sizeof("ISAPNP\\XXXFFFF") +
175 sizeof("*PNPxxxx") +
176 sizeof(ANSI_NULL); /* multi-string */
177
179 {
180 CharCount += sizeof("_DEV1234") - sizeof(ANSI_NULL);
181 }
182
184 CharCount * sizeof(WCHAR),
185 TAG_ISAPNP);
186 if (!Buffer)
188
189 DPRINT("Hardware IDs:\n");
190
191 /* 1 */
193 CharCount,
194 &End,
195 &Remaining,
196 0,
197 L"ISAPNP\\%.3S%04X",
198 LogDev->VendorId,
199 LogDev->ProdId);
201 goto Failure;
202
204 {
206 Remaining,
207 &End,
208 &Remaining,
209 0,
210 L"_DEV%04X",
211 LogDev->LDN);
213 goto Failure;
214 }
215
216 DPRINT(" '%S'\n", Buffer);
217
218 ++End;
219 --Remaining;
220
221 /* 2 */
222 IdStart = End;
224 Remaining,
225 &End,
226 &Remaining,
227 0,
228 L"*%.3S%04X",
229 LogDev->LogVendorId,
230 LogDev->LogProdId);
232 goto Failure;
233
234 DPRINT(" '%S'\n", IdStart);
235
236 *++End = UNICODE_NULL;
237 --Remaining;
238
239 break;
240 }
241
243 {
245
246 for (Entry = LogDev->CompatibleIdList.Flink, CharCount = 0;
247 Entry != &LogDev->CompatibleIdList;
248 Entry = Entry->Flink)
249 {
250 CharCount += sizeof("*PNPxxxx");
251 }
252 CharCount += sizeof(ANSI_NULL); /* multi-string */
253
254 if (CharCount == sizeof(ANSI_NULL))
255 return Irp->IoStatus.Status;
256
258 CharCount * sizeof(WCHAR),
259 TAG_ISAPNP);
260 if (!Buffer)
262
263 DPRINT("Compatible IDs:\n");
264
265 for (Entry = LogDev->CompatibleIdList.Flink, End = Buffer, Remaining = CharCount;
266 Entry != &LogDev->CompatibleIdList;
267 Entry = Entry->Flink)
268 {
269 PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId =
271
272 IdStart = End;
274 Remaining,
275 &End,
276 &Remaining,
277 0,
278 L"*%.3S%04X",
279 CompatibleId->VendorId,
280 CompatibleId->ProdId);
282 goto Failure;
283
284 DPRINT(" '%S'\n", IdStart);
285
286 ++End;
287 --Remaining;
288 }
289
290 *End = UNICODE_NULL;
291
292 break;
293 }
294
296 {
297 CharCount = sizeof(LogDev->SerialNumber) * 2 + sizeof(ANSI_NULL);
298
300 CharCount * sizeof(WCHAR),
301 TAG_ISAPNP);
302 if (!Buffer)
304
306 CharCount,
307 NULL,
308 NULL,
309 0,
310 L"%X",
311 LogDev->SerialNumber);
313 goto Failure;
314
315 DPRINT("Instance ID: '%S'\n", Buffer);
316 break;
317 }
318
319 default:
320 return Irp->IoStatus.Status;
321 }
322
323 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
324 return STATUS_SUCCESS;
325
326Failure:
328
329 return Status;
330}
#define ISAPNP_HAS_MULTIPLE_LOGDEVS
Definition: isapnpres.h:99
#define UNICODE_NULL
base of all file and directory entries
Definition: entries.h:83
struct _IO_STACK_LOCATION::@3980::@4011 QueryId
Definition: isapnpres.h:53
UCHAR VendorId[3]
Definition: isapnpres.h:54
USHORT ProdId
Definition: isapnpres.h:55
LIST_ENTRY CompatibleIdList
Definition: isapnpres.h:129
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
@ BusQueryCompatibleIDs
Definition: iotypes.h:2938
@ BusQueryInstanceID
Definition: iotypes.h:2939
@ BusQueryDeviceID
Definition: iotypes.h:2936
@ BusQueryHardwareIDs
Definition: iotypes.h:2937

Referenced by IsaPdoPnp().

◆ IsaPdoQueryPnpDeviceState()

static NTSTATUS IsaPdoQueryPnpDeviceState ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp 
)
static

Definition at line 90 of file pdo.c.

93{
94 PAGED_CODE();
95
97 {
98 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE |
101 return STATUS_SUCCESS;
102 }
103 else if (PdoExt->SpecialFiles > 0)
104 {
105 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
106 return STATUS_SUCCESS;
107 }
108
109 return Irp->IoStatus.Status;
110}
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:1006
#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED
Definition: iotypes.h:1005
#define PNP_DEVICE_FAILED
Definition: iotypes.h:1003

Referenced by IsaPdoPnp().

◆ IsaPdoQueryResourceRequirements()

static NTSTATUS IsaPdoQueryResourceRequirements ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 507 of file pdo.c.

511{
512 ULONG ListSize;
514
516
517 PAGED_CODE();
518
519 if (PdoExt->Common.Signature == IsaPnpReadDataPort)
520 {
522 if (!RequirementsList)
523 return STATUS_NO_MEMORY;
524
525 Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
526 return STATUS_SUCCESS;
527 }
528
529 if (!PdoExt->RequirementsList)
530 return Irp->IoStatus.Status;
531
532 ListSize = PdoExt->RequirementsList->ListSize;
534 if (!RequirementsList)
535 return STATUS_NO_MEMORY;
536
537 RtlCopyMemory(RequirementsList, PdoExt->RequirementsList, ListSize);
538 Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
539 return STATUS_SUCCESS;
540}
PIO_RESOURCE_REQUIREMENTS_LIST IsaPnpCreateReadPortDORequirements(_In_opt_ ULONG SelectedReadPort)
Definition: isapnp.c:821
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
_In_ WDFIORESREQLIST RequirementsList
Definition: wdfresource.h:65

Referenced by IsaPdoPnp().

◆ IsaPdoQueryResources()

static NTSTATUS IsaPdoQueryResources ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 469 of file pdo.c.

473{
474 ULONG ListSize;
476
478
479 PAGED_CODE();
480
481 if (PdoExt->Common.Signature == IsaPnpReadDataPort)
482 {
484 if (!ResourceList)
485 return STATUS_NO_MEMORY;
486
487 Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
488 return STATUS_SUCCESS;
489 }
490
491 if (!PdoExt->ResourceList)
492 return Irp->IoStatus.Status;
493
494 ListSize = PdoExt->ResourceListSize;
496 if (!ResourceList)
497 return STATUS_NO_MEMORY;
498
499 RtlCopyMemory(ResourceList, PdoExt->ResourceList, ListSize);
500 Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
501 return STATUS_SUCCESS;
502}
PCM_RESOURCE_LIST IsaPnpCreateReadPortDOResources(VOID)
Definition: isapnp.c:967
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:309

Referenced by IsaPdoPnp().

◆ IsaPdoRemoveDevice()

static NTSTATUS IsaPdoRemoveDevice ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_In_ BOOLEAN  FinalRemove 
)
static

Definition at line 748 of file pdo.c.

751{
752 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
753
754 PAGED_CODE();
755
756 /* Deactivate the device if previously activated */
757 if (PdoExt->Common.State == dsStarted)
758 {
759 IsaHwWakeDevice(PdoExt->IsaPnpDevice);
760 IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
761
763
764 PdoExt->Common.State = dsStopped;
765 }
766
767 if (FinalRemove && !(PdoExt->Flags & ISAPNP_ENUMERATED))
768 {
769 IsaPnpAcquireDeviceDataLock(FdoExt);
770
771 RemoveEntryList(&PdoExt->IsaPnpDevice->DeviceLink);
772 --FdoExt->DeviceCount;
773
774 IsaPnpReleaseDeviceDataLock(FdoExt);
775
777 }
778
779 return STATUS_SUCCESS;
780}
VOID IsaPnpRemoveLogicalDeviceDO(_In_ PDEVICE_OBJECT Pdo)
Definition: pdo.c:823
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ISAPNP_ENUMERATED
Whether the device has been reported to the PnP manager.
Definition: isapnp.h:75

Referenced by IsaPdoPnp().

◆ IsaPdoStartReadPort()

static NTSTATUS IsaPdoStartReadPort ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_In_ PCM_RESOURCE_LIST  ResourceList 
)
static

Definition at line 547 of file pdo.c.

550{
551 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
553 ULONG i;
554
555 PAGED_CODE();
556
557 if (!ResourceList)
558 {
559 DPRINT1("No resource list\n");
561 }
562
563 if (ResourceList->List[0].PartialResourceList.Version != 1 ||
564 ResourceList->List[0].PartialResourceList.Revision != 1)
565 {
566 DPRINT1("Bad resource list version (%u.%u)\n",
567 ResourceList->List[0].PartialResourceList.Version,
568 ResourceList->List[0].PartialResourceList.Revision);
570 }
571
572#if 0
573 /* Try various Read Ports from the list */
574 if (ResourceList->List[0].PartialResourceList.Count > 3)
575 {
576 ULONG SelectedPort = 0;
577
578 for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
579 {
580 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
581 &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
582
583 if (IS_READ_PORT(PartialDescriptor))
584 {
585 PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
586 ULONG Cards;
587
588 /*
589 * Remember the first Read Port in the resource list.
590 * It will be selected by default even if no card has been detected.
591 */
592 if (!SelectedPort)
593 SelectedPort = PartialDescriptor->u.Port.Start.u.LowPart;
594
595 Cards = IsaHwTryReadDataPort(ReadDataPort);
597
598 /* We detected some ISAPNP cards */
599 if (Cards > 0)
600 {
601 SelectedPort = PartialDescriptor->u.Port.Start.u.LowPart;
602 break;
603 }
604 }
605 }
606
607 ASSERT(SelectedPort != 0);
608
609 /* Discard the Read Ports at conflicting locations */
610 PdoExt->SelectedPort = SelectedPort;
613
614 return STATUS_SUCCESS;
615 }
616 /* Set the Read Port */
617 else if (ResourceList->List[0].PartialResourceList.Count == 3)
618#else
619 if (ResourceList->List[0].PartialResourceList.Count > 3) /* Temporary HACK */
620#endif
621 {
622 PdoExt->Flags &= ~ISAPNP_READ_PORT_NEED_REBALANCE;
623
624 for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
625 {
626 PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
627 &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
628
629 if (IS_READ_PORT(PartialDescriptor))
630 {
631 PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
632
633 /* Run the isolation protocol */
634 FdoExt->Cards = IsaHwTryReadDataPort(ReadDataPort);
635
636 if (FdoExt->Cards > 0)
637 {
638 FdoExt->ReadDataPort = ReadDataPort;
639
640 IsaPnpAcquireDeviceDataLock(FdoExt);
641
642 /* Card identification */
643 Status = IsaHwFillDeviceList(FdoExt);
645
646 IsaPnpReleaseDeviceDataLock(FdoExt);
647
650
653
654 return Status;
655 }
656 else
657 {
659#if 0 /* See the 'if 0' above */
660 break;
661#endif
662 }
663 }
664 }
665 }
666 else
667 {
669 }
670
671 /* Mark Read Port as started, even if no card has been detected */
672 return STATUS_SUCCESS;
673}
#define ULongToPtr(ul)
Definition: basetsd.h:92
#define IS_READ_PORT(_d)
Definition: pdo.c:542
UCHAR IsaHwTryReadDataPort(_In_ PUCHAR ReadDataPort)
Definition: hardware.c:1259
#define ISAPNP_READ_PORT_ALLOW_FDO_SCAN
Allows the active FDO to scan the bus.
Definition: isapnp.h:77
#define ISAPNP_SCANNED_BY_READ_PORT
The bus has been scanned by Read Port PDO.
Definition: isapnp.h:76
#define ASSERT(a)
Definition: mode.c:44
#define STATUS_DEVICE_CONFIGURATION_ERROR
Definition: ntstatus.h:619
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1772
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@392 u
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@392::@394 Port
PUCHAR ReadDataPort
Definition: isapnp.h:64
PDEVICE_OBJECT Pdo
Definition: isapnp.h:52
PDEVICE_OBJECT ReadPortPdo
Definition: isapnp.h:53
unsigned char * PUCHAR
Definition: typedefs.h:53
@ BusRelations
Definition: iotypes.h:2152

Referenced by IsaPdoPnp().

◆ IsaPnpRemoveLogicalDeviceDO()

VOID IsaPnpRemoveLogicalDeviceDO ( _In_ PDEVICE_OBJECT  Pdo)

Definition at line 823 of file pdo.c.

825{
826 PISAPNP_PDO_EXTENSION PdoExt = Pdo->DeviceExtension;
827 PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
829
830 PAGED_CODE();
831 ASSERT(LogDev);
832
833 DPRINT("Removing CSN %u, LDN %u\n", LogDev->CSN, LogDev->LDN);
834
835 if (PdoExt->RequirementsList)
836 ExFreePoolWithTag(PdoExt->RequirementsList, TAG_ISAPNP);
837
838 if (PdoExt->ResourceList)
839 ExFreePoolWithTag(PdoExt->ResourceList, TAG_ISAPNP);
840
841 if (LogDev->FriendlyName)
843
844 if (LogDev->Resources)
846
847 Entry = LogDev->CompatibleIdList.Flink;
848 while (Entry != &LogDev->CompatibleIdList)
849 {
850 PISAPNP_COMPATIBLE_ID_ENTRY CompatibleId =
852
853 RemoveEntryList(&CompatibleId->IdLink);
854
855 Entry = Entry->Flink;
856
857 ExFreePoolWithTag(CompatibleId, TAG_ISAPNP);
858 }
859
861
863}
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
LIST_ENTRY IdLink
Definition: isapnpres.h:56
PISAPNP_RESOURCE Resources
Definition: isapnpres.h:127
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 IsaFdoRemoveDevice(), and IsaPdoRemoveDevice().

◆ IsaReadPortQueryId()

static NTSTATUS IsaReadPortQueryId ( _Inout_ PIRP  Irp,
_In_ PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 335 of file pdo.c.

338{
340 static const WCHAR ReadPortId[] = L"ISAPNP\\ReadDataPort";
341
342 PAGED_CODE();
343
344 switch (IrpSp->Parameters.QueryId.IdType)
345 {
346 case BusQueryDeviceID:
347 {
348 Buffer = ExAllocatePoolWithTag(PagedPool, sizeof(ReadPortId), TAG_ISAPNP);
349 if (!Buffer)
351
352 RtlCopyMemory(Buffer, ReadPortId, sizeof(ReadPortId));
353
354 DPRINT("Device ID: '%S'\n", Buffer);
355 break;
356 }
357
359 {
361 sizeof(ReadPortId) + sizeof(UNICODE_NULL),
362 TAG_ISAPNP);
363 if (!Buffer)
365
366 RtlCopyMemory(Buffer, ReadPortId, sizeof(ReadPortId));
367
368 Buffer[sizeof(ReadPortId) / sizeof(WCHAR)] = UNICODE_NULL; /* multi-string */
369
370 DPRINT("Hardware ID: '%S'\n", Buffer);
371 break;
372 }
373
375 {
376 /* Empty multi-string */
378 if (!Buffer)
380
381 DPRINT("Compatible ID: '%S'\n", Buffer);
382 break;
383 }
384
386 {
387 /* Even if there are multiple ISA buses, the driver has only one Read Port */
388 static const WCHAR InstanceId[] = L"0";
389
391 if (!Buffer)
393
395
396 DPRINT("Instance ID: '%S'\n", Buffer);
397 break;
398 }
399
400 default:
401 return Irp->IoStatus.Status;
402 }
403
404 Irp->IoStatus.Information = (ULONG_PTR)Buffer;
405 return STATUS_SUCCESS;
406}
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
Definition: fsrtlfuncs.h:908
FORCEINLINE PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45

Referenced by IsaPdoPnp().

◆ IsaReadPortRemoveDevice()

static NTSTATUS IsaReadPortRemoveDevice ( _In_ PISAPNP_PDO_EXTENSION  PdoExt,
_In_ BOOLEAN  FinalRemove 
)
static

Definition at line 785 of file pdo.c.

788{
789 PISAPNP_FDO_EXTENSION FdoExt = PdoExt->FdoExt;
791
792 PAGED_CODE();
793
794 IsaPnpAcquireDeviceDataLock(FdoExt);
795
796 /* Logical devices will receive a remove request afterwards */
797 for (Entry = FdoExt->DeviceListHead.Flink;
798 Entry != &FdoExt->DeviceListHead;
799 Entry = Entry->Flink)
800 {
803 DeviceLink);
804
805 LogDevice->Flags &= ~ISAPNP_PRESENT;
806 }
807
808 IsaPnpReleaseDeviceDataLock(FdoExt);
809
810 PdoExt->Flags &= ~ISAPNP_READ_PORT_ALLOW_FDO_SCAN;
812
813 if (FinalRemove && !(PdoExt->Flags & ISAPNP_ENUMERATED))
814 {
816 }
817
818 return STATUS_SUCCESS;
819}
VOID IsaPnpRemoveReadPortDO(_In_ PDEVICE_OBJECT Pdo)
Definition: isapnp.c:1042
LIST_ENTRY DeviceListHead
Definition: precomp.h:82

Referenced by IsaPdoPnp().