如何调试ISAPI过滤器?

3

ISAPI过滤器是附加到IIS Web服务器的w3wp进程的dll。ISAPI过滤器必须强制导出两个函数,即HttpFilterProc和GetFilterVersion。我编写了一个这样的过滤器,但是它没有按照预期工作,因为HttpFilterProc中的switch case没有被激活。我应该怎么做来检查问题所在?


请查看我的答案,链接在这里:https://dev59.com/BknSa4cB1Zd3GeqPOX_P#10037270 - dpiskyulev
1个回答

2
在HttpFilterProc中添加一个调用DebugBreak的语句,并在将其作为ISAPI过滤器添加之前以调试模式构建您的DLL。
如果HttpFilterProc被调用,Windows会弹出一个消息以调试该进程。
如果没有调用HttpFilterProc,则说明您的DLL没有被加载。您需要检查为什么没有加载。一些可能的原因包括:
  1. ISAPI过滤器与应用程序池位数不同。
  2. 在GetFilterVersion函数中未注册任何ISAPI事件。请参见ISAPI事件列表here

1
使用DebugBreak命令注入的方法是可行的,但为什么当我附加到运行我的网站的w3wp.exe时它不起作用呢?它可以成功附加,但无法加载ISAPI过滤器符号(“当前无法触发断点。未为此文档加载任何符号”)? - Mike Keskinov
@MikeKeskinov,你确定在运行网站时使用了正确的库吗?当代码库与可执行文件内加载的DLL不匹配时,通常会出现这种情况。 - Paras Gera
是的,我确定,因为我有一个项目打开。当我在其中放置DebugBreak,构建它,附加到IIS,然后当它触发DebugBreak时,我可以调试它。如果我简单地构建它而没有DebugBreak,我尝试附加到运行网站的进程w3wp,但它不会通过网站使用的ISAPI过滤器中的断点加载。也许ISAPI由某个不同的进程运行? - Mike Keskinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接