📄 wmirtns.cpp
字号:
/**************************************************************************************************/
/* */
/* Copyright (C) 2003, James Antognini, antognini@mindspring.com. */
/* */
/**************************************************************************************************/
#ifdef __cplusplus // C++ conversion
extern "C"
{
#endif
#include <ndis.h>
#include "passthru.h"
#ifdef __cplusplus // C++ conversion
}
#endif
#define JADrvNm "JApassthru"
#define JADrvRtnsName "WMIRtns"
#define JADrvRtnsVer "1.01"
#pragma comment(exestr, \
JADrvNm " " JADrvRtnsName " v" JADrvRtnsVer " compiled on " __DATE__ " at " __TIME__)
/**************************************************************************************************/
/* */
/**************************************************************************************************/
extern "C"
NDIS_STATUS
PassthruWMIGetAddrArray(
PADAPT pAdapt,
PULONG pUlInArr,// Address of size of provided structure. Will be updated with amount needed or actually used.,
PPassthruIPAddrArray pInArr // Address of provided structure, with number of elements first.
)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
LOCK_STATE saveLockState;
ULONG ulBfrNeeded;
NdisAcquireReadWriteLock( // Get lock.
&pAdapt->IPAddrArrLock,
FALSE, // Read access.
&saveLockState
);
ulBfrNeeded = pAdapt->pIPAddrArray->ulArrayStr - // Determine amount of space needed to set answer.
FIELD_OFFSET(IPAddrFilterArray, IPAddrArray);
if (ulBfrNeeded>*pUlInArr) // Is provided structure too small?
status = NDIS_STATUS_BUFFER_TOO_SHORT;
else
NdisMoveMemory(pInArr, // Copy address array into provided structure.
&pAdapt->pIPAddrArray->IPAddrArray,
ulBfrNeeded
);
*pUlInArr = ulBfrNeeded; // Show amount that is needed or that was actually used.
NdisReleaseReadWriteLock( // Release lock.
&pAdapt->IPAddrArrLock,
&saveLockState
);
return status;
}
/**************************************************************************************************/
/* */
/**************************************************************************************************/
extern "C"
NDIS_STATUS
PassthruWMISetAddrArray(
PADAPT pAdapt,
ULONG ulElems, // Number of elements. 0 => default.
PPassthruIPAddrArray pInArr // Address of provided structure. NULL if ulElems = 0.
// Otherwise, ulElems is assumed equal to pInArr->NumberElements, but this is not checked.
)
{
NDIS_STATUS status;
ULONG ulArrStr;
LOCK_STATE saveLockState;
NdisAcquireReadWriteLock( // Get lock.
&pAdapt->IPAddrArrLock,
TRUE, // Write access.
&saveLockState
);
do
{
if (NULL!=pAdapt->pIPAddrArray) // Answer area allocated (this should be true except when the first set is being done)?
{
// Note: A possible optimization is to leave the existing area in place if it is big enough to accommodate the current request.
ulArrStr = pAdapt->pIPAddrArray->ulArrayStr; // Get structure's size.
NdisFreeMemory( // Free structure's storage.
pAdapt->pIPAddrArray,
ulArrStr,
0
);
}
ulArrStr = // Get size of fixed portion.
FIELD_OFFSET(IPAddrFilterArray, IPAddrArray) +
FIELD_OFFSET(PassthruIPAddrArray, IPAddrArray);
ulArrStr += ulElems*sizeof(ULONG); // Add size of variable portion.
status = // Allocate nonpaged storage for IP-address-array structure.
NdisAllocateMemoryWithTag((PVOID *)&pAdapt->pIPAddrArray,
ulArrStr,
TAG
);
if (NDIS_STATUS_SUCCESS!=status)
{
DBGPRINT(("PassthruWMISetAddrArray(): Couldn't get storage\n"));
status = NDIS_STATUS_RESOURCES;
goto Done;
break;
}
pAdapt->pIPAddrArray->ulArrayStr = ulArrStr; // Save structure size.
if (0!=ulElems) // Non-zero number of array elements?
{
NdisMoveMemory( // Copy supplied array.
&pAdapt->pIPAddrArray->IPAddrArray,
pInArr,
FIELD_OFFSET(PassthruIPAddrArray, IPAddrArray) +
(pInArr->NumberElements*sizeof(pInArr->IPAddrArray))
);
// ULONG i;
// for (i = 0; i < pAdapt->pIPAddrArray->IPAddrArray.NumberElements; i ++)
// {
// PULONG pI = ((PULONG)&pAdapt->pIPAddrArray->IPAddrArray.IPAddrArray) + i;
// PUCHAR pC = (PUCHAR)pI;
// DBGPRINT(("IP address = %03d.%03d.%03d.%03d\n", *pC, *(pC+1), *(pC+2), *(pC+3)));
// }
}
else
pAdapt->pIPAddrArray-> // Set default IP-address array.
IPAddrArray.NumberElements = 0;
} while(0);
Done:
NdisReleaseReadWriteLock( // Release lock.
&pAdapt->IPAddrArrLock,
&saveLockState
);
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -