📄 buffer.c
字号:
* NDIS 5.0
* RETURNS:
* Length of NDIS buffer
*/
{
return MmGetMdlByteCount(Buffer);
}
/*
* @implemented
*/
#undef NdisBufferVirtualAddress
PVOID
EXPORT
NdisBufferVirtualAddress(
IN PNDIS_BUFFER Buffer)
/*
* FUNCTION:
* ARGUMENTS:
* NOTES:
* NDIS 5.0
*/
{
return MmGetSystemAddressForMdl(Buffer);
}
/*
* @unimplemented
*/
VOID
EXPORT
NdisCopyBuffer(
OUT PNDIS_STATUS Status,
OUT PNDIS_BUFFER *Buffer,
IN NDIS_HANDLE PoolHandle,
IN PVOID MemoryDescriptor,
IN UINT Offset,
IN UINT Length)
/*
* FUNCTION: Returns a new buffer descriptor for a (partial) buffer
* ARGUMENTS:
* Status = Address of a buffer to place status of operation
* Buffer = Address of a buffer to place new buffer descriptor
* PoolHandle = Handle returned by NdisAllocateBufferPool
* MemoryDescriptor = Pointer to a memory descriptor (possibly NDIS_BUFFER)
* Offset = Offset in buffer to start copying
* Length = Number of bytes to copy
*/
{
*Status = NDIS_STATUS_FAILURE;
}
/*
* @implemented
*/
VOID
EXPORT
NdisCopyFromPacketToPacket(
IN PNDIS_PACKET Destination,
IN UINT DestinationOffset,
IN UINT BytesToCopy,
IN PNDIS_PACKET Source,
IN UINT SourceOffset,
OUT PUINT BytesCopied)
/*
* FUNCTION: Copies data from one packet to another
* ARGUMENTS:
* Destination = Pointer to packet to copy data to
* DestinationOffset = Offset in destination packet to copy data to
* BytesToCopy = Number of bytes to copy
* Source = Pointer to packet descriptor to copy from
* SourceOffset = Offset in source packet to start copying from
* BytesCopied = Address of buffer to place number of bytes copied
*/
{
PNDIS_BUFFER SrcBuffer;
PNDIS_BUFFER DstBuffer;
PUCHAR DstData, SrcData;
UINT DstSize, SrcSize;
UINT Count, Total;
*BytesCopied = 0;
/* Skip DestinationOffset bytes in the destination packet */
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);
if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
return;
/* Copy the data */
for (Total = 0;;) {
/* Find out how many bytes we can copy at one time */
if (BytesToCopy < SrcSize)
Count = BytesToCopy;
else
Count = SrcSize;
if (DstSize < Count)
Count = DstSize;
RtlCopyMemory(DstData, SrcData, Count);
Total += Count;
BytesToCopy -= Count;
if (BytesToCopy == 0)
break;
DstSize -= Count;
if (DstSize == 0) {
/* No more bytes in destination buffer. Proceed to
the next buffer in the destination buffer chain */
NdisGetNextBuffer(DstBuffer, &DstBuffer);
if (!DstBuffer)
break;
NdisQueryBuffer(DstBuffer, (PVOID)&DstData, &DstSize);
}
SrcSize -= Count;
if (SrcSize == 0) {
/* No more bytes in source buffer. Proceed to
the next buffer in the source buffer chain */
NdisGetNextBuffer(SrcBuffer, &SrcBuffer);
if (!SrcBuffer)
break;
NdisQueryBuffer(SrcBuffer, (PVOID)&SrcData, &SrcSize);
}
}
*BytesCopied = Total;
}
/*
* @unimplemented
*/
VOID
EXPORT
NdisDprAllocatePacket(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET *Packet,
IN NDIS_HANDLE PoolHandle)
/*
* FUNCTION: Allocates a packet at IRQL DISPATCH_LEVEL
* ARGUMENTS:
* Status = Address of buffer to place status of operation
* Packet = Address of buffer to place a pointer to a packet descriptor
* PoolHandle = Handle returned by NdisAllocatePacketPool
*/
{
}
/*
* @unimplemented
*/
VOID
EXPORT
NdisDprAllocatePacketNonInterlocked(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET *Packet,
IN NDIS_HANDLE PoolHandle)
/*
* FUNCTION: Allocates a packet at IRQL DISPATCH_LEVEL (w/o synchronization)
* ARGUMENTS:
* Status = Address of buffer to place status of operation
* Packet = Address of buffer to place a pointer to a packet descriptor
* PoolHandle = Handle returned by NdisAllocatePacketPool
*/
{
*Status = NDIS_STATUS_FAILURE;
}
/*
* @unimplemented
*/
VOID
EXPORT
NdisDprFreePacket(
IN PNDIS_PACKET Packet)
/*
* FUNCTION: Frees a packet at IRQL DISPATCH_LEVEL
* ARGUMENTS:
* Packet = Pointer to packet to free
*/
{
}
/*
* @unimplemented
*/
VOID
EXPORT
NdisDprFreePacketNonInterlocked(
IN PNDIS_PACKET Packet)
/*
* FUNCTION: Frees a packet at IRQL DISPATCH_LEVEL (w/o synchronization)
* ARGUMENTS:
* Packet = Pointer to packet to free
*/
{
}
/*
* @implemented
*/
VOID
EXPORT
NdisFreeBufferPool(
IN NDIS_HANDLE PoolHandle)
/*
* FUNCTION: Frees storage allocated for an NDIS buffer pool
* ARGUMENTS:
* PoolHandle = Handle returned by NdisAllocateBufferPool
*/
{
}
/*
* @implemented
*/
VOID
EXPORT
NdisFreePacketPool(
IN NDIS_HANDLE PoolHandle)
/*
* FUNCTION: Frees storage allocated for an NDIS packet pool
* ARGUMENTS:
* PoolHandle = Handle returned by NdisAllocatePacketPool
*/
{
ExFreePool((PVOID)PoolHandle);
}
/*
* @implemented
*/
#undef NdisFreeBuffer
VOID
EXPORT
NdisFreeBuffer(
IN PNDIS_BUFFER Buffer)
/*
* FUNCTION: Puts an NDIS buffer descriptor back in it's pool
* ARGUMENTS:
* Buffer = Pointer to buffer descriptor
*/
{
IoFreeMdl(Buffer);
}
/*
* @implemented
*/
VOID
EXPORT
NdisFreePacket(
IN PNDIS_PACKET Packet)
/*
* FUNCTION: Puts an NDIS packet descriptor back in it's pool
* ARGUMENTS:
* Packet = Pointer to packet descriptor
*/
{
KIRQL OldIrql;
NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet));
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(
IN PNDIS_BUFFER Buffer,
OUT PUINT ArraySize)
/*
* FUNCTION: Returns number of discontiguous physical blocks backing a buffer
* ARGUMENTS:
* Buffer = Pointer to buffer descriptor
* ArraySize = Address of buffer to place number of physical blocks
*/
{
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
ASSERT(Buffer && ArraySize);
*ArraySize = NDIS_BUFFER_TO_SPAN_PAGES(Buffer);
}
/*
* @implemented
*/
#undef NdisGetFirstBufferFromPacket
VOID
EXPORT
NdisGetFirstBufferFromPacket(
IN PNDIS_PACKET _Packet,
OUT PNDIS_BUFFER *_FirstBuffer,
OUT PVOID *_FirstBufferVA,
OUT PUINT _FirstBufferLength,
OUT PUINT _TotalBufferLength)
/*
* FUNCTION: Retrieves information about an NDIS packet
* ARGUMENTS:
* _Packet = Pointer to NDIS packet
* _FirstBuffer = Address of buffer for pointer to first NDIS buffer
* _FirstBufferVA = Address of buffer for address of first NDIS buffer
* _FirstBufferLength = Address of buffer for length of first buffer
* _TotalBufferLength = Address of buffer for total length of packet
*/
{
PNDIS_BUFFER Buffer;
Buffer = _Packet->Private.Head;
*_FirstBuffer = Buffer;
*_FirstBufferVA = MmGetMdlVirtualAddress(Buffer);
if (Buffer != NULL) {
*_FirstBufferLength = MmGetMdlByteCount(Buffer);
Buffer = Buffer->Next;
} else
*_FirstBufferLength = 0;
*_TotalBufferLength = *_FirstBufferLength;
while (Buffer != NULL) {
*_TotalBufferLength += MmGetMdlByteCount(Buffer);
Buffer = Buffer->Next;
}
}
/*
* @unimplemented
*/
VOID
EXPORT
NdisReturnPackets(
IN PNDIS_PACKET *PacketsToReturn,
IN UINT NumberOfPackets)
/*
* FUNCTION: Releases ownership of one or more packets
* ARGUMENTS:
* PacketsToReturn = Pointer to an array of pointers to packet descriptors
* NumberOfPackets = Number of pointers in descriptor pointer array
*/
{
UNIMPLEMENTED
}
/*
* @unimplemented
*/
UINT
EXPORT
NdisPacketPoolUsage(
IN NDIS_HANDLE PoolHandle)
/*
* FUNCTION:
* ARGUMENTS:
* NOTES:
* NDIS 5.0
*/
{
UNIMPLEMENTED
return 0;
}
/*
* @implemented
*/
#undef NdisQueryBuffer
VOID
EXPORT
NdisQueryBuffer(
IN PNDIS_BUFFER Buffer,
OUT PVOID *VirtualAddress OPTIONAL,
OUT PUINT Length)
/*
* FUNCTION:
* Queries an NDIS buffer for information
* ARGUMENTS:
* Buffer = Pointer to NDIS buffer to query
* VirtualAddress = Address of buffer to place virtual address
* Length = Address of buffer to place length of buffer
*/
{
if (VirtualAddress != NULL)
*(PVOID*)VirtualAddress = MmGetSystemAddressForMdl(Buffer);
*Length = MmGetMdlByteCount(Buffer);
}
/*
* @implemented
*/
#undef NdisQueryBufferSafe
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
*/
#undef NdisQueryBufferOffset
VOID
EXPORT
NdisQueryBufferOffset(
IN PNDIS_BUFFER Buffer,
OUT PUINT Offset,
OUT PUINT Length)
{
*((PUINT)Offset) = MmGetMdlByteOffset(Buffer);
*((PUINT)Length) = MmGetMdlByteCount(Buffer);
}
/*
* @implemented
*/
VOID
EXPORT
NdisUnchainBufferAtBack(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER *Buffer)
/*
* FUNCTION:
* Removes the last buffer in a packet
* ARGUMENTS:
* Packet = Pointer to NDIS packet
* Buffer = Address of buffer to place pointer to removed NDIS buffer
*/
{
PNDIS_BUFFER NdisBuffer, Previous;
NdisQueryPacket(Packet,
NULL,
NULL,
&NdisBuffer,
NULL);
if (!NdisBuffer) {
*Buffer = NULL;
return;
}
Previous = NULL;
while (NdisBuffer->Next) {
Previous = NdisBuffer;
NdisBuffer = NdisBuffer->Next;
}
if (Previous) {
Previous->Next = NULL;
Packet->Private.Tail = Previous;
} else {
Packet->Private.Head = NULL;
Packet->Private.Tail = NULL;
}
Packet->Private.ValidCounts = FALSE;
*Buffer = NdisBuffer;
}
/*
* @implemented
*/
VOID
EXPORT
NdisUnchainBufferAtFront(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER *Buffer)
/*
* FUNCTION:
* Removes the first buffer in a packet
* ARGUMENTS:
* Packet = Pointer to NDIS packet
* Buffer = Address of buffer to place pointer to removed NDIS buffer
*/
{
PNDIS_BUFFER NdisBuffer;
NdisQueryPacket(Packet,
NULL,
NULL,
&NdisBuffer,
NULL);
if (!NdisBuffer) {
*Buffer = NULL;
return;
}
Packet->Private.Head = NdisBuffer->Next;
if (!NdisBuffer->Next)
Packet->Private.Tail = NULL;
NdisBuffer->Next = NULL;
Packet->Private.ValidCounts = FALSE;
*Buffer = NdisBuffer;
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -