[ros-dev] Loading failure of rtl8139.sys driver = OK+
Ndisfunctionunimplemented
Alex Ionescu
ionucu at videotron.ca
Fri Oct 22 14:06:43 CEST 2004
One last fix included below
Alex Ionescu wrote:
> Since Filip posted his in C format, it slightly varies a bit from
> mine, here's the modifications:
>
> typedef struct _DEVICE_NODE
> {
> /* A tree structure. */
> struct _DEVICE_NODE *Sibling;
> struct _DEVICE_NODE *Child;
> struct _DEVICE_NODE *Parent;
> struct _DEVICE_NODE *LastChild;
> /* The level of deepness in the tree. */
> UINT Level;
> /* */
> PPO_DEVICE_NOTIFY Notify;
> /* State machine. */
> PNP_DEVNODE_STATE State;
> PNP_DEVNODE_STATE PreviousState;
> PNP_DEVNODE_STATE StateHistory[20];
> UINT StateHistoryEntry;
> /* ? */
> INT CompletionStatus;
> /* ? */
> PIRP PendingIrp;
> /* See DNF_* flags below (WinDBG documentation has WRONG values) */
> ULONG Flags;
> /* See DNUF_* flags below */
> ULONG UserFlags;
> /* See CM_PROB_* values are defined in cfg.h */
> ULONG Problem;
> /* Pointer to the PDO corresponding to the device node. */
> PDEVICE_OBJECT PhysicalDeviceObject;
> /* Resource list as assigned by the PnP arbiter. See
> IRP_MN_START_DEVICE
> and ARBITER_INTERFACE (not documented in DDK, but present in
> headers). */
> PCM_RESOURCE_LIST ResourceList;
> /* Resource list as assigned by the PnP arbiter (translated
> version). */
> PCM_RESOURCE_LIST ResourceListTranslated;
> /* Instance path relative to the Enum key in registry. */
> UNICODE_STRING InstancePath;
> /* Name of the driver service. */
> UNICODE_STRING ServiceName;
> /* ? */
> PDEVICE_OBJECT DuplicatePDO;
> /* See IRP_MN_QUERY_RESOURCE_REQUIREMENTS. */
> PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements;
> /* Information about bus for bus drivers. */
> INTERFACE_TYPE InterfaceType;
> ULONG BusNumber;
> /* Information about underlying bus for child devices. */
> INTERFACE_TYPE ChildInterfaceType;
> ULONG ChildBusNumber;
> USHORT ChildBusTypeIndex;
> /* ? */
> UCHAR RemovalPolicy;
> UCHAR HardwareRemovalPolicy;
> LIST_ENTRY TargetDeviceNotify;
> LIST_ENTRY DeviceArbiterList;
> LIST_ENTRY DeviceTranslatorList;
> USHORT NoTranslatorMask;
> USHORT QueryTranslatorMask;
> USHORT NoArbiterMask;
> USHORT QueryArbiterMask;
> union {
> struct _DEVICE_NODE *LegacyDeviceNode;
> PDEVICE_RELATIONS PendingDeviceRelations;
> } OverUsed1;
> union {
> struct _DEVICE_NODE *NextResourceDeviceNode;
> } OverUsed2;
> /* See IRP_MN_QUERY_RESOURCES. */
> PCM_RESOURCE_LIST BootResources;
> /* See the bitfields in DEVICE_CAPABILITIES structure. */
> ULONG CapabilityFlags;
> struct {
> ULONG DockStatus; /* See Dock Flags */
> LIST_ENTRY ListEntry;
> WCHAR *SerialNumber;
> } DockInfo;
> ULONG DisableableDepends;
> LIST_ENTRY PendedSetInterfaceState;
> LIST_ENTRY LegacyBusListEntry;
> ULONG DriverUnloadRetryCount;
> } DEVICE_NODE, *PDEVICE_NODE;
>
>
> Dock Flags:
> DOCK_NOTDOCKDEVICE = 0
> DOCK_QUIESCENT = 1
> DOCK_ARRIVING = 2
> DOCK_DEPARTING = 3
> DOCK_EJECTIRP_COMPLETED = 4
>
>
> Filip Navara wrote:
>
>> Eric Kohl wrote:
>>
>>> Do you have an official definition of the _DEVICE_NODE structure? I am
>>> asking because I don't know whether I should keep the BusInformation
>>> component in _DEVICE_NODE or remove it. I am pretty sure we need the
>>> BusNumber and InterfaceType in _DEVICE_NODE but I am not sure about
>>> BusTypeGuid?
>>>
>>>
>> See the attached file (at the end). It's taken from my notes and
>> contains a _DEVICE_NODE definition with some minor annotations.
>>
>>> Ooops, I forgot to mention that one of my machines freezes while
>>> pci.sys
>>> enumerates devices on the pci bus. This has nothing to do with the
>>> RTL8139
>>> driver.
>>>
>>>
>> Reminds me we need implement support for PCI-to-PCI bridges (by
>> stacking another instance of pci.sys on top of the corresponding PDO)
>> so that we can enumerate the RTL card on Gerard's computer.
>>
>> Regards,
>> Filip
>>
>> ------------------------------------------------------------------------
>>
>> Plug & Play Device Nodes
>> ------------------------
>>
>> One of the main structures in PnP is the device node. Each device
>> (or virtual device) present in the system has it's corresponding
>> device node which stores all information about the device it belongs
>> to including it's state, resource requirements, currently assigned
>> resources and device objects (it directly refers only to PDO, but
>> other device objects are accessible too).
>> These device nodes are grouped together in a tree which stores
>> all the devices in the system. On the top of the tree sits the virtual
>> root device node that groups together legacy device drivers, bus
>> drivers and drivers that don't control any physical device. The virtual
>> root bus is implemented in the kernel itself and enumerates it's
>> children based on the settings present in the registry (HKLM\System\
>> CurrentControlSet\Enum).
>> Let's look at a portion of typical device node tree:
>>
>> /--------\
>> | TCP/IP |
>> \--------/ - ...
>> | /
>> /----------\ /----------\ /---------\ / /-------------\
>> | Root Bus |--| ACPI HAL |--| PCI Bus |----| Display Card |
>> \----------/ \----------/ \---------/ \ \-------------/
>> | \ /---------\ \ /---------------\
>> \ ... -| ISA Bus | -| USB Controller |-- ...
>> \---------/ \---------------/
>> In this example you can see that there is a TCP/IP
>> service and
>> ACPI bus enumerated by the root bus. The ACPI HAL is a virtual bus
>> driver which is located in the HAL and might not be present depending
>> on computer and Windows configuration. Down the stack we can see the
>> PCI and ISA bus drivers which were itself enumerated by the ACPI HAL
>> and that enumerate other devices connected to them.
>>
>> Plug & Play Enumeration
>> -----------------------
>>
>> <!!!nonsense!!!>
>> During the system start all the drivers must be loaded. This is
>> accomplished by recursively iterating through the device node tree.
>> At first the root bus device node is created and it's called to
>> enumerate it's children. Then all the children drivers are loaded
>> and called to enumerate their children and so one. For each enumerated
>> device a physical device object (PDO) is created and if everything
>> goes right an functional device object (FDO) is attached on top of it.
>> The parent bus drivers supply the PDOs for their devices and the
>> drivers corresponding to these devices attach their FDOs.
>> </!!!nonsense!!!>
>>
>> * IoInvalidateDeviceRelations
>>
>> typedef struct _PO_DEVICE_NOTIFY
>> {
>> LIST_ENTRY Link;
>> PDEVICE_OBJECT TargetDevice;
>> UCHAR WakeNeeded;
>> UCHAR OrderLevel;
>> PDEVICE_OBJECT DeviceObject;
>> struct _DEVICE_NODE *Node;
>> WCHAR *DeviceName;
>> WCHAR *DriverName;
>> ULONG ChildCount;
>> ULONG ActiveChild;
>> } PO_DEVICE_NOTIFY, *PPO_DEVICE_NOTIFY;
>>
>> typedef enum _PNP_DEVNODE_STATE
>> {
>> DeviceNodeUnspecified = 0x300
>> DeviceNodeUninitialized,
>> DeviceNodeInitialized,
>> DeviceNodeDriversAdded,
>> DeviceNodeResourcesAssigned,
>> DeviceNodeStartPending,
>> DeviceNodeStartCompletion,
>> DeviceNodeStartPostWork,
>> DeviceNodeStarted,
>> DeviceNodeQueryStopped,
>> DeviceNodeStopped,
>> DeviceNodeRestartCompletion,
>> DeviceNodeEnumeratePending,
>> DeviceNodeEnumerateCompletion,
>> DeviceNodeAwaitingQueuedDeletion,
>> DeviceNodeAwaitingQueuedRemoval,
>> DeviceNodeQueryRemoved,
>> DeviceNodeRemovePendingCloses,
>> DeviceNodeRemoved,
>> DeviceNodeDeletePendingCloses,
>> DeviceNodeDeleted
>> } PNP_DEVNODE_STATE, *PPNP_DEVNODE_STATE;
>>
>> typedef enum {
>> DOCK_NOTDOCKDEVICE = 0,
>> DOCK_QUIESCENT,
>> DOCK_ARRIVING,
>> DOCK_DEPARTING,
>> DOCK_EJECTIRP_COMPLETED
>> } PNP_DOCK_STATUS;
>>
>> typedef struct _DEVICE_NODE
>> {
>> /* A tree structure. */
>> struct _DEVICE_NODE *Sibling;
>> struct _DEVICE_NODE *Child;
>> struct _DEVICE_NODE *Parent;
>> struct _DEVICE_NODE *LastChild;
>> /* The level of deepness in the tree. */
>> UINT Level;
>> /* */
>> PPO_DEVICE_NOTIFY Notify;
>> /* State machine. */
>> PNP_DEVNODE_STATE State;
>> PNP_DEVNODE_STATE PreviousState;
>> PNP_DEVNODE_STATE StateHistory[20];
>> UINT StateHistoryEntry;
>> /* ? */
>> INT CompletionStatus;
>> /* ? */
>> PIRP PendingIrp;
>> /* See DNF_* flags below (WinDBG documentation has WRONG values) */
>> ULONG Flags;
>> /* See DNUF_* flags below */
>> ULONG UserFlags;
>> /* See CM_PROB_* values are defined in cfg.h */
>> ULONG Problem;
>> /* Pointer to the PDO corresponding to the device node. */
>> PDEVICE_OBJECT PhysicalDeviceObject;
>> /* Resource list as assigned by the PnP arbiter. See
>> IRP_MN_START_DEVICE
>> and ARBITER_INTERFACE (not documented in DDK, but present in
>> headers). */
>> PCM_RESOURCE_LIST ResourceList;
>> /* Resource list as assigned by the PnP arbiter (translated
>> version). */
>> PCM_RESOURCE_LIST ResourceListTranslated;
>> /* Instance path relative to the Enum key in registry. */
>> UNICODE_STRING InstancePath;
>> /* Name of the driver service. */
>> UNICODE_STRING ServiceName;
>> /* ? */
>> PDEVICE_OBJECT DuplicatePDO;
>> /* See IRP_MN_QUERY_RESOURCE_REQUIREMENTS. */
>> PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements;
>> /* Information about bus for bus drivers. */
>> INTERFACE_TYPE InterfaceType;
>> ULONG BusNumber;
>> /* Information about underlying bus for child devices. */
>> INTERFACE_TYPE ChildInterfaceType;
>> ULONG ChildBusNumber;
>> USHORT ChildBusTypeIndex;
>> /* ? */
>> UCHAR RemovalPolicy;
>> UCHAR HardwareRemovalPolicy;
>> LIST_ENTRY TargetDeviceNotify;
>> LIST_ENTRY DeviceArbiterList;
>> LIST_ENTRY DeviceTranslatorList;
>> USHORT NoTranslatorMask;
>> USHORT QueryTranslatorMask;
>> USHORT NoArbiterMask;
>> USHORT QueryArbiterMask;
>> ULONG OverUsed1;
>> ULONG OverUsed2;
>> /* See IRP_MN_QUERY_RESOURCES. */
>> PCM_RESOURCE_LIST BootResources;
>> /* See the bitfields in DEVICE_CAPABILITIES structure. */
>> ULONG CapabilityFlags;
>> struct {
>> ULONG DockStatus;
>> LIST_ENTRY ListEntry;
>> WCHAR *SerialNumber;
>> } DockInfo;
>> ULONG DisableableDepends;
>> LIST_ENTRY PendedSetInterfaceState;
>> LIST_ENTRY LegacyBusListEntry;
>> ULONG DriverUnloadRetryCount;
>> } DEVICE_NODE, *PDEVICE_NODE;
>> #ifdef _W2K_
>> #define DNF_MADEUP 1
>> #define DNF_HAL_NODE 4
>> #define DNF_PROCESSED 8
>> #define DNF_ENUMERATED 0x10
>> #define DNF_ADDED 0x40
>> #define DNF_HAS_BOOT_CONFIG 0x80
>> #define DNF_BOOT_CONFIG_RESERVED 0x100
>> #define DNF_NO_RESOURCE_REQUIRED 0x400
>> #define DNF_STARTED 0x40000
>> #else
>> #define DNF_MADEUP 1
>> #define DNF_HAL_NODE 4
>> #define DNF_ENUMERATED 0x10
>> #define DNF_IDS_QUERIED 0x20
>> #define DNF_HAS_BOOT_CONFIG 0x40
>> #define DNF_BOOT_CONFIG_RESERVED 0x80
>> #define DNF_NO_RESOURCE_REQUIRED 0x100
>> #define DNF_RESOURCE_REQUIREMENTS_NEED_FILTERED 0x200
>> #endif
>>
>> #define DNUF_DONT_SHOW_IN_UI 2
>> #define DNUF_NOT_DISABLEABLE 8
>>
>> /* CM_PROB_* values are defined in cfg.h */
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Ros-dev mailing list
>> Ros-dev at reactos.com
>> http://reactos.com:8080/mailman/listinfo/ros-dev
>>
>>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.com
> http://reactos.com:8080/mailman/listinfo/ros-dev
>
More information about the Ros-dev
mailing list