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

C++ Create a handle to a NdisProt driver

本文关键字:句柄 驱动程序 NdisProt 创建 C++      更新时间:2023-10-16

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

感谢您的任何帮助!

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

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

感谢您的回答!

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

套接字类呢?

构造 函数:

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

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

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

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

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