原创 NDIS_PROTOCOL_BLOCK 结构

2008-4-3 23:41 5736 5 5 分类: 软件与OS

NDIS_PROTOCOL_BLOCK
结构的完整定义我翻遍了DDK都没找到,翻windows2000源代码也没找到。google到驱动开发网上一篇讲封包过滤技术的文章,里面给出了NDIS_PROTOCOL_BLOCK
的定义。我打印出来对照的一个NDIS protocol
hook的代码看,总感觉这个结构的定义有问题。不爽了好几天。今天终于google到正确的定义,放这存着:


Q: Where can I get the definition of NDIS_PROTOCOL_BLOCK structure? Does it
depend of Windows version or NDIS version?


A: _NDIS_PROTOCOL_BLOCK structure definition depends of Windows and NDIS
versions and it's just partially documented by


Microsoft. Some it's definitions can be found in ndis.h. An example, for
Windows XP NDIS_PROTOCOL_BLOCK defined as the


following:


struct _NDIS_PROTOCOL_BLOCK
{
  _NDIS_OPEN_BLOCK*    OpenQueue;
 
_REFERENCE     Ref;
  _KEVENT*     DeregEvent;
  _NDIS_PROTOCOL_BLOCK*
  NextProtocol;
  _NDIS50_PROTOCOL_CHARACTERISTICS  ProtocolCharacteristics;

  _WORK_QUEUE_ITEM    WorkItem;
  _KMUTANT     Mutex;
  DWORD
    MutexOwner;
  _UNICODE_STRING*    BindDeviceName;
  _UNICODE_STRING*
   RootDeviceName;
  _NDIS_M_DRIVER_BLOCK*   AssociatedMiniDriver;
 
_NDIS_MINIPORT_BLOCK*   BindingAdapter;
};
But in ndis.h for Windows ME
you can find the following definition:


//-----------------驱动开发网上给的是这个,这个已经过时了---------------------


struct _NDIS_PROTOCOL_BLOCK
{
  PNDIS_OPEN_BLOCK       OpenQueue;  //
queue of opens for this protocol
  REFERENCE        Ref;  // contains
spinlock for OpenQueue
  UINT         Length; // of this NDIS_PROTOCOL_BLOCK
struct
  NDIS50_PROTOCOL_CHARACTERISTICS   ProtocolCharacteristics;// handler
addresses struct
  _NDIS_PROTOCOL_BLOCK *      NextProtocol; // Link to
next   
  ULONG        MaxPatternSize;
#if defined(NDIS_WRAPPER)
 
//
  // Protocol filters
  //
  struct    _NDIS_PROTOCOL_FILTER *
ProtocolFilter[NdisMediumMax+1];
  WORK_QUEUE_ITEM       WorkItem; // Used
during NdisRegisterProtocol to
      // notify protocols of existing
drivers.
  KMUTEX        Mutex;  // For serialization of Bind/Unbind requests

  PKEVENT        DeregEvent; // Used by NdisDeregisterProtocol
#endif

};
As you can see this structure definition depends of
NDIS_PROTOCOL_CHARACTERISTICS definition, which is NDIS version


dependent. The Windows version dependence does not need any comments.


//------------------------------------------------------------------------------------------------------------


也给出NDIS_OPEN_BLOCK定义,这个是在xp ddk的ndis.h里翻出来的:


typedef struct _NDIS_COMMON_OPEN_BLOCK
{
   
PVOID                       MacHandle;          // needed for backward
compatibility
    NDIS_HANDLE                 BindingHandle;      //
Miniport's open context
    PNDIS_MINIPORT_BLOCK        MiniportHandle;    
// pointer to the miniport
    PNDIS_PROTOCOL_BLOCK       
ProtocolHandle;     // pointer to our protocol
   
NDIS_HANDLE                 ProtocolBindingContext;// context when calling
ProtXX funcs
    PNDIS_OPEN_BLOCK            MiniportNextOpen;   // used by
adapter's OpenQueue
    PNDIS_OPEN_BLOCK            ProtocolNextOpen;   //
used by protocol's OpenQueue
    NDIS_HANDLE                
MiniportAdapterContext; // context for miniport
   
BOOLEAN                     Reserved1;
    BOOLEAN                    
Reserved2;
    BOOLEAN                     Reserved3;
   
BOOLEAN                     Reserved4;
    PNDIS_STRING               
BindDeviceName;
    KSPIN_LOCK                  Reserved5;
   
PNDIS_STRING                RootDeviceName;


    //
    // These are referenced by the macros used by protocols to
call.
    // All of the ones referenced by the macros are internal NDIS
handlers for the miniports
    //
    union
    {
       
SEND_HANDLER            SendHandler;
        WAN_SEND_HANDLER       
WanSendHandler;
    };
    TRANSFER_DATA_HANDLER      
TransferDataHandler;


    //
    // These are referenced internally by NDIS
    //
   
SEND_COMPLETE_HANDLER       SendCompleteHandler;
   
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
   
RECEIVE_HANDLER             ReceiveHandler;
    RECEIVE_COMPLETE_HANDLER   
ReceiveCompleteHandler;
    WAN_RECEIVE_HANDLER        
WanReceiveHandler;
    REQUEST_COMPLETE_HANDLER   
RequestCompleteHandler;


    //
    // NDIS 4.0 extensions
    //
   
RECEIVE_PACKET_HANDLER      ReceivePacketHandler;
   
SEND_PACKETS_HANDLER        SendPacketsHandler;


    //
    // More Cached Handlers
    //
   
RESET_HANDLER               ResetHandler;
    REQUEST_HANDLER            
RequestHandler;
    RESET_COMPLETE_HANDLER      ResetCompleteHandler;
   
STATUS_HANDLER              StatusHandler;
    STATUS_COMPLETE_HANDLER    
StatusCompleteHandler;
   
#if defined(NDIS_WRAPPER)
   
ULONG                       Flags;
    ULONG                      
References;
    KSPIN_LOCK                  SpinLock;           // guards
Closing
    NDIS_HANDLE                 FilterHandle;
   
ULONG                       ProtocolOptions;
    USHORT                     
CurrentLookahead;
    USHORT                      ConnectDampTicks;
   
USHORT                      DisconnectDampTicks;


    //
    // These are optimizations for getting to driver routines. They
are not
    // necessary, but are here to save a dereference through the
Driver block.
    //
    W_SEND_HANDLER              WSendHandler;
   
W_TRANSFER_DATA_HANDLER     WTransferDataHandler;


    //
    //  NDIS 4.0 miniport entry-points
    //
   
W_SEND_PACKETS_HANDLER      WSendPacketsHandler;


    W_CANCEL_SEND_PACKETS_HANDLER   CancelSendPacketsHandler;


    //
    //  Contains the wake-up events that are enabled for the
open.
    //
    ULONG                       WakeUpEnable;
   
//
    // event to be signalled when close complets
    //
   
PKEVENT                     CloseCompleteEvent;


    QUEUED_CLOSE                QC;


    ULONG                       AfReferences;


    PNDIS_OPEN_BLOCK            NextGlobalOpen;


#endif


} NDIS_COMMON_OPEN_BLOCK;


//
// one of these per open on an adapter/protocol
//
struct
_NDIS_OPEN_BLOCK
{
#ifdef __cplusplus
    NDIS_COMMON_OPEN_BLOCK
NdisCommonOpenBlock;
#else
    NDIS_COMMON_OPEN_BLOCK;
#endif


#if defined(NDIS_WRAPPER)
   
    //
    // The stuff below is for
CO drivers/protocols. This part is not allocated for CL drivers.
   
//
    struct _NDIS_OPEN_CO
    {
        //
        // this is the
list of the call manager opens done on this adapter
        //
       
struct _NDIS_CO_AF_BLOCK *  NextAf;
   
        //
        //  NDIS
5.0 miniport entry-points, filled in at open time.
        //
       
W_CO_CREATE_VC_HANDLER      MiniportCoCreateVcHandler;
       
W_CO_REQUEST_HANDLER        MiniportCoRequestHandler;
   
       
//
        // NDIS 5.0 protocol completion routines, filled in at
RegisterAf/OpenAf time
        //
        CO_CREATE_VC_HANDLER       
CoCreateVcHandler;
        CO_DELETE_VC_HANDLER       
CoDeleteVcHandler;
        PVOID                      
CmActivateVcCompleteHandler;
        PVOID                      
CmDeactivateVcCompleteHandler;
        PVOID                      
CoRequestCompleteHandler;
   
        //
        // lists for queuing
connections. There is both a queue for currently
        // active
connections and a queue for connections that are not active.
       
//
        LIST_ENTRY                  ActiveVcHead;
       
LIST_ENTRY                  InactiveVcHead;
       
LONG                        PendingAfNotifications;
       
PKEVENT                     AfNotifyCompleteEvent;
    };
#endif
};


文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条