Windows Server调试:在WDM内核模式驱动程序断点中查看用户模式堆栈

时间:2014-12-03 12:10:16

标签: windows stack driver wdm

我正在使用Visual Studio内核模式调试WDM内核驱动程序IOCTL通过管道调试器串行连接到运行Windows Server 2012 R2的Hyper-V VM。 一旦我在Driver IOControl内部遇到断点,就可以查看用户模式调用堆栈了吗?

目前我只能看到内核堆栈,例如:

    SIoctl!SioctlDeviceControl+0x14b [d:\workspace\ioctl\c++\sys\sioctl.c @ 320]    C/C++/ASM
    nt!IovCallDriver+0x3cd  C/C++/ASM
    nt!IopXxxControlFile+0x8d2  C/C++/ASM
    nt!NtDeviceIoControlFile+0x56   C/C++/ASM
    nt!KiSystemServiceCopyEnd+0x13  C/C++/ASM
    ntdll!NtDeviceIoControlFile+0xa C/C++/ASM
    KERNELBASE!DeviceIoControl+0x73 C/C++/ASM
    KERNEL32!DeviceIoControl+0x80   C/C++/ASM
    0x9c402408  C/C++/ASM
>   0x0000005e`2f5af9c8 C/C++/ASM

2 个答案:

答案 0 :(得分:0)

是的,您需要先切换到所需的流程,然后才能访问它的堆栈。见.process

  

.process命令指示内核调试器使用特定的用户模式进程作为进程上下文。这种用法有几种效果,但最重要的是调试器可以访问此进程的虚拟地址空间。调试器使用此进程的页表来解释所有用户模式的内存地址,以便您可以读取和写入此内存。

     

注意如果您正在进行实时调试,则应使用/i/p参数。如果没有这些参数之一,则无法正确显示用户模式或会话内存。   /i参数激活目标进程。使用此选项时,必须执行一次目标才能使此命令生效。如果再次执行,则进程上下文将丢失。   /p参数启用forcedecodeuser设置。 (如果forcedecodeuser选项已处于活动状态,则不必使用/p。)进程上下文和forcedecodeuser状态仅在目标再次执行之前保持不变。

我知道你问过Visual Studio,我回答了WinDbg。我认为你应该使用适合这项工作的工具。在调试时,WinDbg更加灵活,功能更强大。我认为在VS中你会使用Process context,但我建议再次使用WinDbg。

答案 1 :(得分:0)

我尝试过使用!process 0 0 app.exe然后执行.process / i pid或.process / P id,两者都无法显示用户堆栈。 我认为这是因为我已经在这个过程中,即使认为它在内核驱动程序中,运行的进程也是application.exe。因此,当我查看调用堆栈窗口或键入k时,我只看到内核堆栈。

" Visual studio方式" "切换"对于不同的进程似乎不起作用,我唯一能做的就是遍历不同的堆栈帧(仅在内核堆栈中 - 与调用堆栈窗口中显示的相同)。

我会尝试在WinDbg中进行操作,看看它是否有所不同。

编辑:

我现在做了一些不同的事情,在切换我做的上下文之后!线程然后.thread到出现的一个线程,它现在正在睡眠调用中工作。不知何故,在我的IOCTL中它不起作用。但我现在尝试使用WinDbg并且效果非常好!

非常感谢!

相关问题