Winapi Windows上的低开销I/O监视

Winapi Windows上的低开销I/O监视,winapi,process,trace,Winapi,Process,Trace,我想要一种低开销的方法来监视Windows进程的I/O 我得到了一些有用的答案。最有希望的是使用Windows Performance Toolkit获取内核事件跟踪。所有必要的信息确实都可以从那里提取出来,但是WPT对于我所需要的东西来说是一个巨大的过度使用,并且随后会产生令人望而却步的开销 我的想法是实现一种检测C/C++依赖关系图的替代方法。通常这是通过向编译器传递一个选项来完成的,例如(-M)。这适用于具有此选项的编译器和工具,但并非所有编译器和工具都具有此选项,而且这些编译器和工具通常

我想要一种低开销的方法来监视Windows进程的I/O

我得到了一些有用的答案。最有希望的是使用Windows Performance Toolkit获取内核事件跟踪。所有必要的信息确实都可以从那里提取出来,但是WPT对于我所需要的东西来说是一个巨大的过度使用,并且随后会产生令人望而却步的开销

我的想法是实现一种检测C/C++依赖关系图的替代方法。通常这是通过向编译器传递一个选项来完成的,例如(-M)。这适用于具有此选项的编译器和工具,但并非所有编译器和工具都具有此选项,而且这些编译器和工具通常以不同的方式实现它们。因此,我在Linux上实现了另一种方法,使用strace检测打开了哪些文件。以这种方式运行gcc(例如)有50%的开销(大概的数字),我希望找到一种在windows上以类似的开销实现这一点的方法

xperf工具集存在两个问题,在这种情况下无法使用它们:

  • 无法监视单个进程的文件I/O事件;我必须使用内核事件跟踪,它跟踪每个进程,从而生成大量数据(运行gcc、YMMV所需的时间为15Mb)
  • 由于必须使用内核事件跟踪,我必须以管理员身份运行
我真的不需要内核级别的事件;我想如果我可以监视,比如说,Win32 API调用CreateFile(),如果我想捕获分叉进程,可能还可以监视CreateProcess()


有什么好主意吗?

我过去用微软的通过拦截特定的API调用来跟踪内存分配。您可以使用它来跟踪CreateFile和CreateProcess。

使用API挂钩。在ntdll中挂接NtCreateFile和一些其他调用就足够了。我在使用easyhook作为一个框架进行钩住本身方面有很好的经验-免费且开源。如果你想这样做的话,甚至可以支持托管挂钩(c#等)。设置起来很容易

它位于

编辑:顺便说一句,绕道不允许64位挂接(除非您以10000美元的名义价格购买许可证)
EasyHook不允许本机钩子跨越WOW64边界。但它允许跨WOW64边界进行托管挂接

这似乎正是我想要的。它基本上是Windows的一个
strace
实现。

此外,我自己也没有使用过它,但EasyHook()通常被称为优于迂回。这似乎正是我想要的。谢谢所以使用EasyHook,在64位系统上挂接NTCreateFile是没有意义的?