NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2245回复:2

Passthru发送自定义包的一点问题

楼主#
更多 发布于:2010-06-17 21:09
网上找的现成代码,问题是怎么调用呢?
NdisBindingHandle和NdisSendPacketPool两个参数从哪儿来啊?
Passthru不是会绑定所有网卡嘛,我该用哪个adapter发送呢?

MySendPacket (
              NDIS_HANDLE     NdisBindingHandle,
              NDIS_HANDLE     NdisSendPacketPool,
              PVOID           pBuffer,
              ULONG           dwBufferLength
              )
{
    NDIS_STATUS     status;
    PNDIS_PACKET    pSendPacket = NULL;
    PNDIS_BUFFER    pSendPacketBuffer = NULL;
    PUCHAR          pSendBuffer = NULL;
    ULONG           dwSendBufferLength;
    NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
    PSEND_RSVD      SendRsvd = NULL;

    if (!NdisBindingHandle)
        return NDIS_STATUS_FAILURE;

    if (!pBuffer)
        return NDIS_STATUS_FAILURE;

    if (dwBufferLength > ETH_MAX_PACKET_SIZE)
        return NDIS_STATUS_FAILURE;

    HighestAcceptableAddress.QuadPart = -1;
    dwSendBufferLength = max(dwBufferLength, ETH_MIN_PACKET_SIZE);

    status = NdisAllocateMemory(&pSendBuffer, dwSendBufferLength, 0, HighestAcceptableAddress);
    if (status != NDIS_STATUS_SUCCESS)
    {
        return status;
    }

    RtlZeroMemory(pSendBuffer, dwSendBufferLength);
    RtlMoveMemory(pSendBuffer, pBuffer, dwSendBufferLength);

    NdisAllocatePacket(&status, &pSendPacket, NdisSendPacketPool);
    if (status != NDIS_STATUS_SUCCESS)
    {
        NdisFreeMemory(pSendBuffer, dwSendBufferLength, 0);

        return status;
    }

    NdisAllocateBuffer( &status,
        &pSendPacketBuffer,
        NdisSendPacketPool,
        pSendBuffer,
        dwSendBufferLength );
    if (status != NDIS_STATUS_SUCCESS)
    {
        NdisFreeMemory(pSendBuffer, dwSendBufferLength, 0);
        NdisDprFreePacket(pSendPacket);

        return status;
    }

    NdisChainBufferAtFront(pSendPacket, pSendPacketBuffer);

    SendRsvd = (PSEND_RSVD)(pSendPacket->ProtocolReserved);
    SendRsvd->OriginalPkt = NULL; //注意这里

    pSendPacket->Private.Head->Next=NULL;
    pSendPacket->Private.Tail=NULL;

    //NDIS_SET_PACKET_HEADER_SIZE(pSendPacket, 14);
    NdisSetPacketFlags(pSendPacket, NDIS_FLAGS_DONT_LOOPBACK);

    NdisSend(&status, NdisBindingHandle, pSendPacket);
    if (status != STATUS_PENDING)
    {
        NdisUnchainBufferAtFront(pSendPacket ,&pSendPacketBuffer);
        NdisQueryBufferSafe( pSendPacketBuffer,
            (PVOID *)&pSendBuffer,
            &dwSendBufferLength,
            HighPagePriority );
        NdisFreeBuffer(pSendPacketBuffer);
        NdisFreeMemory(pSendBuffer, dwSendBufferLength, 0);
        NdisDprFreePacket(pSendPacket);
    }

    return status;
}
NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-06-19 09:35
这个肯定有人做过呀,拜托给点提示吧orz
gt2333588
驱动牛犊
驱动牛犊
  • 注册日期2008-02-27
  • 最后登录2012-06-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-08-07 17:41
passthru只会绑定一块网卡 你可以在BindAdapter的时候保存adapt的地址之后用这个地址就可以了
游客

返回顶部