⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmirtns.cpp

📁 James Antognini和Tom Divine提供的PASSTHRU的编成实例。
💻 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 + -