ReactOS 0.4.15-dev-7953-g1f49173
lan.c File Reference
#include "precomp.h"
#include <ntifs.h>
#include <receive.h>
#include <wait.h>
Include dependency graph for lan.c:

Go to the source code of this file.

Classes

struct  _LAN_WQ_ITEM
 
struct  _RECONFIGURE_CONTEXT
 

Macros

#define CCS_ROOT   L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet"
 
#define TCPIP_GUID   L"{4D36E972-E325-11CE-BFC1-08002BE10318}"
 

Typedefs

typedef struct _LAN_WQ_ITEM LAN_WQ_ITEM
 
typedef struct _LAN_WQ_ITEMPLAN_WQ_ITEM
 
typedef struct _RECONFIGURE_CONTEXT RECONFIGURE_CONTEXT
 
typedef struct _RECONFIGURE_CONTEXTPRECONFIGURE_CONTEXT
 

Functions

NDIS_STATUS NDISCall (PLAN_ADAPTER Adapter, NDIS_REQUEST_TYPE Type, NDIS_OID OID, PVOID Buffer, UINT Length)
 Send a request to NDIS.
 
NDIS_STATUS GetPacketTypeFromHeaderBuffer (PLAN_ADAPTER Adapter, PVOID HeaderBuffer, ULONG HeaderBufferSize, PULONG PacketType)
 
NDIS_STATUS GetPacketTypeFromNdisPacket (PLAN_ADAPTER Adapter, PNDIS_PACKET NdisPacket, PULONG PacketType)
 
VOID FreeAdapter (PLAN_ADAPTER Adapter)
 
NTSTATUS TcpipLanGetDwordOid (PIP_INTERFACE Interface, NDIS_OID Oid, PULONG Result)
 
VOID NTAPI ProtocolOpenAdapterComplete (NDIS_HANDLE BindingContext, NDIS_STATUS Status, NDIS_STATUS OpenErrorStatus)
 
VOID NTAPI ProtocolCloseAdapterComplete (NDIS_HANDLE BindingContext, NDIS_STATUS Status)
 
VOID NTAPI ProtocolResetComplete (NDIS_HANDLE BindingContext, NDIS_STATUS Status)
 
VOID NTAPI ProtocolRequestComplete (NDIS_HANDLE BindingContext, PNDIS_REQUEST NdisRequest, NDIS_STATUS Status)
 
VOID NTAPI ProtocolSendComplete (NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status)
 
VOID LanReceiveWorker (PVOID Context)
 
VOID LanSubmitReceiveWork (NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, UINT BytesTransferred, BOOLEAN LegacyReceive)
 
VOID NTAPI ProtocolTransferDataComplete (NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status, UINT BytesTransferred)
 
INT NTAPI ProtocolReceivePacket (NDIS_HANDLE BindingContext, PNDIS_PACKET NdisPacket)
 
NDIS_STATUS NTAPI ProtocolReceive (NDIS_HANDLE BindingContext, NDIS_HANDLE MacReceiveContext, PVOID HeaderBuffer, UINT HeaderBufferSize, PVOID LookaheadBuffer, UINT LookaheadBufferSize, UINT PacketSize)
 
VOID NTAPI ProtocolReceiveComplete (NDIS_HANDLE BindingContext)
 
BOOLEAN ReadIpConfiguration (PIP_INTERFACE Interface)
 
BOOLEAN ReconfigureAdapter (PRECONFIGURE_CONTEXT Context)
 
VOID ReconfigureAdapterWorker (PVOID Context)
 
VOID NTAPI ProtocolStatus (NDIS_HANDLE BindingContext, NDIS_STATUS GeneralStatus, PVOID StatusBuffer, UINT StatusBufferSize)
 
VOID NTAPI ProtocolStatusComplete (NDIS_HANDLE NdisBindingContext)
 
NDIS_STATUS NTAPI ProtocolPnPEvent (NDIS_HANDLE NdisBindingContext, PNET_PNP_EVENT PnPEvent)
 
VOID NTAPI ProtocolBindAdapter (OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2)
 
VOID LANTransmit (PVOID Context, PNDIS_PACKET NdisPacket, UINT Offset, PVOID LinkAddress, USHORT Type)
 
static NTSTATUS OpenRegistryKey (PNDIS_STRING RegistryPath, PHANDLE RegHandle)
 
static NTSTATUS ReadStringFromRegistry (HANDLE RegHandle, PWCHAR RegistryValue, PUNICODE_STRING String)
 
NTSTATUS NTAPI AppendUnicodeString (PUNICODE_STRING ResultFirst, PUNICODE_STRING Second, BOOLEAN Deallocate)
 
static NTSTATUS CheckForDeviceDesc (PUNICODE_STRING EnumKeyName, PUNICODE_STRING TargetKeyName, PUNICODE_STRING Name, PUNICODE_STRING DeviceDesc)
 
static NTSTATUS FindDeviceDescForAdapter (PUNICODE_STRING Name, PUNICODE_STRING DeviceDesc)
 
VOID GetName (PUNICODE_STRING RegistryKey, PUNICODE_STRING OutName)
 
BOOLEAN BindAdapter (PLAN_ADAPTER Adapter, PNDIS_STRING RegistryPath)
 
VOID UnbindAdapter (PLAN_ADAPTER Adapter)
 
NDIS_STATUS LANRegisterAdapter (PNDIS_STRING AdapterName, PNDIS_STRING RegistryPath)
 Registers protocol with an NDIS adapter.
 
NDIS_STATUS LANUnregisterAdapter (PLAN_ADAPTER Adapter)
 Unregisters protocol with NDIS adapter.
 
VOID NTAPI LANUnregisterProtocol (VOID)
 Unregisters this protocol driver with NDIS.
 
VOID NTAPI ProtocolUnbindAdapter (PNDIS_STATUS Status, NDIS_HANDLE ProtocolBindingContext, NDIS_HANDLE UnbindContext)
 
NTSTATUS LANRegisterProtocol (PNDIS_STRING Name)
 Registers this protocol driver with NDIS.
 

Variables

UINT TransferDataCalled = 0
 
UINT TransferDataCompleteCalled = 0
 
NDIS_HANDLE NdisProtocolHandle = (NDIS_HANDLE)NULL
 
BOOLEAN ProtocolRegistered = FALSE
 
LIST_ENTRY AdapterListHead
 
KSPIN_LOCK AdapterListLock
 

Macro Definition Documentation

◆ CCS_ROOT

#define CCS_ROOT   L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet"

Definition at line 20 of file lan.c.

◆ TCPIP_GUID

#define TCPIP_GUID   L"{4D36E972-E325-11CE-BFC1-08002BE10318}"

Definition at line 21 of file lan.c.

Typedef Documentation

◆ LAN_WQ_ITEM

◆ PLAN_WQ_ITEM

◆ PRECONFIGURE_CONTEXT

◆ RECONFIGURE_CONTEXT

Function Documentation

◆ AppendUnicodeString()

NTSTATUS NTAPI AppendUnicodeString ( PUNICODE_STRING  ResultFirst,
PUNICODE_STRING  Second,
BOOLEAN  Deallocate 
)

Definition at line 1138 of file lan.c.

1140 {
1142 UNICODE_STRING Ustr = *ResultFirst;
1143 PWSTR new_string = ExAllocatePoolWithTag
1144 (PagedPool,
1145 (ResultFirst->Length + Second->Length + sizeof(WCHAR)), TEMP_STRING_TAG);
1146 if( !new_string ) {
1147 return STATUS_NO_MEMORY;
1148 }
1149 memcpy( new_string, ResultFirst->Buffer, ResultFirst->Length );
1150 memcpy( new_string + ResultFirst->Length / sizeof(WCHAR),
1151 Second->Buffer, Second->Length );
1152 if( Deallocate ) RtlFreeUnicodeString(ResultFirst);
1153 ResultFirst->Length = Ustr.Length + Second->Length;
1154 ResultFirst->MaximumLength = ResultFirst->Length;
1155 new_string[ResultFirst->Length / sizeof(WCHAR)] = 0;
1156 Status = RtlCreateUnicodeString(ResultFirst,new_string) ?
1159 return Status;
1160}
WCHAR Second[]
Definition: FormatMessage.c:12
LONG NTSTATUS
Definition: precomp.h:26
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define TEMP_STRING_TAG
Definition: tags.h:42
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_SUCCESS
Definition: shellext.h:65
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint16_t * PWSTR
Definition: typedefs.h:56
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CheckForDeviceDesc(), and GetName().

◆ BindAdapter()

BOOLEAN BindAdapter ( PLAN_ADAPTER  Adapter,
PNDIS_STRING  RegistryPath 
)

Definition at line 1305 of file lan.c.

1316{
1317 PIP_INTERFACE IF;
1318 NDIS_STATUS NdisStatus;
1319 LLIP_BIND_INFO BindInfo;
1320 ULONG Lookahead = LOOKAHEAD_SIZE;
1322 NDIS_MEDIA_STATE MediaState;
1323
1324 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1325
1326 Adapter->State = LAN_STATE_OPENING;
1327
1328 NdisStatus = NDISCall(Adapter,
1331 &Lookahead,
1332 sizeof(ULONG));
1333 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1334 TI_DbgPrint(DEBUG_DATALINK, ("Could not set lookahead buffer size (0x%X).\n", NdisStatus));
1335 return FALSE;
1336 }
1337
1338 /* Bind the adapter to IP layer */
1339 BindInfo.Context = Adapter;
1340 BindInfo.HeaderSize = Adapter->HeaderSize;
1341 BindInfo.MinFrameSize = Adapter->MinFrameSize;
1342 BindInfo.Address = (PUCHAR)&Adapter->HWAddress;
1343 BindInfo.AddressLength = Adapter->HWAddressLength;
1344 BindInfo.Transmit = LANTransmit;
1345
1346 IF = IPCreateInterface(&BindInfo);
1347
1348 if (!IF) {
1349 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1350 return FALSE;
1351 }
1352
1353 /*
1354 * Query per-adapter configuration from the registry
1355 * In case anyone is curious: there *is* an Ndis configuration api
1356 * for this sort of thing, but it doesn't really support things like
1357 * REG_MULTI_SZ very well, and there is a note in the DDK that says that
1358 * protocol drivers developed for win2k and above just use the native
1359 * services (ZwOpenKey, etc).
1360 */
1361
1362 GetName( RegistryPath, &IF->Name );
1363
1365 if (!NT_SUCCESS(Status)) {
1366 TI_DbgPrint(MIN_TRACE, ("Failed to get device description.\n"));
1368 return FALSE;
1369 }
1370
1371 TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n",
1372 &IF->Description));
1373
1374 /* Register interface with IP layer */
1376
1377 /* Store adapter context */
1378 Adapter->Context = IF;
1379
1380 /* Get the media state */
1381 NdisStatus = NDISCall(Adapter,
1384 &MediaState,
1385 sizeof(MediaState));
1386 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1387 TI_DbgPrint(DEBUG_DATALINK, ("Could not query media status (0x%X).\n", NdisStatus));
1390 return FALSE;
1391 }
1392
1393 /* Indicate the current media state */
1394 ProtocolStatus(Adapter,
1396 NULL, 0);
1397
1398 /* Set packet filter so we can send and receive packets */
1399 NdisStatus = NDISCall(Adapter,
1402 &Adapter->PacketFilter,
1403 sizeof(UINT));
1404
1405 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1406 TI_DbgPrint(DEBUG_DATALINK, ("Could not set packet filter (0x%X).\n", NdisStatus));
1409 return FALSE;
1410 }
1411
1412 return TRUE;
1413}
#define MIN_TRACE
Definition: debug.h:14
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define DEBUG_DATALINK
Definition: debug.h:24
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
VOID IPDestroyInterface(PIP_INTERFACE IF)
Definition: ip.c:244
VOID IPUnregisterInterface(PIP_INTERFACE IF)
Definition: ip.c:349
BOOLEAN IPRegisterInterface(PIP_INTERFACE IF)
Definition: ip.c:289
PIP_INTERFACE IPCreateInterface(PLLIP_BIND_INFO BindInfo)
Definition: ip.c:182
#define LAN_STATE_OPENING
Definition: lan.h:111
#define LOOKAHEAD_SIZE
Definition: lan.h:117
VOID LANTransmit(PLAN_ADAPTER Adapter, PNDIS_PACKET NdisPacket, PVOID LinkAddress, USHORT Type)
Transmits a packet ARGUMENTS:
Definition: lan.c:520
VOID NTAPI ProtocolStatus(NDIS_HANDLE BindingContext, NDIS_STATUS GenerelStatus, PVOID StatusBuffer, UINT StatusBufferSize)
Called by NDIS when the underlying driver has changed state.
Definition: lan.c:461
NDIS_STATUS NDISCall(PLAN_ADAPTER Adapter, NDIS_REQUEST_TYPE Type, NDIS_OID OID, PVOID Buffer, UINT Length)
Send a request to NDIS.
Definition: lan.c:29
#define NDIS_STATUS_MEDIA_CONNECT
Definition: ndis.h:361
unsigned int UINT
Definition: ndis.h:50
#define NDIS_STATUS_MEDIA_DISCONNECT
Definition: ndis.h:362
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
@ NdisRequestQueryInformation
Definition: ndis.h:790
@ NdisRequestSetInformation
Definition: ndis.h:791
#define OID_GEN_CURRENT_PACKET_FILTER
Definition: ntddndis.h:246
@ NdisMediaStateConnected
Definition: ntddndis.h:470
enum _NDIS_MEDIA_STATE NDIS_MEDIA_STATE
#define OID_GEN_MEDIA_CONNECT_STATUS
Definition: ntddndis.h:252
int NDIS_STATUS
Definition: ntddndis.h:475
#define OID_GEN_CURRENT_LOOKAHEAD
Definition: ntddndis.h:247
UINT PacketFilter
Definition: lan.h:80
PVOID Context
Definition: lan.h:64
UINT MinFrameSize
Definition: lan.h:75
UCHAR HWAddress[IEEE_802_ADDR_LENGTH]
Definition: lan.h:68
UCHAR HeaderSize
Definition: lan.h:73
UCHAR State
Definition: lan.h:62
UINT HWAddressLength
Definition: lan.h:69
UNICODE_STRING Description
Definition: ip.h:164
UNICODE_STRING Name
Definition: ip.h:163
PUCHAR Address
Definition: ip.h:130
UINT MinFrameSize
Definition: ip.h:129
PVOID Context
Definition: ip.h:127
UINT HeaderSize
Definition: ip.h:128
UINT AddressLength
Definition: ip.h:131
LL_TRANSMIT_ROUTINE Transmit
Definition: ip.h:132
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215

◆ CheckForDeviceDesc()

static NTSTATUS CheckForDeviceDesc ( PUNICODE_STRING  EnumKeyName,
PUNICODE_STRING  TargetKeyName,
PUNICODE_STRING  Name,
PUNICODE_STRING  DeviceDesc 
)
static

Definition at line 1162 of file lan.c.

1165 {
1166 UNICODE_STRING RootDevice = { 0, 0, NULL }, LinkageKeyName = { 0, 0, NULL };
1167 UNICODE_STRING DescKeyName = { 0, 0, NULL }, Linkage = { 0, 0, NULL };
1168 UNICODE_STRING BackSlash = { 0, 0, NULL };
1169 HANDLE DescKey = NULL, LinkageKey = NULL;
1171
1172 TI_DbgPrint(DEBUG_DATALINK,("EnumKeyName %wZ\n", EnumKeyName));
1173
1175 RtlInitUnicodeString(&Linkage, L"\\Linkage");
1176
1177 RtlInitUnicodeString(&DescKeyName, L"");
1178 AppendUnicodeString( &DescKeyName, EnumKeyName, FALSE );
1179 AppendUnicodeString( &DescKeyName, &BackSlash, TRUE );
1180 AppendUnicodeString( &DescKeyName, TargetKeyName, TRUE );
1181
1182 RtlInitUnicodeString(&LinkageKeyName, L"");
1183 AppendUnicodeString( &LinkageKeyName, &DescKeyName, FALSE );
1184 AppendUnicodeString( &LinkageKeyName, &Linkage, TRUE );
1185
1186 Status = OpenRegistryKey( &LinkageKeyName, &LinkageKey );
1187 if( !NT_SUCCESS(Status) ) goto cleanup;
1188
1189 Status = ReadStringFromRegistry( LinkageKey, L"RootDevice", &RootDevice );
1190 if( !NT_SUCCESS(Status) ) goto cleanup;
1191
1192 if( RtlCompareUnicodeString( &RootDevice, Name, TRUE ) == 0 ) {
1193 Status = OpenRegistryKey( &DescKeyName, &DescKey );
1194 if( !NT_SUCCESS(Status) ) goto cleanup;
1195
1196 Status = ReadStringFromRegistry( DescKey, L"DriverDesc", DeviceDesc );
1197 if( !NT_SUCCESS(Status) ) goto cleanup;
1198
1199 TI_DbgPrint(DEBUG_DATALINK,("ADAPTER DESC: %wZ\n", DeviceDesc));
1200 } else Status = STATUS_UNSUCCESSFUL;
1201
1202cleanup:
1203 RtlFreeUnicodeString( &RootDevice );
1204 RtlFreeUnicodeString( &LinkageKeyName );
1205 RtlFreeUnicodeString( &DescKeyName );
1206 if( LinkageKey ) ZwClose( LinkageKey );
1207 if( DescKey ) ZwClose( DescKey );
1208
1209 TI_DbgPrint(DEBUG_DATALINK,("Returning %x\n", Status));
1210
1211 return Status;
1212}
static void cleanup(void)
Definition: main.c:1335
static const WCHAR BackSlash[]
Definition: devclass.c:29
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
Definition: string_lib.cpp:31
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define L(x)
Definition: ntvdm.h:50
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

Referenced by FindDeviceDescForAdapter().

◆ FindDeviceDescForAdapter()

static NTSTATUS FindDeviceDescForAdapter ( PUNICODE_STRING  Name,
PUNICODE_STRING  DeviceDesc 
)
static

Definition at line 1214 of file lan.c.

1215 {
1216 UNICODE_STRING EnumKeyName, TargetKeyName;
1219 ULONG i;
1220 KEY_BASIC_INFORMATION *Kbio =
1222 ULONG KbioLength = sizeof(KEY_BASIC_INFORMATION), ResultLength;
1223
1224 RtlInitUnicodeString( DeviceDesc, NULL );
1225
1226 if( !Kbio ) return STATUS_INSUFFICIENT_RESOURCES;
1227
1229 (&EnumKeyName, CCS_ROOT L"\\Control\\Class\\" TCPIP_GUID);
1230
1231 Status = OpenRegistryKey( &EnumKeyName, &EnumKey );
1232
1233 if( !NT_SUCCESS(Status) ) {
1234 TI_DbgPrint(DEBUG_DATALINK,("Couldn't open Enum key %wZ: %x\n",
1235 &EnumKeyName, Status));
1236 ExFreePoolWithTag( Kbio, KBIO_TAG );
1237 return Status;
1238 }
1239
1240 for( i = 0; NT_SUCCESS(Status); i++ ) {
1241 Status = ZwEnumerateKey( EnumKey, i, KeyBasicInformation,
1242 Kbio, KbioLength, &ResultLength );
1243
1245 ExFreePoolWithTag( Kbio, KBIO_TAG );
1246 KbioLength = ResultLength;
1247 Kbio = ExAllocatePoolWithTag( NonPagedPool, KbioLength, KBIO_TAG );
1248 if( !Kbio ) {
1249 TI_DbgPrint(DEBUG_DATALINK,("Failed to allocate memory\n"));
1250 ZwClose( EnumKey );
1251 return STATUS_NO_MEMORY;
1252 }
1253
1254 Status = ZwEnumerateKey( EnumKey, i, KeyBasicInformation,
1255 Kbio, KbioLength, &ResultLength );
1256
1257 if( !NT_SUCCESS(Status) ) {
1258 TI_DbgPrint(DEBUG_DATALINK,("Couldn't enum key child %d\n", i));
1259 ZwClose( EnumKey );
1260 ExFreePoolWithTag( Kbio, KBIO_TAG );
1261 return Status;
1262 }
1263 }
1264
1265 if( NT_SUCCESS(Status) ) {
1266 TargetKeyName.Length = TargetKeyName.MaximumLength =
1267 Kbio->NameLength;
1268 TargetKeyName.Buffer = Kbio->Name;
1269
1271 ( &EnumKeyName, &TargetKeyName, Name, DeviceDesc );
1272 if( NT_SUCCESS(Status) ) {
1273 ZwClose( EnumKey );
1274 ExFreePoolWithTag( Kbio, KBIO_TAG );
1275 return Status;
1276 } else Status = STATUS_SUCCESS;
1277 }
1278 }
1279
1280 ZwClose( EnumKey );
1281 ExFreePoolWithTag( Kbio, KBIO_TAG );
1282 return STATUS_UNSUCCESSFUL;
1283}
#define KBIO_TAG
Definition: tags.h:41
#define NonPagedPool
Definition: env_spec_w32.h:307
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static LONG WINAPI EnumKey(HANDLE hcKey, DWORD dwIndex, LPWSTR pszName, PDWORD pcchName, PFILETIME pftLastWriteTime, HANDLE hSpooler)
Definition: localmon.c:169
@ KeyBasicInformation
Definition: nt_native.h:1131
struct _KEY_BASIC_INFORMATION KEY_BASIC_INFORMATION
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
Definition: wdfdevice.h:3776

Referenced by BindAdapter().

◆ FreeAdapter()

VOID FreeAdapter ( PLAN_ADAPTER  Adapter)

Definition at line 171 of file lan.c.

178{
180}
#define LAN_ADAPTER_TAG
Definition: tags.h:36

◆ GetName()

VOID GetName ( PUNICODE_STRING  RegistryKey,
PUNICODE_STRING  OutName 
)

Definition at line 1285 of file lan.c.

1286 {
1287 PWCHAR Ptr;
1288 UNICODE_STRING PartialRegistryKey;
1289
1290 PartialRegistryKey.Buffer =
1291 RegistryKey->Buffer + wcslen(CCS_ROOT L"\\Services\\");
1292 Ptr = PartialRegistryKey.Buffer;
1293
1294 while( *Ptr != L'\\' &&
1295 ((PCHAR)Ptr) < ((PCHAR)RegistryKey->Buffer) + RegistryKey->Length )
1296 Ptr++;
1297
1298 PartialRegistryKey.Length = PartialRegistryKey.MaximumLength =
1299 (Ptr - PartialRegistryKey.Buffer) * sizeof(WCHAR);
1300
1301 RtlInitUnicodeString( OutName, L"" );
1302 AppendUnicodeString( OutName, &PartialRegistryKey, FALSE );
1303}
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
uint16_t * PWCHAR
Definition: typedefs.h:56
char * PCHAR
Definition: typedefs.h:51

Referenced by BindAdapter().

◆ GetPacketTypeFromHeaderBuffer()

NDIS_STATUS GetPacketTypeFromHeaderBuffer ( PLAN_ADAPTER  Adapter,
PVOID  HeaderBuffer,
ULONG  HeaderBufferSize,
PULONG  PacketType 
)

Definition at line 94 of file lan.c.

98{
99 PETH_HEADER EthHeader = HeaderBuffer;
100
101 if (HeaderBufferSize < Adapter->HeaderSize)
102 {
103 TI_DbgPrint(DEBUG_DATALINK, ("Runt frame (size %d).\n", HeaderBufferSize));
105 }
106
107 switch (Adapter->Media)
108 {
109 case NdisMedium802_3:
110 /* Ethernet and IEEE 802.3 frames can be distinguished by
111 looking at the IEEE 802.3 length field. This field is
112 less than or equal to 1500 for a valid IEEE 802.3 frame
113 and larger than 1500 is it's a valid EtherType value.
114 See RFC 1122, section 2.3.3 for more information */
115
116 *PacketType = EthHeader->EType;
117 break;
118
119 default:
120 TI_DbgPrint(MIN_TRACE, ("Unsupported media.\n"));
121
122 /* FIXME: Support other medias */
124 }
125
126 TI_DbgPrint(DEBUG_DATALINK, ("EtherType (0x%X).\n", *PacketType));
127
128 return NDIS_STATUS_SUCCESS;
129}
#define NDIS_STATUS_NOT_ACCEPTED
Definition: ndis.h:350
@ NdisMedium802_3
Definition: ntddndis.h:188
NDIS_MEDIUM Media
Definition: lan.h:67

Referenced by GetPacketTypeFromNdisPacket(), and ProtocolReceive().

◆ GetPacketTypeFromNdisPacket()

NDIS_STATUS GetPacketTypeFromNdisPacket ( PLAN_ADAPTER  Adapter,
PNDIS_PACKET  NdisPacket,
PULONG  PacketType 
)

Definition at line 133 of file lan.c.

136{
137 PVOID HeaderBuffer;
140
141 HeaderBuffer = ExAllocatePoolWithTag(NonPagedPool,
142 Adapter->HeaderSize,
143 HEADER_TAG);
144 if (!HeaderBuffer)
146
147 /* Copy the media header */
148 BytesCopied = CopyPacketToBuffer(HeaderBuffer,
149 NdisPacket,
150 0,
151 Adapter->HeaderSize);
152 if (BytesCopied != Adapter->HeaderSize)
153 {
154 /* Runt frame */
155 ExFreePoolWithTag(HeaderBuffer, HEADER_TAG);
156 TI_DbgPrint(DEBUG_DATALINK, ("Runt frame (size %d).\n", BytesCopied));
158 }
159
161 HeaderBuffer,
163 PacketType);
164
165 ExFreePoolWithTag(HeaderBuffer, HEADER_TAG);
166
167 return Status;
168}
UINT CopyPacketToBuffer(PUCHAR DstData, PNDIS_PACKET SrcPacket, UINT SrcOffset, UINT Length)
Definition: buffer.c:172
#define HEADER_TAG
Definition: tags.h:45
_In_ UINT _In_ UINT _In_ PNDIS_PACKET _In_ UINT _Out_ PUINT BytesCopied
Definition: ndis.h:3171
#define NDIS_STATUS_RESOURCES
Definition: ndis.h:466

Referenced by LanReceiveWorker().

◆ LanReceiveWorker()

VOID LanReceiveWorker ( PVOID  Context)

Definition at line 307 of file lan.c.

307 {
308 ULONG PacketType;
311 PLAN_ADAPTER Adapter;
313 IP_PACKET IPPacket;
314 BOOLEAN LegacyReceive;
316
317 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
318
319 Packet = WorkItem->Packet;
320 Adapter = WorkItem->Adapter;
321 BytesTransferred = WorkItem->BytesTransferred;
322 LegacyReceive = WorkItem->LegacyReceive;
323
325
326 Interface = Adapter->Context;
327
328 IPInitializePacket(&IPPacket, 0);
329
330 IPPacket.NdisPacket = Packet;
331 IPPacket.ReturnPacket = !LegacyReceive;
332
333 if (LegacyReceive)
334 {
335 /* Packet type is precomputed */
336 PacketType = PC(IPPacket.NdisPacket)->PacketType;
337
338 /* Data is at position 0 */
339 IPPacket.Position = 0;
340
341 /* Packet size is determined by bytes transferred */
342 IPPacket.TotalSize = BytesTransferred;
343 }
344 else
345 {
346 /* Determine packet type from media header */
347 if (GetPacketTypeFromNdisPacket(Adapter,
348 IPPacket.NdisPacket,
349 &PacketType) != NDIS_STATUS_SUCCESS)
350 {
351 /* Bad packet */
352 IPPacket.Free(&IPPacket);
353 return;
354 }
355
356 /* Data is at the end of the media header */
357 IPPacket.Position = Adapter->HeaderSize;
358
359 /* Calculate packet size (excluding media header) */
360 NdisQueryPacketLength(IPPacket.NdisPacket, &IPPacket.TotalSize);
361 }
362
365 ("Ether Type = %x Total = %d\n",
366 PacketType, IPPacket.TotalSize));
367
368 /* Update interface stats */
369 Interface->Stats.InBytes += IPPacket.TotalSize + Adapter->HeaderSize;
370
371 /* NDIS packet is freed in all of these cases */
372 switch (PacketType) {
373 case ETYPE_IPv4:
374 case ETYPE_IPv6:
375 TI_DbgPrint(MID_TRACE,("Received IP Packet\n"));
376 IPReceive(Adapter->Context, &IPPacket);
377 break;
378 case ETYPE_ARP:
379 TI_DbgPrint(MID_TRACE,("Received ARP Packet\n"));
380 ARPReceive(Adapter->Context, &IPPacket);
381 break;
382 default:
383 IPPacket.Free(&IPPacket);
384 break;
385 }
386}
unsigned char BOOLEAN
VOID ARPReceive(PVOID Context, PIP_PACKET Packet)
Definition: arp.c:175
#define MID_TRACE
Definition: debug.h:15
#define PC(Packet)
Definition: ip.h:106
PIP_PACKET IPInitializePacket(PIP_PACKET IPPacket, ULONG Type)
Definition: ip.c:92
#define WQ_CONTEXT_TAG
Definition: tags.h:37
#define ETYPE_IPv4
Definition: lan.h:121
#define ETYPE_ARP
Definition: lan.h:123
#define ETYPE_IPv6
Definition: lan.h:122
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
Definition: ndis.h:1549
#define NdisQueryPacketLength(_Packet, _TotalPacketLength)
Definition: ndis.h:3645
VOID IPReceive(PIP_INTERFACE IF, PIP_PACKET IPPacket)
Definition: receive.c:638
Definition: ip.h:77
OBJECT_FREE_ROUTINE Free
Definition: ip.h:78
BOOLEAN ReturnPacket
Definition: ip.h:82
UINT Position
Definition: ip.h:87
PNDIS_PACKET NdisPacket
Definition: ip.h:88
UINT TotalSize
Definition: ip.h:86
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _In_ PWDF_USB_CONTROL_SETUP_PACKET _In_opt_ PWDF_MEMORY_DESCRIPTOR _Out_opt_ PULONG BytesTransferred
Definition: wdfusb.h:1342
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:115

Referenced by LanSubmitReceiveWork().

◆ LANRegisterAdapter()

NDIS_STATUS LANRegisterAdapter ( PNDIS_STRING  AdapterName,
PNDIS_STRING  RegistryPath 
)

Registers protocol with an NDIS adapter.

Parameters
AdapterName= Pointer to string with name of adapter to register
Adapter= Address of pointer to a LAN_ADAPTER structure
Returns
Status of operation

Definition at line 1436 of file lan.c.

1447{
1448 PLAN_ADAPTER IF;
1449 NDIS_STATUS NdisStatus;
1451 UINT MediaIndex;
1453 UINT AddressOID;
1454
1455 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1456
1458 if (!IF) {
1459 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1460 return NDIS_STATUS_RESOURCES;
1461 }
1462
1463 RtlZeroMemory(IF, sizeof(LAN_ADAPTER));
1464
1465 /* Put adapter in stopped state */
1467
1468 /* Initialize protecting spin lock */
1470
1472
1473 /* Initialize array with media IDs we support */
1475
1476 TI_DbgPrint(DEBUG_DATALINK,("opening adapter %wZ\n", AdapterName));
1477 /* Open the adapter. */
1478 NdisOpenAdapter(&NdisStatus,
1479 &OpenStatus,
1480 &IF->NdisHandle,
1481 &MediaIndex,
1482 MediaArray,
1483 MAX_MEDIA,
1485 IF,
1487 0,
1488 NULL);
1489
1490 /* Wait until the adapter is opened */
1491 if (NdisStatus == NDIS_STATUS_PENDING)
1493 else if (NdisStatus != NDIS_STATUS_SUCCESS) {
1494 TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ\n", AdapterName));
1496 return NdisStatus;
1497 }
1498
1499 IF->Media = MediaArray[MediaIndex];
1500
1501 /* Fill LAN_ADAPTER structure with some adapter specific information */
1502 switch (IF->Media) {
1503 case NdisMedium802_3:
1508 IF->HeaderSize = sizeof(ETH_HEADER);
1509 IF->MinFrameSize = 60;
1510 AddressOID = OID_802_3_CURRENT_ADDRESS;
1511 IF->PacketFilter =
1515 break;
1516
1517 default:
1518 /* Unsupported media */
1519 TI_DbgPrint(MIN_TRACE, ("Unsupported media.\n"));
1522 }
1523
1524 /* Get maximum number of packets we can pass to NdisSend(Packets) at one time */
1525 NdisStatus = NDISCall(IF,
1528 &IF->MaxSendPackets,
1529 sizeof(UINT));
1530 if (NdisStatus != NDIS_STATUS_SUCCESS)
1531 /* Legacy NIC drivers may not support this query, if it fails we
1532 assume it can send at least one packet per call to NdisSend(Packets) */
1533 IF->MaxSendPackets = 1;
1534
1535 /* Get current hardware address */
1536 NdisStatus = NDISCall(IF,
1538 AddressOID,
1539 &IF->HWAddress,
1540 IF->HWAddressLength);
1541 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1542 TI_DbgPrint(MIN_TRACE, ("Query for current hardware address failed.\n"));
1544 return NdisStatus;
1545 }
1546
1547 /* Bind adapter to IP layer */
1548 if( !BindAdapter(IF, RegistryPath) ) {
1549 TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (BindAdapter)\n", AdapterName));
1552 }
1553
1554 /* Add adapter to the adapter list */
1556 &IF->ListEntry,
1558
1559 TI_DbgPrint(DEBUG_DATALINK, ("Leaving.\n"));
1560
1561 return NDIS_STATUS_SUCCESS;
1562}
VOID EXPORT NdisOpenAdapter(OUT PNDIS_STATUS Status, OUT PNDIS_STATUS OpenErrorStatus, OUT PNDIS_HANDLE NdisBindingHandle, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, IN UINT MediumArraySize, IN NDIS_HANDLE NdisProtocolHandle, IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_STRING AdapterName, IN UINT OpenOptions, IN PSTRING AddressingInformation OPTIONAL)
Definition: protocol.c:764
#define IEEE_802_ADDR_LENGTH
Definition: e1000hw.h:11
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
#define MAX_MEDIA
Definition: lan.h:28
#define BCAST_ETH_OFFSET
Definition: lan.h:48
#define MEDIA_ETH
Definition: lan.h:26
#define LAN_STATE_STOPPED
Definition: lan.h:114
#define BCAST_ETH_CHECK
Definition: lan.h:45
#define BCAST_ETH_MASK
Definition: lan.h:42
#define NDIS_STATUS_PENDING
Definition: ndis.h:347
#define NDIS_STATUS_NOT_SUPPORTED
Definition: ndis.h:479
#define NDIS_PACKET_TYPE_BROADCAST
Definition: ndis.h:666
#define NDIS_PACKET_TYPE_MULTICAST
Definition: ndis.h:664
#define NDIS_PACKET_TYPE_DIRECTED
Definition: ndis.h:663
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE _In_ PNDIS_STRING AdapterName
Definition: ndis.h:6016
_In_ NDIS_STATUS _In_ NDIS_STATUS OpenStatus
Definition: ndis.h:6035
#define KernelMode
Definition: asm.h:34
static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE]
Definition: miniport.c:33
enum _NDIS_MEDIUM NDIS_MEDIUM
#define OID_802_3_CURRENT_ADDRESS
Definition: ntddndis.h:303
#define OID_GEN_MAXIMUM_SEND_PACKETS
Definition: ntddndis.h:253
@ SynchronizationEvent
Definition: lan.h:33
KSPIN_LOCK Lock
Definition: lan.h:60
KEVENT Event
Definition: lan.h:63
LIST_ENTRY ListEntry
Definition: lan.h:57
NDIS_HANDLE NdisHandle
Definition: lan.h:65
UINT MaxSendPackets
Definition: lan.h:77
UCHAR BCastMask
Definition: lan.h:70
UCHAR BCastCheck
Definition: lan.h:71
UCHAR BCastOffset
Definition: lan.h:72
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
@ UserRequest
Definition: ketypes.h:421

◆ LANRegisterProtocol()

NTSTATUS LANRegisterProtocol ( PNDIS_STRING  Name)

Registers this protocol driver with NDIS.

Parameters
Name= Name of this protocol driver
Returns
Status of operation

Definition at line 1657 of file lan.c.

1666{
1667 NDIS_STATUS NdisStatus;
1669
1670 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1671
1674
1675 /* Set up protocol characteristics */
1676 RtlZeroMemory(&ProtChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
1679 ProtChars.Name.Length = Name->Length;
1680 ProtChars.Name.Buffer = Name->Buffer;
1681 ProtChars.Name.MaximumLength = Name->MaximumLength;
1689 ProtChars.ReceiveHandler = ProtocolReceive;
1691 ProtChars.StatusHandler = ProtocolStatus;
1697
1698 /* Try to register protocol */
1699 NdisRegisterProtocol(&NdisStatus,
1701 &ProtChars,
1703 if (NdisStatus != NDIS_STATUS_SUCCESS)
1704 {
1705 TI_DbgPrint(DEBUG_DATALINK, ("NdisRegisterProtocol failed, status 0x%x\n", NdisStatus));
1706 return (NTSTATUS)NdisStatus;
1707 }
1708
1710
1711 return STATUS_SUCCESS;
1712}
VOID EXPORT NdisRegisterProtocol(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE NdisProtocolHandle, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, IN UINT CharacteristicsLength)
Definition: protocol.c:1115
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define NDIS_VERSION_MAJOR
Definition: lan.h:11
#define NDIS_VERSION_MINOR
Definition: lan.h:12
VOID NTAPI ProtocolCloseAdapterComplete(NDIS_HANDLE BindingContext, NDIS_STATUS Status)
Called by NDIS to complete closing an adapter.
Definition: lan.c:120
VOID NTAPI ProtocolStatusComplete(NDIS_HANDLE NdisBindingContext)
Called by NDIS when a status-change has occurred.
Definition: lan.c:478
VOID NTAPI ProtocolRequestComplete(NDIS_HANDLE BindingContext, PNDIS_REQUEST NdisRequest, NDIS_STATUS Status)
Called by NDIS to complete a request.
Definition: lan.c:159
VOID NTAPI ProtocolReceiveComplete(NDIS_HANDLE BindingContext)
Called by NDIS when we're done receiving data.
Definition: lan.c:444
VOID NTAPI ProtocolOpenAdapterComplete(NDIS_HANDLE BindingContext, NDIS_STATUS Status, NDIS_STATUS OpenErrorStatus)
Called by NDIS to complete opening of an adapter.
Definition: lan.c:99
NDIS_STATUS NTAPI ProtocolReceive(NDIS_HANDLE BindingContext, NDIS_HANDLE MacReceiveContext, PVOID HeaderBuffer, UINT HeaderBufferSize, PVOID LookaheadBuffer, UINT LookaheadBufferSize, UINT PacketSize)
Called by NDIS when a packet has been received on the physical link.
Definition: lan.c:355
VOID NTAPI ProtocolTransferDataComplete(NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status, UINT BytesTransferred)
Called by NDIS to complete reception of data.
Definition: lan.c:210
VOID LANUnregisterProtocol(VOID)
Unregisters this protocol driver with NDIS.
Definition: lan.c:943
VOID NTAPI ProtocolResetComplete(NDIS_HANDLE BindingContext, NDIS_STATUS Status)
Called by NDIS to complete resetting an adapter.
Definition: lan.c:142
VOID NTAPI ProtocolBindAdapter(OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2)
Called by NDIS during NdisRegisterProtocol to set up initial bindings, and periodically thereafter as...
Definition: lan.c:497
VOID NTAPI ProtocolSendComplete(NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status)
Called by NDIS to complete sending process.
Definition: lan.c:184
STATUS_COMPLETE_HANDLER StatusCompleteHandler
Definition: ndis.h:1894
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler
Definition: ndis.h:1883
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler
Definition: ndis.h:1892
PNP_EVENT_HANDLER PnPEventHandler
Definition: ndis.h:1899
REQUEST_COMPLETE_HANDLER RequestCompleteHandler
Definition: ndis.h:1887
SEND_COMPLETE_HANDLER SendCompleteHandler
Definition: ndis.h:1879
RECEIVE_HANDLER ReceiveHandler
Definition: ndis.h:1889
BIND_HANDLER BindAdapterHandler
Definition: ndis.h:1897
RESET_COMPLETE_HANDLER ResetCompleteHandler
Definition: ndis.h:1886
RECEIVE_PACKET_HANDLER ReceivePacketHandler
Definition: ndis.h:1896
STATUS_HANDLER StatusHandler
Definition: ndis.h:1893
UNBIND_HANDLER UnbindAdapterHandler
Definition: ndis.h:1898
OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler
Definition: ndis.h:1876
CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler
Definition: ndis.h:1877
UNLOAD_PROTOCOL_HANDLER UnloadHandler
Definition: ndis.h:1900

Referenced by DriverEntry().

◆ LanSubmitReceiveWork()

VOID LanSubmitReceiveWork ( NDIS_HANDLE  BindingContext,
PNDIS_PACKET  Packet,
UINT  BytesTransferred,
BOOLEAN  LegacyReceive 
)

Definition at line 388 of file lan.c.

392 {
395 PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
396
397 TI_DbgPrint(DEBUG_DATALINK,("called\n"));
398
399 if (!WQItem) return;
400
401 WQItem->Packet = Packet;
402 WQItem->Adapter = Adapter;
404 WQItem->LegacyReceive = LegacyReceive;
405
406 if (!ChewCreate( LanReceiveWorker, WQItem ))
408}
struct LAN_ADAPTER * PLAN_ADAPTER
PLAN_ADAPTER Adapter
Definition: lan.c:26
PNDIS_PACKET Packet
Definition: lan.c:25
BOOLEAN LegacyReceive
Definition: lan.c:28
UINT BytesTransferred
Definition: lan.c:27
BOOLEAN ChewCreate(VOID(*Worker)(PVOID), PVOID WorkerContext)
Definition: workqueue.c:61

Referenced by ProtocolReceivePacket(), and ProtocolTransferDataComplete().

◆ LANTransmit()

VOID LANTransmit ( PVOID  Context,
PNDIS_PACKET  NdisPacket,
UINT  Offset,
PVOID  LinkAddress,
USHORT  Type 
)

Definition at line 947 of file lan.c.

962{
963 NDIS_STATUS NdisStatus;
964 PETH_HEADER EHeader;
965 PCHAR Data, OldData;
966 UINT Size, OldSize;
969 PNDIS_PACKET XmitPacket;
971
973 ("Called( NdisPacket %x, Offset %d, Adapter %x )\n",
974 NdisPacket, Offset, Adapter));
975
976 if (Adapter->State != LAN_STATE_STARTED) {
977 (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_NOT_ACCEPTED);
978 return;
979 }
980
982 ("Adapter Address [%02x %02x %02x %02x %02x %02x]\n",
983 Adapter->HWAddress[0] & 0xff,
984 Adapter->HWAddress[1] & 0xff,
985 Adapter->HWAddress[2] & 0xff,
986 Adapter->HWAddress[3] & 0xff,
987 Adapter->HWAddress[4] & 0xff,
988 Adapter->HWAddress[5] & 0xff));
989
990 GetDataPtr( NdisPacket, 0, &OldData, &OldSize );
991
992 NdisStatus = AllocatePacketWithBuffer(&XmitPacket, NULL, OldSize + Adapter->HeaderSize);
993 if (NdisStatus != NDIS_STATUS_SUCCESS) {
994 (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_RESOURCES);
995 return;
996 }
997
998 GetDataPtr(XmitPacket, 0, &Data, &Size);
999
1000 RtlCopyMemory(Data + Adapter->HeaderSize, OldData, OldSize);
1001
1002 (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_SUCCESS);
1003
1004 switch (Adapter->Media) {
1005 case NdisMedium802_3:
1006 EHeader = (PETH_HEADER)Data;
1007
1008 if (LinkAddress) {
1009 /* Unicast address */
1010 RtlCopyMemory(EHeader->DstAddr, LinkAddress, IEEE_802_ADDR_LENGTH);
1011 } else {
1012 /* Broadcast address */
1014 }
1015
1017
1018 switch (Type) {
1019 case LAN_PROTO_IPv4:
1020 EHeader->EType = ETYPE_IPv4;
1021 break;
1022 case LAN_PROTO_ARP:
1023 EHeader->EType = ETYPE_ARP;
1024 break;
1025 case LAN_PROTO_IPv6:
1026 EHeader->EType = ETYPE_IPv6;
1027 break;
1028 default:
1029 ASSERT(FALSE);
1030 return;
1031 }
1032 break;
1033
1034 default:
1035 /* FIXME: Support other medias */
1036 break;
1037 }
1038
1039 TI_DbgPrint( MID_TRACE, ("LinkAddress: %x\n", LinkAddress));
1040 if( LinkAddress ) {
1042 ( MID_TRACE,
1043 ("Link Address [%02x %02x %02x %02x %02x %02x]\n",
1044 ((PCHAR)LinkAddress)[0] & 0xff,
1045 ((PCHAR)LinkAddress)[1] & 0xff,
1046 ((PCHAR)LinkAddress)[2] & 0xff,
1047 ((PCHAR)LinkAddress)[3] & 0xff,
1048 ((PCHAR)LinkAddress)[4] & 0xff,
1049 ((PCHAR)LinkAddress)[5] & 0xff));
1050 }
1051
1052 if (Adapter->MTU < Size) {
1053 /* This is NOT a pointer. MSDN explicitly says so. */
1055 TcpLargeSendPacketInfo) = (PVOID)((ULONG_PTR)Adapter->MTU);
1056 }
1057
1058 /* Update interface stats */
1059 Interface->Stats.OutBytes += Size;
1060
1061 TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql );
1062 TI_DbgPrint(MID_TRACE, ("NdisSend\n"));
1063 NdisSend(&NdisStatus, Adapter->NdisHandle, XmitPacket);
1064 TI_DbgPrint(MID_TRACE, ("NdisSend %s\n",
1065 NdisStatus == NDIS_STATUS_PENDING ?
1066 "Pending" : "Complete"));
1067 TcpipReleaseSpinLock( &Adapter->Lock, OldIrql );
1068
1069 /* I had a talk with vizzini: these really ought to be here.
1070 * we're supposed to see these completed by ndis *only* when
1071 * status_pending is returned. Note that this is different from
1072 * the situation with IRPs. */
1073 if (NdisStatus != NDIS_STATUS_PENDING)
1074 ProtocolSendComplete((NDIS_HANDLE)Context, XmitPacket, NdisStatus);
1075}
Type
Definition: Type.h:7
struct _ETH_HEADER * PETH_HEADER
VOID EXPORT NdisSend(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet)
Definition: protocol.c:1272
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:599
void GetDataPtr(PNDIS_PACKET Packet, UINT Offset, PCHAR *DataOut, PUINT Size)
Definition: routines.c:65
#define LAN_PROTO_IPv4
Definition: lan.h:126
#define LAN_PROTO_ARP
Definition: lan.h:128
#define LAN_STATE_STARTED
Definition: lan.h:113
#define LAN_PROTO_IPv6
Definition: lan.h:127
#define AllocatePacketWithBuffer(x, y, z)
Definition: memtrack.h:7
#define ASSERT(a)
Definition: mode.c:44
#define NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, InfoType)
Definition: ndis.h:1351
@ TcpLargeSendPacketInfo
Definition: ndis.h:1180
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
USHORT MTU
Definition: lan.h:74
UCHAR SrcAddr[ETH_LENGTH_OF_ADDRESS]
Definition: ethernetutils.h:48
UCHAR DstAddr[ETH_LENGTH_OF_ADDRESS]
Definition: ethernetutils.h:47
void * PVOID
Definition: typedefs.h:50
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG_PTR
Definition: typedefs.h:65
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

◆ LANUnregisterAdapter()

NDIS_STATUS LANUnregisterAdapter ( PLAN_ADAPTER  Adapter)

Unregisters protocol with NDIS adapter.

Parameters
Adapter= Pointer to a LAN_ADAPTER structure
Returns
Status of operation

Definition at line 1565 of file lan.c.

1574{
1575 KIRQL OldIrql;
1576 NDIS_HANDLE NdisHandle;
1577 NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS;
1578
1579 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1580
1581 /* Unlink the adapter from the list */
1582 RemoveEntryList(&Adapter->ListEntry);
1583
1584 /* Unbind adapter from IP layer */
1585 UnbindAdapter(Adapter);
1586
1587 TcpipAcquireSpinLock(&Adapter->Lock, &OldIrql);
1588 NdisHandle = Adapter->NdisHandle;
1589 if (NdisHandle) {
1590 Adapter->NdisHandle = NULL;
1591 TcpipReleaseSpinLock(&Adapter->Lock, OldIrql);
1592
1593 NdisCloseAdapter(&NdisStatus, NdisHandle);
1594 if (NdisStatus == NDIS_STATUS_PENDING) {
1597 KernelMode,
1598 FALSE,
1599 NULL);
1600 NdisStatus = Adapter->NdisStatus;
1601 }
1602 } else
1603 TcpipReleaseSpinLock(&Adapter->Lock, OldIrql);
1604
1605 FreeAdapter(Adapter);
1606
1607 return NdisStatus;
1608}
VOID EXPORT NdisCloseAdapter(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle)
Definition: protocol.c:703
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
VOID FreeAdapter(PLAN_ADAPTER Adapter)
Frees memory for a LAN_ADAPTER structure.
Definition: lan.c:83
NDIS_STATUS NdisStatus
Definition: lan.h:66
NTSTATUS TcpipWaitForSingleObject(PVOID Object, KWAIT_REASON Reason, KPROCESSOR_MODE WaitMode, BOOLEAN Alertable, PLARGE_INTEGER Timeout)
Definition: mockwait.c:12

◆ LANUnregisterProtocol()

VOID NTAPI LANUnregisterProtocol ( VOID  )

Unregisters this protocol driver with NDIS.

Note
Does not care wether we are already registered

Definition at line 1612 of file lan.c.

1617{
1618 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1619
1620 if (ProtocolRegistered) {
1621 NDIS_STATUS NdisStatus;
1622 PLIST_ENTRY CurrentEntry;
1623 PLIST_ENTRY NextEntry;
1624 PLAN_ADAPTER Current;
1625 KIRQL OldIrql;
1626
1628
1629 /* Search the list and remove every adapter we find */
1630 CurrentEntry = AdapterListHead.Flink;
1631 while (CurrentEntry != &AdapterListHead) {
1632 NextEntry = CurrentEntry->Flink;
1633 Current = CONTAINING_RECORD(CurrentEntry, LAN_ADAPTER, ListEntry);
1634 /* Unregister it */
1635 LANUnregisterAdapter(Current);
1636 CurrentEntry = NextEntry;
1637 }
1638
1640
1643 }
1644}
VOID EXPORT NdisDeregisterProtocol(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisProtocolHandle)
Definition: protocol.c:734
NDIS_STATUS LANUnregisterAdapter(PLAN_ADAPTER Adapter)
Unregisters protocol with NDIS adapter.
Definition: lan.c:847
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by TiUnload().

◆ NDISCall()

NDIS_STATUS NDISCall ( PLAN_ADAPTER  Adapter,
NDIS_REQUEST_TYPE  Type,
NDIS_OID  OID,
PVOID  Buffer,
UINT  Length 
)

Send a request to NDIS.

Parameters
Adapter= Pointer to a LAN_ADAPTER structure
Type= Type of request (Set or Query)
OID= Value to be set/queried for
Buffer= Pointer to a buffer to use
Length= Number of bytes in Buffer
Returns
Status of operation

Definition at line 41 of file lan.c.

58{
60 NDIS_STATUS NdisStatus;
61
62 Request.RequestType = Type;
64 Request.DATA.SET_INFORMATION.Oid = OID;
65 Request.DATA.SET_INFORMATION.InformationBuffer = Buffer;
66 Request.DATA.SET_INFORMATION.InformationBufferLength = Length;
67 } else {
68 Request.DATA.QUERY_INFORMATION.Oid = OID;
69 Request.DATA.QUERY_INFORMATION.InformationBuffer = Buffer;
70 Request.DATA.QUERY_INFORMATION.InformationBufferLength = Length;
71 }
72
73 if (Adapter->State != LAN_STATE_RESETTING) {
74 NdisRequest(&NdisStatus, Adapter->NdisHandle, &Request);
75 } else {
76 NdisStatus = NDIS_STATUS_NOT_ACCEPTED;
77 }
78
79 /* Wait for NDIS to complete the request */
80 if (NdisStatus == NDIS_STATUS_PENDING) {
84 FALSE,
85 NULL);
86 NdisStatus = Adapter->NdisStatus;
87 }
88
89 return NdisStatus;
90}
Definition: bufpool.h:45
#define LAN_STATE_RESETTING
Definition: lan.h:112
UINT64 OID
Definition: marshal.c:88
_In_opt_ NDIS_HANDLE _In_opt_ NDIS_HANDLE _Inout_ PNDIS_REQUEST NdisRequest
Definition: ndis.h:1573
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547

Referenced by InfoTdiQueryGetInterfaceMIB().

◆ OpenRegistryKey()

static NTSTATUS OpenRegistryKey ( PNDIS_STRING  RegistryPath,
PHANDLE  RegHandle 
)
static

Definition at line 1078 of file lan.c.

1078 {
1081
1083 Status = ZwOpenKey(RegHandle, KEY_ALL_ACCESS, &Attributes);
1084 return Status;
1085}
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_In_opt_ PETWENABLECALLBACK _In_opt_ PVOID _Out_ PREGHANDLE RegHandle
Definition: wmifuncs.h:78

Referenced by CheckForDeviceDesc(), and FindDeviceDescForAdapter().

◆ ProtocolBindAdapter()

VOID NTAPI ProtocolBindAdapter ( OUT PNDIS_STATUS  Status,
IN NDIS_HANDLE  BindContext,
IN PNDIS_STRING  DeviceName,
IN PVOID  SystemSpecific1,
IN PVOID  SystemSpecific2 
)

Definition at line 925 of file lan.c.

941{
942 TI_DbgPrint(DEBUG_DATALINK, ("Called with registry path %wZ for %wZ\n", SystemSpecific1, DeviceName));
943 *Status = LANRegisterAdapter(DeviceName, SystemSpecific1);
944}
NDIS_STATUS LANRegisterAdapter(PNDIS_STRING AdapterName, PNDIS_STRING RegistryPath)
Registers protocol with an NDIS adapter.
Definition: lan.c:637
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3275

◆ ProtocolCloseAdapterComplete()

VOID NTAPI ProtocolCloseAdapterComplete ( NDIS_HANDLE  BindingContext,
NDIS_STATUS  Status 
)

Definition at line 229 of file lan.c.

238{
239 PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
240
241 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
242
243 Adapter->NdisStatus = Status;
244
245 KeSetEvent(&Adapter->Event, 0, FALSE);
246}
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476

◆ ProtocolOpenAdapterComplete()

VOID NTAPI ProtocolOpenAdapterComplete ( NDIS_HANDLE  BindingContext,
NDIS_STATUS  Status,
NDIS_STATUS  OpenErrorStatus 
)

Definition at line 207 of file lan.c.

218{
219 PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
220
221 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
222
223 Adapter->NdisStatus = Status;
224
225 KeSetEvent(&Adapter->Event, 0, FALSE);
226}

◆ ProtocolPnPEvent()

NDIS_STATUS NTAPI ProtocolPnPEvent ( NDIS_HANDLE  NdisBindingContext,
PNET_PNP_EVENT  PnPEvent 
)

Definition at line 897 of file lan.c.

900{
901 switch(PnPEvent->NetEvent)
902 {
903 case NetEventSetPower:
904 DbgPrint("Device transitioned to power state %ld\n", PnPEvent->Buffer);
905 return NDIS_STATUS_SUCCESS;
906
908 DbgPrint("Device wants to go into power state %ld\n", PnPEvent->Buffer);
909 return NDIS_STATUS_SUCCESS;
910
912 DbgPrint("Device is about to be removed\n");
913 return NDIS_STATUS_SUCCESS;
914
916 DbgPrint("Device removal cancelled\n");
917 return NDIS_STATUS_SUCCESS;
918
919 default:
920 DbgPrint("Unhandled event type: %ld\n", PnPEvent->NetEvent);
921 return NDIS_STATUS_SUCCESS;
922 }
923}
#define DbgPrint
Definition: hal.h:12
@ NetEventSetPower
Definition: netpnp.h:15
@ NetEventQueryRemoveDevice
Definition: netpnp.h:17
@ NetEventCancelRemoveDevice
Definition: netpnp.h:18
@ NetEventQueryPower
Definition: netpnp.h:16
PVOID Buffer
Definition: netpnp.h:33
NET_PNP_EVENT_CODE NetEvent
Definition: netpnp.h:32

Referenced by LANRegisterProtocol().

◆ ProtocolReceive()

NDIS_STATUS NTAPI ProtocolReceive ( NDIS_HANDLE  BindingContext,
NDIS_HANDLE  MacReceiveContext,
PVOID  HeaderBuffer,
UINT  HeaderBufferSize,
PVOID  LookaheadBuffer,
UINT  LookaheadBufferSize,
UINT  PacketSize 
)

Definition at line 462 of file lan.c.

483{
484 ULONG PacketType;
486 PCHAR BufferData;
487 NDIS_STATUS NdisStatus;
488 PNDIS_PACKET NdisPacket;
489 PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
490
491 TI_DbgPrint(DEBUG_DATALINK, ("Called. (packetsize %d)\n",PacketSize));
492
493 if (Adapter->State != LAN_STATE_STARTED) {
494 TI_DbgPrint(DEBUG_DATALINK, ("Adapter is stopped.\n"));
496 }
497
498 if (HeaderBufferSize < Adapter->HeaderSize) {
499 TI_DbgPrint(DEBUG_DATALINK, ("Runt frame received.\n"));
501 }
502
503 NdisStatus = GetPacketTypeFromHeaderBuffer(Adapter,
504 HeaderBuffer,
505 HeaderBufferSize,
506 &PacketType);
507 if (NdisStatus != NDIS_STATUS_SUCCESS)
509
510 TI_DbgPrint(DEBUG_DATALINK, ("Adapter: %x (MTU %d)\n",
511 Adapter, Adapter->MTU));
512
513 /* Get a transfer data packet */
514 NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL,
515 PacketSize );
516 if( NdisStatus != NDIS_STATUS_SUCCESS ) {
518 }
519
520 PC(NdisPacket)->PacketType = PacketType;
521
522 TI_DbgPrint(DEBUG_DATALINK, ("pretransfer LookaheadBufferSize %d packsize %d\n",LookaheadBufferSize,PacketSize));
523
524 GetDataPtr( NdisPacket, 0, &BufferData, &PacketSize );
525
527
528 if (LookaheadBufferSize == PacketSize)
529 {
530 /* Optimized code path for packets that are fully contained in
531 * the lookahead buffer. */
532 NdisCopyLookaheadData(BufferData,
533 LookaheadBuffer,
534 LookaheadBufferSize,
535 Adapter->MacOptions);
536 }
537 else
538 {
539 NdisTransferData(&NdisStatus, Adapter->NdisHandle,
540 MacReceiveContext, 0, PacketSize,
541 NdisPacket, &BytesTransferred);
542 }
543 TI_DbgPrint(DEBUG_DATALINK, ("Calling complete\n"));
544
545 if (NdisStatus != NDIS_STATUS_PENDING)
546 ProtocolTransferDataComplete(BindingContext,
547 NdisPacket,
548 NdisStatus,
549 PacketSize);
550
551 TI_DbgPrint(DEBUG_DATALINK, ("leaving\n"));
552
553 return NDIS_STATUS_SUCCESS;
554}
VOID EXPORT NdisTransferData(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN NDIS_HANDLE MacReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer, IN OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred)
Definition: protocol.c:1307
#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions)
Definition: ndis.h:3289
UINT MacOptions
Definition: lan.h:78
_In_ USHORT PacketSize
Definition: iofuncs.h:1058

◆ ProtocolReceiveComplete()

VOID NTAPI ProtocolReceiveComplete ( NDIS_HANDLE  BindingContext)

Definition at line 557 of file lan.c.

564{
565 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
566}

◆ ProtocolReceivePacket()

INT NTAPI ProtocolReceivePacket ( NDIS_HANDLE  BindingContext,
PNDIS_PACKET  NdisPacket 
)

Definition at line 442 of file lan.c.

445{
446 PLAN_ADAPTER Adapter = BindingContext;
447
448 if (Adapter->State != LAN_STATE_STARTED) {
449 TI_DbgPrint(DEBUG_DATALINK, ("Adapter is stopped.\n"));
450 return 0;
451 }
452
453 LanSubmitReceiveWork(BindingContext,
454 NdisPacket,
455 0, /* Unused */
456 FALSE);
457
458 /* Hold 1 reference on this packet */
459 return 1;
460}

Referenced by LANRegisterProtocol().

◆ ProtocolRequestComplete()

VOID NTAPI ProtocolRequestComplete ( NDIS_HANDLE  BindingContext,
PNDIS_REQUEST  NdisRequest,
NDIS_STATUS  Status 
)

Definition at line 269 of file lan.c.

280{
281 PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
282
283 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
284
285 /* Save status of request and signal an event */
286 Adapter->NdisStatus = Status;
287
288 KeSetEvent(&Adapter->Event, 0, FALSE);
289}

◆ ProtocolResetComplete()

VOID NTAPI ProtocolResetComplete ( NDIS_HANDLE  BindingContext,
NDIS_STATUS  Status 
)

Definition at line 249 of file lan.c.

258{
259 PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
260
261 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
262
263 Adapter->NdisStatus = Status;
264
265 KeSetEvent(&Adapter->Event, 0, FALSE);
266}

◆ ProtocolSendComplete()

VOID NTAPI ProtocolSendComplete ( NDIS_HANDLE  BindingContext,
PNDIS_PACKET  Packet,
NDIS_STATUS  Status 
)

Definition at line 292 of file lan.c.

303{
305}
#define FreeNdisPacket(x)
Definition: memtrack.h:8

◆ ProtocolStatus()

VOID NTAPI ProtocolStatus ( NDIS_HANDLE  BindingContext,
NDIS_STATUS  GeneralStatus,
PVOID  StatusBuffer,
UINT  StatusBufferSize 
)

Definition at line 808 of file lan.c.

821{
822 PLAN_ADAPTER Adapter = BindingContext;
824
825 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
826
827 /* Ignore the status indication if we have no context yet. We'll get another later */
828 if (!Adapter->Context)
829 return;
830
832 if (!Context)
833 return;
834
835 Context->Adapter = Adapter;
836
837 switch(GeneralStatus)
838 {
840 DbgPrint("NDIS_STATUS_MEDIA_CONNECT\n");
841
842 if (Adapter->State == LAN_STATE_STARTED)
843 {
845 return;
846 }
847
848 Context->State = LAN_STATE_STARTED;
849 break;
850
852 DbgPrint("NDIS_STATUS_MEDIA_DISCONNECT\n");
853
854 if (Adapter->State == LAN_STATE_STOPPED)
855 {
857 return;
858 }
859
860 Context->State = LAN_STATE_STOPPED;
861 break;
862
864 Adapter->OldState = Adapter->State;
865 Adapter->State = LAN_STATE_RESETTING;
866 /* Nothing else to do here */
868 return;
869
871 Adapter->CompletingReset = TRUE;
872 Context->State = Adapter->OldState;
873 break;
874
875 default:
876 DbgPrint("Unhandled status: %x", GeneralStatus);
878 return;
879 }
880
881 /* Queue the work item */
884}
#define CONTEXT_TAG
Definition: tags.h:43
#define NDIS_STATUS_RESET_START
Definition: ndis.h:354
#define NDIS_STATUS_RESET_END
Definition: ndis.h:355
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS GeneralStatus
Definition: ndis.h:1556
UCHAR OldState
Definition: lan.h:42
BOOLEAN CompletingReset
Definition: lan.h:43

◆ ProtocolStatusComplete()

VOID NTAPI ProtocolStatusComplete ( NDIS_HANDLE  NdisBindingContext)

Definition at line 886 of file lan.c.

892{
893 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
894}

◆ ProtocolTransferDataComplete()

VOID NTAPI ProtocolTransferDataComplete ( NDIS_HANDLE  BindingContext,
PNDIS_PACKET  Packet,
NDIS_STATUS  Status,
UINT  BytesTransferred 
)

Definition at line 410 of file lan.c.

426{
428
429 TI_DbgPrint(DEBUG_DATALINK,("called\n"));
430
433
434 if( Status != NDIS_STATUS_SUCCESS ) return;
435
436 LanSubmitReceiveWork(BindingContext,
437 Packet,
439 TRUE);
440}
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696

◆ ProtocolUnbindAdapter()

VOID NTAPI ProtocolUnbindAdapter ( PNDIS_STATUS  Status,
NDIS_HANDLE  ProtocolBindingContext,
NDIS_HANDLE  UnbindContext 
)

Definition at line 1648 of file lan.c.

1652{
1653 /* We don't pend any unbinding so we can just ignore UnbindContext */
1655}
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE ProtocolBindingContext
Definition: ndis.h:6015

Referenced by LANRegisterProtocol().

◆ ReadIpConfiguration()

BOOLEAN ReadIpConfiguration ( PIP_INTERFACE  Interface)

Definition at line 568 of file lan.c.

569{
571 HANDLE ParameterHandle;
573 ULONG KeyValueInfoLength;
574 WCHAR Buffer[150];
575 UNICODE_STRING IPAddress = RTL_CONSTANT_STRING(L"IPAddress");
576 UNICODE_STRING Netmask = RTL_CONSTANT_STRING(L"SubnetMask");
577 UNICODE_STRING Gateway = RTL_CONSTANT_STRING(L"DefaultGateway");
578 UNICODE_STRING EnableDhcp = RTL_CONSTANT_STRING(L"EnableDHCP");
579 UNICODE_STRING Prefix = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
580 UNICODE_STRING TcpipRegistryPath;
581 UNICODE_STRING RegistryDataU;
582 ANSI_STRING RegistryDataA;
585 IP_ADDRESS DefaultMask, Router;
586
587 AddrInitIPv4(&DefaultMask, 0);
588
589 TcpipRegistryPath.MaximumLength = sizeof(WCHAR) * 150;
590 TcpipRegistryPath.Length = 0;
591 TcpipRegistryPath.Buffer = Buffer;
592
593 /* Build the registry path */
594 RtlAppendUnicodeStringToString(&TcpipRegistryPath, &Prefix);
595 RtlAppendUnicodeStringToString(&TcpipRegistryPath, &Interface->Name);
596
598 &TcpipRegistryPath,
600 0,
601 NULL);
602
603 /* Open a handle to the adapter parameters */
604 Status = ZwOpenKey(&ParameterHandle, KEY_READ, &ObjectAttributes);
605
606 if (!NT_SUCCESS(Status))
607 {
608 return FALSE;
609 }
610 else
611 {
612 KeyValueInfoLength = FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) + 16 * sizeof(WCHAR);
613 KeyValueInfo = ExAllocatePoolWithTag(PagedPool,
614 KeyValueInfoLength,
616 if (!KeyValueInfo)
617 {
618 ZwClose(ParameterHandle);
619 return FALSE;
620 }
621
622 /* Read the EnableDHCP entry */
623 Status = ZwQueryValueKey(ParameterHandle,
624 &EnableDhcp,
626 KeyValueInfo,
627 KeyValueInfoLength,
628 &Unused);
629 if (NT_SUCCESS(Status) && KeyValueInfo->DataLength == sizeof(ULONG) && (*(PULONG)KeyValueInfo->Data) == 0)
630 {
631 RegistryDataU.MaximumLength = KeyValueInfoLength - FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
632 RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data;
633
634 /* Read the IP address */
635 Status = ZwQueryValueKey(ParameterHandle,
636 &IPAddress,
638 KeyValueInfo,
639 KeyValueInfoLength,
640 &Unused);
641 if (NT_SUCCESS(Status))
642 {
643 RegistryDataU.Length = KeyValueInfo->DataLength;
644
645 Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
646 &RegistryDataU,
647 TRUE);
648 if (NT_SUCCESS(Status))
649 {
650 AddrInitIPv4(&Interface->Unicast,
651 inet_addr(RegistryDataA.Buffer));
652 RtlFreeAnsiString(&RegistryDataA);
653 }
654 }
655
656 Status = ZwQueryValueKey(ParameterHandle,
657 &Netmask,
659 KeyValueInfo,
660 KeyValueInfoLength,
661 &Unused);
662 if (NT_SUCCESS(Status))
663 {
664 RegistryDataU.Length = KeyValueInfo->DataLength;
665
666 Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
667 &RegistryDataU,
668 TRUE);
669 if (NT_SUCCESS(Status))
670 {
671 AddrInitIPv4(&Interface->Netmask,
672 inet_addr(RegistryDataA.Buffer));
673 RtlFreeAnsiString(&RegistryDataA);
674 }
675 }
676
677 /* We have to wait until both IP address and subnet mask
678 * are read to add the interface route, but we must do it
679 * before we add the default gateway */
680 if (!AddrIsUnspecified(&Interface->Unicast) &&
681 !AddrIsUnspecified(&Interface->Netmask))
683
684 /* Read default gateway info */
685 Status = ZwQueryValueKey(ParameterHandle,
686 &Gateway,
688 KeyValueInfo,
689 KeyValueInfoLength,
690 &Unused);
691 if (NT_SUCCESS(Status))
692 {
693 RegistryDataU.Length = KeyValueInfo->DataLength;
694
695 Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
696 &RegistryDataU,
697 TRUE);
698 if (NT_SUCCESS(Status))
699 {
700 AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
701
702 if (!AddrIsUnspecified(&Router))
703 RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, Interface, 1);
704
705 RtlFreeAnsiString(&RegistryDataA);
706 }
707 }
708 }
709
710 ExFreePoolWithTag(KeyValueInfo, KEY_VALUE_TAG);
711 ZwClose(ParameterHandle);
712 }
713
714 return TRUE;
715}
#define AddrInitIPv4(IPAddress, RawAddress)
Definition: address.h:16
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
VOID IPAddInterfaceRoute(PIP_INTERFACE IF)
Definition: ip.c:262
#define KEY_VALUE_TAG
Definition: tags.h:44
#define inet_addr(cp)
Definition: inet.h:98
#define Unused(x)
Definition: atlwin.h:28
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlFreeAnsiString(PANSI_STRING AnsiString)
@ KeyValuePartialInformation
Definition: nt_native.h:1182
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define KEY_READ
Definition: nt_native.h:1023
PFIB_ENTRY RouterCreateRoute(PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PIP_ADDRESS RouterAddress, PIP_INTERFACE Interface, UINT Metric)
Definition: router.c:421
Definition: ip.h:23
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
uint32_t * PULONG
Definition: typedefs.h:59
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1630

Referenced by ReconfigureAdapter().

◆ ReadStringFromRegistry()

static NTSTATUS ReadStringFromRegistry ( HANDLE  RegHandle,
PWCHAR  RegistryValue,
PUNICODE_STRING  String 
)
static

Definition at line 1087 of file lan.c.

1089 {
1094 UCHAR buf[1024];
1096
1097 RtlInitUnicodeString(&ValueName, RegistryValue);
1098 Status =
1099 ZwQueryValueKey(RegHandle,
1100 &ValueName,
1103 sizeof(buf),
1104 &ResultLength);
1105
1106 if (!NT_SUCCESS(Status))
1107 return Status;
1108 /* IP address is stored as a REG_MULTI_SZ - we only pay attention to the first one though */
1109 TI_DbgPrint(MIN_TRACE, ("Information DataLength: 0x%x\n", Information->DataLength));
1110
1111 UnicodeString.Buffer = (PWCHAR)&Information->Data;
1112 UnicodeString.Length = Information->DataLength - sizeof(WCHAR);
1113 UnicodeString.MaximumLength = Information->DataLength;
1114
1115 String->Buffer =
1117 UnicodeString.MaximumLength + sizeof(WCHAR), REG_STR_TAG );
1118
1119 if( !String->Buffer ) return STATUS_NO_MEMORY;
1120
1121 String->MaximumLength = UnicodeString.MaximumLength;
1123
1124 return STATUS_SUCCESS;
1125}
#define REG_STR_TAG
Definition: tags.h:46
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
struct _KEY_VALUE_PARTIAL_INFORMATION * PKEY_VALUE_PARTIAL_INFORMATION
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1049
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by CheckForDeviceDesc().

◆ ReconfigureAdapter()

BOOLEAN ReconfigureAdapter ( PRECONFIGURE_CONTEXT  Context)

Definition at line 717 of file lan.c.

718{
719 PLAN_ADAPTER Adapter = Context->Adapter;
721 NDIS_STATUS NdisStatus;
722 IP_ADDRESS DefaultMask;
723
724 /* Initialize the default unspecified address (0.0.0.0) */
725 AddrInitIPv4(&DefaultMask, 0);
726 if (Context->State == LAN_STATE_STARTED &&
727 !Context->Adapter->CompletingReset)
728 {
729 /* Read the IP configuration */
731
732 /* Compute the broadcast address */
733 Interface->Broadcast.Type = IP_ADDRESS_V4;
734 Interface->Broadcast.Address.IPv4Address = Interface->Unicast.Address.IPv4Address |
735 ~Interface->Netmask.Address.IPv4Address;
736 }
737 else if (!Context->Adapter->CompletingReset)
738 {
739 /* Clear IP configuration */
740 Interface->Unicast = DefaultMask;
741 Interface->Netmask = DefaultMask;
742 Interface->Broadcast = DefaultMask;
743
744 /* Remove all interface routes */
746
747 /* Destroy all cached neighbors */
749 }
750
751 Context->Adapter->CompletingReset = FALSE;
752
753 if (Context->State == LAN_STATE_STARTED)
754 {
755 /* Get maximum link speed */
756 NdisStatus = NDISCall(Adapter,
759 &Interface->Speed,
760 sizeof(Interface->Speed));
761
762 if (!NT_SUCCESS(NdisStatus))
764
765 Adapter->Speed = Interface->Speed * 100L;
766
767 /* Get maximum frame size */
768 NdisStatus = NDISCall(Adapter,
771 &Adapter->MTU,
772 sizeof(Adapter->MTU));
773 if (NdisStatus != NDIS_STATUS_SUCCESS)
774 return FALSE;
775
776 Interface->MTU = Adapter->MTU;
777
778 /* Get maximum packet size */
779 NdisStatus = NDISCall(Adapter,
782 &Adapter->MaxPacketSize,
783 sizeof(Adapter->MaxPacketSize));
784 if (NdisStatus != NDIS_STATUS_SUCCESS)
785 return FALSE;
786 }
787
788 Adapter->State = Context->State;
789
790 /* Update the IP and link status information cached in TCP */
793
794 return TRUE;
795}
#define IP_DEFAULT_LINK_SPEED
Definition: ip.h:201
#define IP_ADDRESS_V4
Definition: ip.h:32
VOID TCPUpdateInterfaceIPInformation(PIP_INTERFACE IF)
Definition: if.c:144
VOID TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF)
Definition: if.c:82
VOID NBDestroyNeighborsForInterface(PIP_INTERFACE Interface)
Definition: neighbor.c:237
#define OID_GEN_MAXIMUM_TOTAL_SIZE
Definition: ntddndis.h:249
#define OID_GEN_LINK_SPEED
Definition: ntddndis.h:239
#define OID_GEN_MAXIMUM_FRAME_SIZE
Definition: ntddndis.h:238
VOID RouterRemoveRoutesForInterface(PIP_INTERFACE Interface)
Definition: router.c:341
UINT Speed
Definition: lan.h:79
UINT MaxPacketSize
Definition: lan.h:76

Referenced by ReconfigureAdapterWorker().

◆ ReconfigureAdapterWorker()

VOID ReconfigureAdapterWorker ( PVOID  Context)

Definition at line 797 of file lan.c.

798{
799 PRECONFIGURE_CONTEXT ReconfigureContext = Context;
800
801 /* Complete the reconfiguration asynchronously */
802 ReconfigureAdapter(ReconfigureContext);
803
804 /* Free the context */
805 ExFreePool(ReconfigureContext);
806}
#define ExFreePool(addr)
Definition: env_spec_w32.h:352

Referenced by ProtocolStatus().

◆ TcpipLanGetDwordOid()

NTSTATUS TcpipLanGetDwordOid ( PIP_INTERFACE  Interface,
NDIS_OID  Oid,
PULONG  Result 
)

Definition at line 183 of file lan.c.

186 {
187 /* Get maximum frame size */
188 if( Interface->Context ) {
189 return NDISCall((PLAN_ADAPTER)Interface->Context,
191 Oid,
192 Result,
193 sizeof(ULONG));
194 } else switch( Oid ) { /* Loopback Case */
197 return STATUS_SUCCESS;
200 return STATUS_SUCCESS;
201 default:
203 }
204}
@ NdisHardwareStatusReady
Definition: ntddndis.h:450
#define OID_GEN_HARDWARE_STATUS
Definition: ntddndis.h:234
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

◆ UnbindAdapter()

VOID UnbindAdapter ( PLAN_ADAPTER  Adapter)

Definition at line 1416 of file lan.c.

1423{
1424 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1425
1426 if (Adapter->State == LAN_STATE_STARTED) {
1427 PIP_INTERFACE IF = Adapter->Context;
1428
1430
1432 }
1433}

Referenced by LANUnregisterAdapter().

Variable Documentation

◆ AdapterListHead

◆ AdapterListLock

KSPIN_LOCK AdapterListLock

Definition at line 39 of file lan.c.

Referenced by DriverEntry(), LANRegisterAdapter(), LANRegisterProtocol(), and LANUnregisterProtocol().

◆ NdisProtocolHandle

◆ ProtocolRegistered

BOOLEAN ProtocolRegistered = FALSE

Definition at line 37 of file lan.c.

Referenced by LANRegisterProtocol(), and LANUnregisterProtocol().

◆ TransferDataCalled

UINT TransferDataCalled = 0

Definition at line 17 of file lan.c.

Referenced by ProtocolReceive(), and ProtocolTransferDataComplete().

◆ TransferDataCompleteCalled

UINT TransferDataCompleteCalled = 0

Definition at line 18 of file lan.c.

Referenced by ProtocolTransferDataComplete().