mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 17:01:53 +00:00
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
This commit is contained in:
parent
e5f5b27064
commit
eab39eae46
12 changed files with 615 additions and 309 deletions
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -9,6 +9,45 @@
|
|||
*/
|
||||
#include <ne2000.h>
|
||||
|
||||
/* 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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
*/
|
||||
#include <ndissys.h>
|
||||
|
||||
|
||||
/*
|
||||
* @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
|
||||
|
|
|
@ -41,7 +41,7 @@ extern DWORD DebugTraceLevel;
|
|||
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
/* in rtl.h now */
|
||||
/* in ndis.h now */
|
||||
#if 0
|
||||
#ifdef ASSERT
|
||||
#undef ASSERT
|
||||
|
|
|
@ -28,7 +28,7 @@ extern DWORD DebugTraceLevel;
|
|||
DbgPrint _x_; \
|
||||
}
|
||||
|
||||
/* this belongs in rtl */
|
||||
/* this belongs in ndis.h */
|
||||
#if 0
|
||||
#ifdef ASSERT
|
||||
#undef ASSERT
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue