C++ 创建 NdisProt 驱动程序的句柄

C++ Create a handle to a NdisProt driver

我尝试写入 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# 程序中发送原始以太网数据包的解决方案,请告诉我。

感谢您的帮助!

If you now any other solutions to send raw ethernet packets in a C# program please let me know.

Socketclass呢?

构造函数:

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

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

If you now any other solutions to send raw ethernet packets in a C# program please let me know.

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

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

更新:我刚刚通过添加另一个清单解决了问题,因此应用程序 运行 作为管理员。

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

感谢您的回答!