1

我尝试写入 NdisProt 驱动程序并发送原始以太网数据包。我将一些 C++ 命令导入到我的 C# 程序中,以便我可以访问驱动程序。当我尝试打开驱动程序的句柄时,我总是得到一个无效的句柄。我已经尝试使用“NdisProt”作为路径,但它没有解决它。你有什么建议为什么我得到一个无效的句柄?

private bool OpenDriver()
{
    // User the CreateFile API to open a handle to the file
    this.m_iHandle = CreateFile("\\\\.\\NdisProt,
    GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    // Check to see if we got a valid handle
    if ((int)m_iHandle <= 0)
    {
        // If not, then return false and reset the handle to 0
        this.m_iHandle = IntPtr.Zero;
        return false;
    }

如果您现在有任何其他解决方案可以在 C# 程序中发送原始以太网数据包,请告诉我。

谢谢你的帮助!

4

3 回答 3

1

更新:我刚刚通过添加另一个清单解决了这个问题,以便应用程序以管理员身份运行。

使用 NDIS 驱动程序的解决方案仍然不起作用,所以我搜索了另一个解决方案。我找到了 SharpPcap 库。使用该库,我可以修改要发送的数据包,例如更改目标 MAC 地址。

感谢您的回答!

于 2018-08-31T07:13:28.767 回答
0

如果您现在有任何其他解决方案可以在 C# 程序中发送原始以太网数据包,请告诉我。

那么Socket类呢?

构造函数:

public Socket (System.Net.Sockets.SocketType socketType, System.Net.Sockets.ProtocolType protocolType),

其中 socketType 可以取下一个值:SocketType.Raw

于 2018-08-27T11:37:52.280 回答
0

如果您现在有任何其他解决方案可以在 C# 程序中发送原始以太网数据包,请告诉我。

您可以从 Windows Winsock 库导入函数并在创建套接字时使用SOCK_RAW标志。

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
于 2018-08-28T06:32:26.350 回答