2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS User I/O driver
5 * PURPOSE: Helper functions
6 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
15 AllocateAndChainBuffer(PNDISUIO_ADAPTER_CONTEXT AdapterContext
,
22 PNDIS_BUFFER NdisBuffer
;
24 /* Allocate the NDIS buffer mapping the pool */
25 NdisAllocateBuffer(&Status
,
27 AdapterContext
->BufferPoolHandle
,
30 if (Status
!= NDIS_STATUS_SUCCESS
)
32 DPRINT1("No free buffer descriptors\n");
38 /* Chain the buffer to front */
39 NdisChainBufferAtFront(Packet
, NdisBuffer
);
43 /* Chain the buffer to back */
44 NdisChainBufferAtBack(Packet
, NdisBuffer
);
48 return NDIS_STATUS_SUCCESS
;
52 CreatePacketFromPoolBuffer(PNDISUIO_ADAPTER_CONTEXT AdapterContext
,
59 /* Allocate a packet descriptor */
60 NdisAllocatePacket(&Status
,
62 AdapterContext
->PacketPoolHandle
);
63 if (Status
!= NDIS_STATUS_SUCCESS
)
65 DPRINT1("No free packet descriptors\n");
69 /* Use the helper to chain the buffer */
70 Status
= AllocateAndChainBuffer(AdapterContext
, Packet
,
71 Buffer
, BufferSize
, TRUE
);
72 if (Status
!= NDIS_STATUS_SUCCESS
)
74 NdisFreePacket(Packet
);
78 /* Return the packet */
83 CleanupAndFreePacket(PNDIS_PACKET Packet
, BOOLEAN FreePool
)
89 /* Free each buffer and its backing pool memory */
92 /* Unchain each buffer */
93 NdisUnchainBufferAtFront(Packet
, &Buffer
);
97 /* Get the backing memory */
98 NdisQueryBuffer(Buffer
, &Data
, &Length
);
100 /* Free the buffer */
101 NdisFreeBuffer(Buffer
);
105 /* Free the backing memory */
110 /* Free the packet descriptor */
111 NdisFreePacket(Packet
);
114 PNDISUIO_ADAPTER_CONTEXT
115 FindAdapterContextByName(PNDIS_STRING DeviceName
)
118 PLIST_ENTRY CurrentEntry
;
119 PNDISUIO_ADAPTER_CONTEXT AdapterContext
;
121 KeAcquireSpinLock(&GlobalAdapterListLock
, &OldIrql
);
122 CurrentEntry
= GlobalAdapterList
.Flink
;
123 while (CurrentEntry
!= &GlobalAdapterList
)
125 AdapterContext
= CONTAINING_RECORD(CurrentEntry
, NDISUIO_ADAPTER_CONTEXT
, ListEntry
);
127 /* Check if the device name matches */
128 if (RtlEqualUnicodeString(&AdapterContext
->DeviceName
, DeviceName
, TRUE
))
130 KeReleaseSpinLock(&GlobalAdapterListLock
, OldIrql
);
131 return AdapterContext
;
134 CurrentEntry
= CurrentEntry
->Flink
;
136 KeReleaseSpinLock(&GlobalAdapterListLock
, OldIrql
);
142 ReferenceAdapterContext(PNDISUIO_ADAPTER_CONTEXT AdapterContext
)
144 /* Increment the open count */
145 AdapterContext
->OpenCount
++;
149 DereferenceAdapterContextWithOpenEntry(PNDISUIO_ADAPTER_CONTEXT AdapterContext
,
150 PNDISUIO_OPEN_ENTRY OpenEntry
)
154 /* Lock the adapter context */
155 KeAcquireSpinLock(&AdapterContext
->Spinlock
, &OldIrql
);
157 /* Decrement the open count */
158 AdapterContext
->OpenCount
--;
160 /* Cleanup the open entry if we were given one */
161 if (OpenEntry
!= NULL
)
163 /* Remove the open entry */
164 RemoveEntryList(&OpenEntry
->ListEntry
);
166 /* Invalidate the FO */
167 OpenEntry
->FileObject
->FsContext
= NULL
;
168 OpenEntry
->FileObject
->FsContext2
= NULL
;
170 /* Free the open entry */
171 ExFreePool(OpenEntry
);
174 /* Release the adapter context lock */
175 KeReleaseSpinLock(&AdapterContext
->Spinlock
, OldIrql
);