我正在尝试设置Windows VM的环境以调试内核驱动程序。
我在 Visual Studio 2017 中创建了一个内核驱动程序示例。文件->新建项目->内核模式驱动程序(基本项目;仅用于测试-自动生成的跟踪宏、所需程序等)并希望在目标机器上对其进行测试。
有我的步骤(目标机器):
使用参数运行跟踪日志(GUID 是由模板生成的;没有通过Tools->Create GUID) -成功:
tracelog -start TestKernelDriver2 -guid …
我在这里阅读了有关WinPcap如何过滤数据包的信息,并检查了GitHub ( Microsoft/Windows-driver-samples ) 中的ndis/filter 项目。我在下面提供了WinPcap页面的主要数据,因为它们与问题相关。
我的主要问题:如果NPF丢弃一个数据包(数据包),这意味着数据包将不会被捕获或数据包将不会被发送/接收?例如(据我所知):
接收数据包的情况相同(通过ReceiveNetBufferListsHandler 和 ReturnNetBufferListsHandler函数)。
我是否正确理解有机会通过 NPF 丢弃数据包,将其发送到网络/从网络接收数据包,并将其从“捕获数据包列表”中删除?
如果是,如何实现正确丢包?
我没有找到通过SendNetBufferListsHandler / SendNetBufferListsCompleteHandler和ReceiveNetBufferListsHandler / ReturnNetBufferListsHandler函数丢弃数据包的代码示例。
我想使用异步函数调用。我选择了boost::deadline_timer。
对我来说,硬件计时器是一种特定的硬件(令人惊讶),它独立于 CPU 工作,仅用于监视时间。同时,如果我理解正确,它也可以用于设置超时并在达到超时时产生中断。(计时器)
其主要优点是异步执行。设置定时器的线程可以继续工作,回调函数将在设置定时器的同一线程中触发。
让我描述一下我在行动中看到的情况。
应用程序包含一个或多个工作线程。例如,他们处理输入项目并过滤它们。让我们考虑应用程序有 5 个线程,每个线程设置一个计时器(5 秒)。
应用程序正在运行。例如当前线程是thread-3.
计时器 ( thread-0) 已到期并生成(可能是错误的术语)中断。
线程上下文切换 ( thread-3-> thread-0);
回调函数执行;
计时器 ( thread-1) 已到期并产生中断。
...
等等
PS0。我知道这不仅仅是多线程应用程序的一种可能情况。
问题:
我是否正确描述了工作过程?
难道我理解正确的话,即使当前线程是thread-0它也导致上下文切换,因为线程必须停止执行当前的代码,并切换到执行从回调机能的研究码?
如果每个线程设置 100k 或 500k 计时器,它将如何影响性能?
硬件是否有计时器计数的限制?
更新计时器的超时时间有多昂贵?