* REVISIONS:
* CSH 01/08-2000 Created
*/
-#include <buffer.h>
+#include <buffer.h>
__inline ULONG SkipToOffset(
for (;;) {
if (!Buffer)
- return -1;
+ return 0xFFFFFFFF;
NdisQueryBuffer(Buffer, (PVOID)Data, Size);
if (Offset < *Size) {
- ((ULONG_PTR)*Data) += Offset;
- *Size -= Offset;
+ *Data = (PUCHAR) ((ULONG_PTR) *Data + Offset);
+ *Size -= Offset;
break;
}
return Offset;
}
-
UINT CopyBufferToBufferChain(
PNDIS_BUFFER DstBuffer,
UINT DstOffset,
/*
* FUNCTION: Copies data from a buffer to an NDIS buffer chain
* ARGUMENTS:
- * DstBuffer = Pointer to destination NDIS buffer
+ * DstBuffer = Pointer to destination NDIS buffer
* DstOffset = Destination start offset
* SrcData = Pointer to source buffer
* Length = Number of bytes to copy
NDIS_DbgPrint(MAX_TRACE, ("DstBuffer (0x%X) DstOffset (0x%X) SrcData (0x%X) Length (%d)\n", DstBuffer, DstOffset, SrcData, Length));
/* Skip DstOffset bytes in the destination buffer chain */
- if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == -1)
+ if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == 0xFFFFFFFF)
return 0;
/* Start copying the data */
BytesToCopy = MIN(DstSize, Length);
RtlCopyMemory((PVOID)DstData, (PVOID)SrcData, BytesToCopy);
- BytesCopied += BytesToCopy;
- (ULONG_PTR)SrcData += BytesToCopy;
+ BytesCopied += BytesToCopy;
+ SrcData = (PUCHAR) ((ULONG_PTR) SrcData + BytesToCopy);
Length -= BytesToCopy;
if (Length == 0)
PUCHAR SrcData;
NDIS_DbgPrint(MAX_TRACE, ("DstData 0x%X SrcBuffer 0x%X SrcOffset 0x%X Length %d\n",DstData,SrcBuffer, SrcOffset, Length));
-
+
/* Skip SrcOffset bytes in the source buffer chain */
- if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == -1)
+ if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
return 0;
/* Start copying the data */
NDIS_DbgPrint(MAX_TRACE, ("Copying (%d) bytes from 0x%X to 0x%X\n", BytesToCopy, SrcData, DstData));
RtlCopyMemory((PVOID)DstData, (PVOID)SrcData, BytesToCopy);
- BytesCopied += BytesToCopy;
- (ULONG_PTR)DstData += BytesToCopy;
+ BytesCopied += BytesToCopy;
+ DstData = (PUCHAR)((ULONG_PTR) DstData + BytesToCopy);
Length -= BytesToCopy;
if (Length == 0)
/* Skip DstOffset bytes in the destination buffer chain */
NdisQueryBuffer(DstBuffer, (PVOID)&DstData, &DstSize);
- if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == -1)
+ if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == 0xFFFFFFFF)
return 0;
-
/* Skip SrcOffset bytes in the source packet */
NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
- if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == -1)
+ if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
return 0;
-
/* Copy the data */
for (Total = 0;;) {
/* Find out how many bytes we can copy at one time */
}
-
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisAdjustBufferLength(
}
+/*
+ * @implemented
+ */
ULONG
EXPORT
NDIS_BUFFER_TO_SPAN_PAGES(
{
if (MmGetMdlByteCount(Buffer) == 0)
return 1;
-
+
return ADDRESS_AND_SIZE_TO_SPAN_PAGES(
MmGetMdlVirtualAddress(Buffer),
MmGetMdlByteCount(Buffer));
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisAllocateBuffer(
"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->Next = NULL;
-#ifdef _MSC_VER
MmInitializeMdl(&Temp->Mdl, VirtualAddress, Length);
Temp->Mdl.MdlFlags |= (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE);
Temp->Mdl.MappedSystemVa = VirtualAddress;
-#else
- Temp->Mdl.Next = (PMDL)NULL;
- Temp->Mdl.Size = (CSHORT)(sizeof(MDL) +
- (ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddress, Length) * sizeof(ULONG)));
- Temp->Mdl.MdlFlags = (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE);
-; Temp->Mdl.StartVa = (PVOID)PAGE_ROUND_DOWN(VirtualAddress);
- Temp->Mdl.ByteOffset = (ULONG_PTR)(VirtualAddress - PAGE_ROUND_DOWN(VirtualAddress));
- Temp->Mdl.ByteCount = Length;
- Temp->Mdl.MappedSystemVa = VirtualAddress;
-#if 0
- //Temp->Mdl.Process = PsGetCurrentProcess();
-#else
- Temp->Mdl.Process = NULL;
-#endif
-#endif
-
+
Temp->BufferPool = Pool;
*Buffer = (PNDIS_BUFFER)Temp;
} else {
KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
*Status = NDIS_STATUS_FAILURE;
+ NDIS_DbgPrint(MID_TRACE, ("Can't get another packet.\n"));
+ KeBugCheck(0);
}
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisAllocateBufferPool(
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
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisAllocatePacket(
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) {
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisAllocatePacketPool(
* 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);
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisAllocatePacketPoolEx(
* NDIS 5.0
*/
{
- UNIMPLEMENTED
+ 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));
+
+ if (NumberOfDescriptors > 0xffff)
+ {
+ *Status = NDIS_STATUS_RESOURCES;
+ }
+ else
+ {
+ NumberOfDescriptors += NumberOfOverflowDescriptors;
+ if (NumberOfDescriptors > 0xffff)
+ {
+ NumberOfDescriptors = 0xffff;
+ }
+
+ 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;
+ }
}
+/*
+ * @implemented
+ */
ULONG
EXPORT
NdisBufferLength(
}
+/*
+ * @unimplemented
+ */
PVOID
EXPORT
NdisBufferVirtualAddress(
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisCopyBuffer(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisCopyFromPacketToPacket(
/* Skip DestinationOffset bytes in the destination packet */
NdisGetFirstBufferFromPacket(Destination, &DstBuffer, (PVOID)&DstData, &DstSize, &Total);
- if (SkipToOffset(DstBuffer, DestinationOffset, &DstData, &DstSize) == -1)
+ if (SkipToOffset(DstBuffer, DestinationOffset, &DstData, &DstSize) == 0xFFFFFFFF)
return;
/* Skip SourceOffset bytes in the source packet */
NdisGetFirstBufferFromPacket(Source, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
- if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == -1)
+ if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
return;
/* Copy the data */
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisDprAllocatePacket(
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisDprAllocatePacketNonInterlocked(
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisDprFreePacket(
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisDprFreePacketNonInterlocked(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisFreeBufferPool(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisFreePacketPool(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisFreeBuffer(
Pool = Temp->BufferPool;
KeAcquireSpinLock(&Pool->SpinLock, &OldIrql);
- Buffer->Next = (PMDL)Pool->FreeList;
- Pool->FreeList = (PNETWORK_HEADER)Buffer;
+ Temp->Next = (PNETWORK_HEADER)Pool->FreeList;
+ Pool->FreeList = (PNETWORK_HEADER)Temp;
KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisFreePacket(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisGetBufferPhysicalArraySize(
* ArraySize = Address of buffer to place number of physical blocks
*/
{
- UNIMPLEMENTED
+ ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
+ ASSERT(Buffer && ArraySize);
+
+ *ArraySize = NDIS_BUFFER_TO_SPAN_PAGES(Buffer);
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisGetFirstBufferFromPacket(
}
+/*
+ * @unimplemented
+ */
VOID
EXPORT
NdisReturnPackets(
}
+/*
+ * @unimplemented
+ */
UINT
EXPORT
NdisPacketPoolUsage(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisQueryBuffer(
}
+/*
+ * @implemented
+ */
+VOID
+EXPORT
+NdisQueryBufferSafe(
+ IN PNDIS_BUFFER Buffer,
+ OUT PVOID *VirtualAddress OPTIONAL,
+ OUT PUINT Length,
+ IN UINT Priority)
+/*
+ * FUNCTION:
+ * ARGUMENTS:
+ * NOTES:
+ * NDIS 5.0
+ */
+{
+ if (VirtualAddress != NULL)
+ *VirtualAddress = MmGetSystemAddressForMdlSafe(Buffer, Priority);
+ *Length = MmGetMdlByteCount(Buffer);
+}
+
+
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisQueryBufferOffset(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisUnchainBufferAtBack(
}
+/*
+ * @implemented
+ */
VOID
EXPORT
NdisUnchainBufferAtFront(