ReactOS 0.4.16-dev-2491-g3dc6630
lan.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: datalink/lan.c
5 * PURPOSE: Local Area Network media routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * REVISIONS:
8 * CSH 01/08-2000 Created
9 */
10
11#include "precomp.h"
12
13#include <ntifs.h>
14#include <receive.h>
15#include <wait.h>
16
19
20#define CCS_ROOT L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet"
21#define TCPIP_GUID L"{4D36E972-E325-11CE-BFC1-08002BE10318}"
22
23typedef struct _LAN_WQ_ITEM {
30
31typedef struct _RECONFIGURE_CONTEXT {
35
40
42 PLAN_ADAPTER Adapter,
47/*
48 * FUNCTION: Send a request to NDIS
49 * ARGUMENTS:
50 * Adapter = Pointer to a LAN_ADAPTER structure
51 * Type = Type of request (Set or Query)
52 * OID = Value to be set/queried for
53 * Buffer = Pointer to a buffer to use
54 * Length = Number of bytes in Buffer
55 * RETURNS:
56 * Status of operation
57 */
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}
91
92/* Used by legacy ProtocolReceive for packet type */
95 PVOID HeaderBuffer,
96 ULONG HeaderBufferSize,
97 PULONG PacketType)
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}
130
131/* Used by ProtocolReceivePacket for packet type */
134 PNDIS_PACKET NdisPacket,
135 PULONG PacketType)
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}
169
170
172 PLAN_ADAPTER Adapter)
173/*
174 * FUNCTION: Frees memory for a LAN_ADAPTER structure
175 * ARGUMENTS:
176 * Adapter = Pointer to LAN_ADAPTER structure to free
177 */
178{
180}
181
182
185 NDIS_OID Oid,
186 PULONG Result ) {
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}
205
206
208 NDIS_HANDLE BindingContext,
211/*
212 * FUNCTION: Called by NDIS to complete opening of an adapter
213 * ARGUMENTS:
214 * BindingContext = Pointer to a device context (LAN_ADAPTER)
215 * Status = Status of the operation
216 * OpenErrorStatus = Additional status information
217 */
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}
227
228
230 NDIS_HANDLE BindingContext,
232/*
233 * FUNCTION: Called by NDIS to complete closing an adapter
234 * ARGUMENTS:
235 * BindingContext = Pointer to a device context (LAN_ADAPTER)
236 * Status = Status of the operation
237 */
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}
247
248
250 NDIS_HANDLE BindingContext,
252/*
253 * FUNCTION: Called by NDIS to complete resetting an adapter
254 * ARGUMENTS:
255 * BindingContext = Pointer to a device context (LAN_ADAPTER)
256 * Status = Status of the operation
257 */
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}
267
268
270 NDIS_HANDLE BindingContext,
273/*
274 * FUNCTION: Called by NDIS to complete a request
275 * ARGUMENTS:
276 * BindingContext = Pointer to a device context (LAN_ADAPTER)
277 * NdisRequest = Pointer to an object describing the request
278 * Status = Status of the operation
279 */
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}
290
291
293 NDIS_HANDLE BindingContext,
296/*
297 * FUNCTION: Called by NDIS to complete sending process
298 * ARGUMENTS:
299 * BindingContext = Pointer to a device context (LAN_ADAPTER)
300 * Packet = Pointer to a packet descriptor
301 * Status = Status of the operation
302 */
303{
305}
306
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}
387
389 NDIS_HANDLE BindingContext,
392 BOOLEAN LegacyReceive) {
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}
409
411 NDIS_HANDLE BindingContext,
415/*
416 * FUNCTION: Called by NDIS to complete reception of data
417 * ARGUMENTS:
418 * BindingContext = Pointer to a device context (LAN_ADAPTER)
419 * Packet = Pointer to a packet descriptor
420 * Status = Status of the operation
421 * BytesTransferred = Number of bytes transferred
422 * NOTES:
423 * If the packet was successfully received, determine the protocol
424 * type and pass it to the correct receive handler
425 */
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}
441
443 NDIS_HANDLE BindingContext,
444 PNDIS_PACKET NdisPacket)
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}
461
463 NDIS_HANDLE BindingContext,
464 NDIS_HANDLE MacReceiveContext,
465 PVOID HeaderBuffer,
466 UINT HeaderBufferSize,
467 PVOID LookaheadBuffer,
468 UINT LookaheadBufferSize,
470/*
471 * FUNCTION: Called by NDIS when a packet has been received on the physical link
472 * ARGUMENTS:
473 * BindingContext = Pointer to a device context (LAN_ADAPTER)
474 * MacReceiveContext = Handle used by underlying NIC driver
475 * HeaderBuffer = Pointer to a buffer containing the packet header
476 * HeaderBufferSize = Number of bytes in HeaderBuffer
477 * LookaheadBuffer = Pointer to a buffer containing buffered packet data
478 * LookaheadBufferSize = Size of LookaheadBuffer. May be less than asked for
479 * PacketSize = Overall size of the packet (not including header)
480 * RETURNS:
481 * Status of operation
482 */
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}
555
556
558 NDIS_HANDLE BindingContext)
559/*
560 * FUNCTION: Called by NDIS when we're done receiving data
561 * ARGUMENTS:
562 * BindingContext = Pointer to a device context (LAN_ADAPTER)
563 */
564{
565 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
566}
567
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 InterfaceMetric = RTL_CONSTANT_STRING(L"InterfaceMetric");
580 UNICODE_STRING Prefix = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
581 UNICODE_STRING TcpipRegistryPath;
582 UNICODE_STRING RegistryDataU;
583 ANSI_STRING RegistryDataA;
586 IP_ADDRESS DefaultMask, Router;
587
588 AddrInitIPv4(&DefaultMask, 0);
589
590 TcpipRegistryPath.MaximumLength = sizeof(WCHAR) * 150;
591 TcpipRegistryPath.Length = 0;
592 TcpipRegistryPath.Buffer = Buffer;
593
594 /* Build the registry path */
595 RtlAppendUnicodeStringToString(&TcpipRegistryPath, &Prefix);
596 RtlAppendUnicodeStringToString(&TcpipRegistryPath, &Interface->Name);
597
599 &TcpipRegistryPath,
601 0,
602 NULL);
603
604 /* Open a handle to the adapter parameters */
605 Status = ZwOpenKey(&ParameterHandle, KEY_READ, &ObjectAttributes);
606
607 if (!NT_SUCCESS(Status))
608 {
609 return FALSE;
610 }
611 else
612 {
613 KeyValueInfoLength = FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) + 16 * sizeof(WCHAR);
614 KeyValueInfo = ExAllocatePoolWithTag(PagedPool,
615 KeyValueInfoLength,
617 if (!KeyValueInfo)
618 {
619 ZwClose(ParameterHandle);
620 return FALSE;
621 }
622
623 /* Read the InterfaceMetric value */
624 Interface->Metric = 0;
625 Status = ZwQueryValueKey(ParameterHandle,
626 &InterfaceMetric,
628 KeyValueInfo,
629 KeyValueInfoLength,
630 &Unused);
631 if (NT_SUCCESS(Status) && KeyValueInfo->DataLength == sizeof(ULONG))
632 {
633 Interface->Metric = (UINT)*(PULONG)KeyValueInfo->Data;
634 if (Interface->Metric > 9999)
635 Interface->Metric = 9999;
636 }
637
638 /* Read the EnableDHCP entry */
639 Status = ZwQueryValueKey(ParameterHandle,
640 &EnableDhcp,
642 KeyValueInfo,
643 KeyValueInfoLength,
644 &Unused);
645 if (NT_SUCCESS(Status) && KeyValueInfo->DataLength == sizeof(ULONG) && (*(PULONG)KeyValueInfo->Data) == 0)
646 {
647 RegistryDataU.MaximumLength = KeyValueInfoLength - FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
648 RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data;
649
650 /* Read the IP address */
651 Status = ZwQueryValueKey(ParameterHandle,
652 &IPAddress,
654 KeyValueInfo,
655 KeyValueInfoLength,
656 &Unused);
657 if (NT_SUCCESS(Status))
658 {
659 RegistryDataU.Length = KeyValueInfo->DataLength;
660
661 Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
662 &RegistryDataU,
663 TRUE);
664 if (NT_SUCCESS(Status))
665 {
666 AddrInitIPv4(&Interface->Unicast,
667 inet_addr(RegistryDataA.Buffer));
668 RtlFreeAnsiString(&RegistryDataA);
669 }
670 }
671
672 Status = ZwQueryValueKey(ParameterHandle,
673 &Netmask,
675 KeyValueInfo,
676 KeyValueInfoLength,
677 &Unused);
678 if (NT_SUCCESS(Status))
679 {
680 RegistryDataU.Length = KeyValueInfo->DataLength;
681
682 Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
683 &RegistryDataU,
684 TRUE);
685 if (NT_SUCCESS(Status))
686 {
687 AddrInitIPv4(&Interface->Netmask,
688 inet_addr(RegistryDataA.Buffer));
689 RtlFreeAnsiString(&RegistryDataA);
690 }
691 }
692
693 /* We have to wait until both IP address and subnet mask
694 * are read to add the interface route, but we must do it
695 * before we add the default gateway */
696 if (!AddrIsUnspecified(&Interface->Unicast) &&
697 !AddrIsUnspecified(&Interface->Netmask))
699
700 /* Read default gateway info */
701 Status = ZwQueryValueKey(ParameterHandle,
702 &Gateway,
704 KeyValueInfo,
705 KeyValueInfoLength,
706 &Unused);
707 if (NT_SUCCESS(Status))
708 {
709 RegistryDataU.Length = KeyValueInfo->DataLength;
710
711 Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
712 &RegistryDataU,
713 TRUE);
714 if (NT_SUCCESS(Status))
715 {
716 AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
717
718 if (!AddrIsUnspecified(&Router))
719 RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, Interface);
720
721 RtlFreeAnsiString(&RegistryDataA);
722 }
723 }
724 }
725
726 ExFreePoolWithTag(KeyValueInfo, KEY_VALUE_TAG);
727 ZwClose(ParameterHandle);
728 }
729
730 return TRUE;
731}
732
734{
735 PLAN_ADAPTER Adapter = Context->Adapter;
737 NDIS_STATUS NdisStatus;
738 IP_ADDRESS DefaultMask;
739
740 /* Initialize the default unspecified address (0.0.0.0) */
741 AddrInitIPv4(&DefaultMask, 0);
742 if (Context->State == LAN_STATE_STARTED &&
743 !Context->Adapter->CompletingReset)
744 {
745 /* Read the IP configuration */
747
748 /* Compute the broadcast address */
749 Interface->Broadcast.Type = IP_ADDRESS_V4;
750 Interface->Broadcast.Address.IPv4Address = Interface->Unicast.Address.IPv4Address |
751 ~Interface->Netmask.Address.IPv4Address;
752 }
753 else if (!Context->Adapter->CompletingReset)
754 {
755 /* Clear IP configuration */
756 Interface->Unicast = DefaultMask;
757 Interface->Netmask = DefaultMask;
758 Interface->Broadcast = DefaultMask;
759
760 /* Remove all interface routes */
762
763 /* Destroy all cached neighbors */
765 }
766
767 Context->Adapter->CompletingReset = FALSE;
768
769 if (Context->State == LAN_STATE_STARTED)
770 {
771 /* Get maximum link speed */
772 NdisStatus = NDISCall(Adapter,
775 &Interface->Speed,
776 sizeof(Interface->Speed));
777
778 if (!NT_SUCCESS(NdisStatus))
780
781 Adapter->Speed = Interface->Speed * 100L;
782
783 /* Get maximum frame size */
784 NdisStatus = NDISCall(Adapter,
787 &Adapter->MTU,
788 sizeof(Adapter->MTU));
789 if (NdisStatus != NDIS_STATUS_SUCCESS)
790 return FALSE;
791
792 Interface->MTU = Adapter->MTU;
793
794 /* Get maximum packet size */
795 NdisStatus = NDISCall(Adapter,
798 &Adapter->MaxPacketSize,
799 sizeof(Adapter->MaxPacketSize));
800 if (NdisStatus != NDIS_STATUS_SUCCESS)
801 return FALSE;
802 }
803
804 Adapter->State = Context->State;
805
806 /* Update the IP and link status information cached in TCP */
809
810 return TRUE;
811}
812
814{
815 PRECONFIGURE_CONTEXT ReconfigureContext = Context;
816
817 /* Complete the reconfiguration asynchronously */
818 ReconfigureAdapter(ReconfigureContext);
819
820 /* Free the context */
821 ExFreePool(ReconfigureContext);
822}
823
825 NDIS_HANDLE BindingContext,
829/*
830 * FUNCTION: Called by NDIS when the underlying driver has changed state
831 * ARGUMENTS:
832 * BindingContext = Pointer to a device context (LAN_ADAPTER)
833 * GeneralStatus = A general status code
834 * StatusBuffer = Pointer to a buffer with medium-specific data
835 * StatusBufferSize = Number of bytes in StatusBuffer
836 */
837{
838 PLAN_ADAPTER Adapter = BindingContext;
840
841 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
842
843 /* Ignore the status indication if we have no context yet. We'll get another later */
844 if (!Adapter->Context)
845 return;
846
848 if (!Context)
849 return;
850
851 Context->Adapter = Adapter;
852
853 switch(GeneralStatus)
854 {
856 DbgPrint("NDIS_STATUS_MEDIA_CONNECT\n");
857
858 if (Adapter->State == LAN_STATE_STARTED)
859 {
861 return;
862 }
863
864 Context->State = LAN_STATE_STARTED;
865 break;
866
868 DbgPrint("NDIS_STATUS_MEDIA_DISCONNECT\n");
869
870 if (Adapter->State == LAN_STATE_STOPPED)
871 {
873 return;
874 }
875
876 Context->State = LAN_STATE_STOPPED;
877 break;
878
880 Adapter->OldState = Adapter->State;
881 Adapter->State = LAN_STATE_RESETTING;
882 /* Nothing else to do here */
884 return;
885
887 Adapter->CompletingReset = TRUE;
888 Context->State = Adapter->OldState;
889 break;
890
891 default:
892 DbgPrint("Unhandled status: %x", GeneralStatus);
894 return;
895 }
896
897 /* Queue the work item */
900}
901
903/*
904 * FUNCTION: Called by NDIS when a status-change has occurred
905 * ARGUMENTS:
906 * BindingContext = Pointer to a device context (LAN_ADAPTER)
907 */
908{
909 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
910}
911
914 NDIS_HANDLE NdisBindingContext,
915 PNET_PNP_EVENT PnPEvent)
916{
917 switch(PnPEvent->NetEvent)
918 {
919 case NetEventSetPower:
920 DbgPrint("Device transitioned to power state %ld\n", PnPEvent->Buffer);
921 return NDIS_STATUS_SUCCESS;
922
924 DbgPrint("Device wants to go into power state %ld\n", PnPEvent->Buffer);
925 return NDIS_STATUS_SUCCESS;
926
928 DbgPrint("Device is about to be removed\n");
929 return NDIS_STATUS_SUCCESS;
930
932 DbgPrint("Device removal cancelled\n");
933 return NDIS_STATUS_SUCCESS;
934
935 default:
936 DbgPrint("Unhandled event type: %ld\n", PnPEvent->NetEvent);
937 return NDIS_STATUS_SUCCESS;
938 }
939}
940
943 IN NDIS_HANDLE BindContext,
945 IN PVOID SystemSpecific1,
947/*
948 * FUNCTION: Called by NDIS during NdisRegisterProtocol to set up initial
949 * bindings, and periodically thereafter as new adapters come online
950 * ARGUMENTS:
951 * Status: Return value to NDIS
952 * BindContext: Handle provided by NDIS to track pending binding operations
953 * DeviceName: Name of the miniport device to bind to
954 * SystemSpecific1: Pointer to a registry path with protocol-specific configuration information
955 * SystemSpecific2: Unused & must not be touched
956 */
957{
958 TI_DbgPrint(DEBUG_DATALINK, ("Called with registry path %wZ for %wZ\n", SystemSpecific1, DeviceName));
959 *Status = LANRegisterAdapter(DeviceName, SystemSpecific1);
960}
961
962
965 PNDIS_PACKET NdisPacket,
966 UINT Offset,
967 PVOID LinkAddress,
968 USHORT Type)
969/*
970 * FUNCTION: Transmits a packet
971 * ARGUMENTS:
972 * Context = Pointer to context information (LAN_ADAPTER)
973 * NdisPacket = Pointer to NDIS packet to send
974 * Offset = Offset in packet where data starts
975 * LinkAddress = Pointer to link address of destination (NULL = broadcast)
976 * Type = LAN protocol type (LAN_PROTO_*)
977 */
978{
979 NDIS_STATUS NdisStatus;
980 PETH_HEADER EHeader;
981 PCHAR Data, OldData;
982 UINT Size, OldSize;
985 PNDIS_PACKET XmitPacket;
987
989 ("Called( NdisPacket %x, Offset %d, Adapter %x )\n",
990 NdisPacket, Offset, Adapter));
991
992 if (Adapter->State != LAN_STATE_STARTED) {
993 (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_NOT_ACCEPTED);
994 return;
995 }
996
998 ("Adapter Address [%02x %02x %02x %02x %02x %02x]\n",
999 Adapter->HWAddress[0] & 0xff,
1000 Adapter->HWAddress[1] & 0xff,
1001 Adapter->HWAddress[2] & 0xff,
1002 Adapter->HWAddress[3] & 0xff,
1003 Adapter->HWAddress[4] & 0xff,
1004 Adapter->HWAddress[5] & 0xff));
1005
1006 GetDataPtr( NdisPacket, 0, &OldData, &OldSize );
1007
1008 NdisStatus = AllocatePacketWithBuffer(&XmitPacket, NULL, OldSize + Adapter->HeaderSize);
1009 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1010 (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_RESOURCES);
1011 return;
1012 }
1013
1014 GetDataPtr(XmitPacket, 0, &Data, &Size);
1015
1016 RtlCopyMemory(Data + Adapter->HeaderSize, OldData, OldSize);
1017
1018 (*PC(NdisPacket)->DLComplete)(PC(NdisPacket)->Context, NdisPacket, NDIS_STATUS_SUCCESS);
1019
1020 switch (Adapter->Media) {
1021 case NdisMedium802_3:
1022 EHeader = (PETH_HEADER)Data;
1023
1024 if (LinkAddress) {
1025 /* Unicast address */
1026 RtlCopyMemory(EHeader->DstAddr, LinkAddress, IEEE_802_ADDR_LENGTH);
1027 } else {
1028 /* Broadcast address */
1030 }
1031
1033
1034 switch (Type) {
1035 case LAN_PROTO_IPv4:
1036 EHeader->EType = ETYPE_IPv4;
1037 break;
1038 case LAN_PROTO_ARP:
1039 EHeader->EType = ETYPE_ARP;
1040 break;
1041 case LAN_PROTO_IPv6:
1042 EHeader->EType = ETYPE_IPv6;
1043 break;
1044 default:
1045 ASSERT(FALSE);
1046 return;
1047 }
1048 break;
1049
1050 default:
1051 /* FIXME: Support other medias */
1052 break;
1053 }
1054
1055 TI_DbgPrint( MID_TRACE, ("LinkAddress: %x\n", LinkAddress));
1056 if( LinkAddress ) {
1058 ( MID_TRACE,
1059 ("Link Address [%02x %02x %02x %02x %02x %02x]\n",
1060 ((PCHAR)LinkAddress)[0] & 0xff,
1061 ((PCHAR)LinkAddress)[1] & 0xff,
1062 ((PCHAR)LinkAddress)[2] & 0xff,
1063 ((PCHAR)LinkAddress)[3] & 0xff,
1064 ((PCHAR)LinkAddress)[4] & 0xff,
1065 ((PCHAR)LinkAddress)[5] & 0xff));
1066 }
1067
1068 if (Adapter->MTU < Size) {
1069 /* This is NOT a pointer. MSDN explicitly says so. */
1071 TcpLargeSendPacketInfo) = (PVOID)((ULONG_PTR)Adapter->MTU);
1072 }
1073
1074 /* Update interface stats */
1075 Interface->Stats.OutBytes += Size;
1076
1077 TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql );
1078 TI_DbgPrint(MID_TRACE, ("NdisSend\n"));
1079 NdisSend(&NdisStatus, Adapter->NdisHandle, XmitPacket);
1080 TI_DbgPrint(MID_TRACE, ("NdisSend %s\n",
1081 NdisStatus == NDIS_STATUS_PENDING ?
1082 "Pending" : "Complete"));
1083 TcpipReleaseSpinLock( &Adapter->Lock, OldIrql );
1084
1085 /* I had a talk with vizzini: these really ought to be here.
1086 * we're supposed to see these completed by ndis *only* when
1087 * status_pending is returned. Note that this is different from
1088 * the situation with IRPs. */
1089 if (NdisStatus != NDIS_STATUS_PENDING)
1090 ProtocolSendComplete((NDIS_HANDLE)Context, XmitPacket, NdisStatus);
1091}
1092
1093static NTSTATUS
1097
1099 Status = ZwOpenKey(RegHandle, KEY_ALL_ACCESS, &Attributes);
1100 return Status;
1101}
1102
1104 PWCHAR RegistryValue,
1110 UCHAR buf[1024];
1112
1113 RtlInitUnicodeString(&ValueName, RegistryValue);
1114 Status =
1115 ZwQueryValueKey(RegHandle,
1116 &ValueName,
1119 sizeof(buf),
1120 &ResultLength);
1121
1122 if (!NT_SUCCESS(Status))
1123 return Status;
1124 /* IP address is stored as a REG_MULTI_SZ - we only pay attention to the first one though */
1125 TI_DbgPrint(MIN_TRACE, ("Information DataLength: 0x%x\n", Information->DataLength));
1126
1127 UnicodeString.Buffer = (PWCHAR)&Information->Data;
1128 UnicodeString.Length = Information->DataLength - sizeof(WCHAR);
1129 UnicodeString.MaximumLength = Information->DataLength;
1130
1131 String->Buffer =
1133 UnicodeString.MaximumLength + sizeof(WCHAR), REG_STR_TAG );
1134
1135 if( !String->Buffer ) return STATUS_NO_MEMORY;
1136
1137 String->MaximumLength = UnicodeString.MaximumLength;
1139
1140 return STATUS_SUCCESS;
1141}
1142
1143/*
1144 * Utility to copy and append two unicode strings.
1145 *
1146 * IN OUT PUNICODE_STRING ResultFirst -> First string and result
1147 * IN PUNICODE_STRING Second -> Second string to append
1148 * IN BOOL Deallocate -> TRUE: Deallocate First string before
1149 * overwriting.
1150 *
1151 * Returns NTSTATUS.
1152 */
1153
1156 BOOLEAN Deallocate) {
1158 UNICODE_STRING Ustr = *ResultFirst;
1159 PWSTR new_string = ExAllocatePoolWithTag
1160 (PagedPool,
1161 (ResultFirst->Length + Second->Length + sizeof(WCHAR)), TEMP_STRING_TAG);
1162 if( !new_string ) {
1163 return STATUS_NO_MEMORY;
1164 }
1165 memcpy( new_string, ResultFirst->Buffer, ResultFirst->Length );
1166 memcpy( new_string + ResultFirst->Length / sizeof(WCHAR),
1167 Second->Buffer, Second->Length );
1168 if( Deallocate ) RtlFreeUnicodeString(ResultFirst);
1169 ResultFirst->Length = Ustr.Length + Second->Length;
1170 ResultFirst->MaximumLength = ResultFirst->Length;
1171 new_string[ResultFirst->Length / sizeof(WCHAR)] = 0;
1172 Status = RtlCreateUnicodeString(ResultFirst,new_string) ?
1175 return Status;
1176}
1177
1179 PUNICODE_STRING TargetKeyName,
1181 PUNICODE_STRING DeviceDesc ) {
1182 UNICODE_STRING RootDevice = { 0, 0, NULL }, LinkageKeyName = { 0, 0, NULL };
1183 UNICODE_STRING DescKeyName = { 0, 0, NULL }, Linkage = { 0, 0, NULL };
1184 UNICODE_STRING BackSlash = { 0, 0, NULL };
1185 HANDLE DescKey = NULL, LinkageKey = NULL;
1187
1188 TI_DbgPrint(DEBUG_DATALINK,("EnumKeyName %wZ\n", EnumKeyName));
1189
1191 RtlInitUnicodeString(&Linkage, L"\\Linkage");
1192
1193 RtlInitUnicodeString(&DescKeyName, L"");
1194 AppendUnicodeString( &DescKeyName, EnumKeyName, FALSE );
1195 AppendUnicodeString( &DescKeyName, &BackSlash, TRUE );
1196 AppendUnicodeString( &DescKeyName, TargetKeyName, TRUE );
1197
1198 RtlInitUnicodeString(&LinkageKeyName, L"");
1199 AppendUnicodeString( &LinkageKeyName, &DescKeyName, FALSE );
1200 AppendUnicodeString( &LinkageKeyName, &Linkage, TRUE );
1201
1202 Status = OpenRegistryKey( &LinkageKeyName, &LinkageKey );
1203 if( !NT_SUCCESS(Status) ) goto cleanup;
1204
1205 Status = ReadStringFromRegistry( LinkageKey, L"RootDevice", &RootDevice );
1206 if( !NT_SUCCESS(Status) ) goto cleanup;
1207
1208 if( RtlCompareUnicodeString( &RootDevice, Name, TRUE ) == 0 ) {
1209 Status = OpenRegistryKey( &DescKeyName, &DescKey );
1210 if( !NT_SUCCESS(Status) ) goto cleanup;
1211
1212 Status = ReadStringFromRegistry( DescKey, L"DriverDesc", DeviceDesc );
1213 if( !NT_SUCCESS(Status) ) goto cleanup;
1214
1215 TI_DbgPrint(DEBUG_DATALINK,("ADAPTER DESC: %wZ\n", DeviceDesc));
1216 } else Status = STATUS_UNSUCCESSFUL;
1217
1218cleanup:
1219 RtlFreeUnicodeString( &RootDevice );
1220 RtlFreeUnicodeString( &LinkageKeyName );
1221 RtlFreeUnicodeString( &DescKeyName );
1222 if( LinkageKey ) ZwClose( LinkageKey );
1223 if( DescKey ) ZwClose( DescKey );
1224
1225 TI_DbgPrint(DEBUG_DATALINK,("Returning %x\n", Status));
1226
1227 return Status;
1228}
1229
1231 PUNICODE_STRING DeviceDesc ) {
1232 UNICODE_STRING EnumKeyName, TargetKeyName;
1235 ULONG i;
1236 KEY_BASIC_INFORMATION *Kbio =
1238 ULONG KbioLength = sizeof(KEY_BASIC_INFORMATION), ResultLength;
1239
1240 RtlInitUnicodeString( DeviceDesc, NULL );
1241
1242 if( !Kbio ) return STATUS_INSUFFICIENT_RESOURCES;
1243
1245 (&EnumKeyName, CCS_ROOT L"\\Control\\Class\\" TCPIP_GUID);
1246
1247 Status = OpenRegistryKey( &EnumKeyName, &EnumKey );
1248
1249 if( !NT_SUCCESS(Status) ) {
1250 TI_DbgPrint(DEBUG_DATALINK,("Couldn't open Enum key %wZ: %x\n",
1251 &EnumKeyName, Status));
1252 ExFreePoolWithTag( Kbio, KBIO_TAG );
1253 return Status;
1254 }
1255
1256 for( i = 0; NT_SUCCESS(Status); i++ ) {
1257 Status = ZwEnumerateKey( EnumKey, i, KeyBasicInformation,
1258 Kbio, KbioLength, &ResultLength );
1259
1261 ExFreePoolWithTag( Kbio, KBIO_TAG );
1262 KbioLength = ResultLength;
1263 Kbio = ExAllocatePoolWithTag( NonPagedPool, KbioLength, KBIO_TAG );
1264 if( !Kbio ) {
1265 TI_DbgPrint(DEBUG_DATALINK,("Failed to allocate memory\n"));
1266 ZwClose( EnumKey );
1267 return STATUS_NO_MEMORY;
1268 }
1269
1270 Status = ZwEnumerateKey( EnumKey, i, KeyBasicInformation,
1271 Kbio, KbioLength, &ResultLength );
1272
1273 if( !NT_SUCCESS(Status) ) {
1274 TI_DbgPrint(DEBUG_DATALINK,("Couldn't enum key child %d\n", i));
1275 ZwClose( EnumKey );
1276 ExFreePoolWithTag( Kbio, KBIO_TAG );
1277 return Status;
1278 }
1279 }
1280
1281 if( NT_SUCCESS(Status) ) {
1282 TargetKeyName.Length = TargetKeyName.MaximumLength =
1283 Kbio->NameLength;
1284 TargetKeyName.Buffer = Kbio->Name;
1285
1287 ( &EnumKeyName, &TargetKeyName, Name, DeviceDesc );
1288 if( NT_SUCCESS(Status) ) {
1289 ZwClose( EnumKey );
1290 ExFreePoolWithTag( Kbio, KBIO_TAG );
1291 return Status;
1292 } else Status = STATUS_SUCCESS;
1293 }
1294 }
1295
1296 ZwClose( EnumKey );
1297 ExFreePoolWithTag( Kbio, KBIO_TAG );
1298 return STATUS_UNSUCCESSFUL;
1299}
1300
1302 PUNICODE_STRING OutName ) {
1303 PWCHAR Ptr;
1304 UNICODE_STRING PartialRegistryKey;
1305
1306 PartialRegistryKey.Buffer =
1307 RegistryKey->Buffer + wcslen(CCS_ROOT L"\\Services\\");
1308 Ptr = PartialRegistryKey.Buffer;
1309
1310 while( *Ptr != L'\\' &&
1311 ((PCHAR)Ptr) < ((PCHAR)RegistryKey->Buffer) + RegistryKey->Length )
1312 Ptr++;
1313
1314 PartialRegistryKey.Length = PartialRegistryKey.MaximumLength =
1315 (Ptr - PartialRegistryKey.Buffer) * sizeof(WCHAR);
1316
1317 RtlInitUnicodeString( OutName, L"" );
1318 AppendUnicodeString( OutName, &PartialRegistryKey, FALSE );
1319}
1320
1322 PLAN_ADAPTER Adapter,
1324/*
1325 * FUNCTION: Binds a LAN adapter to IP layer
1326 * ARGUMENTS:
1327 * Adapter = Pointer to LAN_ADAPTER structure
1328 * NOTES:
1329 * We set the lookahead buffer size, set the packet filter and
1330 * bind the adapter to IP layer
1331 */
1332{
1333 PIP_INTERFACE IF;
1334 NDIS_STATUS NdisStatus;
1336 ULONG Lookahead = LOOKAHEAD_SIZE;
1338 NDIS_MEDIA_STATE MediaState;
1339
1340 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1341
1342 Adapter->State = LAN_STATE_OPENING;
1343
1344 NdisStatus = NDISCall(Adapter,
1347 &Lookahead,
1348 sizeof(ULONG));
1349 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1350 TI_DbgPrint(DEBUG_DATALINK, ("Could not set lookahead buffer size (0x%X).\n", NdisStatus));
1351 return FALSE;
1352 }
1353
1354 /* Bind the adapter to IP layer */
1355 BindInfo.Context = Adapter;
1356 BindInfo.HeaderSize = Adapter->HeaderSize;
1357 BindInfo.MinFrameSize = Adapter->MinFrameSize;
1358 BindInfo.Address = (PUCHAR)&Adapter->HWAddress;
1359 BindInfo.AddressLength = Adapter->HWAddressLength;
1360 BindInfo.Transmit = LANTransmit;
1361
1363
1364 if (!IF) {
1365 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1366 return FALSE;
1367 }
1368
1369 /*
1370 * Query per-adapter configuration from the registry
1371 * In case anyone is curious: there *is* an Ndis configuration api
1372 * for this sort of thing, but it doesn't really support things like
1373 * REG_MULTI_SZ very well, and there is a note in the DDK that says that
1374 * protocol drivers developed for win2k and above just use the native
1375 * services (ZwOpenKey, etc).
1376 */
1377
1378 GetName( RegistryPath, &IF->Name );
1379
1381 if (!NT_SUCCESS(Status)) {
1382 TI_DbgPrint(MIN_TRACE, ("Failed to get device description.\n"));
1384 return FALSE;
1385 }
1386
1387 TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n",
1388 &IF->Description));
1389
1390 /* Register interface with IP layer */
1392
1393 /* Store adapter context */
1394 Adapter->Context = IF;
1395
1396 /* Get the media state */
1397 NdisStatus = NDISCall(Adapter,
1400 &MediaState,
1401 sizeof(MediaState));
1402 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1403 TI_DbgPrint(DEBUG_DATALINK, ("Could not query media status (0x%X).\n", NdisStatus));
1406 return FALSE;
1407 }
1408
1409 /* Indicate the current media state */
1410 ProtocolStatus(Adapter,
1412 NULL, 0);
1413
1414 /* Set packet filter so we can send and receive packets */
1415 NdisStatus = NDISCall(Adapter,
1418 &Adapter->PacketFilter,
1419 sizeof(UINT));
1420
1421 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1422 TI_DbgPrint(DEBUG_DATALINK, ("Could not set packet filter (0x%X).\n", NdisStatus));
1425 return FALSE;
1426 }
1427
1428 return TRUE;
1429}
1430
1431
1433 PLAN_ADAPTER Adapter)
1434/*
1435 * FUNCTION: Unbinds a LAN adapter from IP layer
1436 * ARGUMENTS:
1437 * Adapter = Pointer to LAN_ADAPTER structure
1438 */
1439{
1440 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1441
1442 if (Adapter->State == LAN_STATE_STARTED) {
1443 PIP_INTERFACE IF = Adapter->Context;
1444
1446
1448 }
1449}
1450
1451
1455/*
1456 * FUNCTION: Registers protocol with an NDIS adapter
1457 * ARGUMENTS:
1458 * AdapterName = Pointer to string with name of adapter to register
1459 * Adapter = Address of pointer to a LAN_ADAPTER structure
1460 * RETURNS:
1461 * Status of operation
1462 */
1463{
1464 PLAN_ADAPTER IF;
1465 NDIS_STATUS NdisStatus;
1467 UINT MediaIndex;
1469 UINT AddressOID;
1470
1471 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1472
1474 if (!IF) {
1475 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1476 return NDIS_STATUS_RESOURCES;
1477 }
1478
1479 RtlZeroMemory(IF, sizeof(LAN_ADAPTER));
1480
1481 /* Put adapter in stopped state */
1483
1484 /* Initialize protecting spin lock */
1486
1488
1489 /* Initialize array with media IDs we support */
1491
1492 TI_DbgPrint(DEBUG_DATALINK,("opening adapter %wZ\n", AdapterName));
1493 /* Open the adapter. */
1494 NdisOpenAdapter(&NdisStatus,
1495 &OpenStatus,
1496 &IF->NdisHandle,
1497 &MediaIndex,
1498 MediaArray,
1499 MAX_MEDIA,
1501 IF,
1503 0,
1504 NULL);
1505
1506 /* Wait until the adapter is opened */
1507 if (NdisStatus == NDIS_STATUS_PENDING)
1509 else if (NdisStatus != NDIS_STATUS_SUCCESS) {
1510 TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ\n", AdapterName));
1512 return NdisStatus;
1513 }
1514
1515 IF->Media = MediaArray[MediaIndex];
1516
1517 /* Fill LAN_ADAPTER structure with some adapter specific information */
1518 switch (IF->Media) {
1519 case NdisMedium802_3:
1524 IF->HeaderSize = sizeof(ETH_HEADER);
1525 IF->MinFrameSize = 60;
1526 AddressOID = OID_802_3_CURRENT_ADDRESS;
1527 IF->PacketFilter =
1531 break;
1532
1533 default:
1534 /* Unsupported media */
1535 TI_DbgPrint(MIN_TRACE, ("Unsupported media.\n"));
1538 }
1539
1540 /* Get maximum number of packets we can pass to NdisSend(Packets) at one time */
1541 NdisStatus = NDISCall(IF,
1544 &IF->MaxSendPackets,
1545 sizeof(UINT));
1546 if (NdisStatus != NDIS_STATUS_SUCCESS)
1547 /* Legacy NIC drivers may not support this query, if it fails we
1548 assume it can send at least one packet per call to NdisSend(Packets) */
1549 IF->MaxSendPackets = 1;
1550
1551 /* Get current hardware address */
1552 NdisStatus = NDISCall(IF,
1554 AddressOID,
1555 &IF->HWAddress,
1556 IF->HWAddressLength);
1557 if (NdisStatus != NDIS_STATUS_SUCCESS) {
1558 TI_DbgPrint(MIN_TRACE, ("Query for current hardware address failed.\n"));
1560 return NdisStatus;
1561 }
1562
1563 /* Bind adapter to IP layer */
1564 if( !BindAdapter(IF, RegistryPath) ) {
1565 TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (BindAdapter)\n", AdapterName));
1568 }
1569
1570 /* Add adapter to the adapter list */
1572 &IF->ListEntry,
1574
1575 TI_DbgPrint(DEBUG_DATALINK, ("Leaving.\n"));
1576
1577 return NDIS_STATUS_SUCCESS;
1578}
1579
1580
1582 PLAN_ADAPTER Adapter)
1583/*
1584 * FUNCTION: Unregisters protocol with NDIS adapter
1585 * ARGUMENTS:
1586 * Adapter = Pointer to a LAN_ADAPTER structure
1587 * RETURNS:
1588 * Status of operation
1589 */
1590{
1591 KIRQL OldIrql;
1592 NDIS_HANDLE NdisHandle;
1593 NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS;
1594
1595 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1596
1597 /* Unlink the adapter from the list */
1598 RemoveEntryList(&Adapter->ListEntry);
1599
1600 /* Unbind adapter from IP layer */
1601 UnbindAdapter(Adapter);
1602
1603 TcpipAcquireSpinLock(&Adapter->Lock, &OldIrql);
1604 NdisHandle = Adapter->NdisHandle;
1605 if (NdisHandle) {
1606 Adapter->NdisHandle = NULL;
1607 TcpipReleaseSpinLock(&Adapter->Lock, OldIrql);
1608
1609 NdisCloseAdapter(&NdisStatus, NdisHandle);
1610 if (NdisStatus == NDIS_STATUS_PENDING) {
1613 KernelMode,
1614 FALSE,
1615 NULL);
1616 NdisStatus = Adapter->NdisStatus;
1617 }
1618 } else
1619 TcpipReleaseSpinLock(&Adapter->Lock, OldIrql);
1620
1621 FreeAdapter(Adapter);
1622
1623 return NdisStatus;
1624}
1625
1626VOID
1627NTAPI
1629/*
1630 * FUNCTION: Unregisters this protocol driver with NDIS
1631 * NOTES: Does not care wether we are already registered
1632 */
1633{
1634 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1635
1636 if (ProtocolRegistered) {
1637 NDIS_STATUS NdisStatus;
1638 PLIST_ENTRY CurrentEntry;
1639 PLIST_ENTRY NextEntry;
1640 PLAN_ADAPTER Current;
1641 KIRQL OldIrql;
1642
1644
1645 /* Search the list and remove every adapter we find */
1646 CurrentEntry = AdapterListHead.Flink;
1647 while (CurrentEntry != &AdapterListHead) {
1648 NextEntry = CurrentEntry->Flink;
1649 Current = CONTAINING_RECORD(CurrentEntry, LAN_ADAPTER, ListEntry);
1650 /* Unregister it */
1651 LANUnregisterAdapter(Current);
1652 CurrentEntry = NextEntry;
1653 }
1654
1656
1659 }
1660}
1661
1662VOID
1663NTAPI
1667 NDIS_HANDLE UnbindContext)
1668{
1669 /* We don't pend any unbinding so we can just ignore UnbindContext */
1671}
1672
1675/*
1676 * FUNCTION: Registers this protocol driver with NDIS
1677 * ARGUMENTS:
1678 * Name = Name of this protocol driver
1679 * RETURNS:
1680 * Status of operation
1681 */
1682{
1683 NDIS_STATUS NdisStatus;
1685
1686 TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
1687
1690
1691 /* Set up protocol characteristics */
1692 RtlZeroMemory(&ProtChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
1695 ProtChars.Name.Length = Name->Length;
1696 ProtChars.Name.Buffer = Name->Buffer;
1697 ProtChars.Name.MaximumLength = Name->MaximumLength;
1705 ProtChars.ReceiveHandler = ProtocolReceive;
1707 ProtChars.StatusHandler = ProtocolStatus;
1713
1714 /* Try to register protocol */
1715 NdisRegisterProtocol(&NdisStatus,
1717 &ProtChars,
1719 if (NdisStatus != NDIS_STATUS_SUCCESS)
1720 {
1721 TI_DbgPrint(DEBUG_DATALINK, ("NdisRegisterProtocol failed, status 0x%x\n", NdisStatus));
1722 return (NTSTATUS)NdisStatus;
1723 }
1724
1726
1727 return STATUS_SUCCESS;
1728}
1729
1730/* EOF */
WCHAR Second[]
Definition: FormatMessage.c:12
Type
Definition: Type.h:7
unsigned char BOOLEAN
Definition: actypes.h:127
ULONG WSAAPI inet_addr(IN CONST CHAR FAR *cp)
Definition: addrconv.c:71
#define AddrInitIPv4(IPAddress, RawAddress)
Definition: address.h:16
BOOLEAN AddrIsUnspecified(PIP_ADDRESS Address)
Definition: address.c:113
VOID ARPReceive(PVOID Context, PIP_PACKET Packet)
Definition: arp.c:175
LONG NTSTATUS
Definition: precomp.h:26
#define MIN_TRACE
Definition: debug.h:14
#define MID_TRACE
Definition: debug.h:15
UINT CopyPacketToBuffer(PUCHAR DstData, PNDIS_PACKET SrcPacket, UINT SrcOffset, UINT Length)
Definition: buffer.c:172
Definition: bufpool.h:45
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
LPWSTR Name
Definition: desk.c:124
#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:33
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
static void cleanup(void)
Definition: main.c:1335
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
static const WCHAR BackSlash[]
Definition: devclass.c:29
#define L(x)
Definition: resources.c:13
struct _ETH_HEADER * PETH_HEADER
#define DEBUG_DATALINK
Definition: debug.h:24
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
VOID EXPORT NdisDeregisterProtocol(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisProtocolHandle)
Definition: protocol.c:734
VOID EXPORT NdisSend(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet)
Definition: protocol.c:1272
VOID EXPORT NdisCloseAdapter(OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle)
Definition: protocol.c:703
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
VOID EXPORT NdisRegisterProtocol(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE NdisProtocolHandle, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, IN UINT CharacteristicsLength)
Definition: protocol.c:1114
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
VOID IPAddInterfaceRoute(PIP_INTERFACE IF)
Definition: ip.c:262
#define PC(Packet)
Definition: ip.h:106
#define IP_DEFAULT_LINK_SPEED
Definition: ip.h:202
#define IP_ADDRESS_V4
Definition: ip.h:32
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
PIP_PACKET IPInitializePacket(PIP_PACKET IPPacket, ULONG Type)
Definition: ip.c:92
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
#define CONTEXT_TAG
Definition: tags.h:43
#define KEY_VALUE_TAG
Definition: tags.h:44
#define TEMP_STRING_TAG
Definition: tags.h:42
#define HEADER_TAG
Definition: tags.h:45
#define LAN_ADAPTER_TAG
Definition: tags.h:36
#define WQ_CONTEXT_TAG
Definition: tags.h:37
#define KBIO_TAG
Definition: tags.h:41
#define REG_STR_TAG
Definition: tags.h:46
#define IEEE_802_ADDR_LENGTH
Definition: e1000hw.h:11
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
Definition: string_lib.cpp:31
#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 KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define PagedPool
Definition: env_spec_w32.h:308
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
Status
Definition: gdiplustypes.h:25
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
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
#define DbgPrint
Definition: hal.h:12
VOID TCPUpdateInterfaceIPInformation(PIP_INTERFACE IF)
Definition: if.c:144
VOID TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF)
Definition: if.c:82
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 NDIS_VERSION_MAJOR
Definition: lan.h:11
void GetDataPtr(PNDIS_PACKET Packet, UINT Offset, PCHAR *DataOut, PUINT Size)
Definition: routines.c:65
#define LAN_STATE_OPENING
Definition: lan.h:111
#define LAN_PROTO_IPv4
Definition: lan.h:126
#define LOOKAHEAD_SIZE
Definition: lan.h:117
#define ETYPE_IPv4
Definition: lan.h:121
#define LAN_PROTO_ARP
Definition: lan.h:128
#define MEDIA_ETH
Definition: lan.h:26
#define LAN_STATE_STOPPED
Definition: lan.h:114
#define NDIS_VERSION_MINOR
Definition: lan.h:12
#define BCAST_ETH_CHECK
Definition: lan.h:45
#define LAN_STATE_STARTED
Definition: lan.h:113
struct LAN_ADAPTER * PLAN_ADAPTER
#define LAN_STATE_RESETTING
Definition: lan.h:112
#define ETYPE_ARP
Definition: lan.h:123
#define BCAST_ETH_MASK
Definition: lan.h:42
#define ETYPE_IPv6
Definition: lan.h:122
#define LAN_PROTO_IPv6
Definition: lan.h:127
VOID NTAPI ProtocolCloseAdapterComplete(NDIS_HANDLE BindingContext, NDIS_STATUS Status)
Called by NDIS to complete closing an adapter.
Definition: lan.c:120
VOID BindAdapter(PLAN_ADAPTER Adapter, PNDIS_STRING RegistryPath)
Binds a LAN adapter to IP layer.
Definition: lan.c:617
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 LANTransmit(PLAN_ADAPTER Adapter, PNDIS_PACKET NdisPacket, PVOID LinkAddress, USHORT Type)
Transmits a packet ARGUMENTS:
Definition: lan.c:520
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
NDIS_STATUS LANRegisterAdapter(PNDIS_STRING AdapterName, PNDIS_STRING RegistryPath)
Registers protocol with an NDIS adapter.
Definition: lan.c:637
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
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
NDIS_STATUS LANUnregisterAdapter(PLAN_ADAPTER Adapter)
Unregisters protocol with NDIS adapter.
Definition: lan.c:847
VOID FreeAdapter(PLAN_ADAPTER Adapter)
Frees memory for a LAN_ADAPTER structure.
Definition: lan.c:83
NTSTATUS LANRegisterProtocol(PNDIS_STRING Name)
Registers this protocol driver with NDIS.
Definition: lan.c:893
VOID NTAPI ProtocolSendComplete(NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, NDIS_STATUS Status)
Called by NDIS to complete sending process.
Definition: lan.c:184
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 Unused(x)
Definition: atlwin.h:28
static LONG WINAPI EnumKey(HANDLE hcKey, DWORD dwIndex, LPWSTR pszName, PDWORD pcchName, PFILETIME pftLastWriteTime, HANDLE hSpooler)
Definition: localmon.c:169
#define AllocatePacketWithBuffer(x, y, z)
Definition: memtrack.h:7
#define FreeNdisPacket(x)
Definition: memtrack.h:8
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
UINT64 OID
Definition: marshal.c:87
#define NDIS_STATUS_PENDING
Definition: ndis.h:347
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
Definition: ndis.h:1549
#define NDIS_STATUS_MEDIA_CONNECT
Definition: ndis.h:361
#define NdisQueryPacketLength(_Packet, _TotalPacketLength)
Definition: ndis.h:3645
_In_ PVOID _In_ PVOID SystemSpecific2
Definition: ndis.h:638
#define NDIS_STATUS_RESET_START
Definition: ndis.h:354
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS _In_ PVOID _In_ UINT StatusBufferSize
Definition: ndis.h:1558
PVOID NDIS_HANDLE
Definition: ndis.h:338
#define NDIS_STATUS_NOT_SUPPORTED
Definition: ndis.h:479
#define NDIS_STATUS_MEDIA_DISCONNECT
Definition: ndis.h:362
#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions)
Definition: ndis.h:3289
#define NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, InfoType)
Definition: ndis.h:1351
_In_ UINT _In_ UINT _In_ PNDIS_PACKET _In_ UINT _Out_ PUINT BytesCopied
Definition: ndis.h:3171
_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
#define NDIS_PACKET_TYPE_BROADCAST
Definition: ndis.h:666
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
enum _NDIS_REQUEST_TYPE NDIS_REQUEST_TYPE
unsigned int UINT
Definition: ndis.h:50
#define NDIS_PACKET_TYPE_MULTICAST
Definition: ndis.h:664
@ TcpLargeSendPacketInfo
Definition: ndis.h:1180
#define NDIS_STATUS_NOT_ACCEPTED
Definition: ndis.h:350
#define NDIS_PACKET_TYPE_DIRECTED
Definition: ndis.h:663
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS OpenErrorStatus
Definition: ndis.h:6009
#define NDIS_STATUS_RESET_END
Definition: ndis.h:355
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS _In_ PVOID StatusBuffer
Definition: ndis.h:1557
* PNDIS_STATUS
Definition: ndis.h:45
_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_opt_ NDIS_HANDLE _In_opt_ NDIS_HANDLE _Inout_ PNDIS_REQUEST NdisRequest
Definition: ndis.h:1573
_In_ NDIS_STATUS _In_ NDIS_STATUS OpenStatus
Definition: ndis.h:6035
@ NdisRequestQueryInformation
Definition: ndis.h:790
@ NdisRequestSetInformation
Definition: ndis.h:791
#define NDIS_STATUS_RESOURCES
Definition: ndis.h:466
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS GeneralStatus
Definition: ndis.h:1556
#define KernelMode
Definition: asm.h:38
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
VOID NBDestroyNeighborsForInterface(PIP_INTERFACE Interface)
Definition: neighbor.c:237
@ NetEventSetPower
Definition: netpnp.h:15
@ NetEventQueryRemoveDevice
Definition: netpnp.h:17
@ NetEventCancelRemoveDevice
Definition: netpnp.h:18
@ NetEventQueryPower
Definition: netpnp.h:16
static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE]
Definition: miniport.c:33
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
@ KeyBasicInformation
Definition: nt_native.h:1134
NTSYSAPI VOID NTAPI RtlFreeAnsiString(PANSI_STRING AnsiString)
@ KeyValuePartialInformation
Definition: nt_native.h:1185
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
struct _KEY_BASIC_INFORMATION KEY_BASIC_INFORMATION
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
struct _KEY_VALUE_PARTIAL_INFORMATION * PKEY_VALUE_PARTIAL_INFORMATION
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
enum _NDIS_MEDIUM NDIS_MEDIUM
#define OID_GEN_MAXIMUM_TOTAL_SIZE
Definition: ntddndis.h:268
#define OID_GEN_LINK_SPEED
Definition: ntddndis.h:258
#define OID_GEN_CURRENT_PACKET_FILTER
Definition: ntddndis.h:265
@ NdisMediaStateConnected
Definition: ntddndis.h:491
#define OID_802_3_CURRENT_ADDRESS
Definition: ntddndis.h:322
enum _NDIS_MEDIA_STATE NDIS_MEDIA_STATE
@ NdisMedium802_3
Definition: ntddndis.h:191
#define OID_GEN_MAXIMUM_FRAME_SIZE
Definition: ntddndis.h:257
#define OID_GEN_MEDIA_CONNECT_STATUS
Definition: ntddndis.h:271
int NDIS_STATUS
Definition: ntddndis.h:496
@ NdisHardwareStatusReady
Definition: ntddndis.h:471
#define OID_GEN_CURRENT_LOOKAHEAD
Definition: ntddndis.h:266
ULONG NDIS_OID
Definition: ntddndis.h:249
#define OID_GEN_MAXIMUM_SEND_PACKETS
Definition: ntddndis.h:272
#define OID_GEN_HARDWARE_STATUS
Definition: ntddndis.h:253
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
@ SynchronizationEvent
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
unsigned short USHORT
Definition: pedump.c:61
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:603
VOID IPReceive(PIP_INTERFACE IF, PIP_PACKET IPPacket)
Definition: receive.c:638
VOID RouterRemoveRoutesForInterface(PIP_INTERFACE Interface)
Definition: router.c:371
PFIB_ENTRY RouterCreateRoute(PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PIP_ADDRESS RouterAddress, PIP_INTERFACE Interface)
Definition: router.c:451
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
_In_ PVOID Context
Definition: storport.h:2269
Definition: lan.h:33
Definition: ip.h:23
UINT PacketFilter
Definition: lan.h:80
UCHAR OldState
Definition: lan.h:42
PVOID Context
Definition: lan.h:64
UINT MinFrameSize
Definition: lan.h:75
UCHAR HWAddress[IEEE_802_ADDR_LENGTH]
Definition: lan.h:68
KSPIN_LOCK Lock
Definition: lan.h:60
UCHAR HeaderSize
Definition: lan.h:73
USHORT MTU
Definition: lan.h:74
KEVENT Event
Definition: lan.h:63
BOOLEAN CompletingReset
Definition: lan.h:43
UCHAR State
Definition: lan.h:62
NDIS_STATUS NdisStatus
Definition: lan.h:66
UINT HWAddressLength
Definition: lan.h:69
UINT MacOptions
Definition: lan.h:78
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
NDIS_MEDIUM Media
Definition: lan.h:67
UCHAR BCastOffset
Definition: lan.h:72
UINT Speed
Definition: lan.h:79
UINT MaxPacketSize
Definition: lan.h:76
UCHAR SrcAddr[ETH_LENGTH_OF_ADDRESS]
Definition: ethernetutils.h:48
UCHAR DstAddr[ETH_LENGTH_OF_ADDRESS]
Definition: ethernetutils.h:47
UNICODE_STRING Description
Definition: ip.h:165
UNICODE_STRING Name
Definition: ip.h:164
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
PLAN_ADAPTER Adapter
Definition: lan.c:26
PNDIS_PACKET Packet
Definition: lan.c:25
LIST_ENTRY ListEntry
Definition: lan.c:24
BOOLEAN LegacyReceive
Definition: lan.c:28
UINT BytesTransferred
Definition: lan.c:27
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
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
PVOID Buffer
Definition: netpnp.h:33
NET_PNP_EVENT_CODE NetEvent
Definition: netpnp.h:32
PLAN_ADAPTER Adapter
Definition: lan.c:33
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint16_t * PWSTR
Definition: typedefs.h:56
uint32_t * PULONG
Definition: typedefs.h:59
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint16_t * PWCHAR
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
NTSTATUS TcpipWaitForSingleObject(PVOID Object, KWAIT_REASON Reason, KPROCESSOR_MODE WaitMode, BOOLEAN Alertable, PLARGE_INTEGER Timeout)
Definition: mockwait.c:12
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
Definition: wdfdevice.h:3782
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2439
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
WDF_BIND_INFO BindInfo
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_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
_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
_In_opt_ PETWENABLECALLBACK _In_opt_ PVOID _Out_ PREGHANDLE RegHandle
Definition: wmifuncs.h:78
BOOLEAN ChewCreate(VOID(*Worker)(PVOID), PVOID WorkerContext)
Definition: workqueue.c:61
_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
_In_ USHORT PacketSize
Definition: iofuncs.h:1058
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
@ UserRequest
Definition: ketypes.h:473
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1647
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180