[ros-dev] Loading failure of rtl8139.sys driver = OK+ Ndisfunctionunimplemented

Alex Ionescu ionucu at videotron.ca
Fri Oct 22 13:05:49 CEST 2004


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;
        PVOID 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
>  
>



More information about the Ros-dev mailing list