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(PNDIS_PACKET Packet
, PVOID Buffer
, ULONG BufferSize
, BOOLEAN Front
)
18 PNDIS_BUFFER NdisBuffer
;
20 /* Allocate the NDIS buffer mapping the pool */
21 NdisAllocateBuffer(&Status
,
23 GlobalBufferPoolHandle
,
26 if (Status
!= NDIS_STATUS_SUCCESS
)
28 DPRINT1("No free buffer descriptors\n");
34 /* Chain the buffer to front */
35 NdisChainBufferAtFront(Packet
, NdisBuffer
);
39 /* Chain the buffer to back */
40 NdisChainBufferAtBack(Packet
, NdisBuffer
);
44 return NDIS_STATUS_SUCCESS
;
48 CreatePacketFromPoolBuffer(PVOID Buffer
, ULONG BufferSize
)
53 /* Allocate a packet descriptor */
54 NdisAllocatePacket(&Status
,
56 GlobalPacketPoolHandle
);
57 if (Status
!= NDIS_STATUS_SUCCESS
)
59 DPRINT1("No free packet descriptors\n");
63 /* Use the helper to chain the buffer */
64 Status
= AllocateAndChainBuffer(Packet
, Buffer
, BufferSize
, TRUE
);
65 if (Status
!= NDIS_STATUS_SUCCESS
)
67 NdisFreePacket(Packet
);
71 /* Return the packet */
76 CleanupAndFreePacket(PNDIS_PACKET Packet
, BOOLEAN FreePool
)
82 /* Free each buffer and its backing pool memory */
85 /* Unchain each buffer */
86 NdisUnchainBufferAtFront(Packet
, &Buffer
);
90 /* Get the backing memory */
91 NdisQueryBuffer(Buffer
, &Data
, &Length
);
94 NdisFreeBuffer(Buffer
);
98 /* Free the backing memory */
103 /* Free the packet descriptor */
104 NdisFreePacket(Packet
);
107 PNDISUIO_ADAPTER_CONTEXT
108 FindAdapterContextByName(PNDIS_STRING DeviceName
)
111 PLIST_ENTRY CurrentEntry
;
112 PNDISUIO_ADAPTER_CONTEXT AdapterContext
;
114 KeAcquireSpinLock(&GlobalAdapterListLock
, &OldIrql
);
115 CurrentEntry
= GlobalAdapterList
.Flink
;
116 while (CurrentEntry
!= &GlobalAdapterList
)
118 AdapterContext
= CONTAINING_RECORD(CurrentEntry
, NDISUIO_ADAPTER_CONTEXT
, ListEntry
);
120 /* Check if the device name matches */
121 if (RtlEqualUnicodeString(&AdapterContext
->DeviceName
, DeviceName
, TRUE
))
123 KeReleaseSpinLock(&GlobalAdapterListLock
, OldIrql
);
124 return AdapterContext
;
127 CurrentEntry
= CurrentEntry
->Flink
;
129 KeReleaseSpinLock(&GlobalAdapterListLock
, OldIrql
);
135 ReferenceAdapterContext(PNDISUIO_ADAPTER_CONTEXT AdapterContext
)
137 /* Increment the open count */
138 AdapterContext
->OpenCount
++;
142 DereferenceAdapterContextWithOpenEntry(PNDISUIO_ADAPTER_CONTEXT AdapterContext
,
143 PNDISUIO_OPEN_ENTRY OpenEntry
)
147 /* Lock the adapter context */
148 KeAcquireSpinLock(&AdapterContext
->Spinlock
, &OldIrql
);
150 /* Decrement the open count */
151 AdapterContext
->OpenCount
--;
153 /* Cleanup the open entry if we were given one */
154 if (OpenEntry
!= NULL
)
156 /* Remove the open entry */
157 RemoveEntryList(&OpenEntry
->ListEntry
);
159 /* Invalidate the FO */
160 OpenEntry
->FileObject
->FsContext
= NULL
;
161 OpenEntry
->FileObject
->FsContext2
= NULL
;
163 /* Free the open entry */
164 ExFreePool(OpenEntry
);
167 /* Release the adapter context lock */
168 KeReleaseSpinLock(&AdapterContext
->Spinlock
, OldIrql
);