ReactOS 0.4.17-dev-540-g8f54750
miniport.c File Reference
#include "ndissys.h"
#include <ndisguid.h>
Include dependency graph for miniport.c:

Go to the source code of this file.

Macros

#define BREAK_ON_MINIPORT_INIT   0
 
#define ROUTE_DATA_SIZE   256
 
#define MEDIA_ARRAY_SIZE   15
 

Functions

PNDIS_MINIPORT_WORK_ITEM MiniGetFirstWorkItem (PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE Type)
 
BOOLEAN MiniIsBusy (PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE Type)
 
VOID MiniIndicateData (PLOGICAL_ADAPTER Adapter, NDIS_HANDLE MacReceiveContext, PVOID HeaderBuffer, UINT HeaderBufferSize, PVOID LookaheadBuffer, UINT LookaheadBufferSize, UINT PacketSize)
 
VOID EXPORT NdisReturnPackets (IN PNDIS_PACKET *PacketsToReturn, IN UINT NumberOfPackets)
 
VOID NTAPI MiniIndicateReceivePacket (IN NDIS_HANDLE MiniportAdapterHandle, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets)
 
VOID NTAPI MiniResetComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset)
 
VOID NTAPI MiniRequestComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status)
 
VOID NTAPI MiniSendComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status)
 
VOID NTAPI MiniSendResourcesAvailable (IN NDIS_HANDLE MiniportAdapterHandle)
 
VOID NTAPI MiniTransferDataComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred)
 
BOOLEAN MiniAdapterHasAddress (PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet)
 
PLOGICAL_ADAPTER MiniLocateDevice (PNDIS_STRING AdapterName)
 
NDIS_STATUS MiniSetInformation (PLOGICAL_ADAPTER Adapter, NDIS_OID Oid, ULONG Size, PVOID Buffer, PULONG BytesRead)
 
NDIS_STATUS MiniQueryInformation (PLOGICAL_ADAPTER Adapter, NDIS_OID Oid, ULONG Size, PVOID Buffer, PULONG BytesWritten)
 
BOOLEAN MiniCheckForHang (PLOGICAL_ADAPTER Adapter)
 
VOID MiniDoAddressingReset (PLOGICAL_ADAPTER Adapter)
 
NDIS_STATUS MiniReset (PLOGICAL_ADAPTER Adapter)
 
VOID NTAPI MiniportHangDpc (PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
 
VOID MiniWorkItemComplete (PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE WorkItemType)
 
VOID FASTCALL MiniQueueWorkItem (PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE WorkItemType, PVOID WorkItemContext, BOOLEAN Top)
 
NDIS_STATUS FASTCALL MiniDequeueWorkItem (PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE *WorkItemType, PVOID *WorkItemContext)
 
NDIS_STATUS MiniDoRequest (PLOGICAL_ADAPTER Adapter, PNDIS_REQUEST NdisRequest)
 
VOID EXPORT NdisMSetInformationComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status)
 
VOID EXPORT NdisMQueryInformationComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status)
 
VOID NTAPI MiniportWorker (IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
 
VOID NTAPI MiniStatus (IN NDIS_HANDLE MiniportHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize)
 
VOID NTAPI MiniStatusComplete (IN NDIS_HANDLE MiniportAdapterHandle)
 
VOID EXPORT NdisMCloseLog (IN NDIS_HANDLE LogHandle)
 
NDIS_STATUS EXPORT NdisMCreateLog (IN NDIS_HANDLE MiniportAdapterHandle, IN UINT Size, OUT PNDIS_HANDLE LogHandle)
 
VOID EXPORT NdisMDeregisterAdapterShutdownHandler (IN NDIS_HANDLE MiniportHandle)
 
VOID EXPORT NdisMFlushLog (IN NDIS_HANDLE LogHandle)
 
VOID EXPORT NdisMIndicateStatus (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize)
 
VOID EXPORT NdisMIndicateStatusComplete (IN NDIS_HANDLE MiniportAdapterHandle)
 
VOID EXPORT NdisInitializeWrapper (OUT PNDIS_HANDLE NdisWrapperHandle, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
 
VOID NTAPI NdisIBugcheckCallback (IN PVOID Buffer, IN ULONG Length)
 
VOID EXPORT NdisMRegisterAdapterShutdownHandler (IN NDIS_HANDLE MiniportHandle, IN PVOID ShutdownContext, IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler)
 
NDIS_STATUS DoQueries (PLOGICAL_ADAPTER Adapter, NDIS_OID AddressOID)
 
NTSTATUS NTAPI NdisIForwardIrpAndWaitCompletionRoutine (PDEVICE_OBJECT Fdo, PIRP Irp, PVOID Context)
 
NTSTATUS NTAPI NdisIForwardIrpAndWait (PLOGICAL_ADAPTER Adapter, PIRP Irp)
 
NTSTATUS NTAPI NdisICreateClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI NdisIPnPStartDevice (IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI NdisIPnPStopDevice (IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI NdisIShutdown (IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI NdisIDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
static NTSTATUS NdisIPnPRemoveDevice (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
 
NTSTATUS NTAPI NdisIDispatchPnp (IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI NdisIPower (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
 
NTSTATUS NTAPI NdisIAddDevice (IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
 
NTSTATUS NTAPI NdisGenericIrpHandler (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NDIS_STATUS EXPORT NdisMRegisterMiniport (IN NDIS_HANDLE NdisWrapperHandle, IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, IN UINT CharacteristicsLength)
 
VOID EXPORT NdisMResetComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset)
 
VOID EXPORT NdisMSendComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status)
 
VOID EXPORT NdisMSendResourcesAvailable (IN NDIS_HANDLE MiniportAdapterHandle)
 
VOID EXPORT NdisMTransferDataComplete (IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred)
 
VOID EXPORT NdisMSetAttributes (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportAdapterContext, IN BOOLEAN BusMaster, IN NDIS_INTERFACE_TYPE AdapterType)
 
VOID EXPORT NdisMSetAttributesEx (IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportAdapterContext, IN UINT CheckForHangTimeInSeconds OPTIONAL, IN ULONG AttributeFlags, IN NDIS_INTERFACE_TYPE AdapterType)
 
VOID EXPORT NdisMSleep (IN ULONG MicrosecondsToSleep)
 
BOOLEAN EXPORT NdisMSynchronizeWithInterrupt (IN PNDIS_MINIPORT_INTERRUPT Interrupt, IN PVOID SynchronizeFunction, IN PVOID SynchronizeContext)
 
NDIS_STATUS EXPORT NdisMWriteLogData (IN NDIS_HANDLE LogHandle, IN PVOID LogBuffer, IN UINT LogBufferSize)
 
VOID EXPORT NdisTerminateWrapper (IN NDIS_HANDLE NdisWrapperHandle, IN PVOID SystemSpecific)
 
NDIS_STATUS EXPORT NdisMQueryAdapterInstanceName (OUT PNDIS_STRING AdapterInstanceName, IN NDIS_HANDLE MiniportAdapterHandle)
 
VOID EXPORT NdisDeregisterAdapterShutdownHandler (IN NDIS_HANDLE NdisAdapterHandle)
 
VOID EXPORT NdisRegisterAdapterShutdownHandler (IN NDIS_HANDLE NdisAdapterHandle, IN PVOID ShutdownContext, IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler)
 
VOID EXPORT NdisMGetDeviceProperty (IN NDIS_HANDLE MiniportAdapterHandle, IN OUT PDEVICE_OBJECT *PhysicalDeviceObject OPTIONAL, IN OUT PDEVICE_OBJECT *FunctionalDeviceObject OPTIONAL, IN OUT PDEVICE_OBJECT *NextDeviceObject OPTIONAL, IN OUT PCM_RESOURCE_LIST *AllocatedResources OPTIONAL, IN OUT PCM_RESOURCE_LIST *AllocatedResourcesTranslated OPTIONAL)
 
VOID EXPORT NdisMRegisterUnloadHandler (IN NDIS_HANDLE NdisWrapperHandle, IN PDRIVER_UNLOAD UnloadHandler)
 
NDIS_STATUS EXPORT NdisMRegisterDevice (IN NDIS_HANDLE NdisWrapperHandle, IN PNDIS_STRING DeviceName, IN PNDIS_STRING SymbolicName, IN PDRIVER_DISPATCH MajorFunctions[], OUT PDEVICE_OBJECT *pDeviceObject, OUT NDIS_HANDLE *NdisDeviceHandle)
 
NDIS_STATUS EXPORT NdisMDeregisterDevice (IN NDIS_HANDLE NdisDeviceHandle)
 
NDIS_STATUS EXPORT NdisQueryAdapterInstanceName (OUT PNDIS_STRING AdapterInstanceName, IN NDIS_HANDLE NdisBindingHandle)
 
VOID EXPORT NdisCompletePnPEvent (IN NDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNET_PNP_EVENT NetPnPEvent)
 
VOID EXPORT NdisCancelSendPackets (IN NDIS_HANDLE NdisBindingHandle, IN PVOID CancelId)
 
NDIS_HANDLE EXPORT NdisIMGetBindingContext (IN NDIS_HANDLE NdisBindingHandle)
 
NDIS_HANDLE EXPORT NdisIMGetDeviceContext (IN NDIS_HANDLE MiniportAdapterHandle)
 

Variables

static NDIS_MEDIUM MediaArray [MEDIA_ARRAY_SIZE]
 
LIST_ENTRY MiniportListHead
 
KSPIN_LOCK MiniportListLock
 
LIST_ENTRY AdapterListHead
 
KSPIN_LOCK AdapterListLock
 

Macro Definition Documentation

◆ BREAK_ON_MINIPORT_INIT

#define BREAK_ON_MINIPORT_INIT   0

Definition at line 22 of file miniport.c.

◆ MEDIA_ARRAY_SIZE

#define MEDIA_ARRAY_SIZE   15

Definition at line 31 of file miniport.c.

◆ ROUTE_DATA_SIZE

#define ROUTE_DATA_SIZE   256

Definition at line 28 of file miniport.c.

Function Documentation

◆ DoQueries()

NDIS_STATUS DoQueries ( PLOGICAL_ADAPTER  Adapter,
NDIS_OID  AddressOID 
)

Definition at line 1746 of file miniport.c.

1757{
1759 NDIS_STATUS NdisStatus;
1760
1761 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
1762
1763 /* Get MAC options for adapter */
1764 NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAC_OPTIONS, sizeof(UINT),
1765 &Adapter->NdisMiniportBlock.MacOptions,
1766 &BytesWritten);
1767
1768 if (NdisStatus != NDIS_STATUS_SUCCESS)
1769 {
1770 NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAC_OPTIONS failed. NdisStatus (0x%X).\n", NdisStatus));
1771 return NdisStatus;
1772 }
1773
1774 NDIS_DbgPrint(DEBUG_MINIPORT, ("MacOptions (0x%X).\n", Adapter->NdisMiniportBlock.MacOptions));
1775
1776 /* Get current hardware address of adapter */
1777 NdisStatus = MiniQueryInformation(Adapter, AddressOID, Adapter->AddressLength,
1778 &Adapter->Address, &BytesWritten);
1779
1780 if (NdisStatus != NDIS_STATUS_SUCCESS)
1781 {
1782 NDIS_DbgPrint(MIN_TRACE, ("Address OID (0x%X) failed. NdisStatus (0x%X).\n", AddressOID, NdisStatus));
1783 return NdisStatus;
1784 }
1785
1786#if DBG
1787 {
1788 /* 802.3 only */
1789
1790 PUCHAR A = (PUCHAR)&Adapter->Address.Type.Medium802_3;
1791
1792 NDIS_DbgPrint(MAX_TRACE, ("Adapter address is (%02X %02X %02X %02X %02X %02X).\n", A[0], A[1], A[2], A[3], A[4], A[5]));
1793 }
1794#endif /* DBG */
1795
1796 /* Get maximum lookahead buffer size of adapter */
1797 NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_LOOKAHEAD, sizeof(ULONG),
1799
1800 if (NdisStatus != NDIS_STATUS_SUCCESS)
1801 {
1802 NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus));
1803 return NdisStatus;
1804 }
1805
1806 NDIS_DbgPrint(DEBUG_MINIPORT, ("MaxLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.MaximumLookahead));
1807
1808 /* Get current lookahead buffer size of adapter */
1809 NdisStatus = MiniQueryInformation(Adapter, OID_GEN_CURRENT_LOOKAHEAD, sizeof(ULONG),
1811
1812 if (NdisStatus != NDIS_STATUS_SUCCESS)
1813 {
1814 NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_CURRENT_LOOKAHEAD failed. NdisStatus (0x%X).\n", NdisStatus));
1815 return NdisStatus;
1816 }
1817
1818 NdisStatus = MiniQueryInformation(Adapter, OID_GEN_MAXIMUM_SEND_PACKETS, sizeof(ULONG),
1820
1821 if (NdisStatus != NDIS_STATUS_SUCCESS)
1822 {
1823 NDIS_DbgPrint(MIN_TRACE, ("OID_GEN_MAXIMUM_SEND_PACKETS failed. NdisStatus (0x%X).\n", NdisStatus));
1824
1825 /* Set it to 1 if it fails because some drivers don't support this (?)*/
1826 Adapter->NdisMiniportBlock.MaxSendPackets = 1;
1827 }
1828
1829 NDIS_DbgPrint(DEBUG_MINIPORT, ("CurLookaheadLength (0x%X).\n", Adapter->NdisMiniportBlock.CurrentLookahead));
1830
1831 return STATUS_SUCCESS;
1832}
#define MIN_TRACE
Definition: debug.h:14
#define MAX_TRACE
Definition: debug.h:16
Definition: ehthrow.cxx:93
#define NDIS_DbgPrint(_t_, _x_)
Definition: debug.h:40
#define DEBUG_MINIPORT
Definition: debug.h:17
unsigned int UINT
Definition: sysinfo.c:13
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
NDIS_STATUS MiniQueryInformation(PLOGICAL_ADAPTER Adapter, NDIS_OID Oid, ULONG Size, PVOID Buffer, PULONG BytesWritten)
Definition: miniport.c:805
#define OID_GEN_MAXIMUM_LOOKAHEAD
Definition: ntddndis.h:256
int NDIS_STATUS
Definition: ntddndis.h:496
#define OID_GEN_CURRENT_LOOKAHEAD
Definition: ntddndis.h:266
#define OID_GEN_MAC_OPTIONS
Definition: ntddndis.h:270
#define OID_GEN_MAXIMUM_SEND_PACKETS
Definition: ntddndis.h:272
#define STATUS_SUCCESS
Definition: shellext.h:65
UCHAR Medium802_3[ETH_LENGTH_OF_ADDRESS]
Definition: miniport.h:14
union _HARDWARE_ADDRESS::@1113 Type
HARDWARE_ADDRESS Address
Definition: miniport.h:96
ULONG AddressLength
Definition: miniport.h:97
NDIS_MINIPORT_BLOCK NdisMiniportBlock
Definition: miniport.h:89
USHORT MaxSendPackets
Definition: ndis.h:2560
UINT CurrentLookahead
Definition: ndis.h:2569
UINT MaximumLookahead
Definition: ndis.h:2570
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
Definition: wdfiotarget.h:960

Referenced by NdisIPnPStartDevice().

◆ MiniAdapterHasAddress()

BOOLEAN MiniAdapterHasAddress ( PLOGICAL_ADAPTER  Adapter,
PNDIS_PACKET  Packet 
)

Definition at line 616 of file miniport.c.

627{
628 UINT Length;
629 PUCHAR PacketAddress;
630 PUCHAR AdapterAddress;
631 PNDIS_BUFFER NdisBuffer;
633
634 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
635
636#if DBG
637 if(!Adapter)
638 {
639 NDIS_DbgPrint(MIN_TRACE, ("Adapter object was null\n"));
640 return FALSE;
641 }
642
643 if(!Packet)
644 {
645 NDIS_DbgPrint(MIN_TRACE, ("Packet was null\n"));
646 return FALSE;
647 }
648#endif
649
650 NdisQueryPacket(Packet, NULL, NULL, &NdisBuffer, NULL);
651
652 if (!NdisBuffer)
653 {
654 NDIS_DbgPrint(MIN_TRACE, ("Packet contains no buffers.\n"));
655 return FALSE;
656 }
657
658 NdisQueryBuffer(NdisBuffer, (PVOID)&PacketAddress, &BufferLength);
659
660 /* FIXME: Should handle fragmented packets */
661
662 switch (Adapter->NdisMiniportBlock.MediaType)
663 {
664 case NdisMedium802_3:
666 /* Destination address is the first field */
667 break;
668
669 default:
670 NDIS_DbgPrint(MIN_TRACE, ("Adapter has unsupported media type (0x%X).\n", Adapter->NdisMiniportBlock.MediaType));
671 return FALSE;
672 }
673
674 if (BufferLength < Length)
675 {
676 NDIS_DbgPrint(MIN_TRACE, ("Buffer is too small.\n"));
677 return FALSE;
678 }
679
680 AdapterAddress = (PUCHAR)&Adapter->Address;
681 NDIS_DbgPrint(MAX_TRACE, ("packet address: %x:%x:%x:%x:%x:%x adapter address: %x:%x:%x:%x:%x:%x\n",
682 *(PacketAddress), *(PacketAddress+1), *(PacketAddress+2), *(PacketAddress+3), *(PacketAddress+4), *(PacketAddress+5),
683 *(AdapterAddress), *(AdapterAddress+1), *(AdapterAddress+2), *(AdapterAddress+3), *(AdapterAddress+4), *(AdapterAddress+5)));
684
685 return (RtlCompareMemory(PacketAddress, AdapterAddress, Length) == Length);
686}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define ETH_LENGTH_OF_ADDRESS
Definition: efilter.h:16
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
Definition: ndis.h:1549
static __inline VOID NdisQueryPacket(IN PNDIS_PACKET Packet, OUT PUINT PhysicalBufferCount OPTIONAL, OUT PUINT BufferCount OPTIONAL, OUT PNDIS_BUFFER *FirstBuffer OPTIONAL, OUT PUINT TotalPacketLength OPTIONAL)
Definition: ndis.h:3593
MDL * PNDIS_BUFFER
Definition: ndis.h:343
#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length)
Definition: ndis.h:3029
@ NdisMedium802_3
Definition: ntddndis.h:191
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
NDIS_MEDIUM MediaType
Definition: ndis.h:2548
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777

Referenced by ProSend().

◆ MiniCheckForHang()

BOOLEAN MiniCheckForHang ( PLOGICAL_ADAPTER  Adapter)

Definition at line 865 of file miniport.c.

874{
875 BOOLEAN Ret = FALSE;
877
879 if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)
880 Ret = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)(
883
884 return Ret;
885}
unsigned char BOOLEAN
Definition: actypes.h:127
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
NDIS_HANDLE MiniportAdapterContext
Definition: ndis.h:2510
PNDIS_M_DRIVER_BLOCK DriverHandle
Definition: ndis.h:2509
NDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics
Definition: miniport.h:22
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by MiniportHangDpc().

◆ MiniDequeueWorkItem()

NDIS_STATUS FASTCALL MiniDequeueWorkItem ( PLOGICAL_ADAPTER  Adapter,
NDIS_WORK_ITEM_TYPE WorkItemType,
PVOID WorkItemContext 
)

Definition at line 1050 of file miniport.c.

1066{
1067 PNDIS_MINIPORT_WORK_ITEM MiniportWorkItem;
1069
1070 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
1071
1072 MiniportWorkItem = Adapter->WorkQueueHead;
1073
1075 {
1077
1078 *WorkItemType = NdisWorkItemSend;
1079 *WorkItemContext = Packet;
1080
1081 return NDIS_STATUS_SUCCESS;
1082 }
1083 else if (MiniportWorkItem)
1084 {
1085 /* safe due to adapter lock held */
1086 Adapter->WorkQueueHead = (PNDIS_MINIPORT_WORK_ITEM)MiniportWorkItem->Link.Next;
1087
1088 if (MiniportWorkItem == Adapter->WorkQueueTail)
1089 Adapter->WorkQueueTail = NULL;
1090
1091 *WorkItemType = MiniportWorkItem->WorkItemType;
1092 *WorkItemContext = MiniportWorkItem->WorkItemContext;
1093
1094 ExFreePool(MiniportWorkItem);
1095
1096 return NDIS_STATUS_SUCCESS;
1097 }
1098 else
1099 {
1100 NDIS_DbgPrint(MIN_TRACE, ("No work item to dequeue\n"));
1101
1102 return NDIS_STATUS_FAILURE;
1103 }
1104}
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
if(dx< 0)
Definition: linetemp.h:194
@ NdisWorkItemSend
Definition: ndis.h:2295
#define NDIS_STATUS_FAILURE
Definition: ndis.h:465
struct _NDIS_MINIPORT_WORK_ITEM * PNDIS_MINIPORT_WORK_ITEM
PNDIS_MINIPORT_WORK_ITEM WorkQueueTail
Definition: miniport.h:91
PNDIS_MINIPORT_WORK_ITEM WorkQueueHead
Definition: miniport.h:90
PNDIS_PACKET FirstPendingPacket
Definition: ndis.h:2526
NDIS_WORK_ITEM_TYPE WorkItemType
Definition: ndis.h:2310
SINGLE_LIST_ENTRY Link
Definition: ndis.h:2309
struct _SINGLE_LIST_ENTRY * Next
Definition: ntbasedef.h:641

Referenced by MiniportWorker().

◆ MiniDoAddressingReset()

VOID MiniDoAddressingReset ( PLOGICAL_ADAPTER  Adapter)

Definition at line 888 of file miniport.c.

889{
891
892 MiniSetInformation(Adapter,
894 sizeof(ULONG),
896 &BytesRead);
897
898 /* FIXME: Set more stuff */
899}
NDIS_STATUS MiniSetInformation(PLOGICAL_ADAPTER Adapter, NDIS_OID Oid, ULONG Size, PVOID Buffer, PULONG BytesRead)
Definition: miniport.c:756
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
Definition: wdfiotarget.h:870

Referenced by MiniReset(), and MiniResetComplete().

◆ MiniDoRequest()

NDIS_STATUS MiniDoRequest ( PLOGICAL_ADAPTER  Adapter,
PNDIS_REQUEST  NdisRequest 
)

Definition at line 1107 of file miniport.c.

1118{
1120 KIRQL OldIrql;
1121 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
1122
1124
1128
1129 if (!Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CoRequestHandler)
1130 {
1131 switch (NdisRequest->RequestType)
1132 {
1134 Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
1136 NdisRequest->DATA.QUERY_INFORMATION.Oid,
1137 NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
1138 NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
1139 (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesWritten,
1140 (PULONG)&NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded);
1141 break;
1142
1144 Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)(
1146 NdisRequest->DATA.SET_INFORMATION.Oid,
1147 NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
1148 NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
1149 (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesRead,
1150 (PULONG)&NdisRequest->DATA.SET_INFORMATION.BytesNeeded);
1151 break;
1152
1153 default:
1154 NDIS_DbgPrint(MIN_TRACE, ("Bad request type\n"));
1156 }
1157 }
1158 else
1159 {
1160 Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CoRequestHandler)(
1162 NULL, /* FIXME */
1163 NdisRequest);
1164 }
1165
1166 if (Status != NDIS_STATUS_PENDING) {
1170 }
1171
1173
1174 if (Status != NDIS_STATUS_PENDING) {
1176 }
1177
1178 return Status;
1179}
Status
Definition: gdiplustypes.h:24
#define NDIS_STATUS_PENDING
Definition: ndis.h:347
@ NdisWorkItemRequest
Definition: ndis.h:2294
_In_opt_ NDIS_HANDLE _In_opt_ NDIS_HANDLE _Inout_ PNDIS_REQUEST NdisRequest
Definition: ndis.h:1573
@ NdisRequestQueryInformation
Definition: ndis.h:790
@ NdisRequestSetInformation
Definition: ndis.h:791
VOID MiniWorkItemComplete(PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE WorkItemType)
Definition: miniport.c:964
#define KeAcquireSpinLockAtDpcLevel(SpinLock)
Definition: ke.h:125
#define KeReleaseSpinLockFromDpcLevel(SpinLock)
Definition: ke.h:135
PNDIS_REQUEST PendingRequest
Definition: ndis.h:2566
KSPIN_LOCK Lock
Definition: ndis.h:2520
uint32_t * PULONG
Definition: typedefs.h:59

Referenced by MiniportWorker(), MiniQueryInformation(), MiniSetInformation(), and ProRequest().

◆ MiniGetFirstWorkItem()

PNDIS_MINIPORT_WORK_ITEM MiniGetFirstWorkItem ( PLOGICAL_ADAPTER  Adapter,
NDIS_WORK_ITEM_TYPE  Type 
)

Definition at line 124 of file miniport.c.

127{
128 PNDIS_MINIPORT_WORK_ITEM CurrentEntry = Adapter->WorkQueueHead;
129
130 while (CurrentEntry)
131 {
132 if (CurrentEntry->WorkItemType == Type || Type == NdisMaxWorkItems)
133 return CurrentEntry;
134
135 CurrentEntry = (PNDIS_MINIPORT_WORK_ITEM)CurrentEntry->Link.Next;
136 }
137
138 return NULL;
139}
Type
Definition: Type.h:7
@ NdisMaxWorkItems
Definition: ndis.h:2302

Referenced by MiniIsBusy().

◆ MiniIndicateData()

VOID MiniIndicateData ( PLOGICAL_ADAPTER  Adapter,
NDIS_HANDLE  MacReceiveContext,
PVOID  HeaderBuffer,
UINT  HeaderBufferSize,
PVOID  LookaheadBuffer,
UINT  LookaheadBufferSize,
UINT  PacketSize 
)

Definition at line 175 of file miniport.c.

194{
196 PLIST_ENTRY CurrentEntry;
197 PADAPTER_BINDING AdapterBinding;
198
199 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called. Adapter (0x%X) HeaderBuffer (0x%X) "
200 "HeaderBufferSize (0x%X) LookaheadBuffer (0x%X) LookaheadBufferSize (0x%X).\n",
201 Adapter, HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize));
202
203#if DBG
204 MiniDisplayPacket2(HeaderBuffer, HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize);
205#endif
206
207 NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
209 {
210 CurrentEntry = Adapter->ProtocolListHead.Flink;
211 NDIS_DbgPrint(DEBUG_MINIPORT, ("CurrentEntry = %x\n", CurrentEntry));
212
213 if (CurrentEntry == &Adapter->ProtocolListHead)
214 {
215 NDIS_DbgPrint(MIN_TRACE, ("WARNING: No upper protocol layer.\n"));
216 }
217
218 while (CurrentEntry != &Adapter->ProtocolListHead)
219 {
220 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
221 NDIS_DbgPrint(DEBUG_MINIPORT, ("AdapterBinding = %x\n", AdapterBinding));
222
224 (MID_TRACE,
225 ("XXX (%x) %x %x %x %x %x %x %x XXX\n",
226 *AdapterBinding->ProtocolBinding->Chars.ReceiveHandler,
227 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
228 MacReceiveContext,
229 HeaderBuffer,
230 HeaderBufferSize,
231 LookaheadBuffer,
232 LookaheadBufferSize,
233 PacketSize));
234
235 /* call the receive handler */
236 (*AdapterBinding->ProtocolBinding->Chars.ReceiveHandler)(
237 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
238 MacReceiveContext,
239 HeaderBuffer,
240 HeaderBufferSize,
241 LookaheadBuffer,
242 LookaheadBufferSize,
243 PacketSize);
244
245 CurrentEntry = CurrentEntry->Flink;
246 }
247 }
249
250 NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n"));
251}
#define MID_TRACE
Definition: debug.h:15
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
NDIS_OPEN_BLOCK NdisOpenBlock
Definition: protocol.h:22
PPROTOCOL_BINDING ProtocolBinding
Definition: protocol.h:28
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
LIST_ENTRY ProtocolListHead
Definition: miniport.h:94
RECEIVE_HANDLER ReceiveHandler
Definition: ndis.h:1889
NDIS_PROTOCOL_CHARACTERISTICS Chars
Definition: protocol.h:13
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
_In_ USHORT PacketSize
Definition: iofuncs.h:1058

Referenced by EthFilterDprIndicateReceive(), and ProIndicatePacket().

◆ MiniIndicateReceivePacket()

VOID NTAPI MiniIndicateReceivePacket ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN PPNDIS_PACKET  PacketArray,
IN UINT  NumberOfPackets 
)

Definition at line 293 of file miniport.c.

305{
307 PLIST_ENTRY CurrentEntry;
308 PADAPTER_BINDING AdapterBinding;
310 UINT i;
311
313
314 CurrentEntry = Adapter->ProtocolListHead.Flink;
315
316 while (CurrentEntry != &Adapter->ProtocolListHead)
317 {
318 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
319
320 for (i = 0; i < NumberOfPackets; i++)
321 {
322 /* Store the indicating miniport in the packet */
323 PacketArray[i]->Reserved[1] = (ULONG_PTR)Adapter;
324
325 if (AdapterBinding->ProtocolBinding->Chars.ReceivePacketHandler &&
327 {
328 NDIS_DbgPrint(MID_TRACE, ("Indicating packet to protocol's ReceivePacket handler\n"));
330 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
331 PacketArray[i]);
332 NDIS_DbgPrint(MID_TRACE, ("Protocol is holding %d references to the packet\n", PacketArray[i]->WrapperReserved[0]));
333 }
334 else
335 {
336 UINT FirstBufferLength, TotalBufferLength, LookAheadSize, HeaderSize;
337 PNDIS_BUFFER NdisBuffer;
338 PVOID NdisBufferVA, LookAheadBuffer;
339
341 &NdisBuffer,
342 &NdisBufferVA,
343 &FirstBufferLength,
344 &TotalBufferLength);
345
347
348 LookAheadSize = TotalBufferLength - HeaderSize;
349
350 LookAheadBuffer = ExAllocatePool(NonPagedPool, LookAheadSize);
351 if (!LookAheadBuffer)
352 {
353 NDIS_DbgPrint(MIN_TRACE, ("Failed to allocate lookahead buffer!\n"));
355 return;
356 }
357
358 CopyBufferChainToBuffer(LookAheadBuffer,
359 NdisBuffer,
360 HeaderSize,
361 LookAheadSize);
362
363 NDIS_DbgPrint(MID_TRACE, ("Indicating packet to protocol's legacy Receive handler\n"));
364 (*AdapterBinding->ProtocolBinding->Chars.ReceiveHandler)(
365 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
366 AdapterBinding->NdisOpenBlock.MacHandle,
367 NdisBufferVA,
368 HeaderSize,
369 LookAheadBuffer,
370 LookAheadSize,
371 TotalBufferLength - HeaderSize);
372
373 ExFreePool(LookAheadBuffer);
374 }
375 }
376
377 CurrentEntry = CurrentEntry->Flink;
378 }
379
380 /* Loop the packet array to get everything
381 * set up for return the packets to the miniport */
382 for (i = 0; i < NumberOfPackets; i++)
383 {
384 /* First, check the initial packet status */
386 {
387 /* The miniport driver gets it back immediately so nothing to do here */
388 NDIS_DbgPrint(MID_TRACE, ("Miniport needs the packet back immediately\n"));
389 continue;
390 }
391
392 /* Different behavior depending on whether it's serialized or not */
394 {
395 /* We need to check the reference count */
396 if (PacketArray[i]->WrapperReserved[0] == 0)
397 {
398 /* NOTE: Unlike serialized miniports, this is REQUIRED to be called for each
399 * packet received that can be reused immediately, it is not implied! */
400 Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ReturnPacketHandler(
402 PacketArray[i]);
403 NDIS_DbgPrint(MID_TRACE, ("Packet has been returned to miniport (Deserialized)\n"));
404 }
405 else
406 {
407 /* Packet will be returned by the protocol's call to NdisReturnPackets */
408 NDIS_DbgPrint(MID_TRACE, ("Packet will be returned to miniport later (Deserialized)\n"));
409 }
410 }
411 else
412 {
413 /* Check the reference count */
414 if (PacketArray[i]->WrapperReserved[0] == 0)
415 {
416 /* NDIS_STATUS_SUCCESS means the miniport can have the packet back immediately */
418
419 NDIS_DbgPrint(MID_TRACE, ("Packet has been returned to miniport (Serialized)\n"));
420 }
421 else
422 {
423 /* NDIS_STATUS_PENDING means the miniport needs to wait for MiniportReturnPacket */
425
426 NDIS_DbgPrint(MID_TRACE, ("Packet will be returned to miniport later (Serialized)\n"));
427 }
428 }
429 }
430
432}
UINT CopyBufferChainToBuffer(PUCHAR DstData, PNDIS_BUFFER SrcBuffer, UINT SrcOffset, UINT Length)
Definition: buffer.c:113
VOID EXPORT NdisGetFirstBufferFromPacket(IN PNDIS_PACKET _Packet, OUT PNDIS_BUFFER *_FirstBuffer, OUT PVOID *_FirstBufferVA, OUT PUINT _FirstBufferLength, OUT PUINT _TotalBufferLength)
Definition: buffer.c:873
#define ULONG_PTR
Definition: config.h:101
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
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 NDIS_GET_PACKET_HEADER_SIZE(_Packet)
Definition: ndis.h:3427
_In_ PPNDIS_PACKET _In_ UINT NumberOfPackets
Definition: ndis.h:5121
_In_ PPNDIS_PACKET PacketArray
Definition: ndis.h:5120
#define NDIS_ATTRIBUTE_DESERIALIZE
Definition: ndis.h:588
#define NDIS_GET_PACKET_STATUS(_Packet)
Definition: ndis.h:3436
_In_ NDIS_HANDLE MiniportAdapterHandle
Definition: ndis.h:4668
#define NDIS_SET_PACKET_STATUS(_Packet, _Status)
Definition: ndis.h:3509
#define NDIS_STATUS_RESOURCES
Definition: ndis.h:466
RECEIVE_PACKET_HANDLER ReceivePacketHandler
Definition: ndis.h:1896
ULONG_PTR Reserved[2]
Definition: ndis.h:749
UCHAR WrapperReserved[2 *sizeof(PVOID)]
Definition: ndis.h:739

Referenced by NdisIPnPStartDevice().

◆ MiniIsBusy()

BOOLEAN MiniIsBusy ( PLOGICAL_ADAPTER  Adapter,
NDIS_WORK_ITEM_TYPE  Type 
)

Definition at line 142 of file miniport.c.

145{
146 BOOLEAN Busy = FALSE;
148
150
151 if (MiniGetFirstWorkItem(Adapter, Type))
152 {
153 Busy = TRUE;
154 }
156 {
157 Busy = TRUE;
158 }
160 {
161 Busy = TRUE;
162 }
163 else if (Type == NdisWorkItemResetRequested &&
165 {
166 Busy = TRUE;
167 }
168
170
171 return Busy;
172}
#define TRUE
Definition: types.h:120
@ NdisWorkItemResetRequested
Definition: ndis.h:2297
PNDIS_MINIPORT_WORK_ITEM MiniGetFirstWorkItem(PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE Type)
Definition: miniport.c:124
NDIS_STATUS ResetStatus
Definition: ndis.h:2541

Referenced by MiniReset(), MiniWorkItemComplete(), ProRequest(), and proSendPacketToMiniport().

◆ MiniLocateDevice()

PLOGICAL_ADAPTER MiniLocateDevice ( PNDIS_STRING  AdapterName)

Definition at line 690 of file miniport.c.

701{
703 PLIST_ENTRY CurrentEntry;
704 PLOGICAL_ADAPTER Adapter = 0;
705
707
708 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
709
711 {
712 NDIS_DbgPrint(MIN_TRACE, ("No registered miniports for protocol to bind to\n"));
713 return NULL;
714 }
715
716 NDIS_DbgPrint(DEBUG_MINIPORT, ("AdapterName = %wZ\n", AdapterName));
717
719 {
720 CurrentEntry = AdapterListHead.Flink;
721
722 while (CurrentEntry != &AdapterListHead)
723 {
724 Adapter = CONTAINING_RECORD(CurrentEntry, LOGICAL_ADAPTER, ListEntry);
725
726 ASSERT(Adapter);
727
728 NDIS_DbgPrint(DEBUG_MINIPORT, ("Examining adapter 0x%lx\n", Adapter));
729
730 /* We're technically not allowed to call this above PASSIVE_LEVEL, but it doesn't break
731 * right now and I'd rather use a working API than reimplement it here */
733 {
734 break;
735 }
736
737 Adapter = NULL;
738 CurrentEntry = CurrentEntry->Flink;
739 }
740 }
742
743 if(Adapter)
744 {
745 NDIS_DbgPrint(DEBUG_MINIPORT, ("Leaving. Adapter found at 0x%x\n", Adapter));
746 }
747 else
748 {
749 NDIS_DbgPrint(MIN_TRACE, ("Leaving (adapter not found for %wZ).\n", AdapterName));
750 }
751
752 return Adapter;
753}
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
Definition: string_lib.cpp:31
#define ASSERT(a)
Definition: mode.c:44
_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
LIST_ENTRY AdapterListHead
Definition: miniport.c:57
KSPIN_LOCK AdapterListLock
Definition: miniport.c:58
UNICODE_STRING MiniportName
Definition: ndis.h:2511

Referenced by ndisBindMiniportsToProtocol(), and NdisOpenAdapter().

◆ MiniportHangDpc()

VOID NTAPI MiniportHangDpc ( PKDPC  Dpc,
PVOID  DeferredContext,
PVOID  SystemArgument1,
PVOID  SystemArgument2 
)

Definition at line 949 of file miniport.c.

954{
956
957 if (MiniCheckForHang(Adapter)) {
958 NDIS_DbgPrint(MIN_TRACE, ("Miniport detected adapter hang\n"));
959 MiniReset(Adapter);
960 }
961}
BOOLEAN MiniCheckForHang(PLOGICAL_ADAPTER Adapter)
Definition: miniport.c:865
NDIS_STATUS MiniReset(PLOGICAL_ADAPTER Adapter)
Definition: miniport.c:902
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:755

Referenced by NdisIAddDevice().

◆ MiniportWorker()

VOID NTAPI MiniportWorker ( IN PDEVICE_OBJECT  DeviceObject,
IN PVOID  Context 
)

Definition at line 1223 of file miniport.c.

1224{
1225 PLOGICAL_ADAPTER Adapter = DeviceObject->DeviceExtension;
1226 KIRQL OldIrql, RaiseOldIrql;
1227 NDIS_STATUS NdisStatus;
1228 PVOID WorkItemContext;
1229 NDIS_WORK_ITEM_TYPE WorkItemType;
1230 BOOLEAN AddressingReset;
1231
1233
1235
1236 NdisStatus =
1238 (Adapter, &WorkItemType, &WorkItemContext);
1239
1241
1242 if (NdisStatus == NDIS_STATUS_SUCCESS)
1243 {
1244 switch (WorkItemType)
1245 {
1246 case NdisWorkItemSend:
1247 /*
1248 * called by ProSend when protocols want to send packets to the miniport
1249 */
1250
1251 if(Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)
1252 {
1254 {
1255 NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
1256 (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
1257 Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
1258 NdisStatus = NDIS_STATUS_PENDING;
1259 }
1260 else
1261 {
1262 /* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */
1263 KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
1264 {
1265 NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's SendPackets handler\n"));
1266 (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)(
1267 Adapter->NdisMiniportBlock.MiniportAdapterContext, (PPNDIS_PACKET)&WorkItemContext, 1);
1268 }
1269 KeLowerIrql(RaiseOldIrql);
1270
1271 NdisStatus = NDIS_GET_PACKET_STATUS((PNDIS_PACKET)WorkItemContext);
1272 if( NdisStatus == NDIS_STATUS_RESOURCES ) {
1273 MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext, TRUE);
1274 break;
1275 }
1276 }
1277 }
1278 else
1279 {
1281 {
1282 NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
1283 NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
1284 Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext,
1285 ((PNDIS_PACKET)WorkItemContext)->Private.Flags);
1286 NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
1287 }
1288 else
1289 {
1290 /* Send is called at DISPATCH_LEVEL for all serialized miniports */
1291 KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
1292 NDIS_DbgPrint(MAX_TRACE, ("Calling miniport's Send handler\n"));
1293 NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)(
1294 Adapter->NdisMiniportBlock.MiniportAdapterContext, (PNDIS_PACKET)WorkItemContext,
1295 ((PNDIS_PACKET)WorkItemContext)->Private.Flags);
1296 NDIS_DbgPrint(MAX_TRACE, ("back from miniport's send handler\n"));
1297 KeLowerIrql(RaiseOldIrql);
1298 if( NdisStatus == NDIS_STATUS_RESOURCES ) {
1299 MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext, TRUE);
1300 break;
1301 }
1302 }
1303 }
1304
1305 if( NdisStatus != NDIS_STATUS_PENDING ) {
1307 ( Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus );
1308 }
1309 break;
1310
1312 /*
1313 * called by ProSend when protocols want to send loopback packets
1314 */
1315 /* XXX atm ProIndicatePacket sends a packet up via the loopback adapter only */
1316 NdisStatus = ProIndicatePacket(Adapter, (PNDIS_PACKET)WorkItemContext);
1317
1318 if( NdisStatus != NDIS_STATUS_PENDING )
1319 MiniSendComplete((NDIS_HANDLE)Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus);
1320 break;
1321
1323 break;
1324
1328
1330 NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)(
1331 &AddressingReset,
1332 Adapter->NdisMiniportBlock.MiniportAdapterContext);
1333
1334 KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
1335 Adapter->NdisMiniportBlock.ResetStatus = NdisStatus;
1336 KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock);
1337
1339
1340 if (NdisStatus != NDIS_STATUS_PENDING)
1341 MiniResetComplete(Adapter, NdisStatus, AddressingReset);
1342 break;
1343
1345 break;
1346
1348 break;
1349
1351 NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext);
1352
1353 if (NdisStatus == NDIS_STATUS_PENDING)
1354 break;
1355
1356 Adapter->NdisMiniportBlock.PendingRequest = (PNDIS_REQUEST)WorkItemContext;
1357 switch (((PNDIS_REQUEST)WorkItemContext)->RequestType)
1358 {
1360 NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
1361 break;
1362
1364 NdisMSetInformationComplete((NDIS_HANDLE)Adapter, NdisStatus);
1365 break;
1366
1367 default:
1368 NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS request type.\n"));
1369 break;
1370 }
1371 Adapter->NdisMiniportBlock.PendingRequest = NULL;
1372 break;
1373
1374 default:
1375 NDIS_DbgPrint(MIN_TRACE, ("Unknown NDIS work item type (%d).\n", WorkItemType));
1376 break;
1377 }
1378 }
1379}
NDIS_STATUS ProIndicatePacket(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet)
Definition: protocol.c:243
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
struct _NDIS_PACKET * PNDIS_PACKET
#define NdisMSetInformationComplete(MiniportAdapterHandle, Status)
Definition: ndis.h:5762
#define NdisMIndicateStatusComplete(MiniportAdapterHandle)
Definition: ndis.h:5580
#define NdisMQueryInformationComplete(MiniportAdapterHandle, Status)
Definition: ndis.h:5618
#define NDIS_STATUS_RESET_START
Definition: ndis.h:354
@ NdisWorkItemSendLoopback
Definition: ndis.h:2300
@ NdisWorkItemReturnPackets
Definition: ndis.h:2296
@ NdisWorkItemResetInProgress
Definition: ndis.h:2298
@ NdisWorkItemMiniportCallback
Definition: ndis.h:2301
enum _NDIS_WORK_ITEM_TYPE NDIS_WORK_ITEM_TYPE
struct _NDIS_REQUEST * PNDIS_REQUEST
#define NdisMIndicateStatus(MiniportAdapterHandle, GeneralStatus, StatusBuffer, StatusBufferSize)
Definition: ndis.h:5570
VOID NTAPI MiniSendComplete(IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status)
Definition: miniport.c:530
NDIS_STATUS FASTCALL MiniDequeueWorkItem(PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE *WorkItemType, PVOID *WorkItemContext)
Definition: miniport.c:1050
NDIS_STATUS MiniDoRequest(PLOGICAL_ADAPTER Adapter, PNDIS_REQUEST NdisRequest)
Definition: miniport.c:1107
VOID NTAPI MiniResetComplete(IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset)
Definition: miniport.c:435
VOID FASTCALL MiniQueueWorkItem(PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE WorkItemType, PVOID WorkItemContext, BOOLEAN Top)
Definition: miniport.c:982
_In_ PVOID Context
Definition: storport.h:2269
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061

Referenced by MiniWorkItemComplete().

◆ MiniQueryInformation()

NDIS_STATUS MiniQueryInformation ( PLOGICAL_ADAPTER  Adapter,
NDIS_OID  Oid,
ULONG  Size,
PVOID  Buffer,
PULONG  BytesWritten 
)

Definition at line 805 of file miniport.c.

822{
823 NDIS_STATUS NdisStatus;
827
828 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
829
831 if (!NdisRequest) {
832 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
834 }
835
837
839 NdisRequest->DATA.QUERY_INFORMATION.Oid = Oid;
840 NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer = Buffer;
841 NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength = Size;
842
843 /* We'll need to give the completion routine some way of letting us know
844 * when it's finished. We'll stash a pointer to an event in the MacBlock */
846 MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
847 MacBlock->Unknown1 = &Event;
848
849 NdisStatus = MiniDoRequest(Adapter, NdisRequest);
850
851 if (NdisStatus == NDIS_STATUS_PENDING)
852 {
854 NdisStatus = PtrToUlong(MacBlock->Unknown3);
855 }
856
857 *BytesWritten = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten;
858
860
861 return NdisStatus;
862}
Definition: bufpool.h:45
struct _NDIS_REQUEST_MAC_BLOCK * PNDIS_REQUEST_MAC_BLOCK
#define PtrToUlong(u)
Definition: config.h:107
#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 KernelMode
Definition: asm.h:38
@ NotificationEvent
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
@ Executive
Definition: ketypes.h:467

Referenced by DoQueries(), NdisIDeviceIoControl(), and NdisIPnPStartDevice().

◆ MiniQueueWorkItem()

VOID FASTCALL MiniQueueWorkItem ( PLOGICAL_ADAPTER  Adapter,
NDIS_WORK_ITEM_TYPE  WorkItemType,
PVOID  WorkItemContext,
BOOLEAN  Top 
)

Definition at line 982 of file miniport.c.

996{
997 PNDIS_MINIPORT_WORK_ITEM MiniportWorkItem;
999
1000 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
1001
1002 ASSERT(Adapter);
1003
1005 if (Top)
1006 {
1007 if (WorkItemType == NdisWorkItemSend)
1008 {
1009 NDIS_DbgPrint(MIN_TRACE, ("Requeuing failed packet (%x).\n", WorkItemContext));
1010 Adapter->NdisMiniportBlock.FirstPendingPacket = WorkItemContext;
1011 }
1012 else
1013 {
1014 //This should never happen
1015 ASSERT(FALSE);
1016 }
1017 }
1018 else
1019 {
1020 MiniportWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_MINIPORT_WORK_ITEM));
1021 if (!MiniportWorkItem)
1022 {
1024 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1025 return;
1026 }
1027
1028 MiniportWorkItem->WorkItemType = WorkItemType;
1029 MiniportWorkItem->WorkItemContext = WorkItemContext;
1030
1031 /* safe due to adapter lock held */
1032 MiniportWorkItem->Link.Next = NULL;
1033 if (!Adapter->WorkQueueHead)
1034 {
1035 Adapter->WorkQueueHead = MiniportWorkItem;
1036 Adapter->WorkQueueTail = MiniportWorkItem;
1037 }
1038 else
1039 {
1040 Adapter->WorkQueueTail->Link.Next = (PSINGLE_LIST_ENTRY)MiniportWorkItem;
1041 Adapter->WorkQueueTail = MiniportWorkItem;
1042 }
1043 }
1044
1046}
static LPHIST_ENTRY Top
Definition: history.c:53
struct _SINGLE_LIST_ENTRY * PSINGLE_LIST_ENTRY

Referenced by MiniportWorker(), MiniReset(), ProRequest(), ProSend(), and proSendPacketToMiniport().

◆ MiniRequestComplete()

VOID NTAPI MiniRequestComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_STATUS  Status 
)

Definition at line 481 of file miniport.c.

484{
489
490 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
491
493
497
498 MacBlock = (PNDIS_REQUEST_MAC_BLOCK)Request->MacReserved;
499
500 /* We may or may not be doing this request on behalf of an adapter binding */
501 if (MacBlock->Binding != NULL)
502 {
503 /* We are, so invoke its request complete handler */
504 if (MacBlock->Binding->RequestCompleteHandler != NULL)
505 {
506 (*MacBlock->Binding->RequestCompleteHandler)(
507 MacBlock->Binding->ProtocolBindingContext,
508 Request,
509 Status);
510 }
511 }
512 else
513 {
514 /* We are doing this internally, so we'll signal this event we've stashed in the MacBlock */
515 ASSERT(MacBlock->Unknown1 != NULL);
516 ASSERT(MacBlock->Unknown3 == NULL);
517 MacBlock->Unknown3 = UlongToPtr(Status);
519 }
520
525
527}
struct _LOGICAL_ADAPTER * PLOGICAL_ADAPTER
#define UlongToPtr(u)
Definition: config.h:106
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
PNDIS_OPEN_BLOCK Binding
Definition: protocol.h:34
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by NdisIPnPStartDevice().

◆ MiniReset()

NDIS_STATUS MiniReset ( PLOGICAL_ADAPTER  Adapter)

Definition at line 902 of file miniport.c.

911{
914 BOOLEAN AddressingReset = TRUE;
915
918 return NDIS_STATUS_PENDING;
919 }
920
923
926 &AddressingReset,
928
932
934
936 if (AddressingReset)
937 MiniDoAddressingReset(Adapter);
938
941
943 }
944
945 return Status;
946}
#define NDIS_STATUS_RESET_END
Definition: ndis.h:355
BOOLEAN MiniIsBusy(PLOGICAL_ADAPTER Adapter, NDIS_WORK_ITEM_TYPE Type)
Definition: miniport.c:142
VOID MiniDoAddressingReset(PLOGICAL_ADAPTER Adapter)
Definition: miniport.c:888

Referenced by MiniportHangDpc(), and ProReset().

◆ MiniResetComplete()

VOID NTAPI MiniResetComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_STATUS  Status,
IN BOOLEAN  AddressingReset 
)

Definition at line 435 of file miniport.c.

439{
441 PLIST_ENTRY CurrentEntry;
442 PADAPTER_BINDING AdapterBinding;
444
445 if (AddressingReset)
446 MiniDoAddressingReset(Adapter);
447
450
452
454 {
455 KeBugCheckEx(BUGCODE_ID_DRIVER,
458 (ULONG_PTR)AddressingReset,
459 0);
460 }
461
463
464 CurrentEntry = Adapter->ProtocolListHead.Flink;
465
466 while (CurrentEntry != &Adapter->ProtocolListHead)
467 {
468 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
469
470 (*AdapterBinding->ProtocolBinding->Chars.ResetCompleteHandler)(
471 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
472 Status);
473
474 CurrentEntry = CurrentEntry->Flink;
475 }
476
478}
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
Definition: debug.c:485
RESET_COMPLETE_HANDLER ResetCompleteHandler
Definition: ndis.h:1886
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by MiniportWorker(), NdisIPnPStartDevice(), and NdisMResetComplete().

◆ MiniSendComplete()

VOID NTAPI MiniSendComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN PNDIS_PACKET  Packet,
IN NDIS_STATUS  Status 
)

Definition at line 530 of file miniport.c.

542{
544 PADAPTER_BINDING AdapterBinding;
547
548 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
549
550 AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[1];
551
553
554 if (Adapter->NdisMiniportBlock.ScatterGatherListSize != 0)
555 {
556 NDIS_DbgPrint(MAX_TRACE, ("Freeing Scatter/Gather list\n"));
557
560
561 Adapter->NdisMiniportBlock.SystemAdapterObject->
562 DmaOperations->PutScatterGatherList(
563 Adapter->NdisMiniportBlock.SystemAdapterObject,
564 SGList,
565 TRUE);
566
569 }
570
571 (*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
572 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
573 Packet,
574 Status);
575
577
579}
struct _ADAPTER_BINDING * PADAPTER_BINDING
#define NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, InfoType)
Definition: ndis.h:1351
@ ScatterGatherListPacketInfo
Definition: ndis.h:1183
SEND_COMPLETE_HANDLER SendCompleteHandler
Definition: ndis.h:1879
struct _SCATTER_GATHER_LIST * PSCATTER_GATHER_LIST
Definition: iotypes.h:2206

Referenced by MiniportWorker(), NdisIPnPStartDevice(), NdisMSendComplete(), ProSendPackets(), and ScatterGatherSendPacket().

◆ MiniSendResourcesAvailable()

VOID NTAPI MiniSendResourcesAvailable ( IN NDIS_HANDLE  MiniportAdapterHandle)

Definition at line 583 of file miniport.c.

585{
586 /* Run the work if anything is waiting */
588}

Referenced by NdisIPnPStartDevice(), and NdisMSendResourcesAvailable().

◆ MiniSetInformation()

NDIS_STATUS MiniSetInformation ( PLOGICAL_ADAPTER  Adapter,
NDIS_OID  Oid,
ULONG  Size,
PVOID  Buffer,
PULONG  BytesRead 
)

Definition at line 756 of file miniport.c.

762{
763 NDIS_STATUS NdisStatus;
767
768 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
769
771 if (!NdisRequest) {
772 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
774 }
775
777
779 NdisRequest->DATA.SET_INFORMATION.Oid = Oid;
780 NdisRequest->DATA.SET_INFORMATION.InformationBuffer = Buffer;
781 NdisRequest->DATA.SET_INFORMATION.InformationBufferLength = Size;
782
783 /* We'll need to give the completion routine some way of letting us know
784 * when it's finished. We'll stash a pointer to an event in the MacBlock */
786 MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved;
787 MacBlock->Unknown1 = &Event;
788
789 NdisStatus = MiniDoRequest(Adapter, NdisRequest);
790
791 if (NdisStatus == NDIS_STATUS_PENDING)
792 {
794 NdisStatus = PtrToUlong(MacBlock->Unknown3);
795 }
796
797 *BytesRead = NdisRequest->DATA.SET_INFORMATION.BytesRead;
798
800
801 return NdisStatus;
802}

Referenced by MiniDoAddressingReset().

◆ MiniStatus()

VOID NTAPI MiniStatus ( IN NDIS_HANDLE  MiniportHandle,
IN NDIS_STATUS  GeneralStatus,
IN PVOID  StatusBuffer,
IN UINT  StatusBufferSize 
)

Definition at line 1384 of file miniport.c.

1389{
1390 PLOGICAL_ADAPTER Adapter = MiniportHandle;
1391 PLIST_ENTRY CurrentEntry;
1392 PADAPTER_BINDING AdapterBinding;
1393 KIRQL OldIrql;
1394
1396
1397 CurrentEntry = Adapter->ProtocolListHead.Flink;
1398
1399 while (CurrentEntry != &Adapter->ProtocolListHead)
1400 {
1401 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
1402
1403 (*AdapterBinding->ProtocolBinding->Chars.StatusHandler)(
1404 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
1408
1409 CurrentEntry = CurrentEntry->Flink;
1410 }
1411
1413}
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS _In_ PVOID _In_ UINT StatusBufferSize
Definition: ndis.h:1558
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS _In_ PVOID StatusBuffer
Definition: ndis.h:1557
_In_opt_ NDIS_HANDLE _In_ NDIS_STATUS GeneralStatus
Definition: ndis.h:1556
STATUS_HANDLER StatusHandler
Definition: ndis.h:1893

Referenced by NdisIPnPStartDevice(), NdisMIndicateStatus(), and RxChangeBufferingState().

◆ MiniStatusComplete()

VOID NTAPI MiniStatusComplete ( IN NDIS_HANDLE  MiniportAdapterHandle)

Definition at line 1417 of file miniport.c.

1419{
1421 PLIST_ENTRY CurrentEntry;
1422 PADAPTER_BINDING AdapterBinding;
1423 KIRQL OldIrql;
1424
1426
1427 CurrentEntry = Adapter->ProtocolListHead.Flink;
1428
1429 while (CurrentEntry != &Adapter->ProtocolListHead)
1430 {
1431 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
1432
1433 (*AdapterBinding->ProtocolBinding->Chars.StatusCompleteHandler)(
1434 AdapterBinding->NdisOpenBlock.ProtocolBindingContext);
1435
1436 CurrentEntry = CurrentEntry->Flink;
1437 }
1438
1440}
STATUS_COMPLETE_HANDLER StatusCompleteHandler
Definition: ndis.h:1894

Referenced by NdisIPnPStartDevice(), and NdisMIndicateStatusComplete().

◆ MiniTransferDataComplete()

VOID NTAPI MiniTransferDataComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN PNDIS_PACKET  Packet,
IN NDIS_STATUS  Status,
IN UINT  BytesTransferred 
)

Definition at line 592 of file miniport.c.

597{
598 PADAPTER_BINDING AdapterBinding;
600
601 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
602
603 AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[1];
604
607 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
608 Packet,
609 Status,
612}
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler
Definition: ndis.h:1883
_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

Referenced by NdisIPnPStartDevice(), and NdisMTransferDataComplete().

◆ MiniWorkItemComplete()

VOID MiniWorkItemComplete ( PLOGICAL_ADAPTER  Adapter,
NDIS_WORK_ITEM_TYPE  WorkItemType 
)

Definition at line 964 of file miniport.c.

967{
969
970 /* Check if there's anything queued to run after this work item */
971 if (!MiniIsBusy(Adapter, WorkItemType))
972 return;
973
974 /* There is, so fire the worker */
976 if (IoWorkItem)
978}
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
VOID NTAPI MiniportWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Definition: miniport.c:1223
PDEVICE_OBJECT DeviceObject
Definition: ndis.h:2552
@ DelayedWorkQueue
Definition: extypes.h:190
_In_opt_ PVOID _In_ PIO_WORKITEM IoWorkItem
Definition: iotypes.h:521

Referenced by MiniDoRequest(), MiniRequestComplete(), MiniReset(), MiniSendComplete(), MiniSendResourcesAvailable(), and proSendPacketToMiniport().

◆ NdisCancelSendPackets()

VOID EXPORT NdisCancelSendPackets ( IN NDIS_HANDLE  NdisBindingHandle,
IN PVOID  CancelId 
)

Definition at line 3438 of file miniport.c.

3441{
3442 PADAPTER_BINDING AdapterBinding = NdisBindingHandle;
3443 PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
3444
3445 NDIS_DbgPrint(MAX_TRACE, ("Called for ID %x.\n", CancelId));
3446
3447 if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CancelSendPacketsHandler)
3448 {
3449 (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CancelSendPacketsHandler)(
3451 CancelId);
3452 }
3453}
LONG CancelId
Definition: main.c:23
_Must_inspect_result_ _In_ NDIS_HANDLE NdisBindingHandle
Definition: ndis.h:4735
PLOGICAL_ADAPTER Adapter
Definition: protocol.h:29

◆ NdisCompletePnPEvent()

VOID EXPORT NdisCompletePnPEvent ( IN NDIS_STATUS  Status,
IN NDIS_HANDLE  NdisBindingHandle,
IN PNET_PNP_EVENT  NetPnPEvent 
)

Definition at line 3375 of file miniport.c.

3385{
3386 PIRP Irp = (PIRP)NetPnPEvent->NdisReserved[0];
3387 PLIST_ENTRY CurrentEntry = (PLIST_ENTRY)NetPnPEvent->NdisReserved[1];
3388 PADAPTER_BINDING AdapterBinding = NdisBindingHandle;
3389 PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
3390 NDIS_STATUS NdisStatus;
3391
3393 {
3394 if (NetPnPEvent->Buffer) ExFreePool(NetPnPEvent->Buffer);
3396 Irp->IoStatus.Status = Status;
3398 return;
3399 }
3400
3401 while (CurrentEntry != &Adapter->ProtocolListHead)
3402 {
3403 AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry);
3404
3405 NdisStatus = (*AdapterBinding->ProtocolBinding->Chars.PnPEventHandler)(
3406 AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
3407 NetPnPEvent);
3408
3409 if (NdisStatus == NDIS_STATUS_PENDING)
3410 {
3411 NetPnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink;
3412 return;
3413 }
3414 else if (NdisStatus != NDIS_STATUS_SUCCESS)
3415 {
3416 if (NetPnPEvent->Buffer) ExFreePool(NetPnPEvent->Buffer);
3418 Irp->IoStatus.Status = NdisStatus;
3420 return;
3421 }
3422
3423 CurrentEntry = CurrentEntry->Flink;
3424 }
3425
3426 if (NetPnPEvent->Buffer) ExFreePool(NetPnPEvent->Buffer);
3428
3429 Irp->IoStatus.Status = NDIS_STATUS_SUCCESS;
3431}
struct _IRP * PIRP
_In_ PIRP Irp
Definition: csq.h:116
_In_ NDIS_HANDLE _In_ PNET_PNP_EVENT NetPnPEvent
Definition: ndis.h:6082
#define IoCompleteRequest
Definition: irp.c:1240
PNP_EVENT_HANDLER PnPEventHandler
Definition: ndis.h:1899

◆ NdisDeregisterAdapterShutdownHandler()

VOID EXPORT NdisDeregisterAdapterShutdownHandler ( IN NDIS_HANDLE  NdisAdapterHandle)

Definition at line 3158 of file miniport.c.

3166{
3167 NdisMDeregisterAdapterShutdownHandler(NdisAdapterHandle);
3168}
VOID EXPORT NdisMDeregisterAdapterShutdownHandler(IN NDIS_HANDLE MiniportHandle)
Definition: miniport.c:1517

◆ NdisGenericIrpHandler()

NTSTATUS NTAPI NdisGenericIrpHandler ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 2659 of file miniport.c.

2662{
2664
2665 /* Use the characteristics to classify the device */
2666 if (DeviceObject->DeviceType == FILE_DEVICE_PHYSICAL_NETCARD)
2667 {
2668 if ((IrpSp->MajorFunction == IRP_MJ_CREATE) ||
2671 {
2673 }
2674 else if (IrpSp->MajorFunction == IRP_MJ_PNP)
2675 {
2677 }
2678 else if (IrpSp->MajorFunction == IRP_MJ_SHUTDOWN)
2679 {
2681 }
2683 {
2685 }
2686 else if (IrpSp->MajorFunction == IRP_MJ_POWER)
2687 {
2688 return NdisIPower(DeviceObject, Irp);
2689 }
2690 NDIS_DbgPrint(MIN_TRACE, ("Unexpected IRP MajorFunction 0x%x\n", IrpSp->MajorFunction));
2691 ASSERT(FALSE);
2692 }
2693 else if (DeviceObject->DeviceType == FILE_DEVICE_NETWORK)
2694 {
2695 PNDIS_M_DEVICE_BLOCK DeviceBlock = DeviceObject->DeviceExtension;
2696
2697 ASSERT(DeviceBlock->DeviceObject == DeviceObject);
2698
2699 if (DeviceBlock->MajorFunction[IrpSp->MajorFunction] != NULL)
2700 {
2701 return DeviceBlock->MajorFunction[IrpSp->MajorFunction](DeviceObject, Irp);
2702 }
2703 }
2704 else
2705 {
2706 ASSERT(FALSE);
2707 }
2708
2709 Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
2710 Irp->IoStatus.Information = 0;
2711
2713
2715}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4138
NTSTATUS NTAPI NdisIShutdown(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: miniport.c:2280
NTSTATUS NTAPI NdisIDispatchPnp(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: miniport.c:2416
NTSTATUS NTAPI NdisICreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: miniport.c:1871
NTSTATUS NTAPI NdisIDeviceIoControl(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: miniport.c:2302
NTSTATUS NTAPI NdisIPower(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: miniport.c:2492
#define FILE_DEVICE_PHYSICAL_NETCARD
Definition: winioctl.h:68
#define FILE_DEVICE_NETWORK
Definition: winioctl.h:63
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
PDEVICE_OBJECT DeviceObject
Definition: miniport.h:35
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
Definition: miniport.h:37
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define IRP_MJ_SHUTDOWN
#define IRP_MJ_POWER
#define IRP_MJ_CLEANUP

Referenced by NdisMRegisterMiniport().

◆ NdisIAddDevice()

NTSTATUS NTAPI NdisIAddDevice ( IN PDRIVER_OBJECT  DriverObject,
IN PDEVICE_OBJECT  PhysicalDeviceObject 
)

Definition at line 2505 of file miniport.c.

2514{
2515 static const WCHAR ClassKeyName[] = {'C','l','a','s','s','\\'};
2516 static const WCHAR LinkageKeyName[] = {'\\','L','i','n','k','a','g','e',0};
2517 PNDIS_M_DRIVER_BLOCK Miniport;
2518 PNDIS_M_DRIVER_BLOCK *MiniportPtr;
2519 WCHAR *LinkageKeyBuffer;
2520 ULONG DriverKeyLength;
2522 UNICODE_STRING ExportName;
2524 PLOGICAL_ADAPTER Adapter;
2526
2527 /*
2528 * Gain the access to the miniport data structure first.
2529 */
2530
2531 MiniportPtr = IoGetDriverObjectExtension(DriverObject, (PVOID)'NMID');
2532 if (MiniportPtr == NULL)
2533 {
2534 NDIS_DbgPrint(MIN_TRACE, ("Can't get driver object extension.\n"));
2535 return NDIS_STATUS_FAILURE;
2536 }
2537 Miniport = *MiniportPtr;
2538
2539 /*
2540 * Get name of the Linkage registry key for our adapter. It's located under
2541 * the driver key for our driver and so we have basicly two ways to do it.
2542 * Either we can use IoOpenDriverRegistryKey or compose it using information
2543 * gathered by IoGetDeviceProperty. I chose the second because
2544 * IoOpenDriverRegistryKey wasn't implemented at the time of writing.
2545 */
2546
2548 0, NULL, &DriverKeyLength);
2550 {
2551 NDIS_DbgPrint(MIN_TRACE, ("Can't get miniport driver key length.\n"));
2552 return Status;
2553 }
2554
2555 LinkageKeyBuffer = ExAllocatePool(PagedPool, DriverKeyLength +
2556 sizeof(ClassKeyName) + sizeof(LinkageKeyName));
2557 if (LinkageKeyBuffer == NULL)
2558 {
2559 NDIS_DbgPrint(MIN_TRACE, ("Can't allocate memory for driver key name.\n"));
2561 }
2562
2564 DriverKeyLength, LinkageKeyBuffer +
2565 (sizeof(ClassKeyName) / sizeof(WCHAR)),
2566 &DriverKeyLength);
2567 if (!NT_SUCCESS(Status))
2568 {
2569 NDIS_DbgPrint(MIN_TRACE, ("Can't get miniport driver key.\n"));
2570 ExFreePool(LinkageKeyBuffer);
2571 return Status;
2572 }
2573
2574 /* Compose the linkage key name. */
2575 RtlCopyMemory(LinkageKeyBuffer, ClassKeyName, sizeof(ClassKeyName));
2576 RtlCopyMemory(LinkageKeyBuffer + ((sizeof(ClassKeyName) + DriverKeyLength) /
2577 sizeof(WCHAR)) - 1, LinkageKeyName, sizeof(LinkageKeyName));
2578
2579 NDIS_DbgPrint(DEBUG_MINIPORT, ("LinkageKey: %S.\n", LinkageKeyBuffer));
2580
2581 /*
2582 * Now open the linkage key and read the "Export" and "RootDevice" values
2583 * which contains device name and root service respectively.
2584 */
2585
2587 RtlInitUnicodeString(&ExportName, NULL);
2589 QueryTable[0].Name = L"Export";
2590 QueryTable[0].EntryContext = &ExportName;
2591
2593 QueryTable, NULL, NULL);
2594 ExFreePool(LinkageKeyBuffer);
2595 if (!NT_SUCCESS(Status))
2596 {
2597 NDIS_DbgPrint(MIN_TRACE, ("Can't get miniport device name. (%x)\n", Status));
2598 return Status;
2599 }
2600
2601 /*
2602 * Create the device object.
2603 */
2604
2605 NDIS_DbgPrint(MAX_TRACE, ("creating device %wZ\n", &ExportName));
2606
2608 &ExportName, FILE_DEVICE_PHYSICAL_NETCARD,
2609 0, FALSE, &DeviceObject);
2610 if (!NT_SUCCESS(Status))
2611 {
2612 NDIS_DbgPrint(MIN_TRACE, ("Could not create device object.\n"));
2613 RtlFreeUnicodeString(&ExportName);
2614 return Status;
2615 }
2616
2617 /*
2618 * Initialize the adapter structure.
2619 */
2620
2621 Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
2624
2626 &GUID_DEVINTERFACE_NET,
2627 NULL,
2629
2630 if (!NT_SUCCESS(Status))
2631 {
2632 NDIS_DbgPrint(MIN_TRACE, ("Could not create device interface.\n"));
2634 RtlFreeUnicodeString(&ExportName);
2635 return Status;
2636 }
2637
2638 Adapter->NdisMiniportBlock.DriverHandle = Miniport;
2639 Adapter->NdisMiniportBlock.MiniportName = ExportName;
2645
2646 Adapter->NdisMiniportBlock.OldPnPDeviceState = 0;
2647 Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded;
2648
2651
2652 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
2653
2654 return STATUS_SUCCESS;
2655}
LONG NTSTATUS
Definition: precomp.h:26
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
#define L(x)
Definition: resources.c:13
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define PagedPool
Definition: env_spec_w32.h:308
@ NdisPnPDeviceAdded
Definition: ndis.h:990
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
Definition: rtlfuncs.h:4211
VOID NTAPI MiniportHangDpc(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: miniport.c:949
#define RTL_REGISTRY_CONTROL
Definition: nt_native.h:163
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_QUERY_REGISTRY_REQUIRED
Definition: nt_native.h:132
#define RTL_QUERY_REGISTRY_DIRECT
Definition: nt_native.h:144
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:967
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1032
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1252
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
Definition: deviface.c:1437
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1916
short WCHAR
Definition: pedump.c:58
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1382
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
PDEVICE_OBJECT NextDeviceObject
Definition: ndis.h:2554
UNICODE_STRING SymbolicLinkName
Definition: ndis.h:2537
PDEVICE_OBJECT PhysicalDeviceObject
Definition: ndis.h:2553
NDIS_TIMER WakeUpDpcTimer
Definition: ndis.h:2535
PDRIVER_OBJECT DriverObject
Definition: miniport.h:24
KDPC Dpc
Definition: ndis.h:644
KTIMER Timer
Definition: ndis.h:643
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
@ DevicePropertyDriverKeyName
Definition: iotypes.h:1202

Referenced by NdisMRegisterMiniport().

◆ NdisIBugcheckCallback()

VOID NTAPI NdisIBugcheckCallback ( IN PVOID  Buffer,
IN ULONG  Length 
)

Definition at line 1670 of file miniport.c.

1679{
1682
1683 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
1684
1685 if(sh)
1686 sh(Context->DriverContext);
1687}
struct _MINIPORT_BUGCHECK_CONTEXT * PMINIPORT_BUGCHECK_CONTEXT
VOID(NTAPI * ADAPTER_SHUTDOWN_HANDLER)(_In_ PVOID ShutdownContext)
Definition: ndis.h:2025
short sh
Definition: format.c:272

Referenced by NdisMRegisterAdapterShutdownHandler().

◆ NdisICreateClose()

NTSTATUS NTAPI NdisICreateClose ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1871 of file miniport.c.

1874{
1875 Irp->IoStatus.Status = STATUS_SUCCESS;
1876 Irp->IoStatus.Information = 0;
1877
1879
1880 return STATUS_SUCCESS;
1881}

Referenced by NdisGenericIrpHandler().

◆ NdisIDeviceIoControl()

NTSTATUS NTAPI NdisIDeviceIoControl ( IN PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 2302 of file miniport.c.

2305{
2306 PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
2310 ULONG Written;
2311
2312 Irp->IoStatus.Information = 0;
2313
2314 ASSERT(Adapter);
2315
2316 ControlCode = Stack->Parameters.DeviceIoControl.IoControlCode;
2317 switch (ControlCode)
2318 {
2320 Status = MiniQueryInformation(Adapter,
2321 *(PNDIS_OID)Irp->AssociatedIrp.SystemBuffer,
2322 Stack->Parameters.DeviceIoControl.OutputBufferLength,
2323 MmGetSystemAddressForMdl(Irp->MdlAddress),
2324 &Written);
2325 Irp->IoStatus.Information = Written;
2326 break;
2327
2329 NDIS_DbgPrint(MIN_TRACE, ("NdisIDeviceIoControl: IOCTL_NDIS_RESERVED7 UNIMPLEMENTED (CORE-13831)\n"));
2331 break;
2332
2333 default:
2334 NDIS_DbgPrint(MIN_TRACE, ("NdisIDeviceIoControl: unsupported control code 0x%lx\n", ControlCode));
2335 break;
2336 }
2337
2339 {
2340 Irp->IoStatus.Status = Status;
2342 }
2343 else
2345
2346 return Status;
2347}
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
IoMarkIrpPending(Irp)
#define IOCTL_NDIS_QUERY_GLOBAL_STATS
Definition: ntddndis.h:465
#define IOCTL_NDIS_RESERVED7
Definition: ntddndis.h:467
ULONG * PNDIS_OID
Definition: ntddndis.h:249
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
Definition: wmitypes.h:55
#define MmGetSystemAddressForMdl(Mdl)

Referenced by NdisGenericIrpHandler().

◆ NdisIDispatchPnp()

NTSTATUS NTAPI NdisIDispatchPnp ( IN PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 2416 of file miniport.c.

2419{
2421 PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
2423
2424 switch (Stack->MinorFunction)
2425 {
2427 Status = NdisIForwardIrpAndWait(Adapter, Irp);
2428 if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
2429 {
2431 }
2432 else
2433 NDIS_DbgPrint(MIN_TRACE, ("Lower driver failed device start\n"));
2434 Irp->IoStatus.Status = Status;
2436 return Status;
2437
2438 case IRP_MN_STOP_DEVICE:
2440 if (!NT_SUCCESS(Status))
2441 NDIS_DbgPrint(MIN_TRACE, ("WARNING: Ignoring halt device failure! Passing the IRP down anyway\n"));
2442 Irp->IoStatus.Status = STATUS_SUCCESS;
2443 break;
2444
2448 Irp->IoStatus.Status = Status;
2449 if (Status != STATUS_SUCCESS)
2450 {
2452 NDIS_DbgPrint(MIN_TRACE, ("Failing miniport halt request\n"));
2453 return Status;
2454 }
2455 break;
2456
2459 Status = NdisIForwardIrpAndWait(Adapter, Irp);
2460 if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
2461 {
2463 }
2464 else
2465 {
2466 NDIS_DbgPrint(MIN_TRACE, ("Lower driver failed cancel stop/remove request\n"));
2467 }
2468 Irp->IoStatus.Status = Status;
2470 return Status;
2471
2474 Irp->IoStatus.Status = Status;
2475 Irp->IoStatus.Information |= Adapter->NdisMiniportBlock.PnPFlags;
2476 break;
2477
2480
2481 default:
2482 NDIS_DbgPrint(MIN_TRACE, ("Unhandled minor function: 0x%X\n", Stack->MinorFunction));
2483 break;
2484 }
2485
2488}
switch(r->id)
Definition: btrfs.c:3046
NTSTATUS NTAPI NdisIPnPCancelStopDevice(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: protocol.c:172
NTSTATUS NTAPI NdisIPnPQueryStopDevice(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: protocol.c:154
static NTSTATUS NdisIPnPRemoveDevice(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
Definition: miniport.c:2351
NTSTATUS NTAPI NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp)
Definition: miniport.c:1851
NTSTATUS NTAPI NdisIPnPStartDevice(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: miniport.c:1885
NTSTATUS NTAPI NdisIPnPStopDevice(IN PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: miniport.c:2214
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCallDriver
Definition: irp.c:1225
#define IRP_MN_CANCEL_STOP_DEVICE
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define IRP_MN_START_DEVICE
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_REMOVE_DEVICE

Referenced by NdisGenericIrpHandler().

◆ NdisIForwardIrpAndWait()

NTSTATUS NTAPI NdisIForwardIrpAndWait ( PLOGICAL_ADAPTER  Adapter,
PIRP  Irp 
)

Definition at line 1851 of file miniport.c.

1852{
1853 KEVENT Event;
1855
1859 TRUE, TRUE, TRUE);
1861 if (Status == STATUS_PENDING)
1862 {
1864 Status = Irp->IoStatus.Status;
1865 }
1866 return Status;
1867}
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
NTSTATUS NTAPI NdisIForwardIrpAndWaitCompletionRoutine(PDEVICE_OBJECT Fdo, PIRP Irp, PVOID Context)
Definition: miniport.c:1836
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
#define STATUS_PENDING
Definition: telnetd.h:14

Referenced by NdisIDispatchPnp().

◆ NdisIForwardIrpAndWaitCompletionRoutine()

NTSTATUS NTAPI NdisIForwardIrpAndWaitCompletionRoutine ( PDEVICE_OBJECT  Fdo,
PIRP  Irp,
PVOID  Context 
)

Definition at line 1836 of file miniport.c.

1840{
1842
1843 if (Irp->PendingReturned)
1845
1847}
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68

Referenced by NdisIForwardIrpAndWait().

◆ NdisIMGetBindingContext()

NDIS_HANDLE EXPORT NdisIMGetBindingContext ( IN NDIS_HANDLE  NdisBindingHandle)

Definition at line 3461 of file miniport.c.

3469{
3470 PADAPTER_BINDING AdapterBinding = NdisBindingHandle;
3471 PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
3472
3473 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
3474
3475 return Adapter->NdisMiniportBlock.DeviceContext;
3476}
NDIS_HANDLE DeviceContext
Definition: ndis.h:2515

◆ NdisIMGetDeviceContext()

NDIS_HANDLE EXPORT NdisIMGetDeviceContext ( IN NDIS_HANDLE  MiniportAdapterHandle)

Definition at line 3484 of file miniport.c.

3492{
3494
3495 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
3496
3497 return Adapter->NdisMiniportBlock.DeviceContext;
3498}

◆ NdisInitializeWrapper()

VOID EXPORT NdisInitializeWrapper ( OUT PNDIS_HANDLE  NdisWrapperHandle,
IN PVOID  SystemSpecific1,
IN PVOID  SystemSpecific2,
IN PVOID  SystemSpecific3 
)

Definition at line 1591 of file miniport.c.

1606{
1607 PNDIS_M_DRIVER_BLOCK Miniport;
1609 WCHAR *RegistryBuffer;
1610
1611 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
1612
1613 ASSERT(NdisWrapperHandle);
1614
1615 *NdisWrapperHandle = NULL;
1616
1617#if BREAK_ON_MINIPORT_INIT
1618 DbgBreakPoint();
1619#endif
1620
1621 Miniport = ExAllocatePool(NonPagedPool, sizeof(NDIS_M_DRIVER_BLOCK));
1622
1623 if (!Miniport)
1624 {
1625 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1626 return;
1627 }
1628
1629 RtlZeroMemory(Miniport, sizeof(NDIS_M_DRIVER_BLOCK));
1630
1631 KeInitializeSpinLock(&Miniport->Lock);
1632
1633 Miniport->DriverObject = (PDRIVER_OBJECT)SystemSpecific1;
1634
1635 /* set the miniport's driver registry path */
1637 if(!RegistryPath)
1638 {
1639 ExFreePool(Miniport);
1640 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1641 return;
1642 }
1643
1644 RegistryPath->Length = ((PUNICODE_STRING)SystemSpecific2)->Length;
1645 RegistryPath->MaximumLength = RegistryPath->Length + sizeof(WCHAR); /* room for 0-term */
1646
1647 RegistryBuffer = ExAllocatePool(PagedPool, RegistryPath->MaximumLength);
1648 if(!RegistryBuffer)
1649 {
1650 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1651 ExFreePool(Miniport);
1653 return;
1654 }
1655
1656 RtlCopyMemory(RegistryBuffer, ((PUNICODE_STRING)SystemSpecific2)->Buffer, RegistryPath->Length);
1657 RegistryBuffer[RegistryPath->Length/sizeof(WCHAR)] = 0;
1658
1659 RegistryPath->Buffer = RegistryBuffer;
1660 Miniport->RegistryPath = RegistryPath;
1661
1662 InitializeListHead(&Miniport->DeviceList);
1663
1664 /* Put miniport in global miniport list */
1666
1667 *NdisWrapperHandle = Miniport;
1668}
UNICODE_STRING * PUNICODE_STRING
Definition: env_spec_w32.h:373
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
_In_ PVOID _In_ PVOID SystemSpecific2
Definition: ndis.h:638
LIST_ENTRY MiniportListHead
Definition: miniport.c:53
KSPIN_LOCK MiniportListLock
Definition: miniport.c:54
LIST_ENTRY DeviceList
Definition: miniport.h:25
LIST_ENTRY ListEntry
Definition: miniport.h:20
PUNICODE_STRING RegistryPath
Definition: miniport.h:26
KSPIN_LOCK Lock
Definition: miniport.h:21
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
NTSYSAPI void WINAPI DbgBreakPoint(void)
struct _DRIVER_OBJECT * PDRIVER_OBJECT

◆ NdisIPnPRemoveDevice()

static NTSTATUS NdisIPnPRemoveDevice ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp 
)
static

Definition at line 2351 of file miniport.c.

2354{
2356 PLOGICAL_ADAPTER Adapter = DeviceObject->DeviceExtension;
2357
2359 {
2362 }
2363
2364 Irp->IoStatus.Status = STATUS_SUCCESS;
2367
2369
2371
2372 if (Adapter->NdisMiniportBlock.PnPDeviceState == NdisPnPDeviceStarted)
2373 {
2374 /* Remove adapter from adapter list for this miniport */
2376
2377 /* Remove adapter from global adapter list */
2379
2381
2382 Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.HaltHandler(Adapter);
2383 }
2384
2385 if (Adapter->NdisMiniportBlock.EthDB)
2386 {
2387 EthDeleteFilter(Adapter->NdisMiniportBlock.EthDB);
2388 Adapter->NdisMiniportBlock.EthDB = NULL;
2389 }
2390
2391 if (Adapter->NdisMiniportBlock.Resources)
2392 {
2394 Adapter->NdisMiniportBlock.Resources = NULL;
2395 }
2396
2397 if (Adapter->NdisMiniportBlock.AllocatedResources)
2398 {
2399 ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources);
2400 Adapter->NdisMiniportBlock.AllocatedResources = NULL;
2401 }
2402
2403 if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated)
2404 {
2405 ExFreePool(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated);
2406 Adapter->NdisMiniportBlock.AllocatedResourcesTranslated = NULL;
2407 }
2408
2410
2411 return Status;
2412}
VOID NTAPI EthDeleteFilter(IN PETH_FILTER Filter)
Definition: efilter.c:57
@ NdisPnPDeviceStarted
Definition: ndis.h:991
#define ExInterlockedRemoveEntryList(_List, _Lock)
Definition: ndissys.h:39
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1297
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
Definition: deviface.c:1793
LIST_ENTRY ListEntry
Definition: miniport.h:92
LIST_ENTRY MiniportListEntry
Definition: miniport.h:93
PCM_RESOURCE_LIST Resources
Definition: ndis.h:2534
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206

Referenced by NdisIDispatchPnp().

◆ NdisIPnPStartDevice()

NTSTATUS NTAPI NdisIPnPStartDevice ( IN PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 1885 of file miniport.c.

1896{
1898 PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
1899 NDIS_WRAPPER_CONTEXT WrapperContext;
1900 NDIS_STATUS NdisStatus;
1904 NDIS_OID AddressOID;
1907 ULONG ResourceListSize;
1908 UNICODE_STRING ParamName;
1910 NDIS_HANDLE ConfigHandle;
1911 ULONG Size;
1913 UINT MaxMulticastAddresses;
1915 PLIST_ENTRY CurrentEntry;
1916 PPROTOCOL_BINDING ProtocolBinding;
1917
1918 /*
1919 * Prepare wrapper context used by HW and configuration routines.
1920 */
1921
1922 NDIS_DbgPrint(DEBUG_MINIPORT, ("Start Device %wZ\n", &Adapter->NdisMiniportBlock.MiniportName));
1923
1924 NDIS_DbgPrint(MAX_TRACE, ("Inserting adapter 0x%x into adapter list\n", Adapter));
1925
1926 /* Put adapter in global adapter list */
1928
1931 KEY_ALL_ACCESS, &WrapperContext.RegistryHandle);
1932 if (!NT_SUCCESS(Status))
1933 {
1934 NDIS_DbgPrint(MIN_TRACE,("failed to open adapter-specific reg key\n"));
1936 return Status;
1937 }
1938
1939 NDIS_DbgPrint(MAX_TRACE, ("opened device reg key\n"));
1940
1941 WrapperContext.DeviceObject = Adapter->NdisMiniportBlock.DeviceObject;
1942
1943 /*
1944 * Store the adapter resources used by HW routines such as
1945 * NdisMQueryAdapterResources.
1946 */
1947
1948 if (Stack->Parameters.StartDevice.AllocatedResources != NULL)
1949 {
1950 ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0].
1951 PartialResourceList.Count;
1952 ResourceListSize =
1953 FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
1954 PartialDescriptors[ResourceCount]);
1955
1956 Adapter->NdisMiniportBlock.AllocatedResources =
1957 ExAllocatePool(PagedPool, ResourceListSize);
1958 if (Adapter->NdisMiniportBlock.AllocatedResources == NULL)
1959 {
1960 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
1963 }
1964
1965 Adapter->NdisMiniportBlock.Resources =
1966 ExAllocatePool(PagedPool, ResourceListSize);
1967 if (!Adapter->NdisMiniportBlock.Resources)
1968 {
1969 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
1970 ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources);
1973 }
1974
1976 Stack->Parameters.StartDevice.AllocatedResources,
1977 ResourceListSize);
1978
1979 RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResources,
1980 Stack->Parameters.StartDevice.AllocatedResources,
1981 ResourceListSize);
1982 }
1983
1984 if (Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL)
1985 {
1986 ResourceCount = Stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].
1987 PartialResourceList.Count;
1988 ResourceListSize =
1989 FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList.
1990 PartialDescriptors[ResourceCount]);
1991
1992 Adapter->NdisMiniportBlock.AllocatedResourcesTranslated =
1993 ExAllocatePool(PagedPool, ResourceListSize);
1994 if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated == NULL)
1995 {
1996 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
1999 }
2000
2001 RtlCopyMemory(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated,
2002 Stack->Parameters.StartDevice.AllocatedResourcesTranslated,
2003 ResourceListSize);
2004 }
2005
2006 /*
2007 * Store the Bus Type, Bus Number and Slot information. It's used by
2008 * the hardware routines then.
2009 */
2010
2011 NdisOpenConfiguration(&NdisStatus, &ConfigHandle, (NDIS_HANDLE)&WrapperContext);
2012 if (NdisStatus != NDIS_STATUS_SUCCESS)
2013 {
2014 NDIS_DbgPrint(MIN_TRACE, ("Failed to open configuration key\n"));
2016 return NdisStatus;
2017 }
2018
2019 Size = sizeof(ULONG);
2022 &Adapter->NdisMiniportBlock.BusType, &Size);
2024 {
2025 NdisInitUnicodeString(&ParamName, L"BusType");
2026 NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
2027 &ParamName, NdisParameterInteger);
2028 if (NdisStatus == NDIS_STATUS_SUCCESS)
2029 Adapter->NdisMiniportBlock.BusType = ConfigParam->ParameterData.IntegerData;
2030 else
2032 }
2033
2036 &Adapter->NdisMiniportBlock.BusNumber, &Size);
2037 if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.BusNumber == 0xFFFFFFF0)
2038 {
2039 NdisInitUnicodeString(&ParamName, L"BusNumber");
2040 NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
2041 &ParamName, NdisParameterInteger);
2042 if (NdisStatus == NDIS_STATUS_SUCCESS)
2043 Adapter->NdisMiniportBlock.BusNumber = ConfigParam->ParameterData.IntegerData;
2044 else
2045 Adapter->NdisMiniportBlock.BusNumber = 0;
2046 }
2047 WrapperContext.BusNumber = Adapter->NdisMiniportBlock.BusNumber;
2048
2051 &Adapter->NdisMiniportBlock.SlotNumber, &Size);
2052 if (!NT_SUCCESS(Status) || Adapter->NdisMiniportBlock.SlotNumber == (NDIS_INTERFACE_TYPE)-1)
2053 {
2054 NdisInitUnicodeString(&ParamName, L"SlotNumber");
2055 NdisReadConfiguration(&NdisStatus, &ConfigParam, ConfigHandle,
2056 &ParamName, NdisParameterInteger);
2057 if (NdisStatus == NDIS_STATUS_SUCCESS)
2058 Adapter->NdisMiniportBlock.SlotNumber = ConfigParam->ParameterData.IntegerData;
2059 else
2060 Adapter->NdisMiniportBlock.SlotNumber = 0;
2061 }
2062 else
2063 {
2064 /* Convert slotnumber to PCI_SLOT_NUMBER */
2065 ULONG PciSlotNumber = Adapter->NdisMiniportBlock.SlotNumber;
2067
2068 SlotNumber.u.AsULONG = 0;
2069 SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF;
2070 SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF;
2071
2072 Adapter->NdisMiniportBlock.SlotNumber = SlotNumber.u.AsULONG;
2073 }
2074 WrapperContext.SlotNumber = Adapter->NdisMiniportBlock.SlotNumber;
2075
2078
2079 NdisCloseConfiguration(ConfigHandle);
2080
2081 /* Set handlers (some NDIS macros require these) */
2094
2095 /*
2096 * Call MiniportInitialize.
2097 */
2098
2099 NDIS_DbgPrint(MID_TRACE, ("calling MiniportInitialize\n"));
2100 NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.InitializeHandler)(
2102 MEDIA_ARRAY_SIZE, Adapter, (NDIS_HANDLE)&WrapperContext);
2103
2104 ZwClose(WrapperContext.RegistryHandle);
2105
2106 if (NdisStatus != NDIS_STATUS_SUCCESS)
2107 {
2108 NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter (%lx).\n", NdisStatus));
2110 if (Adapter->NdisMiniportBlock.Interrupt)
2111 {
2112 KeBugCheckEx(BUGCODE_ID_DRIVER,
2113 (ULONG_PTR)Adapter,
2114 (ULONG_PTR)Adapter->NdisMiniportBlock.Interrupt,
2115 (ULONG_PTR)Adapter->NdisMiniportBlock.TimerQueue,
2116 1);
2117 }
2118 if (Adapter->NdisMiniportBlock.TimerQueue)
2119 {
2120 KeBugCheckEx(BUGCODE_ID_DRIVER,
2121 (ULONG_PTR)Adapter,
2122 (ULONG_PTR)Adapter->NdisMiniportBlock.Interrupt,
2123 (ULONG_PTR)Adapter->NdisMiniportBlock.TimerQueue,
2124 1);
2125 }
2126 return NdisStatus;
2127 }
2128
2130 {
2131 NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() selected a bad index\n"));
2134 }
2135
2137
2138 switch (Adapter->NdisMiniportBlock.MediaType)
2139 {
2140 case NdisMedium802_3:
2141 Adapter->MediumHeaderSize = 14; /* XXX figure out what to do about LLC */
2142 AddressOID = OID_802_3_CURRENT_ADDRESS;
2144 NdisStatus = DoQueries(Adapter, AddressOID);
2145 if (NdisStatus == NDIS_STATUS_SUCCESS)
2146 {
2147 NdisStatus = MiniQueryInformation(Adapter, OID_802_3_MAXIMUM_LIST_SIZE, sizeof(UINT),
2148 &MaxMulticastAddresses, &BytesWritten);
2149
2150 if (NdisStatus != NDIS_STATUS_SUCCESS)
2151 {
2153 NDIS_DbgPrint(MIN_TRACE, ("MiniQueryInformation failed (%x)\n", NdisStatus));
2154 return NdisStatus;
2155 }
2156
2157 Success = EthCreateFilter(MaxMulticastAddresses,
2158 Adapter->Address.Type.Medium802_3,
2159 &Adapter->NdisMiniportBlock.EthDB);
2160 if (Success)
2161 ((PETHI_FILTER)Adapter->NdisMiniportBlock.EthDB)->Miniport = (PNDIS_MINIPORT_BLOCK)Adapter;
2162 else
2163 NdisStatus = NDIS_STATUS_RESOURCES;
2164 }
2165 break;
2166
2167 default:
2168 /* FIXME: Support other types of media */
2169 NDIS_DbgPrint(MIN_TRACE, ("error: unsupported media\n"));
2170 ASSERT(FALSE);
2172 return STATUS_UNSUCCESSFUL;
2173 }
2174
2175 if (NdisStatus != NDIS_STATUS_SUCCESS)
2176 {
2177 NDIS_DbgPrint(MIN_TRACE, ("couldn't create filter (%x)\n", NdisStatus));
2178 return NdisStatus;
2179 }
2180
2181 /* Check for a hang every two seconds if it wasn't set in MiniportInitialize */
2182 if (Adapter->NdisMiniportBlock.CheckForHangSeconds == 0)
2184
2185 Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
2186 Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
2187
2189
2190 Timeout.QuadPart = Int32x32To64(Adapter->NdisMiniportBlock.CheckForHangSeconds, -1000000);
2192 Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000,
2194
2195 /* Put adapter in adapter list for this miniport */
2197
2198 /* Refresh bindings for all protocols */
2199 CurrentEntry = ProtocolListHead.Flink;
2200 while (CurrentEntry != &ProtocolListHead)
2201 {
2202 ProtocolBinding = CONTAINING_RECORD(CurrentEntry, PROTOCOL_BINDING, ListEntry);
2203
2204 ndisBindMiniportsToProtocol(&NdisStatus, ProtocolBinding);
2205
2206 CurrentEntry = CurrentEntry->Flink;
2207 }
2208
2209 return STATUS_SUCCESS;
2210}
LIST_ENTRY ProtocolListHead
Definition: protocol.c:19
VOID NTAPI ndisBindMiniportsToProtocol(OUT PNDIS_STATUS Status, IN PPROTOCOL_BINDING Protocol)
Definition: protocol.c:908
VOID NTAPI ProSendPackets(IN NDIS_HANDLE NdisBindingHandle, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets)
Definition: protocol.c:577
VOID EXPORT NdisCloseConfiguration(IN NDIS_HANDLE ConfigurationHandle)
Definition: config.c:136
VOID EXPORT NdisReadConfiguration(OUT PNDIS_STATUS Status, OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue, IN NDIS_HANDLE ConfigurationHandle, IN PNDIS_STRING Keyword, IN NDIS_PARAMETER_TYPE ParameterType)
Definition: config.c:414
VOID EXPORT NdisOpenConfiguration(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE ConfigurationHandle, IN NDIS_HANDLE WrapperConfigurationContext)
Definition: config.c:197
VOID EXPORT NdisInitUnicodeString(IN OUT PNDIS_STRING DestinationString, IN PCWSTR SourceString)
Definition: string.c:130
VOID NTAPI EthFilterDprIndicateReceiveComplete(IN PETH_FILTER Filter)
Definition: efilter.c:113
struct ETHI_FILTER * PETHI_FILTER
BOOLEAN NTAPI EthCreateFilter(IN UINT MaximumMulticastAddresses, IN PUCHAR AdapterAddress, OUT PETH_FILTER *Filter)
Definition: efilter.c:16
VOID NTAPI EthFilterDprIndicateReceive(IN PETH_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PCHAR Address, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookaheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize)
Definition: efilter.c:69
@ Success
Definition: eventcreate.c:712
static ULONG ResourceCount
Definition: inbv.c:50
@ NdisParameterInteger
Definition: ndis.h:926
struct _NDIS_MINIPORT_BLOCK * PNDIS_MINIPORT_BLOCK
Definition: ndis.h:319
enum _NDIS_INTERFACE_TYPE NDIS_INTERFACE_TYPE
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT SelectedMediumIndex
Definition: ndis.h:6011
@ NdisInterfaceIsa
Definition: ndis.h:901
@ NdisInterfacePci
Definition: ndis.h:905
#define NDIS_STATUS_UNSUPPORTED_MEDIA
Definition: ndis.h:490
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS OpenErrorStatus
Definition: ndis.h:6009
NTSTATUS NdisQueryPciBusInterface(IN PLOGICAL_ADAPTER Adapter)
Definition: hardware.c:19
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define MEDIA_ARRAY_SIZE
Definition: miniport.c:31
NDIS_STATUS DoQueries(PLOGICAL_ADAPTER Adapter, NDIS_OID AddressOID)
Definition: miniport.c:1746
VOID NTAPI MiniSendResourcesAvailable(IN NDIS_HANDLE MiniportAdapterHandle)
Definition: miniport.c:583
VOID NTAPI MiniStatus(IN NDIS_HANDLE MiniportHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize)
Definition: miniport.c:1384
VOID NTAPI MiniStatusComplete(IN NDIS_HANDLE MiniportAdapterHandle)
Definition: miniport.c:1417
VOID NTAPI MiniTransferDataComplete(IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred)
Definition: miniport.c:592
VOID NTAPI MiniIndicateReceivePacket(IN NDIS_HANDLE MiniportAdapterHandle, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets)
Definition: miniport.c:293
static NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE]
Definition: miniport.c:33
VOID NTAPI MiniRequestComplete(IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status)
Definition: miniport.c:481
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define Int32x32To64(a, b)
#define OID_802_3_MAXIMUM_LIST_SIZE
Definition: ntddndis.h:324
#define OID_802_3_CURRENT_ADDRESS
Definition: ntddndis.h:322
ULONG NDIS_OID
Definition: ntddndis.h:249
static ULONG Timeout
Definition: ping.c:61
NTSTATUS NTAPI IoOpenDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey)
Definition: pnpmgr.c:1621
@ InterfaceTypeUndefined
Definition: restypes.h:120
enum _INTERFACE_TYPE INTERFACE_TYPE
ULONG MediumHeaderSize
Definition: miniport.h:95
NDIS_M_REQ_COMPLETE_HANDLER SetCompleteHandler
Definition: ndis.h:2586
NDIS_M_SEND_COMPLETE_HANDLER SendCompleteHandler
Definition: ndis.h:2545
ETH_RCV_COMPLETE_HANDLER EthRxCompleteHandler
Definition: ndis.h:2579
NDIS_M_STATUS_HANDLER StatusHandler
Definition: ndis.h:2582
ETH_RCV_INDICATE_HANDLER EthRxIndicateHandler
Definition: ndis.h:2576
W_SEND_PACKETS_HANDLER SendPacketsHandler
Definition: ndis.h:2574
NDIS_M_TD_COMPLETE_HANDLER TDCompleteHandler
Definition: ndis.h:2584
NDIS_M_RESET_COMPLETE_HANDLER ResetCompleteHandler
Definition: ndis.h:2547
ULONG CheckForHangSeconds
Definition: ndis.h:2538
NDIS_INTERFACE_TYPE BusType
Definition: ndis.h:2550
NDIS_M_STS_COMPLETE_HANDLER StatusCompleteHandler
Definition: ndis.h:2583
PNDIS_MINIPORT_INTERRUPT Interrupt
Definition: ndis.h:2522
PNDIS_MINIPORT_TIMER TimerQueue
Definition: ndis.h:2564
NDIS_M_SEND_RESOURCES_HANDLER SendResourcesHandler
Definition: ndis.h:2546
FILTERDBS_S FILTER_PACKET_INDICATION_HANDLER PacketIndicateHandler
Definition: ndis.h:2544
NDIS_M_REQ_COMPLETE_HANDLER QueryCompleteHandler
Definition: ndis.h:2585
BOOLEAN NTAPI KeSetTimerEx(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN LONG Period, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:295
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define PLUGPLAY_REGKEY_DRIVER
Definition: usbd.c:42
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
@ DevicePropertyAddress
Definition: iotypes.h:1211
@ DevicePropertyBusNumber
Definition: iotypes.h:1209
@ DevicePropertyLegacyBusType
Definition: iotypes.h:1208

Referenced by NdisIDispatchPnp().

◆ NdisIPnPStopDevice()

NTSTATUS NTAPI NdisIPnPStopDevice ( IN PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 2214 of file miniport.c.

2225{
2226 PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension;
2227
2228 /* Remove adapter from adapter list for this miniport */
2230
2231 /* Remove adapter from global adapter list */
2233
2235
2236 /* Set this here so MiniportISR will be forced to run for interrupts generated in MiniportHalt */
2237 Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState;
2238 Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStopped;
2239
2240 (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.HaltHandler)(Adapter);
2241
2243
2244 if (Adapter->NdisMiniportBlock.AllocatedResources)
2245 {
2246 ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources);
2247 Adapter->NdisMiniportBlock.AllocatedResources = NULL;
2248 }
2249 if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated)
2250 {
2251 ExFreePool(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated);
2252 Adapter->NdisMiniportBlock.AllocatedResourcesTranslated = NULL;
2253 }
2254
2255 if (Adapter->BusInterface.SetBusData != NULL)
2256 {
2259
2260 Adapter->BusInterface.SetBusData = NULL;
2261 }
2262
2263 if (Adapter->NdisMiniportBlock.Resources)
2264 {
2266 Adapter->NdisMiniportBlock.Resources = NULL;
2267 }
2268
2269 if (Adapter->NdisMiniportBlock.EthDB)
2270 {
2271 EthDeleteFilter(Adapter->NdisMiniportBlock.EthDB);
2272 Adapter->NdisMiniportBlock.EthDB = NULL;
2273 }
2274
2275 return STATUS_SUCCESS;
2276}
@ NdisPnPDeviceStopped
Definition: ndis.h:993
PGET_SET_DEVICE_DATA SetBusData
Definition: iotypes.h:915
PINTERFACE_DEREFERENCE InterfaceDereference
Definition: iotypes.h:912
BUS_INTERFACE_STANDARD BusInterface
Definition: miniport.h:99

Referenced by NdisIDispatchPnp().

◆ NdisIPower()

NTSTATUS NTAPI NdisIPower ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp 
)

Definition at line 2492 of file miniport.c.

2495{
2496 PLOGICAL_ADAPTER Adapter = DeviceObject->DeviceExtension;
2497
2500 return PoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
2501}
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758

Referenced by NdisGenericIrpHandler().

◆ NdisIShutdown()

NTSTATUS NTAPI NdisIShutdown ( IN PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 2280 of file miniport.c.

2283{
2284 PLOGICAL_ADAPTER Adapter = DeviceObject->DeviceExtension;
2287
2289
2290 ShutdownHandler(Context->DriverContext);
2291
2292 Irp->IoStatus.Status = STATUS_SUCCESS;
2293 Irp->IoStatus.Information = 0;
2294
2296
2297 return STATUS_SUCCESS;
2298}
PMINIPORT_BUGCHECK_CONTEXT BugcheckContext
Definition: miniport.h:98
@ ShutdownHandler
Definition: winlogon.h:269

Referenced by NdisGenericIrpHandler().

◆ NdisMCloseLog()

VOID EXPORT NdisMCloseLog ( IN NDIS_HANDLE  LogHandle)

Definition at line 1447 of file miniport.c.

1449{
1451 PNDIS_MINIPORT_BLOCK Miniport = Log->Miniport;
1452 KIRQL OldIrql;
1453
1454 NDIS_DbgPrint(MAX_TRACE, ("called: LogHandle 0x%x\n", LogHandle));
1455
1456 KeAcquireSpinLock(&(Miniport)->Lock, &OldIrql);
1457 Miniport->Log = NULL;
1458 KeReleaseSpinLock(&(Miniport)->Lock, OldIrql);
1459
1460 ExFreePool(Log);
1461}
struct _NDIS_LOG * PNDIS_LOG
_In_ UINT _Out_ PNDIS_HANDLE LogHandle
Definition: ndis.h:5382
PNDIS_MINIPORT_BLOCK Miniport
Definition: ndis.h:2475
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:127

◆ NdisMCreateLog()

NDIS_STATUS EXPORT NdisMCreateLog ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN UINT  Size,
OUT PNDIS_HANDLE  LogHandle 
)

Definition at line 1468 of file miniport.c.

1472{
1474 PNDIS_LOG Log;
1475 KIRQL OldIrql;
1476
1477 NDIS_DbgPrint(MAX_TRACE, ("called: MiniportAdapterHandle 0x%x, Size %ld\n", MiniportAdapterHandle, Size));
1478
1480
1481 if (Adapter->NdisMiniportBlock.Log)
1482 {
1483 *LogHandle = NULL;
1484 return NDIS_STATUS_FAILURE;
1485 }
1486
1487 Log = ExAllocatePool(NonPagedPool, Size + sizeof(NDIS_LOG));
1488 if (!Log)
1489 {
1490 *LogHandle = NULL;
1491 return NDIS_STATUS_RESOURCES;
1492 }
1493
1494 Adapter->NdisMiniportBlock.Log = Log;
1495
1497
1498 Log->Miniport = &Adapter->NdisMiniportBlock;
1499 Log->TotalSize = Size;
1500 Log->CurrentSize = 0;
1501 Log->OutPtr = 0;
1502 Log->InPtr = 0;
1503 Log->Irp = NULL;
1504
1505 *LogHandle = Log;
1506
1508
1509 return NDIS_STATUS_SUCCESS;
1510}
UINT OutPtr
Definition: ndis.h:2481
KSPIN_LOCK LogLock
Definition: ndis.h:2476
PIRP Irp
Definition: ndis.h:2477
UINT InPtr
Definition: ndis.h:2480
UINT CurrentSize
Definition: ndis.h:2479
UINT TotalSize
Definition: ndis.h:2478

◆ NdisMDeregisterAdapterShutdownHandler()

VOID EXPORT NdisMDeregisterAdapterShutdownHandler ( IN NDIS_HANDLE  MiniportHandle)

Definition at line 1517 of file miniport.c.

1523{
1524 PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportHandle;
1525
1526 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
1527
1528 if(Adapter->BugcheckContext->ShutdownHandler) {
1531 }
1532}
BOOLEAN NTAPI KeDeregisterBugCheckCallback(IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
Definition: bug.c:1209
VOID NTAPI IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
Definition: device.c:1735
PKBUGCHECK_CALLBACK_RECORD CallbackRecord
Definition: miniport.h:60
ADAPTER_SHUTDOWN_HANDLER ShutdownHandler
Definition: miniport.h:59

Referenced by MiniportHalt(), and NdisDeregisterAdapterShutdownHandler().

◆ NdisMDeregisterDevice()

NDIS_STATUS EXPORT NdisMDeregisterDevice ( IN NDIS_HANDLE  NdisDeviceHandle)

Definition at line 3330 of file miniport.c.

3338{
3340
3341 IoDeleteDevice(DeviceBlock->DeviceObject);
3342
3343 IoDeleteSymbolicLink(DeviceBlock->SymbolicName);
3344
3345 return NDIS_STATUS_SUCCESS;
3346}
_In_ PNDIS_STRING _In_ PNDIS_STRING _Out_ PDEVICE_OBJECT _Out_ NDIS_HANDLE * NdisDeviceHandle
Definition: ndis.h:4680
PNDIS_STRING SymbolicName
Definition: miniport.h:36

◆ NdisMFlushLog()

VOID EXPORT NdisMFlushLog ( IN NDIS_HANDLE  LogHandle)

Definition at line 1539 of file miniport.c.

1541{
1543 KIRQL OldIrql;
1544
1545 NDIS_DbgPrint(MAX_TRACE, ("called: LogHandle 0x%x\n", LogHandle));
1546
1547 /* Lock object */
1549
1550 /* Set buffers size */
1551 Log->CurrentSize = 0;
1552 Log->OutPtr = 0;
1553 Log->InPtr = 0;
1554
1555 /* Unlock object */
1557}

◆ NdisMGetDeviceProperty()

Definition at line 3197 of file miniport.c.

3210{
3212
3213 NDIS_DbgPrint(MAX_TRACE, ("Called\n"));
3214
3217
3220
3221 if (NextDeviceObject != NULL)
3223
3224 if (AllocatedResources != NULL)
3225 *AllocatedResources = Adapter->NdisMiniportBlock.AllocatedResources;
3226
3228 *AllocatedResourcesTranslated = Adapter->NdisMiniportBlock.AllocatedResourcesTranslated;
3229}
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT * FunctionalDeviceObject
Definition: ndis.h:4641
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT * NextDeviceObject
Definition: ndis.h:4642
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PCM_RESOURCE_LIST * AllocatedResources
Definition: ndis.h:4643
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PCM_RESOURCE_LIST _Inout_opt_ PCM_RESOURCE_LIST * AllocatedResourcesTranslated
Definition: ndis.h:4644

Referenced by DcInitializeAdapterLocation().

◆ NdisMIndicateStatus()

VOID EXPORT NdisMIndicateStatus ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_STATUS  GeneralStatus,
IN PVOID  StatusBuffer,
IN UINT  StatusBufferSize 
)

Definition at line 1565 of file miniport.c.

◆ NdisMIndicateStatusComplete()

VOID EXPORT NdisMIndicateStatusComplete ( IN NDIS_HANDLE  MiniportAdapterHandle)

Definition at line 1580 of file miniport.c.

◆ NdisMQueryAdapterInstanceName()

NDIS_STATUS EXPORT NdisMQueryAdapterInstanceName ( OUT PNDIS_STRING  AdapterInstanceName,
IN NDIS_HANDLE  MiniportAdapterHandle 
)

Definition at line 3123 of file miniport.c.

3132{
3135
3136 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
3137
3138 AdapterName.Length = 0;
3140 AdapterName.Buffer = ExAllocatePool(PagedPool, AdapterName.MaximumLength);
3141 if (!AdapterName.Buffer) {
3142 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
3143 return NDIS_STATUS_RESOURCES;
3144 }
3145
3147
3148 *AdapterInstanceName = AdapterName;
3149
3150 return NDIS_STATUS_SUCCESS;
3151}
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
USHORT MaximumLength
Definition: env_spec_w32.h:370

Referenced by NdisQueryAdapterInstanceName().

◆ NdisMQueryInformationComplete()

VOID EXPORT NdisMQueryInformationComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_STATUS  Status 
)

Definition at line 1207 of file miniport.c.

◆ NdisMRegisterAdapterShutdownHandler()

VOID EXPORT NdisMRegisterAdapterShutdownHandler ( IN NDIS_HANDLE  MiniportHandle,
IN PVOID  ShutdownContext,
IN ADAPTER_SHUTDOWN_HANDLER  ShutdownHandler 
)

Definition at line 1694 of file miniport.c.

1707{
1708 PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportHandle;
1709 PMINIPORT_BUGCHECK_CONTEXT BugcheckContext;
1710
1711 NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
1712
1713 if (Adapter->BugcheckContext != NULL)
1714 {
1715 NDIS_DbgPrint(MIN_TRACE, ("Attempted to register again for a shutdown callback\n"));
1716 return;
1717 }
1718
1719 BugcheckContext = ExAllocatePool(NonPagedPool, sizeof(MINIPORT_BUGCHECK_CONTEXT));
1720 if(!BugcheckContext)
1721 {
1722 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
1723 return;
1724 }
1725
1726 BugcheckContext->ShutdownHandler = ShutdownHandler;
1727 BugcheckContext->DriverContext = ShutdownContext;
1728
1730 if (!BugcheckContext->CallbackRecord) {
1731 ExFreePool(BugcheckContext);
1732 return;
1733 }
1734
1735 Adapter->BugcheckContext = BugcheckContext;
1736
1738
1740 BugcheckContext, sizeof(*BugcheckContext), (PUCHAR)"Ndis Miniport");
1741
1743}
BOOLEAN NTAPI KeRegisterBugCheckCallback(IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord, IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, IN PVOID Buffer, IN ULONG Length, IN PUCHAR Component)
Definition: bug.c:1264
VOID NTAPI NdisIBugcheckCallback(IN PVOID Buffer, IN ULONG Length)
Definition: miniport.c:1670
NTSTATUS NTAPI IoRegisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
Definition: device.c:1704
#define KeInitializeCallbackRecord(CallbackRecord)
Definition: kefuncs.h:1387

Referenced by MiniportInitialize(), NdisMSetAttributesEx(), and NdisRegisterAdapterShutdownHandler().

◆ NdisMRegisterDevice()

NDIS_STATUS EXPORT NdisMRegisterDevice ( IN NDIS_HANDLE  NdisWrapperHandle,
IN PNDIS_STRING  DeviceName,
IN PNDIS_STRING  SymbolicName,
IN PDRIVER_DISPATCH  MajorFunctions[],
OUT PDEVICE_OBJECT pDeviceObject,
OUT NDIS_HANDLE NdisDeviceHandle 
)

Definition at line 3258 of file miniport.c.

3271{
3272 PNDIS_M_DRIVER_BLOCK DriverBlock = NdisWrapperHandle;
3273 PNDIS_M_DEVICE_BLOCK DeviceBlock;
3276 UINT i;
3277
3278 NDIS_DbgPrint(MAX_TRACE, ("Called\n"));
3279
3280 Status = IoCreateDevice(DriverBlock->DriverObject,
3281 sizeof(NDIS_M_DEVICE_BLOCK),
3282 DeviceName,
3284 0,
3285 FALSE,
3286 &DeviceObject);
3287
3288 if (!NT_SUCCESS(Status))
3289 {
3290 NDIS_DbgPrint(MIN_TRACE, ("IoCreateDevice failed (%x)\n", Status));
3291 return Status;
3292 }
3293
3295
3296 if (!NT_SUCCESS(Status))
3297 {
3298 NDIS_DbgPrint(MIN_TRACE, ("IoCreateSymbolicLink failed (%x)\n", Status));
3300 return Status;
3301 }
3302
3303 DeviceBlock = DeviceObject->DeviceExtension;
3304
3305 if (!DeviceBlock)
3306 {
3307 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
3310 return NDIS_STATUS_RESOURCES;
3311 }
3312
3313 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
3314 DeviceBlock->MajorFunction[i] = MajorFunctions[i];
3315
3316 DeviceBlock->DeviceObject = DeviceObject;
3317 DeviceBlock->SymbolicName = SymbolicName;
3318
3320 *NdisDeviceHandle = DeviceBlock;
3321
3322 return NDIS_STATUS_SUCCESS;
3323}
_In_ PNDIS_STRING _In_ PNDIS_STRING _Out_ PDEVICE_OBJECT * pDeviceObject
Definition: ndis.h:4679
_In_ PNDIS_STRING _In_ PNDIS_STRING SymbolicName
Definition: ndis.h:4677
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
#define IRP_MJ_MAXIMUM_FUNCTION

◆ NdisMRegisterMiniport()

NDIS_STATUS EXPORT NdisMRegisterMiniport ( IN NDIS_HANDLE  NdisWrapperHandle,
IN PNDIS_MINIPORT_CHARACTERISTICS  MiniportCharacteristics,
IN UINT  CharacteristicsLength 
)

Definition at line 2722 of file miniport.c.

2735{
2736 UINT MinSize;
2737 PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
2738 PNDIS_M_DRIVER_BLOCK *MiniportPtr;
2740 ULONG i;
2741
2742 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
2743
2744 switch (MiniportCharacteristics->MajorNdisVersion)
2745 {
2746 case 0x03:
2747 MinSize = sizeof(NDIS30_MINIPORT_CHARACTERISTICS);
2748 break;
2749
2750 case 0x04:
2751 MinSize = sizeof(NDIS40_MINIPORT_CHARACTERISTICS);
2752 break;
2753
2754 case 0x05:
2755 switch (MiniportCharacteristics->MinorNdisVersion)
2756 {
2757 case 0x00:
2758 MinSize = sizeof(NDIS50_MINIPORT_CHARACTERISTICS);
2759 break;
2760
2761 case 0x01:
2762 MinSize = sizeof(NDIS51_MINIPORT_CHARACTERISTICS);
2763 break;
2764
2765 default:
2766 NDIS_DbgPrint(MIN_TRACE, ("Bad 5.x minor characteristics version.\n"));
2768 }
2769 break;
2770
2771 default:
2772 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics version.\n"));
2774 }
2775
2776 NDIS_DbgPrint(MID_TRACE, ("Initializing an NDIS %u.%u miniport\n",
2777 MiniportCharacteristics->MajorNdisVersion,
2778 MiniportCharacteristics->MinorNdisVersion));
2779
2780 if (CharacteristicsLength < MinSize)
2781 {
2782 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics length.\n"));
2784 }
2785
2786 /* Check if mandatory MiniportXxx functions are specified */
2787 if ((!MiniportCharacteristics->HaltHandler) ||
2788 (!MiniportCharacteristics->InitializeHandler)||
2789 (!MiniportCharacteristics->ResetHandler))
2790 {
2791 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics.\n"));
2793 }
2794
2795 if (MiniportCharacteristics->MajorNdisVersion < 0x05)
2796 {
2797 if ((!MiniportCharacteristics->QueryInformationHandler) ||
2798 (!MiniportCharacteristics->SetInformationHandler))
2799 {
2800 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics. (Set/Query)\n"));
2802 }
2803 }
2804 else
2805 {
2806 if (((!MiniportCharacteristics->QueryInformationHandler) ||
2807 (!MiniportCharacteristics->SetInformationHandler)) &&
2808 (!MiniportCharacteristics->CoRequestHandler))
2809 {
2810 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics. (Set/Query)\n"));
2812 }
2813 }
2814
2815 if (MiniportCharacteristics->MajorNdisVersion == 0x03)
2816 {
2817 if (!MiniportCharacteristics->SendHandler)
2818 {
2819 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics. (NDIS 3.0)\n"));
2821 }
2822 }
2823 else if (MiniportCharacteristics->MajorNdisVersion == 0x04)
2824 {
2825 /* NDIS 4.0 */
2826 if ((!MiniportCharacteristics->SendHandler) &&
2827 (!MiniportCharacteristics->SendPacketsHandler))
2828 {
2829 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics. (NDIS 4.0)\n"));
2831 }
2832 }
2833 else if (MiniportCharacteristics->MajorNdisVersion == 0x05)
2834 {
2835 /* TODO: Add more checks here */
2836
2837 if ((!MiniportCharacteristics->SendHandler) &&
2838 (!MiniportCharacteristics->SendPacketsHandler) &&
2839 (!MiniportCharacteristics->CoSendPacketsHandler))
2840 {
2841 NDIS_DbgPrint(MIN_TRACE, ("Bad miniport characteristics. (NDIS 5.0)\n"));
2843 }
2844 }
2845
2846 RtlCopyMemory(&Miniport->MiniportCharacteristics, MiniportCharacteristics, MinSize);
2847
2848 /*
2849 * NOTE: This is VERY unoptimal! Should we store the NDIS_M_DRIVER_BLOCK
2850 * structure in the driver extension or what?
2851 */
2852
2854 sizeof(PNDIS_M_DRIVER_BLOCK), (PVOID*)&MiniportPtr);
2855 if (!NT_SUCCESS(Status))
2856 {
2857 NDIS_DbgPrint(MIN_TRACE, ("Can't allocate driver object extension.\n"));
2858 return NDIS_STATUS_RESOURCES;
2859 }
2860
2861 *MiniportPtr = Miniport;
2862
2863 /* We have to register for all of these so handler registered in NdisMRegisterDevice work */
2864 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
2865 {
2867 }
2868
2870
2871 return NDIS_STATUS_SUCCESS;
2872}
#define GET_MINIPORT_DRIVER(Handle)
Definition: miniport.h:84
_Out_ PNDIS_HANDLE _In_ PNDIS_PROTOCOL_CHARACTERISTICS _In_ UINT CharacteristicsLength
Definition: ndis.h:6136
#define NDIS_STATUS_BAD_VERSION
Definition: ndis.h:468
struct _NDIS50_MINIPORT_CHARACTERISTICS NDIS50_MINIPORT_CHARACTERISTICS
#define NDIS_STATUS_BAD_CHARACTERISTICS
Definition: ndis.h:469
struct _NDIS40_MINIPORT_CHARACTERISTICS NDIS40_MINIPORT_CHARACTERISTICS
struct _NDIS51_MINIPORT_CHARACTERISTICS NDIS51_MINIPORT_CHARACTERISTICS
struct _NDIS30_MINIPORT_CHARACTERISTICS NDIS30_MINIPORT_CHARACTERISTICS
NTSTATUS NTAPI NdisGenericIrpHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: miniport.c:2659
NTSTATUS NTAPI NdisIAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
Definition: miniport.c:2505
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1838
PDRIVER_ADD_DEVICE AddDevice
Definition: iotypes.h:2222
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
Definition: iotypes.h:2291
PDRIVER_EXTENSION DriverExtension
Definition: iotypes.h:2284

Referenced by DriverEntry().

◆ NdisMRegisterUnloadHandler()

VOID EXPORT NdisMRegisterUnloadHandler ( IN NDIS_HANDLE  NdisWrapperHandle,
IN PDRIVER_UNLOAD  UnloadHandler 
)

Definition at line 3236 of file miniport.c.

3245{
3246 PNDIS_M_DRIVER_BLOCK DriverBlock = NdisWrapperHandle;
3247
3248 NDIS_DbgPrint(MAX_TRACE, ("Miniport registered unload handler\n"));
3249
3250 DriverBlock->DriverObject->DriverUnload = UnloadHandler;
3251}
_In_ PDRIVER_UNLOAD UnloadHandler
Definition: ndis.h:4688
PDRIVER_UNLOAD DriverUnload
Definition: iotypes.h:2290

Referenced by DriverEntry().

◆ NdisMResetComplete()

VOID EXPORT NdisMResetComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_STATUS  Status,
IN BOOLEAN  AddressingReset 
)

Definition at line 2880 of file miniport.c.

2884{
2886}

◆ NdisMSendComplete()

VOID EXPORT NdisMSendComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN PNDIS_PACKET  Packet,
IN NDIS_STATUS  Status 
)

Definition at line 2894 of file miniport.c.

◆ NdisMSendResourcesAvailable()

VOID EXPORT NdisMSendResourcesAvailable ( IN NDIS_HANDLE  MiniportAdapterHandle)

Definition at line 2916 of file miniport.c.

◆ NdisMSetAttributes()

VOID EXPORT NdisMSetAttributes ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_HANDLE  MiniportAdapterContext,
IN BOOLEAN  BusMaster,
IN NDIS_INTERFACE_TYPE  AdapterType 
)

Definition at line 2943 of file miniport.c.

2956{
2957 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
2958 NdisMSetAttributesEx(MiniportAdapterHandle, MiniportAdapterContext, 0,
2959 BusMaster ? NDIS_ATTRIBUTE_BUS_MASTER : 0,
2960 AdapterType);
2961}
#define NDIS_ATTRIBUTE_BUS_MASTER
Definition: ndis.h:586
VOID EXPORT NdisMSetAttributesEx(IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE MiniportAdapterContext, IN UINT CheckForHangTimeInSeconds OPTIONAL, IN ULONG AttributeFlags, IN NDIS_INTERFACE_TYPE AdapterType)
Definition: miniport.c:2968
@ AdapterType
Definition: cmtypes.h:991

◆ NdisMSetAttributesEx()

VOID EXPORT NdisMSetAttributesEx ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_HANDLE  MiniportAdapterContext,
IN UINT CheckForHangTimeInSeconds  OPTIONAL,
IN ULONG  AttributeFlags,
IN NDIS_INTERFACE_TYPE  AdapterType 
)

Definition at line 2968 of file miniport.c.

2984{
2986
2987 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
2988
2989 Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext;
2990 Adapter->NdisMiniportBlock.Flags = AttributeFlags;
2992 if (CheckForHangTimeInSeconds > 0)
2993 Adapter->NdisMiniportBlock.CheckForHangSeconds = CheckForHangTimeInSeconds;
2994 if (AttributeFlags & NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER)
2995 NDIS_DbgPrint(MIN_TRACE, ("Intermediate drivers not supported yet.\n"));
2996
2997 NDIS_DbgPrint(MID_TRACE, ("Miniport attribute flags: 0x%x\n", AttributeFlags));
2998
2999 if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.AdapterShutdownHandler)
3000 {
3001 NDIS_DbgPrint(MAX_TRACE, ("Miniport set AdapterShutdownHandler in MiniportCharacteristics\n"));
3004 Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.AdapterShutdownHandler);
3005 }
3006}
#define GET_LOGICAL_ADAPTER(Handle)
Definition: miniport.h:103
#define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER
Definition: ndis.h:587
VOID EXPORT NdisMRegisterAdapterShutdownHandler(IN NDIS_HANDLE MiniportHandle, IN PVOID ShutdownContext, IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler)
Definition: miniport.c:1694
NDIS_INTERFACE_TYPE AdapterType
Definition: ndis.h:2551

Referenced by DcInitialize(), MiniportInitialize(), NdisMSetAttributes(), and ParaNdis5_Initialize().

◆ NdisMSetInformationComplete()

VOID EXPORT NdisMSetInformationComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN NDIS_STATUS  Status 
)

Definition at line 1187 of file miniport.c.

◆ NdisMSleep()

VOID EXPORT NdisMSleep ( IN ULONG  MicrosecondsToSleep)

Definition at line 3013 of file miniport.c.

3022{
3023 KTIMER Timer;
3025
3026 PAGED_CODE();
3027
3028 DueTime.QuadPart = (-1) * 10 * MicrosecondsToSleep;
3029
3031 KeSetTimer(&Timer, DueTime, 0);
3033}
#define PAGED_CODE()
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:282
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190

Referenced by DcInitialize(), DcSoftReset(), DcStopReceivePath(), MediaSelectMiiPort(), NICSoftReset(), PhyInitRealtek8211c(), PhyReset(), PreventDPCServicing(), SidebandUnitAcquireSemaphore(), SRomAcquireListMutex(), vdev_sleep(), and VirtIONetRelease().

◆ NdisMSynchronizeWithInterrupt()

BOOLEAN EXPORT NdisMSynchronizeWithInterrupt ( IN PNDIS_MINIPORT_INTERRUPT  Interrupt,
IN PVOID  SynchronizeFunction,
IN PVOID  SynchronizeContext 
)

Definition at line 3040 of file miniport.c.

3044{
3045 return(KeSynchronizeExecution(Interrupt->InterruptObject,
3046 (PKSYNCHRONIZE_ROUTINE)SynchronizeFunction,
3048}
BOOLEAN NTAPI KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext OPTIONAL)
Definition: interrupt.c:237
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
Definition: wdfinterrupt.h:379
_In_ PKSYNCHRONIZE_ROUTINE _In_opt_ __drv_aliasesMem PVOID SynchronizeContext
Definition: kefuncs.h:525
KSYNCHRONIZE_ROUTINE * PKSYNCHRONIZE_ROUTINE
Definition: ketypes.h:943

Referenced by MiniportHalt(), MiniportMediaDetectionTimer(), MiniportSend(), NvNetStartAdapter(), and ParaNdis_SynchronizeWithInterrupt().

◆ NdisMTransferDataComplete()

VOID EXPORT NdisMTransferDataComplete ( IN NDIS_HANDLE  MiniportAdapterHandle,
IN PNDIS_PACKET  Packet,
IN NDIS_STATUS  Status,
IN UINT  BytesTransferred 
)

Definition at line 2928 of file miniport.c.

◆ NdisMWriteLogData()

NDIS_STATUS EXPORT NdisMWriteLogData ( IN NDIS_HANDLE  LogHandle,
IN PVOID  LogBuffer,
IN UINT  LogBufferSize 
)

Definition at line 3055 of file miniport.c.

3059{
3060 PUCHAR Buffer = LogBuffer;
3061 UINT i, j, idx;
3062
3064 for (i = 0; i < LogBufferSize; i += 16)
3065 {
3066 DbgPrint("%08x |", i);
3067 for (j = 0; j < 16; j++)
3068 {
3069 idx = i + j;
3070 if (idx < LogBufferSize)
3071 DbgPrint(" %02x", Buffer[idx]);
3072 else
3073 DbgPrint(" ");
3074 }
3075 DbgPrint(" | ");
3076 for (j = 0; j < 16; j++)
3077 {
3078 idx = i + j;
3079 if (idx == LogBufferSize)
3080 break;
3081 if (Buffer[idx] >= ' ') /* FIXME: not portable! replace by if (isprint(Buffer[idx])) ? */
3082 DbgPrint("%c", Buffer[idx]);
3083 else
3084 DbgPrint(".");
3085 }
3086 DbgPrint("\n");
3087 }
3088
3089 return NDIS_STATUS_FAILURE;
3090}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
unsigned int idx
Definition: utils.c:41
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 GLint GLint j
Definition: glfuncs.h:250
#define DbgPrint
Definition: hal.h:12
_In_ UINT LogBufferSize
Definition: ndis.h:5822

◆ NdisQueryAdapterInstanceName()

NDIS_STATUS EXPORT NdisQueryAdapterInstanceName ( OUT PNDIS_STRING  AdapterInstanceName,
IN NDIS_HANDLE  NdisBindingHandle 
)

Definition at line 3353 of file miniport.c.

3362{
3363 PADAPTER_BINDING AdapterBinding = NdisBindingHandle;
3364 PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter;
3365
3366 return NdisMQueryAdapterInstanceName(AdapterInstanceName,
3367 Adapter);
3368}
NDIS_STATUS EXPORT NdisMQueryAdapterInstanceName(OUT PNDIS_STRING AdapterInstanceName, IN NDIS_HANDLE MiniportAdapterHandle)
Definition: miniport.c:3123

◆ NdisRegisterAdapterShutdownHandler()

VOID EXPORT NdisRegisterAdapterShutdownHandler ( IN NDIS_HANDLE  NdisAdapterHandle,
IN PVOID  ShutdownContext,
IN ADAPTER_SHUTDOWN_HANDLER  ShutdownHandler 
)

Definition at line 3176 of file miniport.c.

3186{
3187 NdisMRegisterAdapterShutdownHandler(NdisAdapterHandle,
3188 ShutdownContext,
3190}

◆ NdisReturnPackets()

VOID EXPORT NdisReturnPackets ( IN PNDIS_PACKET PacketsToReturn,
IN UINT  NumberOfPackets 
)

Definition at line 258 of file miniport.c.

267{
268 UINT i;
269 PLOGICAL_ADAPTER Adapter;
271
272 NDIS_DbgPrint(MID_TRACE, ("Returning %d packets\n", NumberOfPackets));
273
274 for (i = 0; i < NumberOfPackets; i++)
275 {
276 PacketsToReturn[i]->WrapperReserved[0]--;
277 if (PacketsToReturn[i]->WrapperReserved[0] == 0)
278 {
279 Adapter = (PVOID)(ULONG_PTR)PacketsToReturn[i]->Reserved[1];
280
281 NDIS_DbgPrint(MAX_TRACE, ("Freeing packet %d (adapter = 0x%p)\n", i, Adapter));
282
284 Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ReturnPacketHandler(
286 PacketsToReturn[i]);
288 }
289 }
290}
void * PVOID
Definition: typedefs.h:50

Referenced by DeinitializePacket(), and FreeIPDR().

◆ NdisTerminateWrapper()

VOID EXPORT NdisTerminateWrapper ( IN NDIS_HANDLE  NdisWrapperHandle,
IN PVOID  SystemSpecific 
)

Definition at line 3097 of file miniport.c.

3106{
3107 PNDIS_M_DRIVER_BLOCK Miniport = GET_MINIPORT_DRIVER(NdisWrapperHandle);
3108
3109 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
3110
3111 ExFreePool(Miniport->RegistryPath->Buffer);
3112 ExFreePool(Miniport->RegistryPath);
3114 ExFreePool(Miniport);
3115}

Referenced by DriverEntry().

Variable Documentation

◆ AdapterListHead

LIST_ENTRY AdapterListHead

Definition at line 57 of file miniport.c.

Referenced by MiniLocateDevice(), and NdisIPnPStartDevice().

◆ AdapterListLock

KSPIN_LOCK AdapterListLock

◆ MediaArray

NDIS_MEDIUM MediaArray[MEDIA_ARRAY_SIZE]
static
Initial value:
=
{
}
@ NdisMedium802_5
Definition: ntddndis.h:192
@ NdisMediumArcnetRaw
Definition: ntddndis.h:197
@ NdisMediumMax
Definition: ntddndis.h:215
@ NdisMediumIrda
Definition: ntddndis.h:201
@ NdisMediumWan
Definition: ntddndis.h:194
@ NdisMediumCoWan
Definition: ntddndis.h:203
@ NdisMediumDix
Definition: ntddndis.h:196
@ NdisMediumFddi
Definition: ntddndis.h:193
@ NdisMediumArcnet878_2
Definition: ntddndis.h:198
@ NdisMedium1394
Definition: ntddndis.h:204
@ NdisMediumWirelessWan
Definition: ntddndis.h:200
@ NdisMediumLocalTalk
Definition: ntddndis.h:195
@ NdisMediumAtm
Definition: ntddndis.h:199
@ NdisMediumBpc
Definition: ntddndis.h:202

Definition at line 33 of file miniport.c.

Referenced by LANRegisterAdapter(), and NdisIPnPStartDevice().

◆ MiniportListHead

LIST_ENTRY MiniportListHead

Definition at line 53 of file miniport.c.

Referenced by DriverEntry(), and NdisInitializeWrapper().

◆ MiniportListLock

KSPIN_LOCK MiniportListLock

Definition at line 54 of file miniport.c.

Referenced by DriverEntry(), NdisInitializeWrapper(), and NdisTerminateWrapper().