216 lines
4.7 KiB
C
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
|
||
|
|
||
|
|