Debugging CreateProcessW是否已弃用?

Debugging CreateProcessW是否已弃用?,debugging,windbg,Debugging,Windbg,我找不到确切的答案,所以我决定问 我一直在阅读“Windows内部调试”,在示例中,它告诉我在内核32上设置断点!CreateProcessW 但在此之前,它使用.symfix调试器命令将调试器符号搜索路径设置为指向Microsoft online symbols服务器。当我试图设置断点时,我得到一个错误,它无法解析函数(或类似的东西)。看起来像这样 0:000> bp kernel32!CreateProcessW Couldn't resolve error at 'kernel32!

我找不到确切的答案,所以我决定问

我一直在阅读“Windows内部调试”,在示例中,它告诉我在内核32上设置断点!CreateProcessW

但在此之前,它使用.symfix调试器命令将调试器符号搜索路径设置为指向Microsoft online symbols服务器。当我试图设置断点时,我得到一个错误,它无法解析函数(或类似的东西)。看起来像这样

0:000> bp kernel32!CreateProcessW
Couldn't resolve error at 'kernel32!CreateProcessW'
这可能是因为下面的列表中没有“kernel32!CreateProcessW”

0:000> x kernel32!CreateProcess*
76b90cb9 KERNEL32!CreateProcessWithTokenW (void)
76b90d84 KERNEL32!CreateProcessAsUserW (void)
76b90d84 KERNEL32!CreateProcessWithLogonW (void)
76b4e225 KERNEL32!CreateProcessWStub = <no type information>
76b72e04 KERNEL32!CreateProcessInternalAStub = <no type information>
76b72e15 KERNEL32!CreateProcessInternalWStub = <no type information>
76b72de2 KERNEL32!CreateProcessAStub = <no type information>
76b72df3 KERNEL32!CreateProcessAsUserWStub = <no type information>
0:000>x内核32!创建进程*
76b90cb9内核32!CreateProcessWithTokenW(无效)
76b90d84内核32!CreateProcessAsUserW(无效)
76b90d84内核32!CreateProcessWithLogonW(无效)
76b4e225内核32!CreateProcessWStub=
76b72e04内核32!CreateProcessInternalAStub=
76b72e15内核32!CreateProcessInternalWStub=
76b72de2内核32!CreateProcessAStub=
76b72df3内核32!CreateProcessAsUserWStub=
如果我将断点设置为kernel32,一切都会正常进行!CreateProcessWStub但我想知道为什么我找不到断点并将其设置为内核32!CreateProcessW

这本书可能关注使用Windows7的读者。我正在使用Windows8.1,我想可能是内核32!CreateProcessW已被弃用


我对这个领域非常陌生,如果这是一个完全愚蠢的问题,我道歉。不过还是要感谢您的阅读。

CreateProcessW
绝对不会被弃用。此外,唯一记录的入口点仍然在kernel32.dll中,因此出于所有目的,您应该继续通过kernel32.dll而不是通过kernelbase.dll调用
CreateProcessW

下面是一些更详细的信息,有助于理解您所观察到的内容。Windows团队经常移动代码,在最近的几个版本中,他们有很强的习惯将较大的DLL分解为较小的DLL,其中包括kernel32、ole32、user32、gdi32等等。这并不是什么新鲜事,雷蒙德·陈在2006年说。然而,Raymond描述的机制是基于转发器的,而您在这里看到的是
kernel32!CreateProcessW
是一个存根,即调用kernelbase的函数!CreateProcessW,然后返回:

0:014> u kernel32!CreateProcessWStub l14
KERNEL32!CreateProcessWStub:
00007ffd`83cf58a8 4c8bdc          mov     r11,rsp
00007ffd`83cf58ab 4883ec58        sub     rsp,58h
00007ffd`83cf58af 488b8424a8000000 mov     rax,qword ptr [rsp+0A8h]
00007ffd`83cf58b7 498943f0        mov     qword ptr [r11-10h],rax
... skip ...
00007ffd`83cf58f5 ff1555871100    call    qword ptr [KERNEL32!_imp_CreateProcessW (00007ffd`83e0e050)]
00007ffd`83cf58fb 4883c458        add     rsp,58h
00007ffd`83cf58ff c3              ret 
您可以使用相同的命令来确定应在何处设置断点。同样,对于转发的出口:

c:\>link /dump /exports c:\Windows\System32\kernel32.dll | findstr EnterCriticalSection
        298  129          EnterCriticalSection (forwarded to NTDLL.RtlEnterCriticalSection)
       1418  589          TryEnterCriticalSection (forwarded to NTDLL.RtlTryEnterCriticalSection)
WinDbg无法解析符号内核32的原因!CreateProcess可能只是WinDbg中的一个bug。在这种情况下,这些符号不是.PDB文件的一部分,而是包含在PE映像中的一个特殊部分中,显然WinDbg不处理这个问题。有趣的是,如果.PDB文件不可用,WinDbg很乐意使用PE映像的导出表:

0:014> .sympath .
0:014> .reload
Reloading current modules ....
0:014> x kernel32!CreateProcessW
00007ffd`83cf58a8 <b>KERNEL32!CreateProcessW</b> (no parameter info)
0:014>.sympath。
0:014>。重新加载
正在重新加载当前模块。。。。
0:014>x内核32!CreateProcessW
00007ffd`83cf58a8内核32!CreateProcessW(无参数信息)

显然,WinDbg决定使用PDB符号或导出符号,但不能同时使用两者

我也注意到了这一点,并认为这是由于API的变化。您将在
KERNELBASE.DLL
中找到
CreateProcessW
。虽然使用depends仍然在
KERNEL32.DLL
中显示
CreateProcessW
,所以我对如何正确解释有些困惑。
c:\>link /dump /exports c:\Windows\System32\kernel32.dll | findstr EnterCriticalSection
        298  129          EnterCriticalSection (forwarded to NTDLL.RtlEnterCriticalSection)
       1418  589          TryEnterCriticalSection (forwarded to NTDLL.RtlTryEnterCriticalSection)
0:014> .sympath .
0:014> .reload
Reloading current modules ....
0:014> x kernel32!CreateProcessW
00007ffd`83cf58a8 <b>KERNEL32!CreateProcessW</b> (no parameter info)