windows-nt/Source/XPSP1/NT/net/tcpip/driver/inc/tcpipbuf.h
2020-09-26 16:20:57 +08:00

216 lines
4.7 KiB
C

/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
tcpipbuf.h
Abstract:
This file implements inline wrappers for the NdisBufferVirtualAddress
and NdisQueryBuffer (which in turn calls MmGetSystemAddressForMdl)
so that we can test the failure paths and add TCP/IP functionality
as required.
Revision History:
--*/
#if DBG
// #define DBG_MAP_BUFFER 1
#if DBG_MAP_BUFFER
// This is to allow us to test failure conditions.
extern ULONG g_cFailSafeMDLQueries;
extern ULONG g_fPerformMDLFailure;
#endif // DBG_MAP_BUFFER
#define TcpipBufferVirtualAddress(pBuffer, Priority) \
DbgTcpipBufferVirtualAddress(pBuffer, Priority, __FILE__, __LINE__)
#define TcpipQueryBuffer(pBuffer, ppvBuffer, pcbBuffer, Priority) \
DbgTcpipQueryBuffer(pBuffer, ppvBuffer, pcbBuffer, Priority, __FILE__, __LINE__)
__inline PVOID
DbgTcpipBufferVirtualAddress(
IN PNDIS_BUFFER pBuffer,
IN UINT Priority,
IN char *pFileName,
IN int cLineNumber
)
{
PVOID pvBuffer;
#if DBG_MAP_BUFFER
if (g_fPerformMDLFailure == TRUE)
{
if (InterlockedDecrement(&g_cFailSafeMDLQueries) == 0)
{
// Stop failing requests.
g_fPerformMDLFailure = FALSE;
}
DbgPrint("TcpipBufferVirtualAddress FORCED failure - MDL %x: %s @ line %d\n",
pBuffer, pFileName, cLineNumber);
return (NULL);
}
#endif // DBG_MAP_BUFFER
#if MILLEN
pvBuffer = NdisBufferVirtualAddress(pBuffer);
#else // MILLEN
pvBuffer = NdisBufferVirtualAddressSafe(pBuffer, Priority);
#endif // !MILLEN
if (pvBuffer == NULL)
{
DbgPrint("TcpipBufferVirtualAddress failure - MDL %x: %s @ line %d\n",
pBuffer, pFileName, cLineNumber);
}
return (pvBuffer);
}
__inline VOID
DbgTcpipQueryBuffer(
IN PNDIS_BUFFER pNdisBuffer,
OUT PVOID * ppvBuffer OPTIONAL,
OUT PUINT pcbBuffer,
IN UINT Priority,
IN char *pFileName,
IN int cLineNumber
)
{
#if DBG_MAP_BUFFER
if (g_fPerformMDLFailure == TRUE)
{
if (InterlockedDecrement(&g_cFailSafeMDLQueries) == 0)
{
// Stop failing requests.
g_fPerformMDLFailure = FALSE;
}
*ppvBuffer = NULL;
*pcbBuffer = MmGetMdlByteCount(pNdisBuffer);
DbgPrint("TcpipQueryBuffer FORCED failure - MDL %x: %s @ line %d\n",
pNdisBuffer, pFileName, cLineNumber);
return;
}
#endif // DBG_MAP_BUFFER
#if MILLEN
NdisQueryBuffer(pNdisBuffer, ppvBuffer, pcbBuffer);
#else // MILLEN
NdisQueryBufferSafe(pNdisBuffer, ppvBuffer, pcbBuffer, Priority);
#endif // !MILLEN
if (*ppvBuffer == NULL)
{
DbgPrint("TcpipQueryBuffer failure - MDL %x: %s @ line %d\n",
pNdisBuffer, pFileName, cLineNumber);
}
return;
}
#if DBG_MAP_BUFFER
#define IOCTL_IP_DBG_TEST_FAIL_MAP_BUFFER \
_IP_CTL_CODE(40, METHOD_BUFFERED, FILE_WRITE_ACCESS)
__inline NTSTATUS
DbgTestFailMapBuffers(
ULONG cFailures
)
{
if (g_fPerformMDLFailure == FALSE) {
DbgPrint("DbgTestFailMapBuffers %d\n", cFailures);
g_cFailSafeMDLQueries = cFailures;
g_fPerformMDLFailure = TRUE;
} else {
return (STATUS_UNSUCCESSFUL);
}
return (STATUS_SUCCESS);
}
#endif // DBG_MAP_BUFFER
#else // DBG
__inline PVOID
TcpipBufferVirtualAddress(
IN PNDIS_BUFFER pBuffer,
IN INT Priority
)
{
#if MILLEN
return (NdisBufferVirtualAddress(pBuffer));
#else // MILLEN
return (NdisBufferVirtualAddressSafe(pBuffer, Priority));
#endif // !MILLEN
}
__inline VOID
TcpipQueryBuffer(
IN PNDIS_BUFFER pNdisBuffer,
OUT PVOID * ppvBuffer OPTIONAL,
OUT PUINT pcbBuffer,
IN UINT Priority
)
{
#if MILLEN
NdisQueryBuffer(pNdisBuffer, ppvBuffer, pcbBuffer);
#else // MILLEN
NdisQueryBufferSafe(pNdisBuffer, ppvBuffer, pcbBuffer, Priority);
#endif // !MILLEN
return;
}
#endif // !DBG
#if MILLEN
typedef struct _XNDIS_BUFFER {
struct _NDIS_BUFFER *Next;
PVOID VirtualAddress;
PVOID Pool;
UINT Length;
UINT Signature;
} XNDIS_BUFFER, *PXNDIS_BUFFER;
__inline VOID
NdisAdjustBuffer(
IN PNDIS_BUFFER Mdl,
IN PVOID NewVirtualAddress,
IN UINT NewLength
)
{
PXNDIS_BUFFER Buffer = (PXNDIS_BUFFER) Mdl;
Buffer->VirtualAddress = NewVirtualAddress;
Buffer->Length = NewLength;
}
#else // MILLEN
__inline VOID
NdisAdjustBuffer(
IN PNDIS_BUFFER Buffer,
IN PVOID NewVirtualAddress,
IN UINT NewLength
)
{
PMDL Mdl = (PMDL) Buffer;
Mdl->MappedSystemVa = NewVirtualAddress;
Mdl->ByteCount = NewLength;
Mdl->ByteOffset = BYTE_OFFSET(NewVirtualAddress);
}
#endif // !MILLEN