From 0a6aa71bb4f2cd8c989d227a28e4e0731e83c30e Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 9 Oct 2004 18:17:08 +0000 Subject: [PATCH] - Attach NDIS miniport devices to the device stack. - Gain the bus type and slot number using IoGetDeviceProperty from the PnP stack. - Read the registry values for NDIS miniports from the correct place. See www.plasmic.com/~vizzini/ntnetarch.html for details. - Update NdisReadPciSlotInformation/NdisWritePciSlotInformation to use the adapter slot information. svn path=/trunk/; revision=11251 --- reactos/bootdata/hivesys.inf | 76 ++--- reactos/drivers/net/ndis/Makefile | 3 +- reactos/drivers/net/ndis/ndis/config.c | 14 +- reactos/drivers/net/ndis/ndis/hardware.c | 13 +- reactos/drivers/net/ndis/ndis/main.c | 9 +- reactos/drivers/net/ndis/ndis/miniport.c | 355 ++++++++++------------- 6 files changed, 185 insertions(+), 285 deletions(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 0b5bf4a6420..9f5fb53a966 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -575,78 +575,40 @@ HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","Group",0x00000000,"NDIS" HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","ImagePath",0x00020000,"system32\drivers\pcntn5m.sys" HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","Type",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Linkage","Bind",0x00010000,"\Device\PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Linkage","Export",0x00010000,"\Device\PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Linkage","Route",0x00010000,"PCNet1" HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Enum","0",0x00000000,"PCI\VEN_1022&DEV_2000\0000" HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Enum","Count",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Enum","NextInstance",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","Service",0x00000000,"PCNet" HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","Class",0x00000000,"Net" HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","ClassGUID",0x00000000,"{4D36E972-E325-11CE-BFC1-08002BE10318}" - -; AMD PCNet Adapter 1 -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1","ErrorControl",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1","Start",0x00010001,0x00000003 -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1","Type",0x00010001,0x00000004 -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Linkage","Bind",0x00010000,"\Device\PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Linkage","Export",0x00010000,"\Device\PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Linkage","Route",0x00010000,"PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","BUS_TO_SCAN",0x00000000,"ALL" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","BUSTIMER",0x00000000,"0" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","BUSTYPE",0x00000000,"5" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","EXTPHY",0x00000000,"0" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","FDUP",0x00000000,"0" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","LED0",0x00000000,"10000" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","LED1",0x00000000,"10000" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","LED2",0x00000000,"10000" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","LED3",0x00000000,"10000" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","MPMODE",0x00000000,"0" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","TP",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","SlotNumber",0x00000000,"10" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","BusNumber",0x00000000,"0" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","DefaultGateway",0x00010000,"10.0.0.1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","IPAddress",0x00010000,"10.0.0.100" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","SubnetMask",0x00010000,"255.255.255.0" +HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","Driver",0x00000000,"{4D36E972-E325-11CE-BFC1-08002BE10318}\0000" ; Configuration Entries for the PCNet Adapter HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","Characteristics",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","DriverDesc",0x00000000,"Device Name(from Inffile)" HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","ProviderName",0x00000000,"Provider Name(from Inffile)" HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","NetCfgInstanceId",0x00000000,"{RANDOMCFGGUIDFOR_PCNET1}" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000\Linkage","Export",0x00000000,"\Device\PCNet1" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000\Linkage","RootDevice",0x00000000,"PCNet1" HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000\Linkage","UpperBind",0x00000000,"Tcpip" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","BUS_TO_SCAN",0x00000000,"ALL" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","BUSTIMER",0x00000000,"0" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","BUSTYPE",0x00000000,"5" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","EXTPHY",0x00000000,"0" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","FDUP",0x00000000,"0" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","LED0",0x00000000,"10000" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","LED1",0x00000000,"10000" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","LED2",0x00000000,"10000" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","LED3",0x00000000,"10000" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","MPMODE",0x00000000,"0" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","TP",0x00000000,"1" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","SlotNumber",0x00000000,"10" +HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","BusNumber",0x00000000,"0" HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{RANDOMCFGGUIDFOR_PCNET1}",,0x00000000,"Network Adapters" HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{RANDOMCFGGUIDFOR_PCNET1}\Connection","Name",0x00000000,"AMD PCNet (static Registry entry)" - - -; ReactOS PCNet Driver -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","ErrorControl",0x00010001,0x00000001 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","Group",0x00000000,"NDIS" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","ImagePath",0x00020000,"system32\drivers\pcnet.sys" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","Start",0x00010001,0x00000003 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","Type",0x00010001,0x00000001 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Linkage","Bind",0x00010000,"\Device\PCNet1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Linkage","Export",0x00010000,"\Device\PCNet1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Linkage","Route",0x00010000,"PCNet1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Enum","0",0x00000000,"PCI\VEN_1022&DEV_2000\0000" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Enum","Count",0x00010001,0x00000001 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet\Enum","NextInstance",0x00010001,0x00000001 -;HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","Service",0x00000000,"PCNet" -;HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","Class",0x00000000,"Net" -;HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_1022&DEV_2000&SUBSYS_20001022&REV_10\0000","ClassGUID",0x00000000,"{4D36E972-E325-11CE-BFC1-08002BE10318}" - -; PCNet Adapter 1 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1","ErrorControl",0x00010001,0x00000001 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1","Start",0x00010001,0x00000003 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1","Type",0x00010001,0x00000004 -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Linkage","Bind",0x00010000,"\Device\PCNet1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Linkage","Export",0x00010000,"\Device\PCNet1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Linkage","Route",0x00010000,"PCNet1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","SlotNumber",0x00000000,"10" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters","BusNumber",0x00000000,"0" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","DefaultGateway",0x00010000,"10.1.0.1" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","IPAddress",0x00010000,"10.1.0.100" -;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","SubnetMask",0x00010000,"255.255.255.0" +HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","DefaultGateway",0x00010000,"10.0.0.1" +HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","IPAddress",0x00010000,"10.0.0.100" +HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","SubnetMask",0x00010000,"255.255.255.0" ; Named Pipe filesystem driver HKLM,"SYSTEM\CurrentControlSet\Services\Npfs","ErrorControl",0x00010001,0x00000000 diff --git a/reactos/drivers/net/ndis/Makefile b/reactos/drivers/net/ndis/Makefile index 3bffb757306..ffac8ffda76 100644 --- a/reactos/drivers/net/ndis/Makefile +++ b/reactos/drivers/net/ndis/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.21 2004/08/15 23:12:32 chorns Exp $ +# $Id: Makefile,v 1.22 2004/10/09 18:17:08 navaraf Exp $ PATH_TO_TOP = ../../.. @@ -20,7 +20,6 @@ TARGET_OBJECTS = \ ndis/co.o \ ndis/config.o \ ndis/control.o \ - ndis/enum.o \ ndis/hardware.o \ ndis/io.o \ ndis/memory.o \ diff --git a/reactos/drivers/net/ndis/ndis/config.c b/reactos/drivers/net/ndis/ndis/config.c index 78fe9c9e90b..6746d142e99 100644 --- a/reactos/drivers/net/ndis/ndis/config.c +++ b/reactos/drivers/net/ndis/ndis/config.c @@ -31,6 +31,7 @@ * - All the routines in this file are PASSIVE_LEVEL only, and all memory is PagedPool */ +#include #include "ndissys.h" #define NDIS_VERSION 0x00040000 /* the version of NDIS we claim to be to miniport drivers */ @@ -168,21 +169,18 @@ NdisOpenConfiguration( * I think this is the parameters key; please verify. */ { - OBJECT_ATTRIBUTES KeyAttributes; - UNICODE_STRING KeyNameU; HANDLE KeyHandle; PMINIPORT_CONFIGURATION_CONTEXT ConfigurationContext; HANDLE RootKeyHandle = (HANDLE)WrapperConfigurationContext; NDIS_DbgPrint(MAX_TRACE, ("Called\n")); - RtlInitUnicodeString(&KeyNameU, PARAMETERS_KEY); - InitializeObjectAttributes(&KeyAttributes, &KeyNameU, OBJ_CASE_INSENSITIVE, RootKeyHandle, NULL); - - *Status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &KeyAttributes); - if(*Status != STATUS_SUCCESS) + *Status = ZwDuplicateObject(NtCurrentProcess(), RootKeyHandle, + NtCurrentProcess(), &KeyHandle, 0, FALSE, + DUPLICATE_SAME_ACCESS); + if(!NT_SUCCESS(*Status)) { - NDIS_DbgPrint(MID_TRACE, ("Failed to open registry configuration for this miniport\n")); + NDIS_DbgPrint(MID_TRACE, ("Failed to open registry configuration for this miniport\n")); *ConfigurationHandle = NULL; *Status = NDIS_STATUS_FAILURE; return; diff --git a/reactos/drivers/net/ndis/ndis/hardware.c b/reactos/drivers/net/ndis/ndis/hardware.c index d625f86320f..28bd80926d4 100644 --- a/reactos/drivers/net/ndis/ndis/hardware.c +++ b/reactos/drivers/net/ndis/ndis/hardware.c @@ -14,6 +14,7 @@ * - Fix HalGetBusDataByOffset() param 2 in most calls below */ +#include #include "ndissys.h" @@ -182,7 +183,11 @@ NdisReadPciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - return HalGetBusDataByOffset (PCIConfiguration, 0, SlotNumber, Buffer, Offset, Length); + PLOGICAL_ADAPTER AdapterObject = (PLOGICAL_ADAPTER)NdisAdapterHandle; + /* Slot number is ignored since W2K for all NDIS drivers. */ + NDIS_DbgPrint(MAX_TRACE, ("Slot: %d\n", AdapterObject->SlotNumber)); + return HalGetBusDataByOffset (PCIConfiguration, 0, AdapterObject->SlotNumber, + Buffer, Offset, Length); } @@ -198,7 +203,11 @@ NdisWritePciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - return HalSetBusDataByOffset (PCIConfiguration, 0, SlotNumber, Buffer, Offset, Length); + PLOGICAL_ADAPTER AdapterObject = (PLOGICAL_ADAPTER)NdisAdapterHandle; + /* Slot number is ignored since W2K for all NDIS drivers. */ + NDIS_DbgPrint(MAX_TRACE, ("Slot: %d\n", AdapterObject->SlotNumber)); + return HalSetBusDataByOffset (PCIConfiguration, 0, AdapterObject->SlotNumber, + Buffer, Offset, Length); } /* EOF */ diff --git a/reactos/drivers/net/ndis/ndis/main.c b/reactos/drivers/net/ndis/ndis/main.c index b9fd018975c..f4bf18eb14f 100644 --- a/reactos/drivers/net/ndis/ndis/main.c +++ b/reactos/drivers/net/ndis/ndis/main.c @@ -18,14 +18,10 @@ #ifdef DBG /* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MIN_TRACE; +DWORD DebugTraceLevel = /*MIN_TRACE*/DEBUG_ULTRA; #endif /* DBG */ -/* see miniport.c */ -extern KSPIN_LOCK OrphanAdapterListLock; -extern LIST_ENTRY OrphanAdapterListHead; - VOID STDCALL MainUnload( PDRIVER_OBJECT DriverObject) @@ -64,9 +60,6 @@ DriverEntry( InitializeListHead(&AdapterListHead); KeInitializeSpinLock(&AdapterListLock); - InitializeListHead(&OrphanAdapterListHead); - KeInitializeSpinLock(&OrphanAdapterListLock); - DriverObject->DriverUnload = MainUnload; /* diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index 5e25e4392f1..832a9ee629e 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -20,9 +20,6 @@ /* Root of the scm database */ #define SERVICES_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" -/* prefix for device object registration */ -#define DEVICE_ROOT L"\\Device\\" - /* * Define to 1 to get a debugger breakpoint at the end of NdisInitializeWrapper * for each new miniport starting up @@ -65,11 +62,6 @@ KSPIN_LOCK MiniportListLock; LIST_ENTRY AdapterListHead; KSPIN_LOCK AdapterListLock; -/* global list and lock of orphan adapters waiting to be claimed by a miniport */ -LIST_ENTRY OrphanAdapterListHead; -KSPIN_LOCK OrphanAdapterListLock; - - VOID MiniDisplayPacket( PNDIS_PACKET Packet) @@ -1335,26 +1327,22 @@ DoQueries( VOID NdisIStartAdapter( - WCHAR *DeviceNameStr, - UINT DeviceNameStrLength, + UNICODE_STRING *DeviceName, + PDEVICE_OBJECT PhysicalDeviceObject, PMINIPORT_DRIVER Miniport ) /* * FUNCTION: Start an adapter * ARGUMENTS: - * DeviceNameStr: 0-terminated wide char string of name of device to start - * DeviceNameStrLength: length of DeviceNameStr *IN WCHARs* + * DeviceName: Name of device to start + * PhysicalDeviceObject: PDO for our adapter * NOTES: * TODO: * - verify that all resources are properly freed on success & failure * - break up this 250-line function */ { - WCHAR *DeviceName; HANDLE RegKeyHandle; - WCHAR *RegKeyPath; - UNICODE_STRING RegKeyPathU; - OBJECT_ATTRIBUTES RegKeyAttributes; NDIS_STATUS NdisStatus; NDIS_STATUS OpenErrorStatus; NTSTATUS Status; @@ -1363,9 +1351,8 @@ NdisIStartAdapter( NDIS_OID AddressOID; BOOLEAN MemError = FALSE; KIRQL OldIrql; - PORPHAN_ADAPTER OrphanAdapter = 0; + ULONG Size; - NDIS_DbgPrint(MAX_TRACE, ("Called with %ws\n", DeviceNameStr)); Adapter = ExAllocatePool(NonPagedPool, sizeof(LOGICAL_ADAPTER)); if (!Adapter) { @@ -1376,22 +1363,17 @@ NdisIStartAdapter( /* This is very important */ RtlZeroMemory(Adapter, sizeof(LOGICAL_ADAPTER)); - DeviceName = ExAllocatePool(NonPagedPool, sizeof(DEVICE_ROOT) + DeviceNameStrLength * sizeof(WCHAR)); - if(!DeviceName) + Adapter->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceName->Length); + if(!Adapter->DeviceName.Buffer) { NDIS_DbgPrint(MIN_TRACE,("Insufficient memory\n")); ExFreePool(Adapter); return; } + Adapter->DeviceName.MaximumLength = DeviceName->Length; + RtlCopyUnicodeString(&Adapter->DeviceName, DeviceName); - /* DEVICE_ROOT is a constant string defined above, incl. 0-term */ - wcscpy(DeviceName, DEVICE_ROOT); - - /* reg_sz is 0-term by def */ - wcsncat(DeviceName, DeviceNameStr, DeviceNameStrLength); - RtlInitUnicodeString(&Adapter->DeviceName, DeviceName); - - NDIS_DbgPrint(MAX_TRACE, ("creating device %ws\n", DeviceName)); + NDIS_DbgPrint(MAX_TRACE, ("creating device %wZ\n", DeviceName)); Status = IoCreateDevice(Miniport->DriverObject, 0, &Adapter->DeviceName, FILE_DEVICE_PHYSICAL_NETCARD, 0, FALSE, &Adapter->NdisMiniportBlock.DeviceObject); @@ -1402,105 +1384,8 @@ NdisIStartAdapter( return; } - /* find out if there are any adapters in the orphans list and reserve resources */ - KeAcquireSpinLock(&OrphanAdapterListLock, &OldIrql); - OrphanAdapter = (PORPHAN_ADAPTER)OrphanAdapterListHead.Flink; - while(&OrphanAdapter->ListEntry != &OrphanAdapterListHead) - { - PORPHAN_ADAPTER TempAdapter; - PCM_RESOURCE_LIST ResourceList; - UINT i; - - if(!RtlCompareUnicodeString(&OrphanAdapter->RegistryPath, Miniport->RegistryPath, TRUE)) - { - OrphanAdapter = (PORPHAN_ADAPTER)OrphanAdapter->ListEntry.Flink; - continue; - } - - NDIS_DbgPrint(MAX_TRACE, ("Found an orphan adapter for RegistryPath %wZ\n", Miniport->RegistryPath)); - - /* there is an orphan adapter for us */ - Adapter->SlotNumber = OrphanAdapter->SlotNumber; - Adapter->BusNumber = OrphanAdapter->BusNumber; - Adapter->BusType = OrphanAdapter->BusType; - - Status = HalAssignSlotResources(Miniport->RegistryPath, 0, Miniport->DriverObject, - Adapter->NdisMiniportBlock.DeviceObject, Adapter->BusType, Adapter->BusNumber, - Adapter->SlotNumber, &ResourceList); - - if(!NT_SUCCESS(Status)) - { - NDIS_DbgPrint(MIN_TRACE, ("HalAssignSlotResources broke: 0x%x\n", Status)); - ASSERT(0); - - /* i guess we should just give up on this adapter */ - break; - } - - /* go through the returned resource list and populate the Adapter */ - for(i = 0; iCount; i++) - { - int j; - - PCM_FULL_RESOURCE_DESCRIPTOR ResourceDescriptor = &ResourceList->List[i]; - - for(j=0; jPartialResourceList.Count; j++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResourceDescriptor = - &ResourceDescriptor->PartialResourceList.PartialDescriptors[i]; - - switch(PartialResourceDescriptor->Type) - { - case CmResourceTypeInterrupt: - Adapter->Irql = PartialResourceDescriptor->u.Interrupt.Level; - Adapter->Vector = PartialResourceDescriptor->u.Interrupt.Vector; - Adapter->Affinity = PartialResourceDescriptor->u.Interrupt.Affinity; - break; - - case CmResourceTypePort: - Adapter->BaseIoAddress = PartialResourceDescriptor->u.Port.Start; - break; - - case CmResourceTypeMemory: - Adapter->BaseMemoryAddress = PartialResourceDescriptor->u.Memory.Start; - break; - - case CmResourceTypeDma: - Adapter->DmaPort = PartialResourceDescriptor->u.Dma.Port; - Adapter->DmaChannel = PartialResourceDescriptor->u.Dma.Channel; - break; - - case CmResourceTypeDeviceSpecific: - default: - break; - } - } - } - - /* remove the adapter from the list */ - TempAdapter = (PORPHAN_ADAPTER)OrphanAdapter->ListEntry.Flink; - RemoveEntryList(&OrphanAdapter->ListEntry); - OrphanAdapter = TempAdapter; - } - KeReleaseSpinLock(&OrphanAdapterListLock, OldIrql); - - /* includes room for a 0-term */ - RegKeyPath = ExAllocatePool(PagedPool, (wcslen(SERVICES_ROOT) + wcslen(DeviceNameStr) + 1) * sizeof(WCHAR)); - if(!RegKeyPath) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources\n")); - ExFreePool(Adapter); - return; - } - - wcscpy(RegKeyPath, SERVICES_ROOT); - wcscat(RegKeyPath, DeviceNameStr); - RegKeyPath[wcslen(SERVICES_ROOT) + wcslen(DeviceNameStr)] = 0; - - RtlInitUnicodeString(&RegKeyPathU, RegKeyPath); - InitializeObjectAttributes(&RegKeyAttributes, &RegKeyPathU, OBJ_CASE_INSENSITIVE, NULL, NULL); - - Status = ZwOpenKey(&RegKeyHandle, KEY_ALL_ACCESS, &RegKeyAttributes); + Status = IoOpenDeviceRegistryKey(PhysicalDeviceObject, PLUGPLAY_REGKEY_DRIVER, + KEY_ALL_ACCESS, &RegKeyHandle); if(Status != STATUS_SUCCESS) { NDIS_DbgPrint(MIN_TRACE,("failed to open adapter-specific reg key %wZ\n", &RegKeyPathU)); @@ -1508,7 +1393,7 @@ NdisIStartAdapter( return; } - NDIS_DbgPrint(MAX_TRACE, ("opened device reg key: %wZ\n", &RegKeyPathU)); + NDIS_DbgPrint(MAX_TRACE, ("opened device reg key\n")); NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeInitializeSpinLock(&Adapter->NdisMiniportBlock.Lock); @@ -1516,6 +1401,15 @@ NdisIStartAdapter( Adapter->RefCount = 1; Adapter->Miniport = Miniport; + /* FIXME: Check return values. */ + Size = sizeof(ULONG); + IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyLegacyBusType, + Size, &Adapter->BusType, &Size); + IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyBusNumber, + Size, &Adapter->BusNumber, &Size); + IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyAddress, + Size, &Adapter->SlotNumber, &Size); + /* Set handlers (some NDIS macros require these) */ Adapter->NdisMiniportBlock.EthRxCompleteHandler = MiniEthReceiveComplete; @@ -1527,7 +1421,7 @@ NdisIStartAdapter( Adapter->NdisMiniportBlock.PacketIndicateHandler= MiniIndicateReceivePacket; KeInitializeDpc(&Adapter->MiniportDpc, MiniportDpc, (PVOID)Adapter); - + /* Put adapter in adapter list for this miniport */ ExInterlockedInsertTailList(&Miniport->AdapterListHead, &Adapter->MiniportListEntry, &Miniport->Lock); @@ -1599,6 +1493,116 @@ NdisIStartAdapter( ExFreePool(Adapter); NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter.\n")); } + else + { + IoAttachDeviceToDeviceStack(Adapter->NdisMiniportBlock.DeviceObject, + PhysicalDeviceObject); + } +} + + +NTSTATUS +STDCALL +NdisIAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject +) +/* + * FUNCTION: Start an adapter found using PnP + * ARGUMENTS: + * DriverObject = Pointer to the miniport driver object + * PhysicalDeviceObject = Pointer to the PDO for our adapter + */ +{ + static const WCHAR ClassKeyName[] = {'C','l','a','s','s','\\'}; + static const WCHAR LinkageKeyName[] = {'\\','L','i','n','k','a','g','e',0}; + PMINIPORT_DRIVER Miniport; + PMINIPORT_DRIVER *MiniportPtr; + WCHAR *LinkageKeyBuffer; + ULONG DriverKeyLength; + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + UNICODE_STRING ExportName; + NTSTATUS Status; + + /* + * Gain the access to the miniport data structure first. + */ + + MiniportPtr = IoGetDriverObjectExtension(DriverObject, (PVOID)TAG('D','I','M','N')); + if (MiniportPtr == NULL) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get driver object extension.\n")); + return STATUS_UNSUCCESSFUL; + } + Miniport = *MiniportPtr; + + /* + * Get name of the Linkage registry key for our adapter. It's located under + * the driver key for our driver and so we have basicly two ways to do it. + * Either we can use IoOpenDriverRegistryKey or compose it using information + * gathered by IoGetDeviceProperty. I choosed the second because + * IoOpenDriverRegistryKey wasn't implemented at the time of writing. + */ + + Status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyDriverKeyName, + 0, NULL, &DriverKeyLength); + if (Status != STATUS_BUFFER_TOO_SMALL) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get miniport driver key length.\n")); + return Status; + } + + LinkageKeyBuffer = ExAllocatePool(PagedPool, DriverKeyLength + + sizeof(ClassKeyName) + sizeof(LinkageKeyName)); + if (LinkageKeyBuffer == NULL) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't allocate memory for driver key name.\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyDriverKeyName, + DriverKeyLength, LinkageKeyBuffer + + (sizeof(ClassKeyName) / sizeof(WCHAR)), + &DriverKeyLength); + if (!NT_SUCCESS(Status)) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get miniport driver key.\n")); + ExFreePool(LinkageKeyBuffer); + return Status; + } + + /* Compose the linkage key name. */ + RtlCopyMemory(LinkageKeyBuffer, ClassKeyName, sizeof(ClassKeyName)); + RtlCopyMemory(LinkageKeyBuffer + ((sizeof(ClassKeyName) + DriverKeyLength) / + sizeof(WCHAR)) - 1, LinkageKeyName, sizeof(LinkageKeyName)); + + NDIS_DbgPrint(DEBUG_MINIPORT, ("LinkageKey: %S.\n", LinkageKeyBuffer)); + + /* + * Now open the linkage key and read the "Export" and "RootDevice" values + * which contains device name and root service respectively. + */ + + RtlZeroMemory(QueryTable, sizeof(QueryTable)); + RtlInitUnicodeString(&ExportName, NULL); + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].Name = L"Export"; + QueryTable[0].EntryContext = &ExportName; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, LinkageKeyBuffer, + QueryTable, NULL, NULL); + if (!NT_SUCCESS(Status)) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't get miniport device name. (%x)\n", Status)); + ExFreePool(LinkageKeyBuffer); + return Status; + } + ExFreePool(LinkageKeyBuffer); + + NdisIStartAdapter(&ExportName, PhysicalDeviceObject, Miniport); + RtlFreeUnicodeString(&ExportName); + + return STATUS_SUCCESS; } @@ -1619,25 +1623,12 @@ NdisMRegisterMiniport( * CharacteristicsLength = Number of bytes in characteristics buffer * RETURNS: * Status of operation - * NOTES: - * - To create device objects for the miniport, the Route value under Linkage is - * parsed. I don't know if this is the way Microsoft does it or not. - * TODO: - * verify this algorithm by playing with nt */ { UINT MinSize; - NTSTATUS Status; PMINIPORT_DRIVER Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle); - OBJECT_ATTRIBUTES DeviceKeyAttributes; - OBJECT_ATTRIBUTES LinkageKeyAttributes; - HANDLE DeviceKeyHandle; - HANDLE LinkageKeyHandle; - UNICODE_STRING RouteVal; - UNICODE_STRING LinkageKeyName; - KEY_VALUE_PARTIAL_INFORMATION *RouteData; - ULONG RouteDataLength; - UINT NextRouteOffset = 0; + PMINIPORT_DRIVER *MiniportPtr; + NTSTATUS Status; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -1701,72 +1692,21 @@ NdisMRegisterMiniport( RtlCopyMemory(&Miniport->Chars, MiniportCharacteristics, MinSize); /* - * extract the list of bound adapters from the registry's Route value - * for this adapter. It seems under WinNT that the Route value in the - * Linkage subkey holds an entry for each miniport instance we know about. - * This surely isn't how Windows does it, but it's better than nothing. - * - * FIXME: this is documented in the ddk, believe it or not - read & do + * NOTE: This is VERY unoptimal! Should we store the MINIPORT_DRIVER + * struture in the driver extension or what? */ - /* Read the miniport config from the registry */ - InitializeObjectAttributes(&DeviceKeyAttributes, Miniport->RegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL); - - Status = ZwOpenKey(&DeviceKeyHandle, KEY_READ, &DeviceKeyAttributes); - if(!NT_SUCCESS(Status)) + Status = IoAllocateDriverObjectExtension(Miniport->DriverObject, (PVOID)TAG('D','I','M','N'), + sizeof(PMINIPORT_DRIVER), (PVOID*)&MiniportPtr); + if (!NT_SUCCESS(Status)) { - NDIS_DbgPrint(MIN_TRACE,("Failed to open driver key: 0x%x\n", Status)); - return NDIS_STATUS_FAILURE; - } - - RtlInitUnicodeString(&LinkageKeyName, L"Linkage"); - InitializeObjectAttributes(&LinkageKeyAttributes, &LinkageKeyName, OBJ_CASE_INSENSITIVE, DeviceKeyHandle, NULL); - - Status = ZwOpenKey(&LinkageKeyHandle, KEY_READ, &LinkageKeyAttributes); - if(!NT_SUCCESS(Status)) - { - NDIS_DbgPrint(MIN_TRACE,("Failed to open Linkage key: 0x%x\n", Status)); - ZwClose(DeviceKeyHandle); - return NDIS_STATUS_FAILURE; - } - - RouteData = ExAllocatePool(PagedPool, ROUTE_DATA_SIZE); - if(!RouteData) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources\n")); - ZwClose(LinkageKeyHandle); - ZwClose(DeviceKeyHandle); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Can't allocate driver object extension.\n")); return NDIS_STATUS_RESOURCES; } - RtlInitUnicodeString(&RouteVal, L"Route"); + *MiniportPtr = Miniport; + Miniport->DriverObject->DriverExtension->AddDevice = NdisIAddDevice; - Status = ZwQueryValueKey(LinkageKeyHandle, &RouteVal, KeyValuePartialInformation, RouteData, ROUTE_DATA_SIZE, &RouteDataLength); - if(!NT_SUCCESS(Status)) - { - NDIS_DbgPrint(MIN_TRACE,("Failed to query Route value\n")); - ZwClose(LinkageKeyHandle); - ZwClose(DeviceKeyHandle); - ExFreePool(RouteData); - return NDIS_STATUS_FAILURE; - } - - ZwClose(LinkageKeyHandle); - ZwClose(DeviceKeyHandle); - - /* route is a REG_MULTI_SZ with each nic object created by NDI - create an adapter for each */ - while(*(RouteData->Data + NextRouteOffset)) - { - NDIS_DbgPrint(MID_TRACE, ("Starting adapter %ws\n", (WCHAR *)(RouteData->Data + NextRouteOffset))); - - NdisIStartAdapter((WCHAR *)(RouteData->Data + NextRouteOffset), - wcslen((WCHAR *)(RouteData->Data + NextRouteOffset)), Miniport); - - /* NextRouteOffset is in bytes, not WCHARs */ - NextRouteOffset += wcslen((WCHAR *)(RouteData->Data + NextRouteOffset)) * sizeof(WCHAR); - } - - ExFreePool(RouteData); return NDIS_STATUS_SUCCESS; } @@ -1914,15 +1854,14 @@ NdisMSetAttributesEx( PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); - NDIS_DbgPrint(MAX_TRACE, ("Called - NdisMSetAttributesEx() is partly-implemented.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext; - - /* don't know why this is here - anybody? */ - Adapter->NdisMiniportBlock.Flags = AttributeFlags; - + Adapter->NdisMiniportBlock.Flags = AttributeFlags; Adapter->NdisMiniportBlock.AdapterType = AdapterType; Adapter->AttributesSet = TRUE; + if (AttributeFlags & NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER) + NDIS_DbgPrint(MAX_TRACE, ("Intermediate drivers not supported yet.\n")); }