1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS NDIS library
4  * FILE:        ndis/miniport.h
5  * PURPOSE:     Definitions for routines used by NDIS miniport drivers
6  */
7 
8 #pragma once
9 
10 #include <ndis.h>
11 #include <ndissys.h>
12 
13 struct _ADAPTER_BINDING;
14 
15 typedef struct _HARDWARE_ADDRESS {
16     union {
17         UCHAR Medium802_3[ETH_LENGTH_OF_ADDRESS];
18     } Type;
19 } HARDWARE_ADDRESS, *PHARDWARE_ADDRESS;
20 
21 /* Information about a miniport */
22 typedef struct _NDIS_M_DRIVER_BLOCK {
23     LIST_ENTRY                      ListEntry;                /* Entry on global list */
24     KSPIN_LOCK                      Lock;                     /* Protecting spin lock */
25     NDIS_MINIPORT_CHARACTERISTICS   MiniportCharacteristics;  /* Miniport characteristics */
26     WORK_QUEUE_ITEM                 WorkItem;                 /* Work item */
27     PDRIVER_OBJECT                  DriverObject;             /* Driver object of miniport */
28     LIST_ENTRY                      DeviceList;               /* Adapters created by miniport */
29     PUNICODE_STRING                 RegistryPath;             /* SCM Registry key */
30 #if !defined(_MSC_VER) && defined(_NDIS_)
31 } NDIS_M_DRIVER_BLOCK_COMPATIBILITY_HACK_DONT_USE;
32 #else
33 } NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
34 #endif
35 
36 /* There must be some defined struct to do this... */
37 typedef struct _NDIS_M_DEVICE_BLOCK {
38     PDEVICE_OBJECT DeviceObject;
39     PNDIS_STRING   SymbolicName;
40     PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1];
41 } NDIS_M_DEVICE_BLOCK, *PNDIS_M_DEVICE_BLOCK;
42 
43 /* resources allocated on behalf on the miniport */
44 #define MINIPORT_RESOURCE_TYPE_REGISTRY_DATA 0
45 #define MINIPORT_RESOURCE_TYPE_MEMORY        1
46 typedef struct _MINIPORT_RESOURCE {
47     LIST_ENTRY     ListEntry;
48     ULONG          ResourceType;
49     PVOID          Resource;
50 } MINIPORT_RESOURCE, *PMINIPORT_RESOURCE;
51 
52 /* Configuration context */
53 typedef struct _MINIPORT_CONFIGURATION_CONTEXT {
54     NDIS_HANDLE    Handle;
55     LIST_ENTRY     ResourceListHead;
56     KSPIN_LOCK     ResourceLock;
57 } MINIPORT_CONFIGURATION_CONTEXT, *PMINIPORT_CONFIGURATION_CONTEXT;
58 
59 /* Bugcheck callback context */
60 typedef struct _MINIPORT_BUGCHECK_CONTEXT {
61     PVOID                       DriverContext;
62     ADAPTER_SHUTDOWN_HANDLER    ShutdownHandler;
63     PKBUGCHECK_CALLBACK_RECORD  CallbackRecord;
64 } MINIPORT_BUGCHECK_CONTEXT, *PMINIPORT_BUGCHECK_CONTEXT;
65 
66 /* a miniport's shared memory */
67 typedef struct _MINIPORT_SHARED_MEMORY {
68     PDMA_ADAPTER          AdapterObject;
69     ULONG                 Length;
70     PHYSICAL_ADDRESS      PhysicalAddress;
71     PVOID                 VirtualAddress;
72     BOOLEAN               Cached;
73     PNDIS_MINIPORT_BLOCK  Adapter;
74     PVOID                 Context;
75     PIO_WORKITEM          WorkItem;
76 } MINIPORT_SHARED_MEMORY, *PMINIPORT_SHARED_MEMORY;
77 
78 /* A structure of WrapperConfigurationContext (not compatible with the
79    Windows one). */
80 typedef struct _NDIS_WRAPPER_CONTEXT {
81     HANDLE            RegistryHandle;
82     PDEVICE_OBJECT    DeviceObject;
83     ULONG             BusNumber;
84     ULONG             SlotNumber;
85 } NDIS_WRAPPER_CONTEXT, *PNDIS_WRAPPER_CONTEXT;
86 
87 #define GET_MINIPORT_DRIVER(Handle)((PNDIS_M_DRIVER_BLOCK)Handle)
88 
89 /* Information about a logical adapter */
90 typedef struct _LOGICAL_ADAPTER
91 {
92     NDIS_MINIPORT_BLOCK         NdisMiniportBlock;      /* NDIS defined fields */
93     PNDIS_MINIPORT_WORK_ITEM    WorkQueueHead;          /* Head of work queue */
94     PNDIS_MINIPORT_WORK_ITEM    WorkQueueTail;          /* Tail of work queue */
95     LIST_ENTRY                  ListEntry;              /* Entry on global list */
96     LIST_ENTRY                  MiniportListEntry;      /* Entry on miniport driver list */
97     LIST_ENTRY                  ProtocolListHead;       /* List of bound protocols */
98     ULONG                       MediumHeaderSize;       /* Size of medium header */
99     HARDWARE_ADDRESS            Address;                /* Hardware address of adapter */
100     ULONG                       AddressLength;          /* Length of hardware address */
101     PMINIPORT_BUGCHECK_CONTEXT  BugcheckContext;        /* Adapter's shutdown handler */
102 } LOGICAL_ADAPTER, *PLOGICAL_ADAPTER;
103 
104 #define GET_LOGICAL_ADAPTER(Handle)((PLOGICAL_ADAPTER)Handle)
105 
106 extern LIST_ENTRY MiniportListHead;
107 extern KSPIN_LOCK MiniportListLock;
108 extern LIST_ENTRY AdapterListHead;
109 extern KSPIN_LOCK AdapterListLock;
110 
111 
112 #if DBG
113 VOID
114 MiniDisplayPacket(
115     PNDIS_PACKET Packet);
116 #endif /* DBG */
117 
118 VOID
119 MiniIndicateData(
120     PLOGICAL_ADAPTER    Adapter,
121     NDIS_HANDLE         MacReceiveContext,
122     PVOID               HeaderBuffer,
123     UINT                HeaderBufferSize,
124     PVOID               LookaheadBuffer,
125     UINT                LookaheadBufferSize,
126     UINT                PacketSize);
127 
128 BOOLEAN
129 MiniAdapterHasAddress(
130     PLOGICAL_ADAPTER Adapter,
131     PNDIS_PACKET Packet);
132 
133 PLOGICAL_ADAPTER
134 MiniLocateDevice(
135     PNDIS_STRING AdapterName);
136 
137 NDIS_STATUS
138 MiniQueryInformation(
139     PLOGICAL_ADAPTER    Adapter,
140     NDIS_OID            Oid,
141     ULONG               Size,
142     PVOID               Buffer,
143     PULONG              BytesWritten);
144 
145 VOID
146 FASTCALL
147 MiniQueueWorkItem(
148     PLOGICAL_ADAPTER    Adapter,
149     NDIS_WORK_ITEM_TYPE WorkItemType,
150     PVOID               WorkItemContext,
151     BOOLEAN             Top);
152 
153 NDIS_STATUS
154 FASTCALL
155 MiniDequeueWorkItem(
156     PLOGICAL_ADAPTER    Adapter,
157     NDIS_WORK_ITEM_TYPE *WorkItemType,
158     PVOID               *WorkItemContext);
159 
160 NDIS_STATUS
161 MiniDoRequest(
162     PLOGICAL_ADAPTER Adapter,
163     PNDIS_REQUEST NdisRequest);
164 
165 BOOLEAN
166 NdisFindDevice(
167     UINT   VendorID,
168     UINT   DeviceID,
169     PUINT  BusNumber,
170     PUINT  SlotNumber);
171 
172 VOID
173 NdisStartDevices(VOID);
174 
175 VOID
176 NTAPI
177 MiniportWorker(
178     IN PDEVICE_OBJECT DeviceObject,
179     IN PVOID WorkItem);
180 
181 VOID NTAPI
182 MiniSendComplete(
183     IN  NDIS_HANDLE     MiniportAdapterHandle,
184     IN  PNDIS_PACKET    Packet,
185     IN  NDIS_STATUS     Status);
186 
187 BOOLEAN
188 MiniIsBusy(
189     PLOGICAL_ADAPTER Adapter,
190     NDIS_WORK_ITEM_TYPE Type);
191 
192 NDIS_STATUS
193 MiniReset(
194     PLOGICAL_ADAPTER Adapter);
195 
196 VOID
197 MiniDoAddressingReset(
198     PLOGICAL_ADAPTER Adapter);
199 
200 VOID
201 MiniWorkItemComplete(
202     PLOGICAL_ADAPTER     Adapter,
203     NDIS_WORK_ITEM_TYPE  WorkItemType);
204 
205 /* EOF */
206