diff --git a/drivers/network/ndis/ndis/buffer.c b/drivers/network/ndis/ndis/buffer.c index 53b4088c19a..3da11508290 100644 --- a/drivers/network/ndis/ndis/buffer.c +++ b/drivers/network/ndis/ndis/buffer.c @@ -694,7 +694,7 @@ NdisCopyFromPacketToPacket( /* - * @unimplemented + * @implemented */ VOID EXPORT @@ -710,7 +710,37 @@ NdisDprAllocatePacket( * PoolHandle = Handle returned by NdisAllocatePacketPool */ { - *Status = NDIS_STATUS_FAILURE; + PNDIS_PACKET Temp; + PNDISI_PACKET_POOL Pool = (PNDISI_PACKET_POOL)PoolHandle; + + NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Packet (0x%X) PoolHandle (0x%X).\n", + Status, Packet, PoolHandle)); + + *Packet = NULL; + + if (Pool == NULL) + { + *Status = NDIS_STATUS_FAILURE; + return; + } + + KeAcquireSpinLockAtDpcLevel(&Pool->SpinLock.SpinLock); + + if (Pool->FreeList) { + Temp = Pool->FreeList; + Pool->FreeList = (PNDIS_PACKET)Temp->Private.Head; + + KeReleaseSpinLockFromDpcLevel(&Pool->SpinLock.SpinLock); + + RtlZeroMemory(&Temp->Private, sizeof(NDIS_PACKET_PRIVATE)); + Temp->Private.Pool = Pool; + + *Packet = Temp; + *Status = NDIS_STATUS_SUCCESS; + } else { + *Status = NDIS_STATUS_RESOURCES; + KeReleaseSpinLockFromDpcLevel(&Pool->SpinLock.SpinLock); + } }