From eab39eae460989ffaa29b17f49682c531ac54b16 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Wed, 30 Jul 2003 22:11:20 +0000 Subject: [PATCH] patch submitted by Vizzini (tested by myself) - implemented Ndis configuration api, adapted ne2000 to use it to get configuration, fixed up registry support for ne2000 driver, other supporting changes svn path=/trunk/; revision=5337 --- reactos/bootdata/hivesys.inf | 27 ++ reactos/drivers/net/dd/ne2000/include/debug.h | 4 +- .../drivers/net/dd/ne2000/include/ne2000.h | 4 +- reactos/drivers/net/dd/ne2000/ne2000/8390.c | 93 +++-- reactos/drivers/net/dd/ne2000/ne2000/main.c | 141 ++++++- reactos/drivers/net/ndis/Makefile | 5 +- reactos/drivers/net/ndis/include/miniport.h | 16 + reactos/drivers/net/ndis/ndis/miniport.c | 359 +++++++++++++----- reactos/drivers/net/ndis/ndis/stubs.c | 136 ------- reactos/drivers/net/tditest/include/debug.h | 2 +- reactos/drivers/net/wshtcpip/debug.h | 2 +- reactos/include/net/ndis.h | 135 +++++-- 12 files changed, 615 insertions(+), 309 deletions(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index cd46251ca53..e1e7c083dfe 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -208,12 +208,39 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","ImagePath",0x00020000,"system32\d HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Type",0x00010001,0x00000001 +; NIC drivers are like any other drivers - but no card-specific info here. bind/route/export +; should have one entry per child device object ; NE2000 NIC driver HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","ErrorControl",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","Group",0x00000000,"NDIS" HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","ImagePath",0x00020000,"system32\drivers\ne2000.sys" HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","Type",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","Test",0x00010001,0xbaadf00d +HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000","Route",0x00000000,"NE20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Bind",0x00000000,"\Device\NE20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Export",0x00000000,"\Device\NE20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Route",0x00000000,"NE20001" + +; Each adapter in the system gets its own SCM entry where its parameters and protocol info are stored. +; NOTE - service type is 0x4 (SERVICE_ADAPTER) and start is 0x3 (manual start). These drivers are named +; for the parent driver plus a globally-increasing serial number (i.e. across all ndis miniports) +; TODO: create this with NDI +; NE2000 Adapter 1 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001","ErrorControl",0x00010001,0x00000001 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001","Start",0x00010001,0x00000003 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001","Type",0x00010001,0x00000004 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Linkage","Bind",0x00010000,"\Device\NE20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Linkage","Export",0x00010000,"\Device\NE20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Linkage","Route",0x00010000,"NE20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","Port",0x00010001,0x00000280 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","Irq",0x00010001,0x00000009 +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","DwordTest",0x00010001,0xbaadf00d +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","StringTest",0x00000000,"StringTest" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","NetworkAddress",0x00000000,"001122334455" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","DefaultGateway",0x00010000,"10.0.0.1" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","IPAddress",0x00010000,"10.0.0.100" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","SubnetMask",0x00010001,"255.255.255.0" ; Named Pipe filesystem driver HKLM,"SYSTEM\CurrentControlSet\Services\Npfs","ErrorControl",0x00010001,0x00000000 diff --git a/reactos/drivers/net/dd/ne2000/include/debug.h b/reactos/drivers/net/dd/ne2000/include/debug.h index 2b61a545e96..168bc3b4fbd 100644 --- a/reactos/drivers/net/dd/ne2000/include/debug.h +++ b/reactos/drivers/net/dd/ne2000/include/debug.h @@ -43,7 +43,7 @@ extern ULONG DebugTraceLevel; #endif /* _MSC_VER */ -/* Assert and kin are defined in rtl.h */ +/* Assert is defined in ndis.h */ #if 0 #ifdef ASSERT #undef ASSERT @@ -62,7 +62,7 @@ extern ULONG DebugTraceLevel; #define NDIS_DbgPrint(_t_, _x_) #define ASSERT_IRQL(x) -/* #define ASSERT(x) */ /* rtl.h */ +/* #define ASSERT(x) */ /* ndis.h */ #endif /* DBG */ diff --git a/reactos/drivers/net/dd/ne2000/include/ne2000.h b/reactos/drivers/net/dd/ne2000/include/ne2000.h index 0da7d5035e8..4495faa6af7 100644 --- a/reactos/drivers/net/dd/ne2000/include/ne2000.h +++ b/reactos/drivers/net/dd/ne2000/include/ne2000.h @@ -33,8 +33,8 @@ #define DRIVER_NDIS_MAJOR_VERSION 3 #define DRIVER_NDIS_MINOR_VERSION 0 -#define DRIVER_DEFAULT_IO_BASE_ADDRESS 0x300 -#define DRIVER_DEFAULT_INTERRUPT_NUMBER 10 +#define DRIVER_DEFAULT_IO_BASE_ADDRESS 0x280 /* bochs default */ +#define DRIVER_DEFAULT_INTERRUPT_NUMBER 9 /* bochs default */ #define DRIVER_MAX_MULTICAST_LIST_SIZE 8 diff --git a/reactos/drivers/net/dd/ne2000/ne2000/8390.c b/reactos/drivers/net/dd/ne2000/ne2000/8390.c index 2c285d2a529..1ea6f92bc48 100644 --- a/reactos/drivers/net/dd/ne2000/ne2000/8390.c +++ b/reactos/drivers/net/dd/ne2000/ne2000/8390.c @@ -9,6 +9,45 @@ */ #include +/* Null-terminated array of ports to probe. This is "semi-risky" (Don Becker). */ +ULONG ProbeAddressList[] = { 0x280, 0x300, 0x320, 0x340, 0x360, 0x380, 0 }; + +BOOLEAN ProbeAddressForNIC( + ULONG address) +/* + * FUNCTION: Probes an address for a NIC + * ARGUMENTS: + * address = Base address to probe + * RETURNS: + * TRUE if an NIC is found at the address + * FALSE otherwise + * NOTES: + * If the adapter responds correctly to a + * stop command we assume it is present + */ +{ + UCHAR Tmp; + + NDIS_DbgPrint(MID_TRACE, ("Probing address 0x%x\n", address)); + + /* Disable interrupts */ + NdisRawWritePortUchar(address + PG0_IMR, 0); + + /* Stop the NIC */ + NdisRawWritePortUchar(address + PG0_CR, CR_STP | CR_RD2); + + /* Pause for 1.6ms */ + NdisStallExecution(1600); + + /* Read NIC response */ + NdisRawReadPortUchar(address + PG0_CR, &Tmp); + + if ((Tmp == (CR_RD2 | CR_STP)) || (Tmp == (CR_RD2 | CR_STP | CR_STA))) + return TRUE; + else + return FALSE; +} + BOOLEAN NICCheck( PNIC_ADAPTER Adapter) @@ -18,29 +57,32 @@ BOOLEAN NICCheck( * Adapter = Pointer to adapter information * RETURNS: * TRUE if NIC is believed to be present, FALSE if not - * NOTES: - * If the adapter responds correctly to a - * stop command we assume it is present */ { - UCHAR Tmp; + int i; - /* Disable interrupts */ - NdisRawWritePortUchar(Adapter->IOBase + PG0_IMR, 0); + NDIS_DbgPrint(MAX_TRACE, ("Called\n")); - /* Stop the NIC */ - NdisRawWritePortUchar(Adapter->IOBase + PG0_CR, CR_STP | CR_RD2); - - /* Pause for 1.6ms */ - NdisStallExecution(1600); - - /* Read NIC response */ - NdisRawReadPortUchar(Adapter->IOBase + PG0_CR, &Tmp); - - if ((Tmp == (CR_RD2 | CR_STP)) || (Tmp == (CR_RD2 | CR_STP | CR_STA))) + /* first try the supplied value */ + if(ProbeAddressForNIC(Adapter->IoBaseAddress)) + { + NDIS_DbgPrint(MIN_TRACE, ("Found adapter at 0x%x\n", Adapter->IoBaseAddress)); return TRUE; - else - return FALSE; + } + + /* ok, no dice, time to probe */ + for(i = 0; ProbeAddressList[i]; i++) + { + if(ProbeAddressForNIC(ProbeAddressList[i])) + { + NDIS_DbgPrint(MIN_TRACE, ("Found adapter at address 0x%x\n", ProbeAddressList[i])); + Adapter->IoBaseAddress = ProbeAddressList[i]; + return TRUE; + } + } + + NDIS_DbgPrint(MIN_TRACE,("Adapter NOT found!\n")); + return FALSE; } @@ -215,7 +257,7 @@ BOOLEAN NICReadSAPROM( /* If WordLength is 2 the data read before was doubled. We must compensate for this */ if (WordLength == 2) { - DbgPrint("NE2000 or compatible network adapter found.\n"); + NDIS_DbgPrint(MAX_TRACE,("NE2000 or compatible network adapter found.\n")); Adapter->WordMode = TRUE; @@ -234,7 +276,7 @@ BOOLEAN NICReadSAPROM( return TRUE; } else { - DbgPrint("NE1000 or compatible network adapter found.\n"); + NDIS_DbgPrint(MAX_TRACE, ("NE1000 or compatible network adapter found.\n")); Adapter->WordMode = FALSE; @@ -257,13 +299,7 @@ NDIS_STATUS NICInitialize( { UCHAR Tmp; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - - if (!NICCheck(Adapter)) { - NDIS_DbgPrint(MID_TRACE, ("No adapter found at (0x%X).\n", Adapter->IOBase)); - return NDIS_STATUS_ADAPTER_NOT_FOUND; - } else - NDIS_DbgPrint(MID_TRACE, ("Adapter found at (0x%X).\n", Adapter->IOBase)); + NDIS_DbgPrint(MID_TRACE, ("Called.\n")); /* Reset the NIC */ NdisRawReadPortUchar(Adapter->IOBase + NIC_RESET, &Tmp); @@ -867,6 +903,7 @@ VOID NICIndicatePacket( IndicateLength + DRIVER_HEADER_SIZE); NDIS_DbgPrint(MID_TRACE, ("Indicating (%d) bytes.\n", IndicateLength)); + DbgPrint("ne2000!NICIndicatePacket: Indicating (%d) bytes.\n", IndicateLength); #if 0 NDIS_DbgPrint(MAX_TRACE, ("FRAME:\n")); @@ -927,7 +964,7 @@ VOID NICReadPacket( NDIS_DbgPrint(MAX_TRACE, ("HEADER: (PacketLength) (0x%X)\n", Adapter->PacketHeader.PacketLength)); if (Adapter->PacketHeader.PacketLength < 64 || - Adapter->PacketHeader.PacketLength > 1518) { + Adapter->PacketHeader.PacketLength > 1518) { /* XXX I don't think the CRC will show up... should be 1514 */ NDIS_DbgPrint(MAX_TRACE, ("Bogus packet size (%d).\n", Adapter->PacketHeader.PacketLength)); SkipPacket = TRUE; diff --git a/reactos/drivers/net/dd/ne2000/ne2000/main.c b/reactos/drivers/net/dd/ne2000/ne2000/main.c index be3acee2071..6597e3ec395 100644 --- a/reactos/drivers/net/dd/ne2000/ne2000/main.c +++ b/reactos/drivers/net/dd/ne2000/ne2000/main.c @@ -13,7 +13,6 @@ #ifdef DBG /* See debug.h for debug/trace constants */ -//DWORD DebugTraceLevel = MID_TRACE; ULONG DebugTraceLevel = MIN_TRACE; #endif /* DBG */ @@ -173,7 +172,7 @@ NDIS_STATUS MiniportInitialize( } if (i == MediumArraySize) { - NDIS_DbgPrint(MIN_TRACE, ("No supported medias.\n")); + NDIS_DbgPrint(MIN_TRACE, ("No supported media.\n")); return NDIS_STATUS_UNSUPPORTED_MEDIA; } @@ -196,6 +195,63 @@ NDIS_STATUS MiniportInitialize( Adapter->InterruptMask = DRIVER_INTERRUPT_MASK; Adapter->LookaheadSize = DRIVER_MAXIMUM_LOOKAHEAD; + /* get the port, irq, and MAC address from registry */ + do + { + PNDIS_CONFIGURATION_PARAMETER ConfigurationParameter; + NDIS_HANDLE ConfigurationHandle; + UNICODE_STRING Keyword; + UINT *RegNetworkAddress = 0; + UINT RegNetworkAddressLength = 0; + + NdisOpenConfiguration(&Status, &ConfigurationHandle, WrapperConfigurationContext); + if(Status != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE,("NdisOpenConfiguration returned error 0x%x\n", Status)); + break; + } + + NdisInitUnicodeString(&Keyword, L"Irq"); + NdisReadConfiguration(&Status, &ConfigurationParameter, ConfigurationHandle, &Keyword, NdisParameterInteger); + if(Status == NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MID_TRACE,("NdisReadConfiguration for Irq returned successfully, irq 0x%x\n", + ConfigurationParameter->ParameterData.IntegerData)); + Adapter->InterruptNumber = ConfigurationParameter->ParameterData.IntegerData; + } + + NdisInitUnicodeString(&Keyword, L"Port"); + NdisReadConfiguration(&Status, &ConfigurationParameter, ConfigurationHandle, &Keyword, NdisParameterInteger); + if(Status == NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MID_TRACE,("NdisReadConfiguration for Port returned successfully, port 0x%x\n", + ConfigurationParameter->ParameterData.IntegerData)); + Adapter->IoBaseAddress = ConfigurationParameter->ParameterData.IntegerData; + } + + /* the returned copy of the data is owned by NDIS and will be released on NdisCloseConfiguration */ + NdisReadNetworkAddress(&Status, (PVOID *)&RegNetworkAddress, &RegNetworkAddressLength, ConfigurationHandle); + if(Status == NDIS_STATUS_SUCCESS && RegNetworkAddressLength == DRIVER_LENGTH_OF_ADDRESS) + { + int i; + NDIS_DbgPrint(MID_TRACE,("NdisReadNetworkAddress returned successfully, address %x:%x:%x:%x:%x:%x\n", + RegNetworkAddress[0], RegNetworkAddress[1], RegNetworkAddress[2], RegNetworkAddress[3], + RegNetworkAddress[4], RegNetworkAddress[5])); + for(i = 0; i < DRIVER_LENGTH_OF_ADDRESS; i++) + Adapter->StationAddress[i] = RegNetworkAddress[i]; + } + + NdisCloseConfiguration(ConfigurationHandle); + } while(0); + + /* find the nic */ + if (!NICCheck(Adapter)) { + NDIS_DbgPrint(MID_TRACE, ("No adapter found at (0x%X).\n", Adapter->IOBase)); + return NDIS_STATUS_ADAPTER_NOT_FOUND; + } else + NDIS_DbgPrint(MID_TRACE, ("Adapter found at (0x%X).\n", Adapter->IOBase)); + + NdisMSetAttributes( MiniportAdapterHandle, (NDIS_HANDLE)Adapter, @@ -220,8 +276,8 @@ NDIS_STATUS MiniportInitialize( #ifndef NOCARD Status = NICInitialize(Adapter); if (Status != NDIS_STATUS_SUCCESS) { - DbgPrint("No NE2000 or compatible network adapter found at address 0x%X.\n", - Adapter->IOBase); + NDIS_DbgPrint(MIN_TRACE,("No NE2000 or compatible network adapter found at address 0x%X.\n", + Adapter->IOBase)); NDIS_DbgPrint(MID_TRACE, ("Status (0x%X).\n", Status)); MiniportHalt((NDIS_HANDLE)Adapter); @@ -809,4 +865,81 @@ DriverEntry( return STATUS_SUCCESS; } +#if 0 + /* while i'm here - some basic registry sanity checks */ + { + /* write tests */ + NDIS_CONFIGURATION_PARAMETER ParameterValue; + + ParameterValue.ParameterType = NdisParameterInteger; + ParameterValue.ParameterData.IntegerData = 0x12345678; + NdisInitUnicodeString(&Keyword, L"DwordTest"); + NdisWriteConfiguration(&Status, ConfigurationHandle, &Keyword, &ParameterValue); + + if(Status != NDIS_STATUS_SUCCESS) + { + DbgPrint("ne2000!MiniportInitialize: failed to set DwordTest: 0x%x\n", Status); + KeBugCheck(0); + } + + DbgPrint("ne2000!MiniportInitialize: DwordTest successfully set\n"); + + NdisInitUnicodeString(&Keyword, L"StringTest"); + ParameterValue.ParameterType = NdisParameterString; + NdisInitUnicodeString(&ParameterValue.ParameterData.StringData, L"Testing123"); + + NdisWriteConfiguration(&Status, ConfigurationHandle, &Keyword, &ParameterValue); + + if(Status != NDIS_STATUS_SUCCESS) + { + DbgPrint("ne2000!MiniportInitialize: failed to set StringTest: 0x%x\n", Status); + KeBugCheck(0); + } + + DbgPrint("ne2000!MiniportInitialize: StringTest successfully set\n"); + } + + { + /* read back the test values */ + NDIS_CONFIGURATION_PARAMETER *ParameterValue = 0; + + NdisInitUnicodeString(&Keyword, L"DwordTest"); + NdisReadConfiguration(&Status, &ParameterValue, ConfigurationHandle, &Keyword, NdisParameterInteger); + + if(Status != NDIS_STATUS_SUCCESS) + { + DbgPrint("ne2000!MiniportInitialize: failed to read DwordTest: 0x%x\n", Status); + KeBugCheck(0); + } + + if(ParameterValue->ParameterData.IntegerData != 0x12345678) + { + DbgPrint("ne2000!MiniportInitialize: DwordTest value is wrong: 0x%x\n", + ParameterValue->ParameterData.IntegerData); + KeBugCheck(0); + } + + DbgPrint("ne2000!MiniportInitialize: DwordTest value was correctly read\n"); + + NdisInitUnicodeString(&Keyword, L"StringTest"); + NdisReadConfiguration(&Status, &ParameterValue, ConfigurationHandle, &Keyword, NdisParameterString); + + if(Status != NDIS_STATUS_SUCCESS) + { + DbgPrint("ne2000!MiniportInitialize: failed to read StringTest: 0x%x\n", Status); + KeBugCheck(0); + } + + if(wcsncmp(ParameterValue->ParameterData.StringData.Buffer, L"Testing123", + wcslen(L"Testing123"))) + { + DbgPrint("ne2000!MiniportInitialize: StringTest value is wrong: %wZ\n", + &ParameterValue->ParameterData.StringData); + KeBugCheck(0); + } + + DbgPrint("ne2000!MiniportInitialize: StringTest value was correctly read\n"); + } + +#endif /* EOF */ diff --git a/reactos/drivers/net/ndis/Makefile b/reactos/drivers/net/ndis/Makefile index 7bea96002bb..43096a8456b 100644 --- a/reactos/drivers/net/ndis/Makefile +++ b/reactos/drivers/net/ndis/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.15 2002/09/08 10:22:16 chorns Exp $ +# $Id: Makefile,v 1.16 2003/07/30 22:11:20 royce Exp $ PATH_TO_TOP = ../../.. @@ -6,7 +6,7 @@ TARGET_TYPE = export_driver TARGET_NAME = ndis -TARGET_CFLAGS = -I./include -DNDIS_WRAPPER -DBINARY_COMPATIBLE=1 +TARGET_CFLAGS = -I./include -DNDIS_WRAPPER TARGET_OBJECTS = \ ndis/main.o \ @@ -16,6 +16,7 @@ TARGET_OBJECTS = \ ndis/cl.o \ ndis/cm.o \ ndis/co.o \ + ndis/config.o \ ndis/control.o \ ndis/hardware.o \ ndis/io.o \ diff --git a/reactos/drivers/net/ndis/include/miniport.h b/reactos/drivers/net/ndis/include/miniport.h index 1ae54f05028..a997f9d4f4a 100644 --- a/reactos/drivers/net/ndis/include/miniport.h +++ b/reactos/drivers/net/ndis/include/miniport.h @@ -26,8 +26,24 @@ typedef struct _MINIPORT_DRIVER { WORK_QUEUE_ITEM WorkItem; /* Work item */ PDRIVER_OBJECT DriverObject; /* Driver object of miniport */ LIST_ENTRY AdapterListHead; /* Adapters created by miniport */ + PUNICODE_STRING RegistryPath; /* SCM Registry key */ } MINIPORT_DRIVER, *PMINIPORT_DRIVER; +/* resources allocated on behalf on the miniport */ +#define MINIPORT_RESOURCE_TYPE_MEMORY 0 +typedef struct _MINIPORT_RESOURCE { + LIST_ENTRY ListEntry; + ULONG ResourceType; + PVOID Resource; +} MINIPORT_RESOURCE, *PMINIPORT_RESOURCE; + +/* Configuration context */ +typedef struct _MINIPORT_CONFIGURATION_CONTEXT { + NDIS_HANDLE Handle; + LIST_ENTRY ResourceListHead; + KSPIN_LOCK ResourceLock; +} MINIPORT_CONFIGURATION_CONTEXT, *PMINIPORT_CONFIGURATION_CONTEXT; + #define GET_MINIPORT_DRIVER(Handle)((PMINIPORT_DRIVER)Handle) /* Information about a logical adapter */ diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index 399ff1cb975..cd3c1fe4296 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -20,6 +20,10 @@ ULONG DebugTraceLevel = (MAX_TRACE + DEBUG_MINIPORT); #endif /* DBG */ +#define SERVICES_ROOT L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" +#define DEVICE_ROOT L"\\Device\\" +#define ROUTE_DATA_SIZE 256 /* adjust as necessary */ + /* Number of media we know */ #define MEDIA_ARRAY_SIZE 15 @@ -54,9 +58,9 @@ VOID MiniDisplayPacket( PNDIS_PACKET Packet) { +#if 0 ULONG i, Length; UCHAR Buffer[64]; -#if 0 if ((DebugTraceLevel | DEBUG_PACKET) > 0) { Length = CopyPacketToBuffer( (PUCHAR)&Buffer, @@ -817,9 +821,14 @@ NdisInitializeWrapper( * SystemSpecific1 = Pointer to the driver's driver object * SystemSpecific2 = Pointer to the driver's registry path * SystemSpecific3 = Always NULL + * NOTES: + * - SystemSpecific2 goes invalid so we copy it + * - Registry key is 0-terminated for safety */ { PMINIPORT_DRIVER Miniport; + PUNICODE_STRING RegistryPath; + WCHAR *RegistryBuffer; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -838,6 +847,30 @@ NdisInitializeWrapper( Miniport->DriverObject = (PDRIVER_OBJECT)SystemSpecific1; + /* set the miniport's driver registry path */ + RegistryPath = ExAllocatePool(PagedPool, sizeof(UNICODE_STRING)); + if(!RegistryPath) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return; + } + + RegistryPath->Length = ((PUNICODE_STRING)SystemSpecific2)->Length; + RegistryPath->MaximumLength = RegistryPath->Length + 1; /* room for 0-term */ + + RegistryBuffer = ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR)); + if(!RegistryBuffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return; + } + + RtlCopyMemory(RegistryBuffer, ((PUNICODE_STRING)SystemSpecific2)->Buffer, RegistryPath->Length); + RegistryBuffer[RegistryPath->Length] = 0; + + RegistryPath->Buffer = RegistryBuffer; + Miniport->RegistryPath = RegistryPath; + InitializeListHead(&Miniport->AdapterListHead); /* Put miniport in global miniport list */ @@ -996,7 +1029,13 @@ NdisMRegisterMiniport( * MiniportCharacteristics = Pointer to a buffer with miniport characteristics * CharacteristicsLength = Number of bytes in characteristics buffer * RETURNS: - * Status of operation + * 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 + * break this function up */ { UINT MinSize; @@ -1009,6 +1048,15 @@ NdisMRegisterMiniport( NDIS_OID AddressOID; BOOLEAN MemError = FALSE; 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; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -1061,125 +1109,204 @@ NdisMRegisterMiniport( RtlCopyMemory(&Miniport->Chars, MiniportCharacteristics, MinSize); - Adapter = ExAllocatePool(NonPagedPool, sizeof(LOGICAL_ADAPTER)); - if (!Adapter) { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + /* 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)) + { + 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); return NDIS_STATUS_RESOURCES; } - /* This is very important */ - RtlZeroMemory(Adapter, sizeof(LOGICAL_ADAPTER)); + RtlInitUnicodeString(&RouteVal, L"Route"); - /* Create the device object for this adapter */ - /* FIXME: Use GUIDs */ - RtlInitUnicodeStringFromLiteral(&Adapter->DeviceName, L"\\Device\\ne2000"); - Status = IoCreateDevice(Miniport->DriverObject, - 0, - &Adapter->DeviceName, - FILE_DEVICE_PHYSICAL_NETCARD, - 0, - FALSE, - &Adapter->NdisMiniportBlock.DeviceObject); - if (!NT_SUCCESS(Status)) { - NDIS_DbgPrint(MIN_TRACE, ("Could not create device object.\n")); - ExFreePool(Adapter); + 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; } - /* Initialize adapter object */ + ZwClose(LinkageKeyHandle); + ZwClose(DeviceKeyHandle); - KeInitializeSpinLock(&Adapter->NdisMiniportBlock.Lock); + /* route is a REG_MULTI_SZ with each nic object created by NDI - create an adapter for each */ + while((RouteData->Data)[NextRouteOffset]) + { + WCHAR *DeviceName; + HANDLE RegKeyHandle; + WCHAR *RegKeyPath; + UNICODE_STRING RegKeyPathU; + OBJECT_ATTRIBUTES RegKeyAttributes; - InitializeListHead(&Adapter->ProtocolListHead); + Adapter = ExAllocatePool(NonPagedPool, sizeof(LOGICAL_ADAPTER)); + if (!Adapter) { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + ExFreePool(RouteData); + return NDIS_STATUS_RESOURCES; + } - Adapter->RefCount = 1; + /* This is very important */ + RtlZeroMemory(Adapter, sizeof(LOGICAL_ADAPTER)); - Adapter->Miniport = Miniport; + DeviceName = ExAllocatePool(NonPagedPool, sizeof(DEVICE_ROOT) + RouteData->DataLength); + if(!DeviceName) + { + NDIS_DbgPrint(MIN_TRACE,("Insufficient memory\n")); + ExFreePool(Adapter); + ExFreePool(RouteData); + return NDIS_STATUS_RESOURCES; + } - /* Set handlers (some NDIS macros require these) */ + wcscpy(DeviceName, DEVICE_ROOT); + wcsncat(DeviceName, (WCHAR *)RouteData->Data, RouteData->DataLength); /* reg_sz is 0-term by def */ + RtlInitUnicodeString(&Adapter->DeviceName, DeviceName); - Adapter->NdisMiniportBlock.EthRxCompleteHandler = MiniEthReceiveComplete; - Adapter->NdisMiniportBlock.EthRxIndicateHandler = MiniEthReceiveIndication; + NDIS_DbgPrint(MAX_TRACE, ("creating device %ws\n", DeviceName)); - Adapter->NdisMiniportBlock.SendCompleteHandler = MiniSendComplete; - Adapter->NdisMiniportBlock.SendResourcesHandler = MiniSendResourcesAvailable; - Adapter->NdisMiniportBlock.ResetCompleteHandler = MiniResetComplete; - Adapter->NdisMiniportBlock.TDCompleteHandler = MiniTransferDataComplete; - - - KeInitializeDpc(&Adapter->MiniportDpc, MiniportDpc, (PVOID)Adapter); - - /* Put adapter in adapter list for this miniport */ - ExInterlockedInsertTailList(&Miniport->AdapterListHead, - &Adapter->MiniportListEntry, - &Miniport->Lock); - - /* Put adapter in global adapter list */ - ExInterlockedInsertTailList(&AdapterListHead, - &Adapter->ListEntry, - &AdapterListLock); - - /* Call MiniportInitialize */ - NdisStatus = (*Miniport->Chars.InitializeHandler)( - &OpenErrorStatus, - &SelectedMediumIndex, - &MediaArray[0], - MEDIA_ARRAY_SIZE, - Adapter, - NULL /* FIXME: WrapperConfigurationContext */); - - if ((NdisStatus == NDIS_STATUS_SUCCESS) && - (SelectedMediumIndex < MEDIA_ARRAY_SIZE)) { - - Adapter->NdisMiniportBlock.MediaType = MediaArray[SelectedMediumIndex]; - - switch (Adapter->NdisMiniportBlock.MediaType) { - case NdisMedium802_3: - Adapter->MediumHeaderSize = 14; - AddressOID = OID_802_3_CURRENT_ADDRESS; - Adapter->AddressLength = ETH_LENGTH_OF_ADDRESS; - - Adapter->NdisMiniportBlock.FilterDbs.u.EthDB = ExAllocatePool(NonPagedPool, - sizeof(ETH_FILTER)); - if (Adapter->NdisMiniportBlock.FilterDbs.u.EthDB) { - RtlZeroMemory(Adapter->NdisMiniportBlock.FilterDbs.u.EthDB, sizeof(ETH_FILTER)); - Adapter->NdisMiniportBlock.FilterDbs.u.EthDB->Miniport = (PNDIS_MINIPORT_BLOCK)Adapter; - } else - MemError = TRUE; - break; - - default: - /* FIXME: Support other types of medias */ - ASSERT(FALSE); + Status = IoCreateDevice(Miniport->DriverObject, 0, &Adapter->DeviceName, FILE_DEVICE_PHYSICAL_NETCARD, + 0, FALSE, &Adapter->NdisMiniportBlock.DeviceObject); + if (!NT_SUCCESS(Status)) { + NDIS_DbgPrint(MIN_TRACE, ("Could not create device object.\n")); + ExFreePool(Adapter); + ExFreePool(RouteData); return NDIS_STATUS_FAILURE; } - NdisStatus = DoQueries(Adapter, AddressOID); - } + RegKeyPath = ExAllocatePool(PagedPool, sizeof(SERVICES_ROOT)+RouteData->DataLength); /* includes room for a 0-term */ + if(!RegKeyPath) + { + NDIS_DbgPrint(MIN_TRACE,("Insufficient resources\n")); + ExFreePool(Adapter); + ExFreePool(RouteData); + return NDIS_STATUS_FAILURE; + } - if ((MemError) || - (NdisStatus != NDIS_STATUS_SUCCESS) || - (SelectedMediumIndex >= MEDIA_ARRAY_SIZE)) { + wcscpy(RegKeyPath, SERVICES_ROOT); + wcsncat(RegKeyPath, (WCHAR *)RouteData->Data, RouteData->DataLength); + RegKeyPath[sizeof(SERVICES_ROOT)+RouteData->DataLength-1] = 0; - /* Remove adapter from adapter list for this miniport */ - KeAcquireSpinLock(&Miniport->Lock, &OldIrql); - RemoveEntryList(&Adapter->MiniportListEntry); - KeReleaseSpinLock(&Miniport->Lock, OldIrql); + RtlInitUnicodeString(&RegKeyPathU, RegKeyPath); + InitializeObjectAttributes(&RegKeyAttributes, &RegKeyPathU, OBJ_CASE_INSENSITIVE, NULL, NULL); - /* Remove adapter from global adapter list */ - KeAcquireSpinLock(&AdapterListLock, &OldIrql); - RemoveEntryList(&Adapter->ListEntry); - KeReleaseSpinLock(&AdapterListLock, OldIrql); + Status = ZwOpenKey(&RegKeyHandle, KEY_ALL_ACCESS, &RegKeyAttributes); + if(Status != STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE,("ndis!NdisMRegisterMiniport: failed to open adapter-specific reg key %ws\n", RegKeyPath)); + ExFreePool(Adapter); + ExFreePool(RouteData); + return NDIS_STATUS_FAILURE; + } - if (Adapter->LookaheadBuffer) + KeInitializeSpinLock(&Adapter->NdisMiniportBlock.Lock); + InitializeListHead(&Adapter->ProtocolListHead); + Adapter->RefCount = 1; + Adapter->Miniport = Miniport; + + /* Set handlers (some NDIS macros require these) */ + + Adapter->NdisMiniportBlock.EthRxCompleteHandler = MiniEthReceiveComplete; + Adapter->NdisMiniportBlock.EthRxIndicateHandler = MiniEthReceiveIndication; + Adapter->NdisMiniportBlock.SendCompleteHandler = MiniSendComplete; + Adapter->NdisMiniportBlock.SendResourcesHandler = MiniSendResourcesAvailable; + Adapter->NdisMiniportBlock.ResetCompleteHandler = MiniResetComplete; + Adapter->NdisMiniportBlock.TDCompleteHandler = MiniTransferDataComplete; + + KeInitializeDpc(&Adapter->MiniportDpc, MiniportDpc, (PVOID)Adapter); + + /* Put adapter in adapter list for this miniport */ + ExInterlockedInsertTailList(&Miniport->AdapterListHead, &Adapter->MiniportListEntry, &Miniport->Lock); + + /* Put adapter in global adapter list */ + ExInterlockedInsertTailList(&AdapterListHead, &Adapter->ListEntry, &AdapterListLock); + + /* Call MiniportInitialize */ + NDIS_DbgPrint(MID_TRACE, ("calling MiniportInitialize\n")); + NdisStatus = (*Miniport->Chars.InitializeHandler)( &OpenErrorStatus, &SelectedMediumIndex, &MediaArray[0], + MEDIA_ARRAY_SIZE, Adapter, RegKeyHandle); + + ZwClose(RegKeyHandle); + + if ((NdisStatus == NDIS_STATUS_SUCCESS) && (SelectedMediumIndex < MEDIA_ARRAY_SIZE)) { + + NDIS_DbgPrint(MID_TRACE,("successful return from MiniportInitialize\n")); + + Adapter->NdisMiniportBlock.MediaType = MediaArray[SelectedMediumIndex]; + + switch (Adapter->NdisMiniportBlock.MediaType) { + case NdisMedium802_3: + Adapter->MediumHeaderSize = 14; + AddressOID = OID_802_3_CURRENT_ADDRESS; + Adapter->AddressLength = ETH_LENGTH_OF_ADDRESS; + + Adapter->NdisMiniportBlock.FilterDbs.u.EthDB = ExAllocatePool(NonPagedPool, sizeof(ETH_FILTER)); + if (Adapter->NdisMiniportBlock.FilterDbs.u.EthDB) { + RtlZeroMemory(Adapter->NdisMiniportBlock.FilterDbs.u.EthDB, sizeof(ETH_FILTER)); + Adapter->NdisMiniportBlock.FilterDbs.u.EthDB->Miniport = (PNDIS_MINIPORT_BLOCK)Adapter; + } else + MemError = TRUE; + break; + + default: + /* FIXME: Support other types of media */ + ExFreePool(Adapter); + ExFreePool(RouteData); + ASSERT(FALSE); + return NDIS_STATUS_FAILURE; + } + + NdisStatus = DoQueries(Adapter, AddressOID); + } + + if ((MemError) || (NdisStatus != NDIS_STATUS_SUCCESS) || (SelectedMediumIndex >= MEDIA_ARRAY_SIZE)) { + + /* Remove adapter from adapter list for this miniport */ + KeAcquireSpinLock(&Miniport->Lock, &OldIrql); + RemoveEntryList(&Adapter->MiniportListEntry); + KeReleaseSpinLock(&Miniport->Lock, OldIrql); + + /* Remove adapter from global adapter list */ + KeAcquireSpinLock(&AdapterListLock, &OldIrql); + RemoveEntryList(&Adapter->ListEntry); + KeReleaseSpinLock(&AdapterListLock, OldIrql); + + if (Adapter->LookaheadBuffer) ExFreePool(Adapter->LookaheadBuffer); - IoDeleteDevice(Adapter->NdisMiniportBlock.DeviceObject); - ExFreePool(Adapter); - NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed.\n")); - return NDIS_STATUS_FAILURE; + IoDeleteDevice(Adapter->NdisMiniportBlock.DeviceObject); + ExFreePool(Adapter); + NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter.\n")); + } + + /* NextRouteOffset += wcslen((WCHAR *)RouteData->Data); */ + RouteData->Data[NextRouteOffset] = 0; /* will cause the while to break */ } + ExFreePool(RouteData); return NDIS_STATUS_SUCCESS; } @@ -1404,7 +1531,47 @@ NdisTerminateWrapper( NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + ExFreePool(Miniport->RegistryPath->Buffer); + ExFreePool(Miniport->RegistryPath); ExFreePool(Miniport); } /* EOF */ +/* enum test */ + /* + { + ULONG KeyInformationSize; + KEY_BASIC_INFORMATION *KeyInformation; + int i; + + KeyInformation = ExAllocatePool(PagedPool, 1024); + ASSERT(KeyInformation); + + RtlInitUnicodeString(&LinkageKeyName, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\NE2000"); + InitializeObjectAttributes(&LinkageKeyAttributes, &LinkageKeyName, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, NULL, NULL); + + Status = ZwOpenKey(&LinkageKeyHandle, KEY_READ, &LinkageKeyAttributes); + if(!NT_SUCCESS(Status)) + { + DbgPrint("ndis!NdisMRegisterMiniport: Failed to open Linkage key: 0x%x\n", Status); + ASSERT(0); + KeBugCheck(0); + } + + for(i=0;i<5;i++) + { + Status = ZwEnumerateKey(LinkageKeyHandle, i, KeyBasicInformation, KeyInformation, 1024, &KeyInformationSize); + if(!NT_SUCCESS(Status)) + { + DbgPrint("ndis!NdisMRegisterMiniport: Failed to enumerate: 0x%x\n", Status); + break; + } + + KeyInformation->Name[KeyInformation->NameLength] = 0; + DbgPrint("ndis!NdisMRegisterMiniport: enumerated key %ws\n", KeyInformation->Name); + } + + ExFreePool(KeyInformation); + KeBugCheck(0); + } + */ diff --git a/reactos/drivers/net/ndis/ndis/stubs.c b/reactos/drivers/net/ndis/ndis/stubs.c index 5e5f3744ca3..4ab5fb2a349 100644 --- a/reactos/drivers/net/ndis/ndis/stubs.c +++ b/reactos/drivers/net/ndis/ndis/stubs.c @@ -9,7 +9,6 @@ */ #include - /* * @unimplemented */ @@ -164,22 +163,6 @@ NdisMapFile( UNIMPLEMENTED } - -/* - * @unimplemented - */ -VOID -EXPORT -NdisWriteConfiguration( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, - IN PNDIS_STRING Keyword, - IN PNDIS_CONFIGURATION_PARAMETER * ParameterValue) -{ - UNIMPLEMENTED -} - - /* * @unimplemented */ @@ -198,18 +181,6 @@ NdisWriteErrorLogEntry( } -/* - * @unimplemented - */ -VOID -EXPORT -NdisCloseConfiguration( - IN NDIS_HANDLE ConfigurationHandle) -{ - UNIMPLEMENTED -} - - /* * @unimplemented */ @@ -310,26 +281,6 @@ NdisMWanSendComplete( } -/* - * @unimplemented - */ -VOID -EXPORT -NdisOpenConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE ConfigurationHandle, - IN NDIS_HANDLE WrapperConfigurationContext) -{ - UNIMPLEMENTED -} - - -/* -NdisOpenConfigurationKeyByIndex -NdisOpenConfigurationKeyByName -*/ - - /* * @unimplemented */ @@ -350,51 +301,6 @@ NdisOpenFile( NdisOpenGlobalConfiguration */ -/* - * @unimplemented - */ -VOID -EXPORT -NdisOpenProtocolConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING ProtocolSection) -{ - UNIMPLEMENTED -} - - -/* - * @unimplemented - */ -VOID -EXPORT -NdisReadConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_CONFIGURATION_PARAMETER * ParameterValue, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING Keyword, - IN NDIS_PARAMETER_TYPE ParameterType) -{ - UNIMPLEMENTED -} - - -/* - * @unimplemented - */ -VOID -EXPORT -NdisReadNetworkAddress( - OUT PNDIS_STATUS Status, - OUT PVOID * NetworkAddress, - OUT PUINT NetworkAddressLength, - IN NDIS_HANDLE ConfigurationHandle) -{ - UNIMPLEMENTED -} - - #if 0 VOID EXPORT @@ -877,48 +783,6 @@ NdisMSetMiniportSecondary( } -/* - * @unimplemented - */ -VOID -EXPORT -NdisOpenConfigurationKeyByIndex( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN ULONG Index, - OUT PNDIS_STRING KeyName, - OUT PNDIS_HANDLE KeyHandle) -/* - * FUNCTION: - * ARGUMENTS: - * NOTES: - * NDIS 5.0 - */ -{ - UNIMPLEMENTED -} - - -/* - * @unimplemented - */ -VOID -EXPORT -NdisOpenConfigurationKeyByName( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING SubKeyName, - OUT PNDIS_HANDLE SubKeyHandle) -/* - * FUNCTION: - * ARGUMENTS: - * NOTES: - * NDIS 5.0 - */ -{ - UNIMPLEMENTED -} - /* * @unimplemented diff --git a/reactos/drivers/net/tditest/include/debug.h b/reactos/drivers/net/tditest/include/debug.h index 067baef4cc0..9b510b82e8e 100644 --- a/reactos/drivers/net/tditest/include/debug.h +++ b/reactos/drivers/net/tditest/include/debug.h @@ -41,7 +41,7 @@ extern DWORD DebugTraceLevel; #endif /* _MSC_VER */ -/* in rtl.h now */ +/* in ndis.h now */ #if 0 #ifdef ASSERT #undef ASSERT diff --git a/reactos/drivers/net/wshtcpip/debug.h b/reactos/drivers/net/wshtcpip/debug.h index c4f80df9006..15e4d9cfebd 100644 --- a/reactos/drivers/net/wshtcpip/debug.h +++ b/reactos/drivers/net/wshtcpip/debug.h @@ -28,7 +28,7 @@ extern DWORD DebugTraceLevel; DbgPrint _x_; \ } -/* this belongs in rtl */ +/* this belongs in ndis.h */ #if 0 #ifdef ASSERT #undef ASSERT diff --git a/reactos/include/net/ndis.h b/reactos/include/net/ndis.h index 6dd62be49b8..d18a1afcf94 100644 --- a/reactos/include/net/ndis.h +++ b/reactos/include/net/ndis.h @@ -427,7 +427,6 @@ NdisSetTimer( IN PNDIS_TIMER Timer, IN UINT MillisecondsToDelay); - /* Hardware */ typedef CM_MCA_POS_DATA NDIS_MCA_POS_DATA, *PNDIS_MCA_POS_DATA; @@ -717,15 +716,35 @@ typedef enum _NDIS_INTERFACE_TYPE #define NdisInterruptLatched Latched typedef KINTERRUPT_MODE NDIS_INTERRUPT_MODE, *PNDIS_INTERRUPT_MODE; +typedef enum _NDIS_PROCESSOR_TYPE +{ + NdisProcessorX86, + NdisProcessorMips, + NdisProcessorAlpha, + NdisProcessorPpc +} NDIS_PROCESSOR_TYPE, *PNDIS_PROCESSOR_TYPE; + +typedef enum _NDIS_ENVIRONMENT_TYPE +{ + NdisEnvironmentWindows, + NdisEnvironmentWindowsNt +} NDIS_ENVIRONMENT_TYPE, *PNDIS_ENVIRONMENT_TYPE; typedef enum _NDIS_PARAMETER_TYPE { NdisParameterInteger, NdisParameterHexInteger, NdisParameterString, - NdisParameterMultiString + NdisParameterMultiString, + NdisParameterBinary } NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE; +typedef struct +{ + USHORT Length; + PVOID Buffer; +} BINARY_DATA; + typedef struct _NDIS_CONFIGURATION_PARAMETER { NDIS_PARAMETER_TYPE ParameterType; @@ -733,6 +752,7 @@ typedef struct _NDIS_CONFIGURATION_PARAMETER { ULONG IntegerData; NDIS_STRING StringData; + BINARY_DATA BinaryData; } ParameterData; } NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER; @@ -2521,13 +2541,45 @@ NdisReadConfiguration( IN PNDIS_STRING Keyword, IN NDIS_PARAMETER_TYPE ParameterType); +VOID +EXPIMP +NdisReadNetworkAddress( + OUT PNDIS_STATUS Status, + OUT PVOID *NetworkAddress, + OUT PUINT NetworkAddressLength, + IN NDIS_HANDLE ConfigurationHandle); + VOID EXPIMP NdisWriteConfiguration( OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, + IN NDIS_HANDLE ConfigurationHandle, IN PNDIS_STRING Keyword, - IN PNDIS_CONFIGURATION_PARAMETER *ParameterValue); + IN PNDIS_CONFIGURATION_PARAMETER ParameterValue); + +VOID +EXPIMP +NdisOpenConfiguration( + OUT PNDIS_STATUS Status, + OUT PNDIS_HANDLE ConfigurationHandle, + IN NDIS_HANDLE WrapperConfigurationContext); + +VOID +EXPIMP +NdisOpenConfigurationKeyByIndex( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ConfigurationHandle, + IN ULONG Index, + OUT PNDIS_STRING KeyName, + OUT PNDIS_HANDLE KeyHandle); + +VOID +EXPIMP +NdisOpenConfigurationKeyByName( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE ConfigurationHandle, + IN PNDIS_STRING SubKeyName, + OUT PNDIS_HANDLE SubKeyHandle); VOID @@ -2901,23 +2953,6 @@ NdisMSetMiniportSecondary( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE PrimaryMiniportAdapterHandle); -VOID -EXPIMP -NdisOpenConfigurationKeyByIndex( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN ULONG Index, - OUT PNDIS_STRING KeyName, - OUT PNDIS_HANDLE KeyHandle); - -VOID -EXPIMP -NdisOpenConfigurationKeyByName( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING SubKeyName, - OUT PNDIS_HANDLE SubKeyHandle); - UINT EXPIMP NdisPacketPoolUsage( @@ -4815,6 +4850,22 @@ struct _NDIS_OPEN_BLOCK /* Routines for NDIS miniport drivers */ +/* + * VOID NdisMInitializeWrapper( + * OUT PNDIS_HANDLE NdisWrapperHandle, + * IN PVOID SystemSpecific1, + * IN PVOID SystemSpecific2, + * IN PVOID SystemSpecific3); + */ +#define NdisMInitializeWrapper(NdisWrapperHandle, \ + SystemSpecific1, \ + SystemSpecific2, \ + SystemSpecific3) \ + NdisInitializeWrapper((NdisWrapperHandle), \ + (SystemSpecific1), \ + (SystemSpecific2), \ + (SystemSpecific3)) + VOID EXPIMP NdisInitializeWrapper( @@ -4995,22 +5046,6 @@ EXPIMP NdisMIndicateStatusComplete( IN NDIS_HANDLE MiniportAdapterHandle); -/* - * VOID NdisMInitializeWrapper( - * OUT PNDIS_HANDLE NdisWrapperHandle, - * IN PVOID SystemSpecific1, - * IN PVOID SystemSpecific2, - * IN PVOID SystemSpecific3); - */ -#define NdisMInitializeWrapper(NdisWrapperHandle, \ - SystemSpecific1, \ - SystemSpecific2, \ - SystemSpecific3) \ - NdisInitializeWrapper((NdisWrapperHandle), \ - (SystemSpecific1), \ - (SystemSpecific2), \ - (SystemSpecific3)) - NDIS_STATUS EXPIMP NdisMMapIoSpace( @@ -5058,6 +5093,32 @@ NdisMRegisterMiniport( IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, IN UINT CharacteristicsLength); +VOID +EXPIMP +NdisMSetTimer( + IN PNDIS_MINIPORT_TIMER Timer, + IN UINT MillisecondsToDelay); + +VOID +EXPIMP +NdisMInitializeTimer( + IN OUT PNDIS_MINIPORT_TIMER Timer, + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_TIMER_FUNCTION TimerFunction, + IN PVOID FunctionContext); + +VOID +EXPIMP +NdisMSetPeriodicTimer( + IN PNDIS_MINIPORT_TIMER Timer, + IN UINT MillisecondPeriod); + +VOID +EXPIMP +NdisMCancelTimer( + IN PNDIS_MINIPORT_TIMER Timer, + OUT PBOOLEAN TimerCancelled); + #ifndef NDIS_WRAPPER