Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS NDIS User I/O driver * FILE: misc.c * PURPOSE: Helper functions * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) */
#include "ndisuio.h"
#define NDEBUG#include <debug.h>
NDIS_STATUSAllocateAndChainBuffer(PNDISUIO_ADAPTER_CONTEXT AdapterContext, PNDIS_PACKET Packet, PVOID Buffer, ULONG BufferSize, BOOLEAN Front){ NDIS_STATUS Status; PNDIS_BUFFER NdisBuffer;
/* Allocate the NDIS buffer mapping the pool */ NdisAllocateBuffer(&Status, &NdisBuffer, AdapterContext->BufferPoolHandle, Buffer, BufferSize); if (Status != NDIS_STATUS_SUCCESS) { DPRINT1("No free buffer descriptors\n"); return Status; }
if (Front) { /* Chain the buffer to front */ NdisChainBufferAtFront(Packet, NdisBuffer); } else { /* Chain the buffer to back */ NdisChainBufferAtBack(Packet, NdisBuffer); }
/* Return success */ return NDIS_STATUS_SUCCESS;}
PNDIS_PACKETCreatePacketFromPoolBuffer(PNDISUIO_ADAPTER_CONTEXT AdapterContext, PVOID Buffer, ULONG BufferSize){ PNDIS_PACKET Packet; NDIS_STATUS Status;
/* Allocate a packet descriptor */ NdisAllocatePacket(&Status, &Packet, AdapterContext->PacketPoolHandle); if (Status != NDIS_STATUS_SUCCESS) { DPRINT1("No free packet descriptors\n"); return NULL; }
/* Use the helper to chain the buffer */ Status = AllocateAndChainBuffer(AdapterContext, Packet, Buffer, BufferSize, TRUE); if (Status != NDIS_STATUS_SUCCESS) { NdisFreePacket(Packet); return NULL; }
/* Return the packet */ return Packet;}
VOIDCleanupAndFreePacket(PNDIS_PACKET Packet, BOOLEAN FreePool){ PNDIS_BUFFER Buffer; PVOID Data; ULONG Length;
/* Free each buffer and its backing pool memory */ while (TRUE) { /* Unchain each buffer */ NdisUnchainBufferAtFront(Packet, &Buffer); if (!Buffer) break;
/* Get the backing memory */ NdisQueryBuffer(Buffer, &Data, &Length);
/* Free the buffer */ NdisFreeBuffer(Buffer);
if (FreePool) { /* Free the backing memory */ ExFreePool(Data); } }
/* Free the packet descriptor */ NdisFreePacket(Packet);}
PNDISUIO_ADAPTER_CONTEXTFindAdapterContextByName(PNDIS_STRING DeviceName){ KIRQL OldIrql; PLIST_ENTRY CurrentEntry; PNDISUIO_ADAPTER_CONTEXT AdapterContext;
KeAcquireSpinLock(&GlobalAdapterListLock, &OldIrql); CurrentEntry = GlobalAdapterList.Flink; while (CurrentEntry != &GlobalAdapterList) { AdapterContext = CONTAINING_RECORD(CurrentEntry, NDISUIO_ADAPTER_CONTEXT, ListEntry);
/* Check if the device name matches */ if (RtlEqualUnicodeString(&AdapterContext->DeviceName, DeviceName, TRUE)) { KeReleaseSpinLock(&GlobalAdapterListLock, OldIrql); return AdapterContext; }
CurrentEntry = CurrentEntry->Flink; } KeReleaseSpinLock(&GlobalAdapterListLock, OldIrql);
return NULL;}
VOIDReferenceAdapterContext(PNDISUIO_ADAPTER_CONTEXT AdapterContext){ /* Increment the open count */ AdapterContext->OpenCount++;}
VOIDDereferenceAdapterContextWithOpenEntry(PNDISUIO_ADAPTER_CONTEXT AdapterContext, PNDISUIO_OPEN_ENTRY OpenEntry){ KIRQL OldIrql;
/* Lock the adapter context */ KeAcquireSpinLock(&AdapterContext->Spinlock, &OldIrql);
/* Decrement the open count */ AdapterContext->OpenCount--;
/* Cleanup the open entry if we were given one */ if (OpenEntry != NULL) { /* Remove the open entry */ RemoveEntryList(&OpenEntry->ListEntry);
/* Invalidate the FO */ OpenEntry->FileObject->FsContext = NULL; OpenEntry->FileObject->FsContext2 = NULL;
/* Free the open entry */ ExFreePool(OpenEntry); }
/* Release the adapter context lock */ KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql);}