小编sli*_*kin的帖子

如何正确调试 Windows 内核驱动程序?

我正在尝试设置Windows VM的环境以调试内核驱动程序。

我在 Visual Studio 2017 中创建了一个内核驱动程序示例。文件->新建项目->内核模式驱动程序基本项目;仅用于测试-自动生成的跟踪宏、所需程序等)并希望在目标机器上对其进行测试

有我的步骤(目标机器):

  1. 将 Windows 10 安装到虚拟机(VirtualBox);
  2. 打开测试模式并将BCDEdit设置为本地
  3. 安装WDK
  4. 下载OSR 加载器
  5. 将构建后的文件复制到 VM (C:\DriverTest\TestKernelDriver2\; .cer , .inf , .pdb , .sys );
  6. 创建跟踪文件夹;C:\DriverTest\TestKernelDriver2\traces\
  7. 安装证书 - TestKernelDriver2.sys;(签名模式测试签名
  8. 运行OSR Driver Loader,选择驱动,点击注册服务成功)。
  9. 使用参数运行跟踪日志(GUID 是由模板生成的;没有通过Tools->Create GUID) -成功

    tracelog -start TestKernelDriver2 -guid …

c windows debugging kernel visual-studio

7
推荐指数
1
解决办法
3081
查看次数

捕获数据包(NPF;WinPcap)如何工作?

在这里阅读了有关WinPcap如何过滤数据包的信息,并检查了GitHub ( Microsoft/Windows-driver-samples ) 中的ndis/filter 项目我在下面提供了WinPcap页面的主要数据,因为它们与问题相关。

在此输入图像描述


在此输入图像描述

我的主要问题:如果NPF丢弃一个数据包(数据包),这意味着数据包将不会被捕获或数据包将不会被发送/接收?例如(据我所知):

  1. dumpcap开始侦听eth0上的数据包。
  2. Chrome发送 DNS 请求。
  3. NDIS 驱动程序处理此数据包。(确切地说 - NetBufferList;通过SendNetBufferListsHandler 和 SendNetBufferListsCompleteHandler函数)
  4. 解析NBL:解析各个缓冲区并检查数据包特征;
  5. 如果我们想丢弃一个数据包,我们需要组装新的NBL(不含不需要的数据包)并使用新的NBList调用SendNetBufferListsCompleteHandler ;
  6. 如果我们想从捕获中删除此数据包,我们需要组装新的 NBL(不含不需要的数据包)并使用新的 NBList 调用NdisFIndicateReceiveNetBufferLists ;

接收数据包的情况相同(通过ReceiveNetBufferListsHandler 和 ReturnNetBufferListsHandler函数)。

我是否正确理解有机会通过 NPF 丢弃数据包,将发送到网络/从网络接收数据包,并将其从“捕获数据包列表”中删除?

如果是,如何实现正确丢包?

我没有找到通过SendNetBufferListsHandler / SendNetBufferListsCompleteHandlerReceiveNetBufferListsHandler / ReturnNetBufferListsHandler函数丢弃数据包的代码示例。

c windows ndis driver packet-capture

3
推荐指数
1
解决办法
1379
查看次数

硬件定时器如何工作并影响软件性能?

我想使用异步函数调用。我选择了boost::deadline_timer

对我来说,硬件计时器是一种特定的硬件(令人惊讶),它独立于 CPU 工作,仅用于监视时间。同时,如果我理解正确,它也可以用于设置超时并在达到超时时产生中断。(计时器

其主要优点是异步执行。设置定时器的线程可以继续工作,回调函数将在设置定时器的同一线程中触发。

让我描述一下我在行动中看到的情况。

  1. 应用程序包含一个或多个工作线程。例如,他们处理输入项目并过滤它们。让我们考虑应用程序有 5 个线程,每个线程设置一个计时器(5 秒)。

  2. 应用程序正在运行。例如当前线程是thread-3.

  3. 计时器 ( thread-0) 已到期并生成(可能是错误的术语)中断。

  4. 线程上下文切换 ( thread-3-> thread-0);

  5. 回调函数执行;

  6. 计时器 ( thread-1) 已到期并产生中断。

...

等等

PS0。我知道这不仅仅是多线程应用程序的一种可能情况。

问题:

  1. 我是否正确描述了工作过程?

  2. 难道我理解正确的话,即使当前线程thread-0它也导致上下文切换,因为线程必须停止执行当前的代码,并切换到执行从回调机能的研究码?

  3. 如果每个线程设置 100k 或 500k 计时器,它将如何影响性能?

  4. 硬件是否有计时器计数的限制?

  5. 更新计时器的超时时间有多昂贵?

c++ assembly asynchronous timer lock-free

0
推荐指数
1
解决办法
85
查看次数