* CSH 01/08-2000 Created
*/
-#include <buffer.h>
+#include <ndissys.h>
__inline ULONG SkipToOffset(
- PNDIS_BUFFER Buffer,
- UINT Offset,
- PUCHAR *Data,
- PUINT Size)
+ IN PNDIS_BUFFER Buffer,
+ IN UINT Offset,
+ IN OUT PUCHAR *Data,
+ IN OUT PUINT Size)
/*
* FUNCTION: Skips Offset bytes into a buffer chain
* ARGUMENTS:
if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == 0xFFFFFFFF)
return 0;
/* Skip SrcOffset bytes in the source packet */
- NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
+ NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID*)&SrcData, &SrcSize, &Total);
if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
return 0;
/* Copy the data */
/*
* @implemented
*/
+#undef NdisAdjustBufferLength
VOID
EXPORT
NdisAdjustBufferLength(
/*
* @implemented
*/
+#undef NDIS_BUFFER_TO_SPAN_PAGES
ULONG
EXPORT
NDIS_BUFFER_TO_SPAN_PAGES(
* Length = Number of bytes in data buffer
*/
{
- KIRQL OldIrql;
- PNETWORK_HEADER Temp;
- PNDIS_BUFFER_POOL Pool = (PNDIS_BUFFER_POOL)PoolHandle;
-
- NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Buffer (0x%X) PoolHandle (0x%X) "
- "VirtualAddress (0x%X) Length (%d)\n",
- Status, Buffer, PoolHandle, VirtualAddress, Length));
-
-#if 0
- Temp = Pool->FreeList;
- while( Temp ) {
- NDIS_DbgPrint(MID_TRACE,("Free buffer -> %x\n", Temp));
- Temp = Temp->Next;
- }
-
- NDIS_DbgPrint(MID_TRACE,("|:. <- End free buffers"));
-#endif
-
- if(!VirtualAddress && !Length) return;
-
- KeAcquireSpinLock(&Pool->SpinLock, &OldIrql);
-
- if (Pool->FreeList) {
- Temp = Pool->FreeList;
- Pool->FreeList = Temp->Next;
-
- KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
-
- Temp->Next = NULL;
-
- MmInitializeMdl(&Temp->Mdl, VirtualAddress, Length);
- Temp->Mdl.MdlFlags |= (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE);
- Temp->Mdl.MappedSystemVa = VirtualAddress;
-
- Temp->BufferPool = Pool;
-
- *Buffer = (PNDIS_BUFFER)Temp;
+ ASSERT(VirtualAddress != NULL);
+ ASSERT(Length > 0);
+
+ *Buffer = IoAllocateMdl(VirtualAddress, Length, FALSE, FALSE, NULL);
+ if (*Buffer != NULL) {
+ MmBuildMdlForNonPagedPool(*Buffer);
+ (*Buffer)->Next = NULL;
*Status = NDIS_STATUS_SUCCESS;
} else {
- KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
*Status = NDIS_STATUS_FAILURE;
- NDIS_DbgPrint(MID_TRACE, ("Can't get another packet.\n"));
- KeBugCheck(0);
}
}
* NumberOfDescriptors = Size of buffer pool in number of descriptors
*/
{
- UINT i;
- PNDIS_BUFFER_POOL Pool;
- PNETWORK_HEADER Buffer;
-
- NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) PoolHandle (0x%X) NumberOfDescriptors (%d).\n",
- Status, PoolHandle, NumberOfDescriptors));
-
- Pool = ExAllocatePool(NonPagedPool,
- sizeof(NDIS_BUFFER_POOL) +
- sizeof(NETWORK_HEADER) *
- NumberOfDescriptors);
- if (Pool) {
- KeInitializeSpinLock(&Pool->SpinLock);
-
- if (NumberOfDescriptors > 0) {
- Buffer = &Pool->Buffers[0];
- NDIS_DbgPrint(MAX_TRACE, ("NDIS BUFFER ADDRESS << %x >>\n", Buffer));
- Pool->FreeList = Buffer;
- for (i = 1; i < NumberOfDescriptors; i++) {
- Buffer->Next = &Pool->Buffers[i];
- Buffer = Buffer->Next;
- NDIS_DbgPrint(MAX_TRACE, ("NDIS BUFFER ADDRESS << %x >>\n",
- Buffer));
- }
- Buffer->Next = NULL;
- } else
- Pool->FreeList = NULL;
-
- *Status = NDIS_STATUS_SUCCESS;
- *PoolHandle = (PNDIS_HANDLE)Pool;
- } else
- *Status = NDIS_STATUS_RESOURCES;
+ *Status = NDIS_STATUS_SUCCESS;
+ *PoolHandle = 0;
}
{
KIRQL OldIrql;
PNDIS_PACKET Temp;
- PNDIS_PACKET_POOL Pool = (PNDIS_PACKET_POOL)PoolHandle;
+ 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));
+ if (Pool == NULL)
+ {
+ *Status = NDIS_STATUS_FAILURE;
+ return;
+ }
+
KeAcquireSpinLock(&Pool->SpinLock.SpinLock, &OldIrql);
if (Pool->FreeList) {
* ProtocolReservedLength = Size of protocol reserved area in bytes
*/
{
- PNDIS_PACKET_POOL Pool;
- UINT Size, Length, i;
- PNDIS_PACKET Packet, NextPacket;
-
- NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) PoolHandle (0x%X) "
- "NumberOfDescriptors (%d) ProtocolReservedLength (%d).\n",
- Status, PoolHandle, NumberOfDescriptors, ProtocolReservedLength));
-
- Length = sizeof(NDIS_PACKET) + ProtocolReservedLength;
- Size = sizeof(NDIS_PACKET_POOL) + Length * NumberOfDescriptors;
-
- Pool = ExAllocatePool(NonPagedPool, Size);
- if (Pool) {
- KeInitializeSpinLock(&Pool->SpinLock.SpinLock);
- Pool->PacketLength = Length;
-
- if (NumberOfDescriptors > 0) {
- Packet = (PNDIS_PACKET)&Pool->Buffer;
- Pool->FreeList = Packet;
-
- NextPacket = (PNDIS_PACKET)((ULONG_PTR)Packet + Length);
- for (i = 1; i < NumberOfDescriptors; i++) {
- Packet->Private.Head = (PNDIS_BUFFER)NextPacket;
- Packet = NextPacket;
- NextPacket = (PNDIS_PACKET)((ULONG_PTR)Packet + Length);
- }
- Packet->Private.Head = NULL;
- } else
- Pool->FreeList = NULL;
-
- *Status = NDIS_STATUS_SUCCESS;
- *PoolHandle = (PNDIS_HANDLE)Pool;
- } else
- *Status = NDIS_STATUS_RESOURCES;
+ NdisAllocatePacketPoolEx(
+ Status,
+ PoolHandle,
+ NumberOfDescriptors,
+ 0,
+ ProtocolReservedLength);
}
* NDIS 5.0
*/
{
- UNIMPLEMENTED
+ PNDISI_PACKET_POOL Pool;
+ UINT Size, Length, i;
+ PNDIS_PACKET Packet, NextPacket;
+
+ NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) PoolHandle (0x%X) "
+ "NumberOfDescriptors (%d) ProtocolReservedLength (%d).\n",
+ Status, PoolHandle, NumberOfDescriptors, ProtocolReservedLength));
+
+ if (NumberOfDescriptors > 0xffff)
+ {
+ *Status = NDIS_STATUS_RESOURCES;
+ }
+ else
+ {
+ NumberOfDescriptors += NumberOfOverflowDescriptors;
+ if (NumberOfDescriptors > 0xffff)
+ {
+ NumberOfDescriptors = 0xffff;
+ }
+
+ Length = sizeof(NDIS_PACKET) + ProtocolReservedLength;
+ Size = sizeof(NDISI_PACKET_POOL) + Length * NumberOfDescriptors;
+
+ Pool = ExAllocatePool(NonPagedPool, Size);
+ if (Pool)
+ {
+ KeInitializeSpinLock(&Pool->SpinLock.SpinLock);
+ Pool->PacketLength = Length;
+
+ if (NumberOfDescriptors > 0)
+ {
+ Packet = (PNDIS_PACKET)&Pool->Buffer;
+ Pool->FreeList = Packet;
+
+ NextPacket = (PNDIS_PACKET)((ULONG_PTR)Packet + Length);
+ for (i = 1; i < NumberOfDescriptors; i++)
+ {
+ Packet->Private.Head = (PNDIS_BUFFER)NextPacket;
+ Packet = NextPacket;
+ NextPacket = (PNDIS_PACKET)((ULONG_PTR)Packet + Length);
+ }
+ Packet->Private.Head = NULL;
+ }
+ else
+ Pool->FreeList = NULL;
+
+ *Status = NDIS_STATUS_SUCCESS;
+ *PoolHandle = (PNDIS_HANDLE)Pool;
+ } else
+ *Status = NDIS_STATUS_RESOURCES;
+ }
}
/*
* @implemented
*/
+#undef NdisBufferLength
ULONG
EXPORT
NdisBufferLength(
* Length of NDIS buffer
*/
{
- return Buffer->ByteCount;
+ return MmGetMdlByteCount(Buffer);
}
/*
- * @unimplemented
+ * @implemented
*/
+#undef NdisBufferVirtualAddress
PVOID
EXPORT
NdisBufferVirtualAddress(
* NDIS 5.0
*/
{
- UNIMPLEMENTED
-
- return NULL;
+ return MmGetSystemAddressForMdl(Buffer);
}
*BytesCopied = 0;
/* Skip DestinationOffset bytes in the destination packet */
- NdisGetFirstBufferFromPacket(Destination, &DstBuffer, (PVOID)&DstData, &DstSize, &Total);
+ NdisGetFirstBufferFromPacket(Destination, &DstBuffer, (PVOID*)&DstData, &DstSize, &Total);
if (SkipToOffset(DstBuffer, DestinationOffset, &DstData, &DstSize) == 0xFFFFFFFF)
return;
/* Skip SourceOffset bytes in the source packet */
- NdisGetFirstBufferFromPacket(Source, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
+ NdisGetFirstBufferFromPacket(Source, &SrcBuffer, (PVOID*)&SrcData, &SrcSize, &Total);
if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
return;
* PoolHandle = Handle returned by NdisAllocateBufferPool
*/
{
- ExFreePool((PVOID)PoolHandle);
}
/*
* @implemented
*/
+#undef NdisFreeBuffer
VOID
EXPORT
NdisFreeBuffer(
* Buffer = Pointer to buffer descriptor
*/
{
- KIRQL OldIrql;
- PNDIS_BUFFER_POOL Pool;
- PNETWORK_HEADER Temp = (PNETWORK_HEADER)Buffer;
-
- NDIS_DbgPrint(MAX_TRACE, ("Buffer (0x%X).\n", Buffer));
-
- Pool = Temp->BufferPool;
-
- KeAcquireSpinLock(&Pool->SpinLock, &OldIrql);
- Temp->Next = (PNETWORK_HEADER)Pool->FreeList;
- Pool->FreeList = (PNETWORK_HEADER)Temp;
- KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
+ IoFreeMdl(Buffer);
}
NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet));
- KeAcquireSpinLock(&Packet->Private.Pool->SpinLock.SpinLock, &OldIrql);
- Packet->Private.Head = (PNDIS_BUFFER)Packet->Private.Pool->FreeList;
- Packet->Private.Pool->FreeList = Packet;
- KeReleaseSpinLock(&Packet->Private.Pool->SpinLock.SpinLock, OldIrql);
+ KeAcquireSpinLock(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock, &OldIrql);
+ Packet->Private.Head = (PNDIS_BUFFER)((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList;
+ ((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList = Packet;
+ KeReleaseSpinLock(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock, OldIrql);
}
/*
* @implemented
*/
+#undef NdisGetBufferPhysicalArraySize
VOID
EXPORT
NdisGetBufferPhysicalArraySize(
/*
* @implemented
*/
+#undef NdisGetFirstBufferFromPacket
VOID
EXPORT
NdisGetFirstBufferFromPacket(
/*
* @implemented
*/
+#undef NdisQueryBuffer
VOID
EXPORT
NdisQueryBuffer(
/*
* @implemented
*/
+#undef NdisQueryBufferSafe
VOID
EXPORT
NdisQueryBufferSafe(
/*
* @implemented
*/
+#undef NdisQueryBufferOffset
VOID
EXPORT
NdisQueryBufferOffset(