diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index 62635010c6d..295c35fa1dc 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -55,8 +55,9 @@ HKLM,"SYSTEM\CurrentControlSet\Control\ServiceGroupOrder","List",0x00010000, \ "Video", \ "File System", \ "Event log", \ - "NDIS", \ + "NDIS Wrapper" \ "PNP_TDI", \ + "NDIS", \ "TDI", \ "Extended Base" @@ -219,28 +220,28 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Msfs","Type",0x00010001,0x00000002 ; NDIS driver - the only boot-start network driver HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","ErrorControl",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Group",0x00000000,"NDIS" +HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Group",0x00000000,"NDIS Wrapper" HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","ImagePath",0x00020000,"system32\drivers\ndis.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\Ndis","Start",0x00010001,0x00000000 +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. ; Comment the networking stuff out if you don't have hte card and don't want to see errors ; 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,0x00000003 -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",0x00010000,"\Device\Ne20001" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Export",0x00010000,"\Device\Ne20001" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Route",0x00010000,"Ne20001" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","0",0x00000000,"Root\POSVPN\0000" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","Count",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","NextInstance",0x00010001,0x00000001 +;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,0x00000003 +;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",0x00010000,"\Device\Ne20001" +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Export",0x00010000,"\Device\Ne20001" +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Linkage","Route",0x00010000,"Ne20001" +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","0",0x00000000,"Root\POSVPN\0000" +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","Count",0x00010001,0x00000001 +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","NextInstance",0x00010001,0x00000001 ; one day this will happen automatically; until then we need this since ndis5 drivers ; rely on the fact that their resources are handed to them by ndis, so we have to find @@ -254,60 +255,60 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Ne2000\Enum","NextInstance",0x00010001,0 ; 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",0x00000000,"280" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","Irq",0x00000000,"9" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","DwordTest",0x00000000,"baadf00d" -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",0x00010000,"255.255.255.0" +;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",0x00000000,"280" +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","Irq",0x00000000,"9" +;HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters","DwordTest",0x00000000,"baadf00d" +;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",0x00010000,"255.255.255.0" ; AMD PCNet NIC 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\pcntn5m.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}" +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\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.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","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.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" ; ReactOS PCNet Driver ;HKLM,"SYSTEM\CurrentControlSet\Services\PCNet","ErrorControl",0x00010001,0x00000001 @@ -428,12 +429,12 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip","Type",0x00010001,0x00000001 ; These bindings are of the windows 2000 type, and will probably need to be ; twiddled to get 3rd-party network-related software to work. ; NT4 puts additional stuff in the Bind, Export, and Route values. -;HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Bind",0x00010000,"\Device\PCNet1", "\Device\Ne20001", "\Device\PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Bind",0x00010000, "\Device\Ne20001" -;HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Export",0x00010000,"\Device\Tcpip_PCNet1", "\Device\Tcpip_Ne20001", "\Device\Tcpip_PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Export",0x00010000, "\Device\Tcpip_Ne20001" -;HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Route",0x00010000,"PCNet1", "Ne20001", "PCNet1" -HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Route",0x00010000,"Ne20001" +;HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Bind",0x00010000,"\Device\PCNet1", "\Device\Ne20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Bind",0x00010000, "\Device\PCNet1" +;HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Export",0x00010000,"\Device\Tcpip_PCNet1", "\Device\Tcpip_Ne20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Export",0x00010000, "\Device\Tcpip_PCNet1" +;HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Route",0x00010000,"PCNet1", "Ne20001" +HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage","Route",0x00010000,"PCNet1" HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters","DataBasePath",0x00000000,"DataBasePath" HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters","Domain",0x00000000,"" HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters","Hostname",0x00000000,"ROSHost" diff --git a/reactos/drivers/net/ndis/include/miniport.h b/reactos/drivers/net/ndis/include/miniport.h index dfb050424be..757ed517360 100644 --- a/reactos/drivers/net/ndis/include/miniport.h +++ b/reactos/drivers/net/ndis/include/miniport.h @@ -79,9 +79,9 @@ typedef struct _ORPHAN_ADATER { } ORPHAN_ADAPTER, *PORPHAN_ADAPTER; /* Information about a logical adapter */ -typedef struct _LOGICAL_ADAPTER { - NDIS_MINIPORT_BLOCK NdisMiniportBlock; /* NDIS defined fields */ - +typedef struct _LOGICAL_ADAPTER +{ + NDIS_MINIPORT_BLOCK NdisMiniportBlock; /* NDIS defined fields */ KDPC MiniportDpc; /* DPC routine for adapter */ BOOLEAN MiniportBusy; /* A MiniportXxx routine is executing */ NDIS_HANDLE MiniportAdapterBinding; /* Binding handle for current caller */ @@ -89,7 +89,6 @@ typedef struct _LOGICAL_ADAPTER { NDIS_MINIPORT_WORK_ITEM WorkQueue[NDIS_MINIPORT_WORK_QUEUE_SIZE]; PNDIS_MINIPORT_WORK_ITEM WorkQueueHead; /* Head of work queue */ PNDIS_MINIPORT_WORK_ITEM WorkQueueTail; /* Tail of work queue */ - LIST_ENTRY ListEntry; /* Entry on global list */ LIST_ENTRY MiniportListEntry; /* Entry on miniport driver list */ LIST_ENTRY ProtocolListHead; /* List of bound protocols */ @@ -97,8 +96,7 @@ typedef struct _LOGICAL_ADAPTER { PMINIPORT_DRIVER Miniport; /* Miniport owning this adapter */ UNICODE_STRING DeviceName; /* Device name of this adapter */ ULONG Attributes; /* Attributes of adapter */ - /* TRUE if the miniport has called NdisSetAttributes(Ex) for this adapter */ - BOOLEAN AttributesSet; + BOOLEAN AttributesSet; /* Whether NdisMSetAttributes(Ex) has been called */ PVOID QueryBuffer; /* Buffer to use for queries */ ULONG QueryBufferLength; /* Length of QueryBuffer */ ULONG MediumHeaderSize; /* Size of medium header */ @@ -108,10 +106,8 @@ typedef struct _LOGICAL_ADAPTER { ULONG LookaheadLength; /* Length of lookahead buffer */ ULONG CurLookaheadLength; /* Current (selected) length of lookahead buffer */ ULONG MaxLookaheadLength; /* Maximum length of lookahead buffer */ - PNDIS_PACKET PacketQueueHead; /* Head of packet queue */ PNDIS_PACKET PacketQueueTail; /* Head of packet queue */ - PNDIS_PACKET LoopPacket; /* Current packet beeing looped */ PMINIPORT_BUGCHECK_CONTEXT BugcheckContext; /* Adapter's shutdown handler */ UINT MapRegistersRequested; /* Number of outstanding map registers requested */ @@ -119,17 +115,17 @@ typedef struct _LOGICAL_ADAPTER { ADAPTER_MAP_REGISTER_LIST MapRegisterList; /* List of allocated map registers */ KEVENT DmaEvent; /* Event to support DMA register allocation */ KSPIN_LOCK DmaLock; /* Spinlock to protect the dma list */ - UINT BusNumber; - INTERFACE_TYPE BusType; - UINT SlotNumber; - ULONG Irql; - ULONG Vector; - KAFFINITY Affinity; - PHYSICAL_ADDRESS BaseIoAddress; - PHYSICAL_ADDRESS BaseMemoryAddress; /* multiple ranges? */ - ULONG DmaChannel; - ULONG DmaPort; - PNDIS_MINIPORT_TIMER Timer; + UINT BusNumber; /* The bus number of the adapter */ + INTERFACE_TYPE BusType; /* The bus type of the adapter */ + UINT SlotNumber; /* The slot number of the adapter*/ + ULONG Irql; /* The Irql assigned to the adapter */ + ULONG Vector; /* The interrupt vector assigned to the adapter */ + KAFFINITY Affinity; /* The processor affinity of the adapter */ + PHYSICAL_ADDRESS BaseIoAddress; /* The base IO address of the adapter */ + PHYSICAL_ADDRESS BaseMemoryAddress; /* The base memory address of mapped memory for the adapter */ + ULONG DmaChannel; /* The DMA channel number of the adapter */ + ULONG DmaPort; /* The DMA port number of the adapter */ + PNDIS_MINIPORT_TIMER Timer; /* The timer object of the adapter */ } LOGICAL_ADAPTER, *PLOGICAL_ADAPTER; #define GET_LOGICAL_ADAPTER(Handle)((PLOGICAL_ADAPTER)Handle) @@ -206,3 +202,4 @@ NdisStartDevices(); #endif /* __MINIPORT_H */ /* EOF */ + diff --git a/reactos/drivers/net/ndis/include/protocol.h b/reactos/drivers/net/ndis/include/protocol.h index b2b97f0fca2..3666614f8e7 100644 --- a/reactos/drivers/net/ndis/include/protocol.h +++ b/reactos/drivers/net/ndis/include/protocol.h @@ -10,7 +10,7 @@ #include #include -#include "../include/miniport.h" +#include "miniport.h" typedef struct _PROTOCOL_BINDING { @@ -52,3 +52,4 @@ ProIndicatePacket( #endif /* __PROTOCOL_H */ /* EOF */ + diff --git a/reactos/drivers/net/ndis/ndis.rc b/reactos/drivers/net/ndis/ndis.rc index 2ea36d0d0fd..cf943c21764 100644 --- a/reactos/drivers/net/ndis/ndis.rc +++ b/reactos/drivers/net/ndis/ndis.rc @@ -21,8 +21,8 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", RES_STR_COMPANY_NAME - VALUE "FileDescription", "NDIS library\0" - VALUE "FileVersion", "0.0.0\0" + VALUE "FileDescription", "NDIS Library\0" + VALUE "FileVersion", "0.1.4\0" VALUE "InternalName", "ndis\0" VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT VALUE "OriginalFilename", "ndis.sys\0" diff --git a/reactos/drivers/net/ndis/ndis/control.c b/reactos/drivers/net/ndis/ndis/control.c index f7e33b9d5ec..c8806469422 100644 --- a/reactos/drivers/net/ndis/ndis/control.c +++ b/reactos/drivers/net/ndis/ndis/control.c @@ -4,11 +4,14 @@ * FILE: ndis/control.c * PURPOSE: Program control routines * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created + * 3 Oct 2003 Vizzini - Formatting and minor bugfixes */ #include + /* * @implemented */ @@ -17,11 +20,11 @@ EXPORT NdisReinitializePacket( IN OUT PNDIS_PACKET Packet) { - (Packet)->Private.Head = (PNDIS_BUFFER)NULL; - (Packet)->Private.ValidCounts = FALSE; + (Packet)->Private.Head = (PNDIS_BUFFER)NULL; + (Packet)->Private.ValidCounts = FALSE; } - + /* * @unimplemented */ @@ -41,7 +44,7 @@ NdisAcquireReadWriteLock( UNIMPLEMENTED } - + /* * @implemented */ @@ -55,10 +58,10 @@ NdisAcquireSpinLock( * SpinLock = Pointer to the initialized NDIS spin lock to be acquired */ { - KeAcquireSpinLock(&SpinLock->SpinLock, &SpinLock->OldIrql); + KeAcquireSpinLock(&SpinLock->SpinLock, &SpinLock->OldIrql); } - + /* * @implemented */ @@ -72,10 +75,10 @@ NdisAllocateSpinLock( * SpinLock = Pointer to an NDIS spin lock structure */ { - KeInitializeSpinLock(&SpinLock->SpinLock); + KeInitializeSpinLock(&SpinLock->SpinLock); } - + /* * @implemented */ @@ -89,11 +92,11 @@ NdisDprAcquireSpinLock( * SpinLock = Pointer to the initialized NDIS spin lock to be acquired */ { - KeAcquireSpinLockAtDpcLevel(&SpinLock->SpinLock); - SpinLock->OldIrql = DISPATCH_LEVEL; + KeAcquireSpinLockAtDpcLevel(&SpinLock->SpinLock); + SpinLock->OldIrql = DISPATCH_LEVEL; } - + /* * @implemented */ @@ -107,10 +110,10 @@ NdisDprReleaseSpinLock( * SpinLock = Pointer to the acquired NDIS spin lock to be released */ { - KeReleaseSpinLockFromDpcLevel(&SpinLock->SpinLock); + KeReleaseSpinLockFromDpcLevel(&SpinLock->SpinLock); } - + /* * @implemented */ @@ -124,10 +127,10 @@ NdisFreeSpinLock( * SpinLock = Pointer to an initialized NDIS spin lock */ { - /* Nothing to do here! */ + /* Nothing to do here! */ } - + /* * @unimplemented */ @@ -158,7 +161,7 @@ NdisInitializeEvent( * Event = Pointer to an NDIS event structure to be initialized */ { - KeInitializeEvent(&Event->Event, NotificationEvent, FALSE); + KeInitializeEvent(&Event->Event, NotificationEvent, FALSE); } @@ -175,7 +178,7 @@ NdisReleaseSpinLock( * SpinLock = Pointer to the acquired NDIS spin lock to be released */ { - KeReleaseSpinLock(&SpinLock->SpinLock, SpinLock->OldIrql); + KeReleaseSpinLock(&SpinLock->SpinLock, SpinLock->OldIrql); } @@ -192,7 +195,7 @@ NdisResetEvent( * Event = Pointer to the initialized event object to be reset */ { - KeResetEvent(&Event->Event); + KeResetEvent(&Event->Event); } @@ -209,7 +212,7 @@ NdisSetEvent( * Event = Pointer to the initialized event object to be set */ { - KeSetEvent(&Event->Event, IO_NO_INCREMENT, FALSE); + KeSetEvent(&Event->Event, IO_NO_INCREMENT, FALSE); } @@ -230,18 +233,15 @@ NdisWaitEvent( * TRUE if the event is in the signaled state */ { - LARGE_INTEGER Timeout; - NTSTATUS Status; + LARGE_INTEGER Timeout; + NTSTATUS Status; - Timeout.QuadPart = MsToWait * -10000LL; + Timeout.QuadPart = MsToWait * -10000LL; - Status = KeWaitForSingleObject(&Event->Event, - Executive, - KernelMode, - TRUE, - &Timeout); + Status = KeWaitForSingleObject(&Event->Event, Executive, KernelMode, TRUE, &Timeout); - return (Status == STATUS_SUCCESS); + return (Status == STATUS_SUCCESS); } /* EOF */ + diff --git a/reactos/drivers/net/ndis/ndis/hardware.c b/reactos/drivers/net/ndis/ndis/hardware.c index b27ce77bccd..80447c13118 100644 --- a/reactos/drivers/net/ndis/ndis/hardware.c +++ b/reactos/drivers/net/ndis/ndis/hardware.c @@ -7,12 +7,16 @@ * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created - * 8/25/2003 Vizzini - NDIS4/5 and PnP additions + * 25 Aug 2003 Vizzini - NDIS4/5 and PnP additions + * 3 Oct 2003 Vizzini - formatting and minor bugfixes + * + * TODO: + * - Fix HalGetBusDataByOffset() param 2 in most calls below */ #include #include - + /* * @implemented */ @@ -25,15 +29,10 @@ NdisImmediateReadPciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - return HalGetBusDataByOffset (PCIConfiguration, - 0, /* FIXME */ - SlotNumber, - Buffer, - Offset, - Length); + return HalGetBusDataByOffset (PCIConfiguration, 0, SlotNumber, Buffer, Offset, Length); } - + /* * @implemented */ @@ -46,15 +45,10 @@ NdisImmediateWritePciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - return HalSetBusDataByOffset (PCIConfiguration, - 0, /* FIXME */ - SlotNumber, - Buffer, - Offset, - Length); + return HalSetBusDataByOffset (PCIConfiguration, 0, SlotNumber, Buffer, Offset, Length); } - + /* * @implemented */ @@ -88,13 +82,12 @@ NdisMPciAssignResources( return NDIS_STATUS_FAILURE; } - *AssignedResources = - (PNDIS_RESOURCE_LIST)&ResourceList->List[0].PartialResourceList; + *AssignedResources = (PNDIS_RESOURCE_LIST)&ResourceList->List[0].PartialResourceList; return NDIS_STATUS_SUCCESS; } - + /* * @unimplemented */ @@ -124,10 +117,10 @@ NdisQueryMapRegisterCount( * As such, we do what microsoft does on the x86 hals and return as follows */ { - return NDIS_STATUS_NOT_SUPPORTED; + return NDIS_STATUS_NOT_SUPPORTED; } - + /* * @unimplemented */ @@ -171,15 +164,10 @@ NdisReadPciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - return HalGetBusDataByOffset (PCIConfiguration, - 0, /* FIXME */ - SlotNumber, - Buffer, - Offset, - Length); + return HalGetBusDataByOffset (PCIConfiguration, 0, SlotNumber, Buffer, Offset, Length); } - + /* * @implemented */ @@ -192,12 +180,8 @@ NdisWritePciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - return HalSetBusDataByOffset (PCIConfiguration, - 0, /* FIXME */ - SlotNumber, - Buffer, - Offset, - Length); + return HalSetBusDataByOffset (PCIConfiguration, 0, SlotNumber, Buffer, Offset, Length); } /* EOF */ + diff --git a/reactos/drivers/net/ndis/ndis/io.c b/reactos/drivers/net/ndis/ndis/io.c index e193bc9106c..05f2149a74b 100644 --- a/reactos/drivers/net/ndis/ndis/io.c +++ b/reactos/drivers/net/ndis/ndis/io.c @@ -7,11 +7,13 @@ * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created - * 8-20-2003 Vizzini - DMA support + * 20 Aug 2003 Vizzini - DMA support + * 3 Oct 2003 Vizzini - Formatting and minor bugfixes */ #include #include + VOID STDCALL HandleDeferredProcessing( IN PKDPC Dpc, IN PVOID DeferredContext, @@ -26,32 +28,48 @@ VOID STDCALL HandleDeferredProcessing( * SystemArgument2 = Unused */ { - BOOLEAN WasBusy; - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); + BOOLEAN WasBusy; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); - WasBusy = Adapter->MiniportBusy; - Adapter->MiniportBusy = TRUE; - KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - /* Call the deferred interrupt service handler for this adapter */ - (*Adapter->Miniport->Chars.HandleInterruptHandler)( + /* XXX try to grok WasBusy */ + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); + { + WasBusy = Adapter->MiniportBusy; + Adapter->MiniportBusy = TRUE; + } + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + + /* Call the deferred interrupt service handler for this adapter */ + (*Adapter->Miniport->Chars.HandleInterruptHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext); + + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); + { + if ((!WasBusy) && (Adapter->WorkQueueHead)) + { + KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); + } + else + { + Adapter->MiniportBusy = WasBusy; + } + } + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + + /* re-enable the interrupt */ + NDIS_DbgPrint(MAX_TRACE, ("re-enabling the interrupt\n")); + if(Adapter->Miniport->Chars.EnableInterruptHandler) + (*Adapter->Miniport->Chars.EnableInterruptHandler)( Adapter->NdisMiniportBlock.MiniportAdapterContext); - KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); - if ((!WasBusy) && (Adapter->WorkQueueHead)) { - KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); - } else { - Adapter->MiniportBusy = WasBusy; - } - KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); - - NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); } - + BOOLEAN STDCALL ServiceRoutine( IN PKINTERRUPT Interrupt, IN PVOID ServiceContext) @@ -64,27 +82,28 @@ BOOLEAN STDCALL ServiceRoutine( * TRUE if a miniport controlled device generated the interrupt */ { - BOOLEAN InterruptRecognized; - BOOLEAN QueueMiniportHandleInterrupt; - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(ServiceContext); + BOOLEAN InterruptRecognized; + BOOLEAN QueueMiniportHandleInterrupt; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(ServiceContext); - NDIS_DbgPrint(MAX_TRACE, ("Called. Adapter (0x%X)\n", Adapter)); + NDIS_DbgPrint(MAX_TRACE, ("Called. Adapter (0x%X)\n", Adapter)); - (*Adapter->Miniport->Chars.ISRHandler)(&InterruptRecognized, - &QueueMiniportHandleInterrupt, - Adapter->NdisMiniportBlock.MiniportAdapterContext); + (*Adapter->Miniport->Chars.ISRHandler)(&InterruptRecognized, + &QueueMiniportHandleInterrupt, + Adapter->NdisMiniportBlock.MiniportAdapterContext); - if (QueueMiniportHandleInterrupt) { - NDIS_DbgPrint(MAX_TRACE, ("Queueing DPC.\n")); - KeInsertQueueDpc(&Adapter->NdisMiniportBlock.Interrupt->InterruptDpc, NULL, NULL); + if (QueueMiniportHandleInterrupt) + { + NDIS_DbgPrint(MAX_TRACE, ("Queueing DPC.\n")); + KeInsertQueueDpc(&Adapter->NdisMiniportBlock.Interrupt->InterruptDpc, NULL, NULL); } - NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); - return InterruptRecognized; + return InterruptRecognized; } - + /* * @unimplemented */ @@ -101,7 +120,7 @@ NdisCompleteDmaTransfer( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -114,7 +133,7 @@ NdisFlushBuffer( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -125,10 +144,10 @@ NdisGetCacheFillSize( { UNIMPLEMENTED - return 0; + return 0; } - + /* * @implemented */ @@ -139,11 +158,11 @@ NdisImmediateReadPortUchar( IN ULONG Port, OUT PUCHAR Data) { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - *Data = READ_PORT_UCHAR((PUCHAR)Port); // FIXME: What to do with WrapperConfigurationContext? + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + *Data = READ_PORT_UCHAR((PUCHAR)Port); // FIXME: What to do with WrapperConfigurationContext? } - + /* * @implemented */ @@ -154,11 +173,11 @@ NdisImmediateReadPortUlong( IN ULONG Port, OUT PULONG Data) { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - *Data = READ_PORT_ULONG((PULONG)Port); // FIXME: What to do with WrapperConfigurationContext? + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + *Data = READ_PORT_ULONG((PULONG)Port); // FIXME: What to do with WrapperConfigurationContext? } - + /* * @implemented */ @@ -169,11 +188,11 @@ NdisImmediateReadPortUshort( IN ULONG Port, OUT PUSHORT Data) { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - *Data = READ_PORT_USHORT((PUSHORT)Port); // FIXME: What to do with WrapperConfigurationContext? + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + *Data = READ_PORT_USHORT((PUSHORT)Port); // FIXME: What to do with WrapperConfigurationContext? } - + /* * @implemented */ @@ -184,11 +203,11 @@ NdisImmediateWritePortUchar( IN ULONG Port, IN UCHAR Data) { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - WRITE_PORT_UCHAR((PUCHAR)Port, Data); // FIXME: What to do with WrapperConfigurationContext? + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + WRITE_PORT_UCHAR((PUCHAR)Port, Data); // FIXME: What to do with WrapperConfigurationContext? } - + /* * @implemented */ @@ -199,11 +218,11 @@ NdisImmediateWritePortUlong( IN ULONG Port, IN ULONG Data) { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - WRITE_PORT_ULONG((PULONG)Port, Data); // FIXME: What to do with WrapperConfigurationContext? + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + WRITE_PORT_ULONG((PULONG)Port, Data); // FIXME: What to do with WrapperConfigurationContext? } - + /* * @unimplemented */ @@ -214,11 +233,11 @@ NdisImmediateWritePortUshort( IN ULONG Port, IN USHORT Data) { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - WRITE_PORT_USHORT((PUSHORT)Port, Data); // FIXME: What to do with WrapperConfigurationContext? + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + WRITE_PORT_USHORT((PUSHORT)Port, Data); // FIXME: What to do with WrapperConfigurationContext? } - + IO_ALLOCATION_ACTION NdisMapRegisterCallback ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, @@ -383,7 +402,7 @@ NdisMAllocateMapRegisters( return NDIS_STATUS_SUCCESS; } - + /* * @unimplemented */ @@ -400,7 +419,7 @@ NdisMCompleteDmaTransfer( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -412,7 +431,7 @@ NdisMDeregisterDmaChannel( UNIMPLEMENTED } - + /* * @implemented */ @@ -430,7 +449,7 @@ NdisMDeregisterInterrupt( IoDisconnectInterrupt(Interrupt->InterruptObject); } - + /* * @unimplemented */ @@ -450,10 +469,10 @@ NdisMDeregisterIoPortRange( * PortOffset = Pointer to mapped base port address */ { - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("called - IMPLEMENT ME.\n")); } - + /* * @implemented */ @@ -491,7 +510,7 @@ NdisMFreeMapRegisters( KeLowerIrql(OldIrql); } - + /* * @unimplemented */ @@ -505,10 +524,10 @@ NdisMMapIoSpace( { UNIMPLEMENTED - return NDIS_STATUS_FAILURE; + return NDIS_STATUS_FAILURE; } - + /* * @unimplemented */ @@ -519,10 +538,10 @@ NdisMReadDmaCounter( { UNIMPLEMENTED - return 0; + return 0; } - + /* * @unimplemented */ @@ -538,9 +557,10 @@ NdisMRegisterDmaChannel( { UNIMPLEMENTED - return NDIS_STATUS_FAILURE; + return NDIS_STATUS_FAILURE; } + /* * @implemented */ @@ -568,67 +588,52 @@ NdisMRegisterInterrupt( * Status of operation */ { - NTSTATUS Status; - ULONG MappedIRQ; - KIRQL DIrql; - KAFFINITY Affinity; - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); + NTSTATUS Status; + ULONG MappedIRQ; + KIRQL DIrql; + KAFFINITY Affinity; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); - NDIS_DbgPrint(MAX_TRACE, ("Called. InterruptVector (0x%X) InterruptLevel (0x%X) " - "SharedInterrupt (%d) InterruptMode (0x%X)\n", - InterruptVector, InterruptLevel, SharedInterrupt, InterruptMode)); + NDIS_DbgPrint(MAX_TRACE, ("Called. InterruptVector (0x%X) InterruptLevel (0x%X) " + "SharedInterrupt (%d) InterruptMode (0x%X)\n", + InterruptVector, InterruptLevel, SharedInterrupt, InterruptMode)); - RtlZeroMemory(Interrupt, sizeof(NDIS_MINIPORT_INTERRUPT)); + RtlZeroMemory(Interrupt, sizeof(NDIS_MINIPORT_INTERRUPT)); - KeInitializeSpinLock(&Interrupt->DpcCountLock); + KeInitializeSpinLock(&Interrupt->DpcCountLock); - KeInitializeDpc(&Interrupt->InterruptDpc, - HandleDeferredProcessing, - Adapter); + KeInitializeDpc(&Interrupt->InterruptDpc, HandleDeferredProcessing, Adapter); - KeInitializeEvent(&Interrupt->DpcsCompletedEvent, - NotificationEvent, - FALSE); + KeInitializeEvent(&Interrupt->DpcsCompletedEvent, NotificationEvent, FALSE); - Interrupt->SharedInterrupt = SharedInterrupt; + Interrupt->SharedInterrupt = SharedInterrupt; - Adapter->NdisMiniportBlock.Interrupt = Interrupt; + Adapter->NdisMiniportBlock.Interrupt = Interrupt; - MappedIRQ = HalGetInterruptVector(Adapter->BusType, - Adapter->BusNumber, - InterruptLevel, - InterruptVector, - &DIrql, - &Affinity); + MappedIRQ = HalGetInterruptVector(Adapter->BusType, Adapter->BusNumber, InterruptLevel, InterruptVector, &DIrql, &Affinity); - NDIS_DbgPrint(MAX_TRACE, ("Connecting to interrupt vector (0x%X) Affinity (0x%X).\n", MappedIRQ, Affinity)); + NDIS_DbgPrint(MAX_TRACE, ("Connecting to interrupt vector (0x%X) Affinity (0x%X).\n", MappedIRQ, Affinity)); - Status = IoConnectInterrupt(&Interrupt->InterruptObject, - ServiceRoutine, - Adapter, - &Interrupt->DpcCountLock, - MappedIRQ, - DIrql, - DIrql, - InterruptMode, - SharedInterrupt, - Affinity, - FALSE); + Status = IoConnectInterrupt(&Interrupt->InterruptObject, ServiceRoutine, Adapter, &Interrupt->DpcCountLock, MappedIRQ, + DIrql, DIrql, InterruptMode, SharedInterrupt, Affinity, FALSE); - NDIS_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X).\n", Status)); + NDIS_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X).\n", Status)); - if (NT_SUCCESS(Status)) - return NDIS_STATUS_SUCCESS; + if (NT_SUCCESS(Status)) + return NDIS_STATUS_SUCCESS; - if (Status == STATUS_INSUFFICIENT_RESOURCES) { + if (Status == STATUS_INSUFFICIENT_RESOURCES) + { /* FIXME: Log error */ - return NDIS_STATUS_RESOURCE_CONFLICT; + NDIS_DbgPrint(MIN_TRACE, ("Resource conflict!\n")); + return NDIS_STATUS_RESOURCE_CONFLICT; } - return NDIS_STATUS_FAILURE; + NDIS_DbgPrint(MIN_TRACE, ("Function failed\n")); + return NDIS_STATUS_FAILURE; } - + /* * @unimplemented */ @@ -727,3 +732,4 @@ NdisMUnmapIoSpace( } /* EOF */ + diff --git a/reactos/drivers/net/ndis/ndis/main.c b/reactos/drivers/net/ndis/ndis/main.c index b68806bd06a..a227484e09b 100644 --- a/reactos/drivers/net/ndis/ndis/main.c +++ b/reactos/drivers/net/ndis/ndis/main.c @@ -7,7 +7,8 @@ * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created - * 8/20/2003 Vizzini - NDIS4/5 revisions + * 20 Aug 2003 Vizzini - NDIS4/5 revisions + * 3 Oct 2003 Vizzini - formatting and minor bugfixing */ #include #include @@ -25,6 +26,7 @@ DWORD DebugTraceLevel = MIN_TRACE; extern KSPIN_LOCK OrphanAdapterListLock; extern LIST_ENTRY OrphanAdapterListHead; + VOID MainUnload( PDRIVER_OBJECT DriverObject) /* @@ -33,9 +35,10 @@ VOID MainUnload( * DriverObject = Pointer to driver object created by the system */ { - NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); } + NTSTATUS STDCALL DriverEntry( @@ -76,6 +79,7 @@ DriverEntry( return STATUS_SUCCESS; } + /* * @implemented */ @@ -103,13 +107,10 @@ NdisWriteErrorLogEntry( */ { NDIS_DbgPrint(MIN_TRACE, ("ERROR: ErrorCode 0x%x\n", ErrorCode)); - -#if DBG - /* break into a debugger so we can see what's up */ - __asm__("int $3\n"); -#endif + ASSERT(0); } + /* * @implemented */ @@ -128,6 +129,7 @@ NdisInitializeReadWriteLock( memset(Lock,0,sizeof(NDIS_RW_LOCK)); } + /* * @implemented */ diff --git a/reactos/drivers/net/ndis/ndis/memory.c b/reactos/drivers/net/ndis/ndis/memory.c index 96e8c44ba2b..4375a83442a 100644 --- a/reactos/drivers/net/ndis/ndis/memory.c +++ b/reactos/drivers/net/ndis/ndis/memory.c @@ -7,11 +7,13 @@ * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created - * 8/15/2003 Vizzini - DMA support + * 15 Aug 2003 Vizzini - DMA support + * 3 Oct 2003 Vizzini - formatting and minor bugfixing */ #include #include + /* * @implemented */ @@ -45,7 +47,7 @@ NdisAllocateMemoryWithTag( return NDIS_STATUS_SUCCESS; } - + /* * @unimplemented */ @@ -59,7 +61,7 @@ NdisCreateLookaheadBufferFromSharedMemory( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -71,7 +73,7 @@ NdisDestroyLookaheadBufferFromSharedMemory( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -85,7 +87,7 @@ NdisMoveFromMappedMemory( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -99,7 +101,7 @@ NdisMoveMappedMemory( RtlCopyMemory(Destination,Source,Length); } - + /* * @unimplemented */ @@ -113,7 +115,7 @@ NdisMoveToMappedMemory( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -128,7 +130,7 @@ NdisMUpdateSharedMemory( UNIMPLEMENTED } - + /* * @implemented */ @@ -180,7 +182,7 @@ NdisAllocateMemory( return NDIS_STATUS_SUCCESS; } - + /* * @implemented */ @@ -215,7 +217,7 @@ NdisFreeMemory( ExFreePool(VirtualAddress); } - + /* * @unimplemented */ @@ -230,7 +232,7 @@ NdisImmediateReadSharedMemory( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -245,7 +247,7 @@ NdisImmediateWriteSharedMemory( UNIMPLEMENTED } - + /* * @implemented */ @@ -276,7 +278,7 @@ NdisMAllocateSharedMemory( *VirtualAddress = HalAllocateCommonBuffer(Adapter->AdapterObject, Length, PhysicalAddress, Cached); } - + /* * @unimplemented */ @@ -291,9 +293,10 @@ NdisMAllocateSharedMemoryAsync( NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); UNIMPLEMENTED - return NDIS_STATUS_FAILURE; + return NDIS_STATUS_FAILURE; } + /* * @implemented */ @@ -321,7 +324,7 @@ NdisMFreeSharedMemoryPassive( ExFreePool(Memory); } - + /* * @implemented */ diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index 4b842f4656b..0d13b2540d8 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -7,10 +7,12 @@ * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created - * 8/20/2003 vizzini - DMA support + * 20 Aug 2003 vizzini - DMA support + * 3 Oct 2003 vizzini - SendPackets support */ #include #include + #ifdef DBG #include #endif /* DBG */ @@ -36,7 +38,8 @@ /* Number of media we know */ #define MEDIA_ARRAY_SIZE 15 -static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE] = { +static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE] = +{ NdisMedium802_3, NdisMedium802_5, NdisMediumFddi, @@ -67,11 +70,11 @@ LIST_ENTRY OrphanAdapterListHead; KSPIN_LOCK OrphanAdapterListLock; -#ifdef DBG VOID MiniDisplayPacket( PNDIS_PACKET Packet) { +//#ifdef DBG #if 0 ULONG i, Length; UCHAR Buffer[64]; @@ -92,41 +95,17 @@ MiniDisplayPacket( DbgPrint("*** PACKET STOP ***\n"); } -#endif -} #endif /* DBG */ - +} VOID -MiniIndicateData( - PLOGICAL_ADAPTER Adapter, - NDIS_HANDLE MacReceiveContext, - PVOID HeaderBuffer, - UINT HeaderBufferSize, - PVOID LookaheadBuffer, - UINT LookaheadBufferSize, - UINT PacketSize) -/* - * FUNCTION: Indicate received data to bound protocols - * ARGUMENTS: - * Adapter = Pointer to logical adapter - * MacReceiveContext = MAC receive context handle - * HeaderBuffer = Pointer to header buffer - * HeaderBufferSize = Size of header buffer - * LookaheadBuffer = Pointer to lookahead buffer - * LookaheadBufferSize = Size of lookahead buffer - * PacketSize = Total size of received packet - */ +MiniDisplayPacket2( + PVOID HeaderBuffer, + UINT HeaderBufferSize, + PVOID LookaheadBuffer, + UINT LookaheadBufferSize) { - KIRQL OldIrql; - PLIST_ENTRY CurrentEntry; - PADAPTER_BINDING AdapterBinding; - - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called. Adapter (0x%X) HeaderBuffer (0x%X) " - "HeaderBufferSize (0x%X) LookaheadBuffer (0x%X) LookaheadBufferSize (0x%X).\n", - Adapter, HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize)); - -#ifdef DBG +//#ifdef DBG #if 0 if ((DebugTraceLevel | DEBUG_PACKET) > 0) { ULONG i, Length; @@ -155,62 +134,119 @@ MiniIndicateData( DbgPrint("\n*** RECEIVE PACKET STOP ***\n"); } -#endif #endif /* DBG */ - - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); - CurrentEntry = Adapter->ProtocolListHead.Flink; - - if (CurrentEntry == &Adapter->ProtocolListHead) { - NDIS_DbgPrint(DEBUG_MINIPORT, ("WARNING: No upper protocol layer.\n")); - } - - while (CurrentEntry != &Adapter->ProtocolListHead) { - AdapterBinding = CONTAINING_RECORD(CurrentEntry, - ADAPTER_BINDING, - AdapterListEntry); - - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); - -#if DBG - if(!AdapterBinding) - { - NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding was null\n")); - return; - } - - if(!AdapterBinding->ProtocolBinding) - { - NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding->ProtocolBinding was null\n")); - return; - } - - if(!AdapterBinding->ProtocolBinding->Chars.u4.ReceiveHandler) - { - NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding->ProtocolBinding->Chars.u4.ReceiveHandler was null\n")); - return; - } -#endif - - (*AdapterBinding->ProtocolBinding->Chars.u4.ReceiveHandler)( - AdapterBinding->NdisOpenBlock.ProtocolBindingContext, - MacReceiveContext, - HeaderBuffer, - HeaderBufferSize, - LookaheadBuffer, - LookaheadBufferSize, - PacketSize); - - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); - - CurrentEntry = CurrentEntry->Flink; - } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); - - NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); } + +VOID +MiniIndicateData( + PLOGICAL_ADAPTER Adapter, + NDIS_HANDLE MacReceiveContext, + PVOID HeaderBuffer, + UINT HeaderBufferSize, + PVOID LookaheadBuffer, + UINT LookaheadBufferSize, + UINT PacketSize) +/* + * FUNCTION: Indicate received data to bound protocols + * ARGUMENTS: + * Adapter = Pointer to logical adapter + * MacReceiveContext = MAC receive context handle + * HeaderBuffer = Pointer to header buffer + * HeaderBufferSize = Size of header buffer + * LookaheadBuffer = Pointer to lookahead buffer + * LookaheadBufferSize = Size of lookahead buffer + * PacketSize = Total size of received packet + */ +{ + /* KIRQL OldIrql; */ + PLIST_ENTRY CurrentEntry; + PADAPTER_BINDING AdapterBinding; + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called. Adapter (0x%X) HeaderBuffer (0x%X) " + "HeaderBufferSize (0x%X) LookaheadBuffer (0x%X) LookaheadBufferSize (0x%X).\n", + Adapter, HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize)); + + MiniDisplayPacket2(HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize); + + /* + * XXX Think about this. This is probably broken. Spinlocks are + * taken out for now until i comprehend the Right Way to do this. + * + * This used to acquire the MiniportBlock spinlock and hold it until + * just before the call to ReceiveHandler. It would then release and + * subsequently re-acquire the lock. + * + * I don't see how this does any good, as it would seem he's just + * trying to protect the packet list. If someobdy else dequeues + * a packet, we are in fact in bad shape, but we don't want to + * necessarily call the receive handler at elevated irql either. + * + * therefore: We *are* going to call the receive handler at high irql + * (due to holding the lock) for now, and eventually we have to + * figure out another way to protect this packet list. + * + * UPDATE: this is busted; this results in a recursive lock acquisition. + */ + //NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); + //KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + { + CurrentEntry = Adapter->ProtocolListHead.Flink; + + if (CurrentEntry == &Adapter->ProtocolListHead) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("WARNING: No upper protocol layer.\n")); + } + + while (CurrentEntry != &Adapter->ProtocolListHead) + { + AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry); + + /* see above */ + /* KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); */ + +#if DBG + if(!AdapterBinding) + { + NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding was null\n")); + break; + } + + if(!AdapterBinding->ProtocolBinding) + { + NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding->ProtocolBinding was null\n")); + break; + } + + if(!AdapterBinding->ProtocolBinding->Chars.u4.ReceiveHandler) + { + NDIS_DbgPrint(MIN_TRACE, ("AdapterBinding->ProtocolBinding->Chars.u4.ReceiveHandler was null\n")); + break; + } +#endif + + /* call the receive handler */ + (*AdapterBinding->ProtocolBinding->Chars.u4.ReceiveHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext, + MacReceiveContext, + HeaderBuffer, + HeaderBufferSize, + LookaheadBuffer, + LookaheadBufferSize, + PacketSize); + + /* see above */ + /* KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); */ + + CurrentEntry = CurrentEntry->Flink; + } + } + //KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + + NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); +} + + VOID STDCALL MiniIndicateReceivePacket( IN NDIS_HANDLE Miniport, @@ -269,7 +305,7 @@ MiniIndicateReceivePacket( } } - + VOID MiniEthReceiveComplete( IN PETH_FILTER Filter) @@ -279,35 +315,40 @@ MiniEthReceiveComplete( * Filter = Pointer to Ethernet filter */ { - KIRQL OldIrql; - PLIST_ENTRY CurrentEntry; - PLOGICAL_ADAPTER Adapter; - PADAPTER_BINDING AdapterBinding; + KIRQL OldIrql; + PLIST_ENTRY CurrentEntry; + PLOGICAL_ADAPTER Adapter; + PADAPTER_BINDING AdapterBinding; - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - Adapter = (PLOGICAL_ADAPTER)Filter->Miniport; + Adapter = (PLOGICAL_ADAPTER)Filter->Miniport; - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); - CurrentEntry = Adapter->ProtocolListHead.Flink; - while (CurrentEntry != &Adapter->ProtocolListHead) { - AdapterBinding = CONTAINING_RECORD(CurrentEntry, - ADAPTER_BINDING, - AdapterListEntry); + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + { + CurrentEntry = Adapter->ProtocolListHead.Flink; - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + while (CurrentEntry != &Adapter->ProtocolListHead) + { + AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry); - (*AdapterBinding->ProtocolBinding->Chars.ReceiveCompleteHandler)( - AdapterBinding->NdisOpenBlock.ProtocolBindingContext); + /* see comment in MiniIndicateData */ + /* KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); */ - KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + (*AdapterBinding->ProtocolBinding->Chars.ReceiveCompleteHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext); - CurrentEntry = CurrentEntry->Flink; + /* see above */ + /* KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); */ + + CurrentEntry = CurrentEntry->Flink; + } } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); } - + VOID MiniEthReceiveIndication( IN PETH_FILTER Filter, /* shouldn't be NDIS_HANDLE? */ @@ -340,7 +381,7 @@ MiniEthReceiveIndication( PacketSize); } - + VOID MiniResetComplete( IN NDIS_HANDLE MiniportAdapterHandle, @@ -405,7 +446,7 @@ MiniTransferDataComplete( BytesTransferred); } - + BOOLEAN MiniAdapterHasAddress( PLOGICAL_ADAPTER Adapter, @@ -419,69 +460,73 @@ MiniAdapterHasAddress( * TRUE if the destination address is that of the adapter, FALSE if not */ { - UINT Length; - PUCHAR Start1; - PUCHAR Start2; - PNDIS_BUFFER NdisBuffer; - UINT BufferLength; + UINT Length; + PUCHAR Start1; + PUCHAR Start2; + PNDIS_BUFFER NdisBuffer; + UINT BufferLength; - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); #if DBG - if(!Adapter) - { - NDIS_DbgPrint(MID_TRACE, ("Adapter object was null\n")); - return FALSE; - } - - if(!Packet) - { - NDIS_DbgPrint(MID_TRACE, ("Packet was null\n")); - return FALSE; - } -#endif - - NdisQueryPacket(Packet, NULL, NULL, &NdisBuffer, NULL); - if (!NdisBuffer) { - NDIS_DbgPrint(MID_TRACE, ("Packet contains no buffers.\n")); - return FALSE; + if(!Adapter) + { + NDIS_DbgPrint(MID_TRACE, ("Adapter object was null\n")); + return FALSE; } - NdisQueryBuffer(NdisBuffer, (PVOID)&Start2, &BufferLength); + if(!Packet) + { + NDIS_DbgPrint(MID_TRACE, ("Packet was null\n")); + return FALSE; + } +#endif - /* FIXME: Should handle fragmented packets */ + NdisQueryPacket(Packet, NULL, NULL, &NdisBuffer, NULL); - switch (Adapter->NdisMiniportBlock.MediaType) { - case NdisMedium802_3: + if (!NdisBuffer) + { + NDIS_DbgPrint(MID_TRACE, ("Packet contains no buffers.\n")); + return FALSE; + } + + NdisQueryBuffer(NdisBuffer, (PVOID)&Start2, &BufferLength); + + /* FIXME: Should handle fragmented packets */ + + switch (Adapter->NdisMiniportBlock.MediaType) + { + case NdisMedium802_3: Length = ETH_LENGTH_OF_ADDRESS; /* Destination address is the first field */ break; - default: - NDIS_DbgPrint(MIN_TRACE, ("Adapter has unsupported media type (0x%X).\n", - Adapter->NdisMiniportBlock.MediaType)); + default: + NDIS_DbgPrint(MIN_TRACE, ("Adapter has unsupported media type (0x%X).\n", Adapter->NdisMiniportBlock.MediaType)); return FALSE; } - if (BufferLength < Length) { + if (BufferLength < Length) + { NDIS_DbgPrint(MID_TRACE, ("Buffer is too small.\n")); return FALSE; } - Start1 = (PUCHAR)&Adapter->Address; - NDIS_DbgPrint(MAX_TRACE, ("packet address: %x:%x:%x:%x:%x:%x adapter address: %x:%x:%x:%x:%x:%x\n", - *((char *)Start1), *(((char *)Start1)+1), *(((char *)Start1)+2), *(((char *)Start1)+3), *(((char *)Start1)+4), *(((char *)Start1)+5), - *((char *)Start2), *(((char *)Start2)+1), *(((char *)Start2)+2), *(((char *)Start2)+3), *(((char *)Start2)+4), *(((char *)Start2)+5) - )); - return (RtlCompareMemory((PVOID)Start1, (PVOID)Start2, Length) == Length); + Start1 = (PUCHAR)&Adapter->Address; + NDIS_DbgPrint(MAX_TRACE, ("packet address: %x:%x:%x:%x:%x:%x adapter address: %x:%x:%x:%x:%x:%x\n", + *((char *)Start1), *(((char *)Start1)+1), *(((char *)Start1)+2), *(((char *)Start1)+3), *(((char *)Start1)+4), *(((char *)Start1)+5), + *((char *)Start2), *(((char *)Start2)+1), *(((char *)Start2)+2), *(((char *)Start2)+3), *(((char *)Start2)+4), *(((char *)Start2)+5)) + ); + + return (RtlCompareMemory((PVOID)Start1, (PVOID)Start2, Length) == Length); } - + PLOGICAL_ADAPTER MiniLocateDevice( PNDIS_STRING AdapterName) /* - * FUNCTION: Returns the logical adapter object for a specific adapter + * FUNCTION: Finds an adapter object by name * ARGUMENTS: * AdapterName = Pointer to name of adapter * RETURNS: @@ -490,36 +535,60 @@ MiniLocateDevice( * is responsible for dereferencing after use */ { - KIRQL OldIrql; - PLIST_ENTRY CurrentEntry; - PLOGICAL_ADAPTER Adapter; + KIRQL OldIrql; + PLIST_ENTRY CurrentEntry; + PLOGICAL_ADAPTER Adapter = 0; - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + ASSERT(AdapterName); - KeAcquireSpinLock(&AdapterListLock, &OldIrql); - CurrentEntry = AdapterListHead.Flink; - while (CurrentEntry != &AdapterListHead) { - Adapter = CONTAINING_RECORD(CurrentEntry, LOGICAL_ADAPTER, ListEntry); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - if (RtlCompareUnicodeString(AdapterName, &Adapter->DeviceName, TRUE) == 0) { - ReferenceObject(Adapter); - KeReleaseSpinLock(&AdapterListLock, OldIrql); - - NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving. Adapter found at (0x%X).\n", Adapter)); - - return Adapter; - } - - CurrentEntry = CurrentEntry->Flink; + if(IsListEmpty(&AdapterListHead)) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("No registered miniports for protocol to bind to\n")); + return NULL; } - KeReleaseSpinLock(&AdapterListLock, OldIrql); - NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving (adapter not found).\n")); + KeAcquireSpinLock(&AdapterListLock, &OldIrql); + { + do + { + CurrentEntry = AdapterListHead.Flink; - return NULL; + while (CurrentEntry != &AdapterListHead) + { + Adapter = CONTAINING_RECORD(CurrentEntry, LOGICAL_ADAPTER, ListEntry); + + ASSERT(Adapter); + + NDIS_DbgPrint(DEBUG_MINIPORT, ("AdapterName = %wZ\n", &AdapterName)); + NDIS_DbgPrint(DEBUG_MINIPORT, ("DeviceName = %wZ\n", &Adapter->DeviceName)); + + if (RtlCompareUnicodeString(AdapterName, &Adapter->DeviceName, TRUE) == 0) + { + ReferenceObject(Adapter); + break; + } + + CurrentEntry = CurrentEntry->Flink; + } + } while (0); + } + KeReleaseSpinLock(&AdapterListLock, OldIrql); + + if(Adapter) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving. Adapter found at 0x%x\n", Adapter)); + } + else + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving (adapter not found).\n")); + } + + return Adapter; } - + NDIS_STATUS MiniQueryInformation( PLOGICAL_ADAPTER Adapter, @@ -538,64 +607,75 @@ MiniQueryInformation( * and the query is attempted again * RETURNS: * Status of operation + * TODO: + * Is there any way to use the buffer provided by the protocol? */ { - NDIS_STATUS NdisStatus; - ULONG BytesNeeded; + NDIS_STATUS NdisStatus; + ULONG BytesNeeded; - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - if (Adapter->QueryBufferLength == 0) { - Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, (Size == 0)? 32 : Size); + if (Adapter->QueryBufferLength == 0) + { + /* XXX is 32 the right number? */ + Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, (Size == 0)? 32 : Size); - if (!Adapter->QueryBuffer) { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return NDIS_STATUS_RESOURCES; + if (!Adapter->QueryBuffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return NDIS_STATUS_RESOURCES; } - Adapter->QueryBufferLength = (Size == 0)? 32 : Size; + /* ditto */ + Adapter->QueryBufferLength = (Size == 0)? 32 : Size; } - BytesNeeded = (Size == 0)? Adapter->QueryBufferLength : Size; + /* this is the third time i've seen this conditional */ + BytesNeeded = (Size == 0)? Adapter->QueryBufferLength : Size; - NdisStatus = (*Adapter->Miniport->Chars.QueryInformationHandler)( - Adapter->NdisMiniportBlock.MiniportAdapterContext, - Oid, - Adapter->QueryBuffer, - BytesNeeded, - BytesWritten, - &BytesNeeded); + /* call the miniport's queryinfo handler */ + NdisStatus = (*Adapter->Miniport->Chars.QueryInformationHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + Oid, + Adapter->QueryBuffer, + BytesNeeded, + BytesWritten, + &BytesNeeded); - if ((NT_SUCCESS(NdisStatus)) || (NdisStatus == NDIS_STATUS_PENDING)) { - NDIS_DbgPrint(DEBUG_MINIPORT, ("Miniport returned status (0x%X).\n", NdisStatus)); - return NdisStatus; + /* XXX is status_pending part of success macro? */ + if ((NT_SUCCESS(NdisStatus)) || (NdisStatus == NDIS_STATUS_PENDING)) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Miniport returned status (0x%X).\n", NdisStatus)); + return NdisStatus; } - if (NdisStatus == NDIS_STATUS_INVALID_LENGTH) { - ExFreePool(Adapter->QueryBuffer); + if (NdisStatus == NDIS_STATUS_INVALID_LENGTH) + { + ExFreePool(Adapter->QueryBuffer); - Adapter->QueryBufferLength += BytesNeeded; - Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, - Adapter->QueryBufferLength); + Adapter->QueryBufferLength += BytesNeeded; + Adapter->QueryBuffer = ExAllocatePool(NonPagedPool, Adapter->QueryBufferLength); - if (!Adapter->QueryBuffer) { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return NDIS_STATUS_RESOURCES; + if (!Adapter->QueryBuffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return NDIS_STATUS_RESOURCES; } - NdisStatus = (*Adapter->Miniport->Chars.QueryInformationHandler)( - Adapter->NdisMiniportBlock.MiniportAdapterContext, - Oid, - Adapter->QueryBuffer, - Size, - BytesWritten, - &BytesNeeded); + NdisStatus = (*Adapter->Miniport->Chars.QueryInformationHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + Oid, + Adapter->QueryBuffer, + Size, + BytesWritten, + &BytesNeeded); } - return NdisStatus; + return NdisStatus; } - + NDIS_STATUS FASTCALL MiniQueueWorkItem( @@ -616,42 +696,55 @@ MiniQueueWorkItem( * Status of operation */ { - PNDIS_MINIPORT_WORK_ITEM Item; + PNDIS_MINIPORT_WORK_ITEM Item; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if (Adapter->WorkQueueLevel < NDIS_MINIPORT_WORK_QUEUE_SIZE - 1) { - Item = &Adapter->WorkQueue[Adapter->WorkQueueLevel]; - Adapter->WorkQueueLevel++; - } else { - Item = ExAllocatePool(NonPagedPool, sizeof(NDIS_MINIPORT_WORK_ITEM)); - if (Item) { - /* Set flag so we know that the buffer should be freed - when work item is dequeued */ - Item->Allocated = TRUE; - } else { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return NDIS_STATUS_RESOURCES; + ASSERT(Adapter); + + if (Adapter->WorkQueueLevel < NDIS_MINIPORT_WORK_QUEUE_SIZE - 1) + { + Item = &Adapter->WorkQueue[Adapter->WorkQueueLevel]; + Adapter->WorkQueueLevel++; + } + else + { + Item = ExAllocatePool(NonPagedPool, sizeof(NDIS_MINIPORT_WORK_ITEM)); + if (Item) + { + /* Set flag so we know that the buffer should be freed when work item is dequeued */ + Item->Allocated = TRUE; + } + else + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return NDIS_STATUS_RESOURCES; } } - Item->WorkItemType = WorkItemType; - Item->WorkItemContext = WorkItemContext; - Item->Initiator = Initiator; + Item->WorkItemType = WorkItemType; + Item->WorkItemContext = WorkItemContext; + Item->Initiator = Initiator; - Item->Link.Next = NULL; - if (!Adapter->WorkQueueHead) { - Adapter->WorkQueueHead = Item; - } else { - Adapter->WorkQueueTail->Link.Next = (PSINGLE_LIST_ENTRY)Item; + /* safe due to adapter lock held */ + Item->Link.Next = NULL; + if (!Adapter->WorkQueueHead) + { + Adapter->WorkQueueHead = Item; + Adapter->WorkQueueTail = Item; + } + else + { + Adapter->WorkQueueTail->Link.Next = (PSINGLE_LIST_ENTRY)Item; + Adapter->WorkQueueTail = Item; } - KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); + KeInsertQueueDpc(&Adapter->MiniportDpc, NULL, NULL); - return NDIS_STATUS_SUCCESS; + return NDIS_STATUS_SUCCESS; } - + NDIS_STATUS FASTCALL MiniDequeueWorkItem( @@ -672,38 +765,46 @@ MiniDequeueWorkItem( * Status of operation */ { - PNDIS_MINIPORT_WORK_ITEM Item; + PNDIS_MINIPORT_WORK_ITEM Item; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - Item = Adapter->WorkQueueHead; - if (Item) { - Adapter->WorkQueueHead = (PNDIS_MINIPORT_WORK_ITEM)Item->Link.Next; - if (Item == Adapter->WorkQueueTail) - Adapter->WorkQueueTail = NULL; + Item = Adapter->WorkQueueHead; - *WorkItemType = Item->WorkItemType; - *WorkItemContext = Item->WorkItemContext; - *Initiator = Item->Initiator; + if (Item) + { + /* safe due to adapter lock held */ + Adapter->WorkQueueHead = (PNDIS_MINIPORT_WORK_ITEM)Item->Link.Next; - if (Item->Allocated) { + if (Item == Adapter->WorkQueueTail) + Adapter->WorkQueueTail = NULL; + + *WorkItemType = Item->WorkItemType; + *WorkItemContext = Item->WorkItemContext; + *Initiator = Item->Initiator; + + if (Item->Allocated) + { ExFreePool(Item); - } else { - Adapter->WorkQueueLevel--; + } + else + { + Adapter->WorkQueueLevel--; #ifdef DBG - if (Adapter->WorkQueueLevel < 0) { - NDIS_DbgPrint(MIN_TRACE, ("Adapter->WorkQueueLevel is < 0 (should be >= 0).\n")); + if (Adapter->WorkQueueLevel < 0) + { + NDIS_DbgPrint(MIN_TRACE, ("Adapter->WorkQueueLevel is < 0 (should be >= 0).\n")); } #endif } - return NDIS_STATUS_SUCCESS; + return NDIS_STATUS_SUCCESS; } - return NDIS_STATUS_FAILURE; + return NDIS_STATUS_FAILURE; } - + NDIS_STATUS MiniDoRequest( PLOGICAL_ADAPTER Adapter, @@ -717,12 +818,13 @@ MiniDoRequest( * Status of operation */ { - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - Adapter->NdisMiniportBlock.MediaRequest = NdisRequest; + Adapter->NdisMiniportBlock.MediaRequest = NdisRequest; - switch (NdisRequest->RequestType) { - case NdisRequestQueryInformation: + switch (NdisRequest->RequestType) + { + case NdisRequestQueryInformation: return (*Adapter->Miniport->Chars.QueryInformationHandler)( Adapter->NdisMiniportBlock.MiniportAdapterContext, NdisRequest->DATA.QUERY_INFORMATION.Oid, @@ -732,7 +834,7 @@ MiniDoRequest( (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded); break; - case NdisRequestSetInformation: + case NdisRequestSetInformation: return (*Adapter->Miniport->Chars.SetInformationHandler)( Adapter->NdisMiniportBlock.MiniportAdapterContext, NdisRequest->DATA.SET_INFORMATION.Oid, @@ -742,12 +844,12 @@ MiniDoRequest( (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesNeeded); break; - default: + default: return NDIS_STATUS_FAILURE; } } - + VOID STDCALL MiniportDpc( IN PKDPC Dpc, IN PVOID DeferredContext, @@ -762,25 +864,27 @@ VOID STDCALL MiniportDpc( * SystemArgument2 = Unused */ { - NDIS_STATUS NdisStatus; - PVOID WorkItemContext; - NDIS_WORK_ITEM_TYPE WorkItemType; - PADAPTER_BINDING AdapterBinding; - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); + NDIS_STATUS NdisStatus; + PVOID WorkItemContext; + NDIS_WORK_ITEM_TYPE WorkItemType; + PADAPTER_BINDING AdapterBinding; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); + NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - NdisStatus = MiniDequeueWorkItem(Adapter, - &WorkItemType, - &WorkItemContext, - (PNDIS_HANDLE)&AdapterBinding); - if (NdisStatus == NDIS_STATUS_SUCCESS) { - Adapter->MiniportAdapterBinding = AdapterBinding; - switch (WorkItemType) { - case NdisWorkItemSend: - /* - * called by ProSend when protocols want to send packets to the miniport - */ + /* XXX is adapter lock held here? should be... */ + NdisStatus = MiniDequeueWorkItem(Adapter, &WorkItemType, &WorkItemContext, (PNDIS_HANDLE)&AdapterBinding); + + if (NdisStatus == NDIS_STATUS_SUCCESS) + { + Adapter->MiniportAdapterBinding = AdapterBinding; + + switch (WorkItemType) + { + case NdisWorkItemSend: + /* + * called by ProSend when protocols want to send packets to the miniport + */ #ifdef DBG MiniDisplayPacket((PNDIS_PACKET)WorkItemContext); #endif @@ -800,8 +904,10 @@ VOID STDCALL MiniportDpc( else { NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n")); + NdisStatus = (*Adapter->Miniport->Chars.u1.SendHandler)( Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext, 0); + NDIS_DbgPrint(MAX_TRACE, ("back from miniport's Send handler\n")); if (NdisStatus != NDIS_STATUS_PENDING) @@ -810,59 +916,60 @@ VOID STDCALL MiniportDpc( break; - case NdisWorkItemSendLoopback: - /* - * called by ProSend when protocols want to send loopback packets - */ + case NdisWorkItemSendLoopback: + /* + * called by ProSend when protocols want to send loopback packets + */ /* XXX atm ProIndicatePacket sends a packet up via the loopback adapter only */ NdisStatus = ProIndicatePacket(Adapter, (PNDIS_PACKET)WorkItemContext); MiniSendComplete((NDIS_HANDLE)Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus); break; - case NdisWorkItemReturnPackets: + case NdisWorkItemReturnPackets: break; - case NdisWorkItemResetRequested: + case NdisWorkItemResetRequested: break; - case NdisWorkItemResetInProgress: + case NdisWorkItemResetInProgress: break; - case NdisWorkItemHalt: + case NdisWorkItemHalt: break; - case NdisWorkItemMiniportCallback: + case NdisWorkItemMiniportCallback: break; - case NdisWorkItemRequest: + case NdisWorkItemRequest: NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext); if (NdisStatus == NDIS_STATUS_PENDING) - break; + break; - switch (((PNDIS_REQUEST)WorkItemContext)->RequestType) { - case NdisRequestQueryInformation: - NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus); - break; + switch (((PNDIS_REQUEST)WorkItemContext)->RequestType) + { + case NdisRequestQueryInformation: + NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus); + break; - case NdisRequestSetInformation: - NdisMSetInformationComplete((NDIS_HANDLE)Adapter, NdisStatus); - break; + case NdisRequestSetInformation: + NdisMSetInformationComplete((NDIS_HANDLE)Adapter, NdisStatus); + break; - default: - NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS request type.\n")); - break; - } + default: + NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS request type.\n")); + break; + } break; - default: + default: NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS work item type (%d).\n", WorkItemType)); break; } } } - + /* * @unimplemented */ @@ -874,7 +981,7 @@ NdisMCloseLog( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -887,10 +994,10 @@ NdisMCreateLog( { UNIMPLEMENTED - return NDIS_STATUS_FAILURE; + return NDIS_STATUS_FAILURE; } - + /* * @implemented */ @@ -910,7 +1017,7 @@ NdisMDeregisterAdapterShutdownHandler( KeDeregisterBugCheckCallback(Adapter->BugcheckContext->CallbackRecord); } - + /* * @unimplemented */ @@ -949,7 +1056,7 @@ NdisMIndicateStatusComplete( UNIMPLEMENTED } - + /* * @implemented */ @@ -971,67 +1078,69 @@ NdisInitializeWrapper( * - SystemSpecific2 goes invalid so we copy it */ { - PMINIPORT_DRIVER Miniport; - PUNICODE_STRING RegistryPath; - WCHAR *RegistryBuffer; + PMINIPORT_DRIVER Miniport; + PUNICODE_STRING RegistryPath; + WCHAR *RegistryBuffer; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + + ASSERT(NdisWrapperHandle); + + *NdisWrapperHandle = NULL; #if BREAK_ON_MINIPORT_INIT __asm__ ("int $3\n"); #endif - Miniport = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_DRIVER)); - if (!Miniport) { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - *NdisWrapperHandle = NULL; - return; - } + Miniport = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_DRIVER)); - RtlZeroMemory(Miniport, sizeof(MINIPORT_DRIVER)); - - KeInitializeSpinLock(&Miniport->Lock); - - Miniport->RefCount = 1; - - Miniport->DriverObject = (PDRIVER_OBJECT)SystemSpecific1; - - /* set the miniport's driver registry path */ - RegistryPath = ExAllocatePool(PagedPool, sizeof(UNICODE_STRING)); - if(!RegistryPath) + if (!Miniport) { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return; + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return; } - RegistryPath->Length = ((PUNICODE_STRING)SystemSpecific2)->Length; - RegistryPath->MaximumLength = RegistryPath->Length + sizeof(WCHAR); /* room for 0-term */ + RtlZeroMemory(Miniport, sizeof(MINIPORT_DRIVER)); - RegistryBuffer = ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR)); - if(!RegistryBuffer) + KeInitializeSpinLock(&Miniport->Lock); + + Miniport->RefCount = 1; + + 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; + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return; } - RtlCopyMemory(RegistryBuffer, ((PUNICODE_STRING)SystemSpecific2)->Buffer, RegistryPath->Length); - RegistryBuffer[RegistryPath->Length/sizeof(WCHAR)] = 0; + RegistryPath->Length = ((PUNICODE_STRING)SystemSpecific2)->Length; + RegistryPath->MaximumLength = RegistryPath->Length + sizeof(WCHAR); /* room for 0-term */ - RegistryPath->Buffer = RegistryBuffer; - Miniport->RegistryPath = RegistryPath; + RegistryBuffer = ExAllocatePool(PagedPool, RegistryPath->MaximumLength); + if(!RegistryBuffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return; + } - InitializeListHead(&Miniport->AdapterListHead); + RtlCopyMemory(RegistryBuffer, ((PUNICODE_STRING)SystemSpecific2)->Buffer, RegistryPath->Length); + RegistryBuffer[RegistryPath->Length/sizeof(WCHAR)] = 0; - /* Put miniport in global miniport list */ - ExInterlockedInsertTailList(&MiniportListHead, - &Miniport->ListEntry, - &MiniportListLock); + RegistryPath->Buffer = RegistryBuffer; + Miniport->RegistryPath = RegistryPath; - *NdisWrapperHandle = Miniport; + InitializeListHead(&Miniport->AdapterListHead); + /* Put miniport in global miniport list */ + ExInterlockedInsertTailList(&MiniportListHead, &Miniport->ListEntry, &MiniportListLock); + + *NdisWrapperHandle = Miniport; } - + /* * @implemented */ @@ -1041,18 +1150,18 @@ NdisMQueryInformationComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status) { - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); - PADAPTER_BINDING AdapterBinding = (PADAPTER_BINDING)Adapter->MiniportAdapterBinding; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); + PADAPTER_BINDING AdapterBinding = (PADAPTER_BINDING)Adapter->MiniportAdapterBinding; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - (*AdapterBinding->ProtocolBinding->Chars.RequestCompleteHandler)( - AdapterBinding->NdisOpenBlock.ProtocolBindingContext, - Adapter->NdisMiniportBlock.MediaRequest, - Status); + (*AdapterBinding->ProtocolBinding->Chars.RequestCompleteHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext, + Adapter->NdisMiniportBlock.MediaRequest, + Status); } - + VOID NdisIBugcheckCallback( IN PVOID Buffer, IN ULONG Length) @@ -1072,7 +1181,7 @@ VOID NdisIBugcheckCallback( sh(Context->DriverContext); } - + /* * @implemented */ @@ -1118,7 +1227,7 @@ NdisMRegisterAdapterShutdownHandler( BugcheckContext, sizeof(BugcheckContext), "Ndis Miniport"); } - + NDIS_STATUS DoQueries( PLOGICAL_ADAPTER Adapter, @@ -1132,89 +1241,83 @@ DoQueries( * Status of operation */ { - ULONG BytesWritten; - NDIS_STATUS NdisStatus; + ULONG BytesWritten; + NDIS_STATUS NdisStatus; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - /* Get MAC options for adapter */ - NdisStatus = MiniQueryInformation(Adapter, - OID_GEN_MAC_OPTIONS, - 0, - &BytesWritten); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAC_OPTIONS failed. NdisStatus (0x%X).\n", NdisStatus)); - return NdisStatus; + /* Get MAC options for adapter */ + NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAC_OPTIONS, 0, &BytesWritten); + + if (NdisStatus != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAC_OPTIONS failed. NdisStatus (0x%X).\n", NdisStatus)); + return NdisStatus; } - RtlCopyMemory(&Adapter->NdisMiniportBlock.MacOptions, Adapter->QueryBuffer, sizeof(UINT)); + RtlCopyMemory(&Adapter->NdisMiniportBlock.MacOptions, Adapter->QueryBuffer, sizeof(UINT)); - NDIS_DbgPrint(DEBUG_MINIPORT, ("MacOptions (0x%X).\n", Adapter->NdisMiniportBlock.MacOptions)); + NDIS_DbgPrint(DEBUG_MINIPORT, ("MacOptions (0x%X).\n", Adapter->NdisMiniportBlock.MacOptions)); - /* Get current hardware address of adapter */ - NdisStatus = MiniQueryInformation(Adapter, - AddressOID, - 0, - &BytesWritten); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - NDIS_DbgPrint(MIN_TRACE, ("Address OID (0x%X) failed. NdisStatus (0x%X).\n", - AddressOID, NdisStatus)); - return NdisStatus; + /* Get current hardware address of adapter */ + NdisStatus = MiniQueryInformation(Adapter, AddressOID, 0, &BytesWritten); + + if (NdisStatus != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE, ("Address OID (0x%X) failed. NdisStatus (0x%X).\n", AddressOID, NdisStatus)); + return NdisStatus; } - RtlCopyMemory(&Adapter->Address, Adapter->QueryBuffer, Adapter->AddressLength); + RtlCopyMemory(&Adapter->Address, Adapter->QueryBuffer, Adapter->AddressLength); #ifdef DBG { - /* 802.3 only */ + /* 802.3 only */ - PUCHAR A = (PUCHAR)&Adapter->Address.Type.Medium802_3; + PUCHAR A = (PUCHAR)&Adapter->Address.Type.Medium802_3; - NDIS_DbgPrint(MAX_TRACE, ("Adapter address is (%02X %02X %02X %02X %02X %02X).\n", - A[0], A[1], A[2], A[3], A[4], A[5])); + NDIS_DbgPrint(MAX_TRACE, ("Adapter address is (%02X %02X %02X %02X %02X %02X).\n", A[0], A[1], A[2], A[3], A[4], A[5])); } #endif /* DBG */ - /* Get maximum lookahead buffer size of adapter */ - NdisStatus = MiniQueryInformation(Adapter, - OID_GEN_MAXIMUM_LOOKAHEAD, - 0, - &BytesWritten); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus)); - return NdisStatus; + /* Get maximum lookahead buffer size of adapter */ + NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_LOOKAHEAD, 0, &BytesWritten); + + if (NdisStatus != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus)); + return NdisStatus; } - Adapter->MaxLookaheadLength = *((PULONG)Adapter->QueryBuffer); + Adapter->MaxLookaheadLength = *((PULONG)Adapter->QueryBuffer); - NDIS_DbgPrint(DEBUG_MINIPORT, ("MaxLookaheadLength (0x%X).\n", Adapter->MaxLookaheadLength)); + NDIS_DbgPrint(DEBUG_MINIPORT, ("MaxLookaheadLength (0x%X).\n", Adapter->MaxLookaheadLength)); - /* Get current lookahead buffer size of adapter */ - NdisStatus = MiniQueryInformation(Adapter, - OID_GEN_CURRENT_LOOKAHEAD, - 0, - &BytesWritten); - if (NdisStatus != NDIS_STATUS_SUCCESS) { - NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_CURRENT_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus)); - return NdisStatus; + /* Get current lookahead buffer size of adapter */ + NdisStatus = MiniQueryInformation(Adapter, OID_GEN_CURRENT_LOOKAHEAD, 0, &BytesWritten); + + if (NdisStatus != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_CURRENT_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus)); + return NdisStatus; } - Adapter->CurLookaheadLength = *((PULONG)Adapter->QueryBuffer); + Adapter->CurLookaheadLength = *((PULONG)Adapter->QueryBuffer); - NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->CurLookaheadLength)); + NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->CurLookaheadLength)); - if (Adapter->MaxLookaheadLength != 0) { - Adapter->LookaheadLength = Adapter->MaxLookaheadLength + - Adapter->MediumHeaderSize; - Adapter->LookaheadBuffer = ExAllocatePool(NonPagedPool, - Adapter->LookaheadLength); - if (!Adapter->LookaheadBuffer) - return NDIS_STATUS_RESOURCES; + if (Adapter->MaxLookaheadLength != 0) + { + Adapter->LookaheadLength = Adapter->MaxLookaheadLength + Adapter->MediumHeaderSize; + Adapter->LookaheadBuffer = ExAllocatePool(NonPagedPool, Adapter->LookaheadLength); + + if (!Adapter->LookaheadBuffer) + return NDIS_STATUS_RESOURCES; } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - + VOID NdisIStartAdapter( WCHAR *DeviceNameStr, @@ -1229,6 +1332,7 @@ NdisIStartAdapter( * NOTES: * TODO: * - verify that all resources are properly freed on success & failure + * - break up this 250-line function */ { WCHAR *DeviceName; @@ -1312,9 +1416,8 @@ NdisIStartAdapter( if(!NT_SUCCESS(Status)) { NDIS_DbgPrint(MIN_TRACE, ("HalAssignSlotResources broke: 0x%x\n", Status)); -#ifdef DBG - __asm__ ("int $3\n"); -#endif + ASSERT(0); + /* i guess we should just give up on this adapter */ break; } @@ -1392,6 +1495,7 @@ NdisIStartAdapter( NDIS_DbgPrint(MAX_TRACE, ("opened device reg key: %wZ\n", &RegKeyPathU)); + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeInitializeSpinLock(&Adapter->NdisMiniportBlock.Lock); InitializeListHead(&Adapter->ProtocolListHead); Adapter->RefCount = 1; @@ -1448,6 +1552,7 @@ NdisIStartAdapter( default: /* FIXME: Support other types of media */ + NDIS_DbgPrint(MIN_TRACE, ("error: unsupported media\n")); ExFreePool(Adapter); ASSERT(FALSE); return; @@ -1480,6 +1585,7 @@ NdisIStartAdapter( } } + /* * @implemented */ @@ -1504,125 +1610,135 @@ NdisMRegisterMiniport( * 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; + 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; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - switch (MiniportCharacteristics->MajorNdisVersion) { - case 0x03: + switch (MiniportCharacteristics->MajorNdisVersion) + { + case 0x03: MinSize = sizeof(NDIS30_MINIPORT_CHARACTERISTICS_S); break; - case 0x04: + case 0x04: MinSize = sizeof(NDIS40_MINIPORT_CHARACTERISTICS_S); break; - case 0x05: + case 0x05: MinSize = sizeof(NDIS50_MINIPORT_CHARACTERISTICS_S); break; - default: + default: NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics version.\n")); return NDIS_STATUS_BAD_VERSION; } - if (CharacteristicsLength < MinSize) { + if (CharacteristicsLength < MinSize) + { NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); return NDIS_STATUS_BAD_CHARACTERISTICS; } - /* Check if mandatory MiniportXxx functions are specified */ - if ((!MiniportCharacteristics->HaltHandler) || - (!MiniportCharacteristics->InitializeHandler)|| - (!MiniportCharacteristics->QueryInformationHandler) || - (!MiniportCharacteristics->ResetHandler) || - (!MiniportCharacteristics->SetInformationHandler)) { - NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); - return NDIS_STATUS_BAD_CHARACTERISTICS; + /* Check if mandatory MiniportXxx functions are specified */ + if ((!MiniportCharacteristics->HaltHandler) || + (!MiniportCharacteristics->InitializeHandler)|| + (!MiniportCharacteristics->QueryInformationHandler) || + (!MiniportCharacteristics->ResetHandler) || + (!MiniportCharacteristics->SetInformationHandler)) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); + return NDIS_STATUS_BAD_CHARACTERISTICS; } - if (MiniportCharacteristics->MajorNdisVersion == 0x03) { - if (!MiniportCharacteristics->u1.SendHandler) { - NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); - return NDIS_STATUS_BAD_CHARACTERISTICS; + if (MiniportCharacteristics->MajorNdisVersion == 0x03) + { + if (!MiniportCharacteristics->u1.SendHandler) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); + return NDIS_STATUS_BAD_CHARACTERISTICS; } - } else if (MiniportCharacteristics->MajorNdisVersion >= 0x04) { - /* NDIS 4.0+ */ - if ((!MiniportCharacteristics->u1.SendHandler) && - (!MiniportCharacteristics->SendPacketsHandler)) { - NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); - return NDIS_STATUS_BAD_CHARACTERISTICS; + } + else if (MiniportCharacteristics->MajorNdisVersion >= 0x04) + { + /* NDIS 4.0+ */ + if ((!MiniportCharacteristics->u1.SendHandler) && + (!MiniportCharacteristics->SendPacketsHandler)) + { + NDIS_DbgPrint(DEBUG_MINIPORT, ("Bad miniport characteristics.\n")); + return NDIS_STATUS_BAD_CHARACTERISTICS; } } - /* TODO: verify NDIS5 and NDIS5.1 */ + /* TODO: verify NDIS5 and NDIS5.1 */ - RtlCopyMemory(&Miniport->Chars, MiniportCharacteristics, MinSize); + 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. - */ + /* + * 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 + */ - /* Read the miniport config from the registry */ - InitializeObjectAttributes(&DeviceKeyAttributes, Miniport->RegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL); + /* 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 = 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; + 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); + RtlInitUnicodeString(&LinkageKeyName, L"Linkage"); + InitializeObjectAttributes(&LinkageKeyAttributes, &LinkageKeyName, OBJ_CASE_INSENSITIVE, DeviceKeyHandle, NULL); - Status = ZwOpenKey(&LinkageKeyHandle, KEY_READ, &LinkageKeyAttributes); - if(!NT_SUCCESS(Status)) + 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; + 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) + RouteData = ExAllocatePool(PagedPool, ROUTE_DATA_SIZE); + if(!RouteData) { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources\n")); - ZwClose(LinkageKeyHandle); - ZwClose(DeviceKeyHandle); - return NDIS_STATUS_RESOURCES; + NDIS_DbgPrint(MIN_TRACE,("Insufficient resources\n")); + ZwClose(LinkageKeyHandle); + ZwClose(DeviceKeyHandle); + return NDIS_STATUS_RESOURCES; } - RtlInitUnicodeString(&RouteVal, L"Route"); + RtlInitUnicodeString(&RouteVal, L"Route"); - Status = ZwQueryValueKey(LinkageKeyHandle, &RouteVal, KeyValuePartialInformation, RouteData, ROUTE_DATA_SIZE, &RouteDataLength); - if(!NT_SUCCESS(Status)) + 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; + NDIS_DbgPrint(MIN_TRACE,("Failed to query Route value\n")); + ZwClose(LinkageKeyHandle); + ZwClose(DeviceKeyHandle); + ExFreePool(RouteData); + return NDIS_STATUS_FAILURE; } - ZwClose(LinkageKeyHandle); - ZwClose(DeviceKeyHandle); + ZwClose(LinkageKeyHandle); + ZwClose(DeviceKeyHandle); - /* route is a REG_MULTI_SZ with each nic object created by NDI - create an adapter for each */ + /* 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))); @@ -1630,14 +1746,15 @@ NdisMRegisterMiniport( NdisIStartAdapter((WCHAR *)(RouteData->Data + NextRouteOffset), wcslen((WCHAR *)(RouteData->Data + NextRouteOffset)), Miniport); - NextRouteOffset += wcslen((WCHAR *)(RouteData->Data + NextRouteOffset)); + /* NextRouteOffset is in bytes, not WCHARs */ + NextRouteOffset += wcslen((WCHAR *)(RouteData->Data + NextRouteOffset)) * sizeof(WCHAR); } - ExFreePool(RouteData); - return NDIS_STATUS_SUCCESS; + ExFreePool(RouteData); + return NDIS_STATUS_SUCCESS; } - + /* * @implemented */ @@ -1648,12 +1765,10 @@ NdisMResetComplete( IN NDIS_STATUS Status, IN BOOLEAN AddressingReset) { - MiniResetComplete(MiniportAdapterHandle, - Status, - AddressingReset); + MiniResetComplete(MiniportAdapterHandle, Status, AddressingReset); } - + /* * @implemented */ @@ -1672,12 +1787,10 @@ NdisMSendComplete( * Status = Status of send operation */ { - MiniSendComplete(MiniportAdapterHandle, - Packet, - Status); + MiniSendComplete(MiniportAdapterHandle, Packet, Status); } - + /* * @implemented */ @@ -1686,10 +1799,10 @@ EXPORT NdisMSendResourcesAvailable( IN NDIS_HANDLE MiniportAdapterHandle) { - MiniSendResourcesAvailable(MiniportAdapterHandle); + MiniSendResourcesAvailable(MiniportAdapterHandle); } - + /* * @implemented */ @@ -1701,13 +1814,10 @@ NdisMTransferDataComplete( IN NDIS_STATUS Status, IN UINT BytesTransferred) { - MiniTransferDataComplete(MiniportAdapterHandle, - Packet, - Status, - BytesTransferred); + MiniTransferDataComplete(MiniportAdapterHandle, Packet, Status, BytesTransferred); } - + /* * @implemented */ @@ -1717,18 +1827,18 @@ NdisMSetInformationComplete( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status) { - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); - PADAPTER_BINDING AdapterBinding = (PADAPTER_BINDING)Adapter->MiniportAdapterBinding; + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); + PADAPTER_BINDING AdapterBinding = (PADAPTER_BINDING)Adapter->MiniportAdapterBinding; - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - (*AdapterBinding->ProtocolBinding->Chars.RequestCompleteHandler)( - AdapterBinding->NdisOpenBlock.ProtocolBindingContext, - Adapter->NdisMiniportBlock.MediaRequest, - Status); + (*AdapterBinding->ProtocolBinding->Chars.RequestCompleteHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext, + Adapter->NdisMiniportBlock.MediaRequest, + Status); } - + /* * @implemented */ @@ -1748,17 +1858,17 @@ NdisMSetAttributes( * AdapterType = Specifies the I/O bus interface of the caller's NIC */ { - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext; - Adapter->Attributes = BusMaster? NDIS_ATTRIBUTE_BUS_MASTER : 0; - Adapter->NdisMiniportBlock.AdapterType = AdapterType; - Adapter->AttributesSet = TRUE; + Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext; + Adapter->Attributes = BusMaster? NDIS_ATTRIBUTE_BUS_MASTER : 0; + Adapter->NdisMiniportBlock.AdapterType = AdapterType; + Adapter->AttributesSet = TRUE; } - + /* * @implemented */ @@ -1781,31 +1891,29 @@ NdisMSetAttributesEx( * AdapterType = Specifies the I/O bus interface of the caller's NIC */ { - // Currently just like NdisMSetAttributesEx - // TODO: Take CheckForHandTimeInSeconds into account! - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); + /* TODO: Take CheckForHandTimeInSeconds into account! */ - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - NDIS_DbgPrint(MAX_TRACE, ("NdisMSetAttributesEx() is partly-implemented.\n")); + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); - Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext; + NDIS_DbgPrint(MAX_TRACE, ("Called - NdisMSetAttributesEx() is partly-implemented.\n")); - /* don't know why this is here - anybody? */ - Adapter->Attributes = AttributeFlags & NDIS_ATTRIBUTE_BUS_MASTER; - Adapter->NdisMiniportBlock.AdapterType = AdapterType; - Adapter->AttributesSet = TRUE; + Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext; - if(AttributeFlags & NDIS_ATTRIBUTE_DESERIALIZE) - { - NDIS_DbgPrint(MIN_TRACE, ("Deserialized miniport - UNIMPLEMENTED\n")); - /* XXX when this is implemented, be sure to fix ProSend() to not nail the irql up to dispatch_level */ -#ifdef DBG - __asm__("int $3\n"); -#endif - } + /* don't know why this is here - anybody? */ + Adapter->Attributes = AttributeFlags & NDIS_ATTRIBUTE_BUS_MASTER; + + Adapter->NdisMiniportBlock.AdapterType = AdapterType; + Adapter->AttributesSet = TRUE; + + if(AttributeFlags & NDIS_ATTRIBUTE_DESERIALIZE) + { + NDIS_DbgPrint(MIN_TRACE, ("Deserialized miniport - UNIMPLEMENTED\n")); + /* XXX when this is implemented, be sure to fix ProSend() to not nail the irql up to dispatch_level */ + ASSERT(0); + } } - + /* * @unimplemented */ @@ -1817,7 +1925,7 @@ NdisMSleep( UNIMPLEMENTED } - + /* * @unimplemented */ @@ -1830,10 +1938,10 @@ NdisMSynchronizeWithInterrupt( { UNIMPLEMENTED - return FALSE; + return FALSE; } - + /* * @unimplemented */ @@ -1846,10 +1954,10 @@ NdisMWriteLogData( { UNIMPLEMENTED - return NDIS_STATUS_FAILURE; + return NDIS_STATUS_FAILURE; } - + /* * @implemented */ @@ -1865,51 +1973,14 @@ NdisTerminateWrapper( * SystemSpecific = Always NULL */ { - PMINIPORT_DRIVER Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle); + PMINIPORT_DRIVER Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle); - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - ExFreePool(Miniport->RegistryPath->Buffer); - ExFreePool(Miniport->RegistryPath); - ExFreePool(Miniport); + 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/sizeof(WCHAR)] = 0; - DbgPrint("ndis!NdisMRegisterMiniport: enumerated key %ws\n", KeyInformation->Name); - } - - ExFreePool(KeyInformation); - KeBugCheck(0); - } - */ diff --git a/reactos/drivers/net/ndis/ndis/protocol.c b/reactos/drivers/net/ndis/ndis/protocol.c index c3932a67171..507557d3db8 100644 --- a/reactos/drivers/net/ndis/ndis/protocol.c +++ b/reactos/drivers/net/ndis/ndis/protocol.c @@ -76,6 +76,7 @@ ProIndicatePacket( NdisQueryPacket(Packet, NULL, NULL, NULL, &PacketLength); + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); { Adapter->LoopPacket = Packet; @@ -95,6 +96,7 @@ ProIndicatePacket( MiniIndicateData(Adapter, NULL, Adapter->LookaheadBuffer, Adapter->MediumHeaderSize, NULL, 0, 0); } + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); { Adapter->LoopPacket = NULL; @@ -119,7 +121,7 @@ ProRequest( */ { KIRQL OldIrql; - BOOLEAN QueueWorkItem; + BOOLEAN QueueWorkItem = FALSE; NDIS_STATUS NdisStatus; PADAPTER_BINDING AdapterBinding; PLOGICAL_ADAPTER Adapter; @@ -135,12 +137,16 @@ ProRequest( /* * If the miniport is already busy, queue a workitem */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); { if(Adapter->MiniportBusy) QueueWorkItem = TRUE; else - Adapter->MiniportBusy = TRUE; + { + NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to busy\n")); + Adapter->MiniportBusy = TRUE; + } } KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); @@ -156,8 +162,10 @@ ProRequest( { NdisStatus = MiniDoRequest(Adapter, NdisRequest); + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); { + NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to free\n")); Adapter->MiniportBusy = FALSE; if (Adapter->WorkQueueHead) @@ -202,7 +210,7 @@ ProSend( */ { KIRQL RaiseOldIrql, SpinOldIrql; - BOOLEAN QueueWorkItem; + BOOLEAN QueueWorkItem = FALSE; NDIS_STATUS NdisStatus; PADAPTER_BINDING AdapterBinding; PLOGICAL_ADAPTER Adapter; @@ -229,6 +237,7 @@ ProSend( * Else we don't do anything because we have to queue a workitem * anyway. */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql); { /* @@ -239,7 +248,10 @@ ProSend( if (Adapter->MiniportBusy) QueueWorkItem = TRUE; else - Adapter->MiniportBusy = TRUE; + { + NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to busy\n")); + Adapter->MiniportBusy = TRUE; + } } KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); @@ -271,8 +283,10 @@ ProSend( */ NdisStatus = ProIndicatePacket(Adapter, Packet); + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); { + NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to free\n")); Adapter->MiniportBusy = FALSE; if (Adapter->WorkQueueHead) @@ -317,6 +331,7 @@ ProSend( KeLowerIrql(RaiseOldIrql); /* XXX why the hell do we do this? */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql); { if (Adapter->WorkQueueHead) @@ -342,6 +357,7 @@ ProSend( NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n")); /* XXX why the hell do we do this? */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); { if (Adapter->WorkQueueHead) @@ -442,6 +458,7 @@ NdisCloseAdapter( KeReleaseSpinLock(&AdapterBinding->ProtocolBinding->Lock, OldIrql); /* Remove protocol from adapter's bound protocols list */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&AdapterBinding->Adapter->NdisMiniportBlock.Lock, &OldIrql); RemoveEntryList(&AdapterBinding->AdapterListEntry); KeReleaseSpinLock(&AdapterBinding->Adapter->NdisMiniportBlock.Lock, OldIrql); @@ -518,85 +535,90 @@ NdisOpenAdapter( * AddressingInformation = Optional pointer to buffer with NIC specific information */ { - UINT i; - BOOLEAN Found; - PLOGICAL_ADAPTER Adapter; - PADAPTER_BINDING AdapterBinding; - PPROTOCOL_BINDING Protocol = GET_PROTOCOL_BINDING(NdisProtocolHandle); + UINT i; + BOOLEAN Found; + PLOGICAL_ADAPTER Adapter; + PADAPTER_BINDING AdapterBinding; + PPROTOCOL_BINDING Protocol = GET_PROTOCOL_BINDING(NdisProtocolHandle); - NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - if(!NdisProtocolHandle) - { - NDIS_DbgPrint(MAX_TRACE, ("NdisProtocolHandle is NULL\n")); - *OpenErrorStatus = *Status = NDIS_STATUS_FAILURE; - return; - } - - Adapter = MiniLocateDevice(AdapterName); - if (!Adapter) { - NDIS_DbgPrint(MIN_TRACE, ("Adapter not found.\n")); - *Status = NDIS_STATUS_ADAPTER_NOT_FOUND; - return; + if(!NdisProtocolHandle) + { + NDIS_DbgPrint(MAX_TRACE, ("NdisProtocolHandle is NULL\n")); + *OpenErrorStatus = *Status = NDIS_STATUS_FAILURE; + return; } - /* Find the media type in the list provided by the protocol driver */ - Found = FALSE; - for (i = 0; i < MediumArraySize; i++) { - if (Adapter->NdisMiniportBlock.MediaType == MediumArray[i]) { - *SelectedMediumIndex = i; - Found = TRUE; - break; + Adapter = MiniLocateDevice(AdapterName); + if (!Adapter) + { + NDIS_DbgPrint(MIN_TRACE, ("Adapter not found.\n")); + *Status = NDIS_STATUS_ADAPTER_NOT_FOUND; + return; + } + + /* Find the media type in the list provided by the protocol driver */ + Found = FALSE; + for (i = 0; i < MediumArraySize; i++) + { + if (Adapter->NdisMiniportBlock.MediaType == MediumArray[i]) + { + *SelectedMediumIndex = i; + Found = TRUE; + break; } } - if (!Found) { - NDIS_DbgPrint(MIN_TRACE, ("Medium is not supported.\n")); - *Status = NDIS_STATUS_UNSUPPORTED_MEDIA; - return; + if (!Found) + { + NDIS_DbgPrint(MIN_TRACE, ("Medium is not supported.\n")); + *Status = NDIS_STATUS_UNSUPPORTED_MEDIA; + return; } - AdapterBinding = ExAllocatePool(NonPagedPool, sizeof(ADAPTER_BINDING)); - if (!AdapterBinding) { - NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - *Status = NDIS_STATUS_RESOURCES; - return; + /* Now that we have confirmed that the adapter can be opened, create a binding */ + + AdapterBinding = ExAllocatePool(NonPagedPool, sizeof(ADAPTER_BINDING)); + if (!AdapterBinding) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + *Status = NDIS_STATUS_RESOURCES; + return; } - RtlZeroMemory(AdapterBinding, sizeof(ADAPTER_BINDING)); + RtlZeroMemory(AdapterBinding, sizeof(ADAPTER_BINDING)); - AdapterBinding->ProtocolBinding = Protocol; - AdapterBinding->Adapter = Adapter; - AdapterBinding->NdisOpenBlock.ProtocolBindingContext = ProtocolBindingContext; + AdapterBinding->ProtocolBinding = Protocol; + AdapterBinding->Adapter = Adapter; + AdapterBinding->NdisOpenBlock.ProtocolBindingContext = ProtocolBindingContext; - /* Set fields required by some NDIS macros */ - AdapterBinding->NdisOpenBlock.MacBindingHandle = (NDIS_HANDLE)AdapterBinding; + /* Set fields required by some NDIS macros */ + AdapterBinding->NdisOpenBlock.MacBindingHandle = (NDIS_HANDLE)AdapterBinding; - /* Set handlers (some NDIS macros require these) */ + /* Set handlers (some NDIS macros require these) */ - AdapterBinding->NdisOpenBlock.RequestHandler = ProRequest; - AdapterBinding->NdisOpenBlock.ResetHandler = ProReset; - AdapterBinding->NdisOpenBlock.u1.SendHandler = ProSend; - AdapterBinding->NdisOpenBlock.SendPacketsHandler = ProSendPackets; - AdapterBinding->NdisOpenBlock.TransferDataHandler = ProTransferData; + AdapterBinding->NdisOpenBlock.RequestHandler = ProRequest; + AdapterBinding->NdisOpenBlock.ResetHandler = ProReset; + AdapterBinding->NdisOpenBlock.u1.SendHandler = ProSend; + AdapterBinding->NdisOpenBlock.SendPacketsHandler = ProSendPackets; + AdapterBinding->NdisOpenBlock.TransferDataHandler = ProTransferData; #if 0 - /* XXX this looks fishy */ - /* OK, this really *is* fishy - it bugchecks */ - /* Put on protocol's bound adapters list */ - ExInterlockedInsertTailList(&Protocol->AdapterListHead, - &AdapterBinding->ProtocolListEntry, - &Protocol->Lock); + /* XXX this looks fishy */ + /* OK, this really *is* fishy - it bugchecks */ + /* Put on protocol's bound adapters list */ + ExInterlockedInsertTailList(&Protocol->AdapterListHead, &AdapterBinding->ProtocolListEntry, &Protocol->Lock); #endif - /* XXX so does this */ - /* Put protocol on adapter's bound protocols list */ - ExInterlockedInsertTailList(&Adapter->ProtocolListHead, - &AdapterBinding->AdapterListEntry, - &Adapter->NdisMiniportBlock.Lock); - *NdisBindingHandle = (NDIS_HANDLE)AdapterBinding; + /* XXX so does this */ + /* Put protocol on adapter's bound protocols list */ + NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); + ExInterlockedInsertTailList(&Adapter->ProtocolListHead, &AdapterBinding->AdapterListEntry, &Adapter->NdisMiniportBlock.Lock); - *Status = NDIS_STATUS_SUCCESS; + *NdisBindingHandle = (NDIS_HANDLE)AdapterBinding; + + *Status = NDIS_STATUS_SUCCESS; } diff --git a/reactos/drivers/net/ndis/ndis/string.c b/reactos/drivers/net/ndis/ndis/string.c index 46f90f62bb7..e1fac0011a7 100644 --- a/reactos/drivers/net/ndis/ndis/string.c +++ b/reactos/drivers/net/ndis/ndis/string.c @@ -4,33 +4,41 @@ * FILE: ndis/string.c * PURPOSE: String management routines * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created + * Vizzini 08-Oct-2003 Error checking, documentation, and formatting */ #include - + /* * @implemented */ NDIS_STATUS EXPORT NdisAnsiStringToUnicodeString( - IN OUT PNDIS_STRING DestinationString, + IN OUT PNDIS_STRING DestinationString, IN PANSI_STRING SourceString) /* * FUNCTION: Converts an ANSI string to an NDIS (unicode) string * ARGUMENTS: * DestinationString = Address of buffer to place converted string in * SourceString = Pointer to ANSI string to be converted + * NOTES: + * - caller must be running at IRQL = PASSIVE_LEVEL */ { - return (NDIS_STATUS)RtlAnsiStringToUnicodeString( - (PUNICODE_STRING)DestinationString, - (PANSI_STRING)SourceString, FALSE); + PAGED_CODE(); + ASSERT(DestinationString); + ASSERT(SourceString); + + return (NDIS_STATUS)RtlAnsiStringToUnicodeString( + (PUNICODE_STRING)DestinationString, + (PANSI_STRING)SourceString, FALSE); } - + /* * @implemented */ @@ -46,15 +54,20 @@ NdisEqualString( * String1 = Pointer to first string * String2 = Pointer to second string * CaseInsensitive = TRUE if the compare should be case insensitive + * NOTES: + * - caller must be at IRQL = PASSIVE_LEVEL */ { - return RtlEqualUnicodeString( - (PUNICODE_STRING)String1, - (PUNICODE_STRING)String2, - CaseInsensitive); + PAGED_CODE(); + ASSERT(String1); + ASSERT(String2); + + return RtlEqualUnicodeString((PUNICODE_STRING)String1, + (PUNICODE_STRING)String2, + CaseInsensitive); } - + /* * @implemented */ @@ -62,20 +75,23 @@ VOID EXPORT NdisInitAnsiString( IN OUT PANSI_STRING DestinationString, - IN PCSTR SourceString) + IN PCSTR SourceString) /* * FUNCTION: Initializes an ANSI string * ARGUMENTS: * DestinationString = Address of buffer to place string in * SourceString = Pointer to null terminated ANSI string + * NOTES: + * - Caller must be at IRQL <= DISPATCH_LEVEL */ { - RtlInitString( - (PANSI_STRING)DestinationString, - (PCSZ)SourceString); + ASSERT(DestinationString); + ASSERT(SourceString); + + RtlInitString((PANSI_STRING)DestinationString, (PCSZ)SourceString); } - + /* * @implemented */ @@ -89,21 +105,22 @@ NdisInitializeString( * ARGUMENTS: * DestinationString = Address of buffer to place string in * SourceString = Pointer to null terminated ANSI string + * NOTES: + * - Must be called at IRQL = PASSIVE_LEVEL */ { - ANSI_STRING AnsiString; + ANSI_STRING AnsiString; - RtlInitAnsiString( - &AnsiString, - (PCSZ)SourceString); + PAGED_CODE(); + ASSERT(DestinationString); + ASSERT(SourceString); - RtlAnsiStringToUnicodeString( - (PUNICODE_STRING)DestinationString, - &AnsiString, - TRUE); + RtlInitAnsiString(&AnsiString, (PCSZ)SourceString); + + RtlAnsiStringToUnicodeString((PUNICODE_STRING)DestinationString, &AnsiString, TRUE); } - + /* * @implemented */ @@ -117,14 +134,17 @@ NdisInitUnicodeString( * ARGUMENTS: * DestinationString = Address of buffer to place string in * SourceString = Pointer to null terminated unicode string + * NOTES: + * - call with IRQL <= DISPATCH_LEVEL */ { - RtlInitUnicodeString( - (PUNICODE_STRING)DestinationString, - SourceString); + ASSERT(DestinationString); + ASSERT(SourceString); + + RtlInitUnicodeString((PUNICODE_STRING)DestinationString, SourceString); } - + /* * @implemented */ @@ -132,21 +152,27 @@ NDIS_STATUS EXPORT NdisUnicodeStringToAnsiString( IN OUT PANSI_STRING DestinationString, - IN PNDIS_STRING SourceString) + IN PNDIS_STRING SourceString) /* * FUNCTION: Converts an NDIS (unicode) string to an ANSI string * ARGUMENTS: * DestinationString = Address of buffer to place converted string in * SourceString = Pointer to unicode string to be converted + * NOTES: + * - must be called at IRQL = PASSIVE_LEVEL */ { - return (NDIS_STATUS)RtlUnicodeStringToAnsiString( - (PANSI_STRING)DestinationString, - (PUNICODE_STRING)SourceString, - FALSE); + PAGED_CODE(); + ASSERT(DestinationString); + ASSERT(SourceString); + + return (NDIS_STATUS)RtlUnicodeStringToAnsiString( + (PANSI_STRING)DestinationString, + (PUNICODE_STRING)SourceString, + FALSE); } - + /* * @implemented */ @@ -156,15 +182,21 @@ NdisUpcaseUnicodeString( OUT PUNICODE_STRING DestinationString, IN PUNICODE_STRING SourceString) /* - * FUNCTION: + * FUNCTION: Uppercase a UNICODE string * ARGUMENTS: + * DestinationString: caller-allocated space for the uppercased string + * SourceString: string to be uppercased * NOTES: - * NDIS 5.0 + * - Currently requires caller to allocate destination string - XXX is this right? + * - callers must be running at IRQL = PASSIVE_LEVEL */ { - ASSERT_IRQL(PASSIVE_LEVEL); - // FIXME - not sure if 3rd param should be TRUE or FALSE - return RtlUpcaseUnicodeString ( DestinationString, SourceString, FALSE ); + PAGED_CODE(); + ASSERT(SourceString); + ASSERT(DestinationString); + + return RtlUpcaseUnicodeString (DestinationString, SourceString, FALSE ); } /* EOF */ + diff --git a/reactos/drivers/net/ndis/ndis/time.c b/reactos/drivers/net/ndis/ndis/time.c index 18c5e7fc16f..93bc196a562 100644 --- a/reactos/drivers/net/ndis/ndis/time.c +++ b/reactos/drivers/net/ndis/ndis/time.c @@ -4,27 +4,50 @@ * FILE: ndis/time.c * PURPOSE: Time related routines * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * Vizzini (vizzini@plasmic.com) * REVISIONS: * CSH 01/08-2000 Created + * Vizzini 08-Oct-2003 Formatting, commenting, and ASSERTs + * + * NOTES: + * - Although the standard kernel-mode M.O. is to trust the caller + * to not provide bad arguments, we have added lots of argument + * validation to assist in the effort to get third-party binaries + * working. It is easiest to track bugs when things break quickly + * and badly. + * - Nearly this entire file is PAGED_CODE (with the exception of the + * MiniportTimerDpc() function) */ #include - + VOID STDCALL MiniportTimerDpc( PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) +/* + * FUNCTION: Scheduled by the SetTimer family of functions + * ARGUMENTS: + * Dpc: Pointer to the DPC Object being executed + * DeferredContext: Pointer to a NDIS_MINIPORT_TIMER object + * SystemArgument1: Unused. + * SystemArgument2: Unused. + * NOTES: + * - runs at IRQL = DISPATCH_LEVEL + */ { - PNDIS_MINIPORT_TIMER Timer; + PNDIS_MINIPORT_TIMER Timer; - Timer = (PNDIS_MINIPORT_TIMER)DeferredContext; + Timer = (PNDIS_MINIPORT_TIMER)DeferredContext; - Timer->MiniportTimerFunction (NULL, Timer->MiniportTimerContext, NULL, NULL); + ASSERT(Timer->MiniportTimerFunction); + + Timer->MiniportTimerFunction (NULL, Timer->MiniportTimerContext, NULL, NULL); } - + /* * @implemented */ @@ -33,11 +56,22 @@ EXPORT NdisCancelTimer( IN PNDIS_TIMER Timer, OUT PBOOLEAN TimerCancelled) +/* + * FUNCTION: Cancels a scheduled NDIS timer + * ARGUMENTS: + * Timer: pointer to an NDIS_TIMER object to cancel + * TimerCancelled: boolean that returns cancellation status + * NOTES: + * - call at IRQL <= DISPATCH_LEVEL + */ { - *TimerCancelled = KeCancelTimer (&Timer->Timer); + PAGED_CODE(); + ASSERT(Timer); + + *TimerCancelled = KeCancelTimer (&Timer->Timer); } - + /* * @implemented */ @@ -45,11 +79,21 @@ VOID EXPORT NdisGetCurrentSystemTime ( IN OUT PLARGE_INTEGER pSystemTime) +/* + * FUNCTION: Retrieve the current system time + * ARGUMENTS: + * pSystemTime: pointer to the returned system time + * NOTES: + * - call at IRQL <= DISPATCH_LEVEL + */ { - KeQuerySystemTime (pSystemTime); + PAGED_CODE(); + ASSERT(pSystemTime); + + KeQuerySystemTime (pSystemTime); } - + /* * @implemented */ @@ -59,13 +103,26 @@ NdisInitializeTimer( IN OUT PNDIS_TIMER Timer, IN PNDIS_TIMER_FUNCTION TimerFunction, IN PVOID FunctionContext) +/* + * FUNCTION: Set up an NDIS_TIMER for later use + * ARGUMENTS: + * Timer: pointer to caller-allocated storage to receive an NDIS_TIMER + * TimerFunction: function pointer to routine to run when timer expires + * FunctionContext: context (param 2) to be passed to the timer function when it runs + * NOTES: + * - TimerFunction will be called at DISPATCH_LEVEL + * - call at IRQL = PASSIVE_LEVEL + */ { - KeInitializeTimer (&Timer->Timer); + PAGED_CODE(); + ASSERT(Timer); - KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext); + KeInitializeTimer (&Timer->Timer); + + KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext); } - + /* * @implemented */ @@ -74,11 +131,23 @@ EXPORT NdisMCancelTimer( IN PNDIS_MINIPORT_TIMER Timer, OUT PBOOLEAN TimerCancelled) +/* + * FUNCTION: cancel a scheduled NDIS_MINIPORT_TIMER + * ARGUMENTS: + * Timer: timer object to cancel + * TimerCancelled: status of cancel operation + * NOTES: + * - call at IRQL <= DISPATCH_LEVEL + */ { - *TimerCancelled = KeCancelTimer (&Timer->Timer); + PAGED_CODE(); + ASSERT(TimerCancelled); + ASSERT(Timer); + + *TimerCancelled = KeCancelTimer (&Timer->Timer); } - + /* * @implemented */ @@ -89,17 +158,30 @@ NdisMInitializeTimer( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_TIMER_FUNCTION TimerFunction, IN PVOID FunctionContext) +/* + * FUNCTION: Initialize an NDIS_MINIPORT_TIMER + * ARGUMENTS: + * Timer: Timer object to initialize + * MiniportAdapterHandle: Handle to the miniport, passed in to MiniportInitialize + * TimerFunction: function to be executed when the timer expires + * FunctionContext: argument passed to TimerFunction when it is called + * NOTES: + * - TimerFunction is called at IRQL = DISPATCH_LEVEL + * - call at IRQL = PASSIVE_LEVEL + */ { - KeInitializeTimer (&Timer->Timer); + PAGED_CODE(); + ASSERT(Timer); + KeInitializeTimer (&Timer->Timer); - KeInitializeDpc (&Timer->Dpc, MiniportTimerDpc, (PVOID) Timer); + KeInitializeDpc (&Timer->Dpc, MiniportTimerDpc, (PVOID) Timer); - Timer->MiniportTimerFunction = TimerFunction; - Timer->MiniportTimerContext = FunctionContext; - Timer->Miniport = MiniportAdapterHandle; + Timer->MiniportTimerFunction = TimerFunction; + Timer->MiniportTimerContext = FunctionContext; + Timer->Miniport = MiniportAdapterHandle; } - + /* * @implemented */ @@ -108,15 +190,28 @@ EXPORT NdisMSetPeriodicTimer( IN PNDIS_MINIPORT_TIMER Timer, IN UINT MillisecondsPeriod) +/* + * FUNCTION: Set a timer to go off periodically + * ARGUMENTS: + * Timer: pointer to the timer object to set + * MillisecondsPeriod: period of the timer + * NOTES: + * - Minimum predictible interval is ~10ms + * - Must be called at IRQL <= DISPATCH_LEVEL) + */ { - LARGE_INTEGER Timeout; + LARGE_INTEGER Timeout; - Timeout.QuadPart = MillisecondsPeriod * -10000; + PAGED_CODE(); + ASSERT(Timer); - KeSetTimerEx (&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc); + /* relative delays are negative, absolute are positive; resolution is 100ns */ + Timeout.QuadPart = MillisecondsPeriod * -10000; + + KeSetTimerEx (&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc); } - + /* * @implemented */ @@ -125,15 +220,28 @@ EXPORT NdisMSetTimer( IN PNDIS_MINIPORT_TIMER Timer, IN UINT MillisecondsToDelay) +/* + * FUNCTION: Set a NDIS_MINIPORT_TIMER so that it goes off + * ARGUMENTS: + * Timer: timer object to set + * MillisecondsToDelay: time to wait for the timer to expire + * NOTES: + * - Minimum predictible interval is ~10ms + * - Must be called at IRQL <= DISPATCH_LEVEL) + */ { - LARGE_INTEGER Timeout; + LARGE_INTEGER Timeout; - Timeout.QuadPart = MillisecondsToDelay * -10000; + PAGED_CODE(); + ASSERT(Timer); - KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc); + /* relative delays are negative, absolute are positive; resolution is 100ns */ + Timeout.QuadPart = MillisecondsToDelay * -10000; + + KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc); } - + /* * @implemented */ @@ -142,12 +250,26 @@ EXPORT NdisSetTimer( IN PNDIS_TIMER Timer, IN UINT MillisecondsToDelay) +/* + * FUNCTION: Set an NDIS_TIMER so that it goes off + * ARGUMENTS: + * Timer: timer object to set + * MillisecondsToDelay: time to wait for the timer to expire + * NOTES: + * - Minimum predictible interval is ~10ms + * - Must be called at IRQL <= DISPATCH_LEVEL) + */ { - LARGE_INTEGER Timeout; + LARGE_INTEGER Timeout; - Timeout.QuadPart = MillisecondsToDelay * -10000; + PAGED_CODE(); + ASSERT(Timer); - KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc); + /* relative delays are negative, absolute are positive; resolution is 100ns */ + Timeout.QuadPart = MillisecondsToDelay * -10000; + + KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc); } /* EOF */ + diff --git a/reactos/include/ddk/kedef.h b/reactos/include/ddk/kedef.h index 507f1b3fc1a..c1212f8a5d0 100644 --- a/reactos/include/ddk/kedef.h +++ b/reactos/include/ddk/kedef.h @@ -44,6 +44,7 @@ typedef enum _KWAIT_REASON WrExecutive, WrFreePage, WrPageIn, + WrPoolAllocation, WrDelayExecution, WrSuspended, WrUserRequest, diff --git a/reactos/include/net/ndis.h b/reactos/include/net/ndis.h index 37e45006c8d..2bdf10ba0a5 100644 --- a/reactos/include/net/ndis.h +++ b/reactos/include/net/ndis.h @@ -95,12 +95,14 @@ RtlAssert ( PCHAR Message ); -#define ASSERT( exp ) if (!(exp)) RtlAssert( #exp, __FILE__, __LINE__, NULL ) +#define ASSERT( exp ) if (!(exp)) RtlAssert( #exp, __FILE__, __LINE__, NULL ) #define ASSERTMSG( msg, exp ) if (!(exp)) RtlAssert( #exp, __FILE__, __LINE__, msg ) +#define PAGED_CODE() if (KeGetCurrentIrql() > APC_LEVEL) ASSERT(0); #else #define ASSERT( exp ) #define ASSERTMSG( msg, exp ) +#define PAGED_CODE() #endif /* DBG */ /* Base types */ @@ -5565,7 +5567,7 @@ NdisReturnPackets( /* EOF */ /* - * XXX - these macros are disabled for the momentdue to the fact that there are definitions for them elsewhere. + * XXX - these macros are disabled for the moment due to the fact that there are definitions for them elsewhere. * We will have to decide which to keep; we don't need both (no BINARY_COMPATIBLE) */ #if 0 diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index f82ed3d8fd2..2e24e1fe333 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: main.c,v 1.172 2003/09/29 20:43:07 navaraf Exp $ +/* $Id: main.c,v 1.173 2003/10/12 16:39:52 vizzini Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -682,7 +682,7 @@ ExpInitializeExecutive(VOID) for (i = 2; i < KeLoaderBlock.ModsCount; i++) { #ifdef KDBG - /* Do not free the memory from symbol files, if the kernel debugger is activ */ + /* Do not free the memory from symbol files, if the kernel debugger is active */ if (!RtlpCheckFileNameExtension(name, ".sym")) #endif { diff --git a/reactos/rules.mak b/reactos/rules.mak index 241fc28cf11..b0eca943f89 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -9,7 +9,7 @@ HOST = mingw32-windows endif # Build map files which includes source and asm code -# FULL_MAP = yes +FULL_MAP = yes # Default to no PCH support ifeq ($(ROS_USE_PCH),)