【问题标题】:Deleting symlink created by NtCreateSymbolicLinkObject删除由 NtCreateSymbolicLinkObject 创建的符号链接
【发布时间】:2013-11-07 23:20:08
【问题描述】:

NtCreateSymbolicLinkObject 在 Windows 对象管理器中创建一个对象(您可以使用 System Internals 中的 WinObj 实用程序查看此类链接)。

删除符号链接对象的正确方法是什么?我注意到使用NtOpenSymbolicLinkObject 可以在ACCESS_MASK(仅限第16 位)中指定DELETE 进行删除访问,但我需要知道的是如何实际进行删除?

【问题讨论】:

    标签: windows winapi nt-native-api


    【解决方案1】:

    要从用户模式中删除本机对象命名空间符号链接:构建描述链接对象的 OBJECT_ATTRIBUTES 结构,然后:

    ...
    if (NtOpenSymbolicLinkObject( &handle, DELETE, &objectAttributes) == STATUS_SUCCESS)
    {
        NtMakeTemporaryObject( handle);
        NtClose( handle);
    }
    

    您可能需要将函数指针和 GetProcAddress() 用于 NT*() 函数调用,除非您可以跟踪或构建一个 ntdll.dll 导入库来链接。

    【讨论】:

      【解决方案2】:

      您的问题实际上并未指定您是在要求用户模式还是内核模式。我的猜测是,由于您指定了,因此您正在寻找用户模式下的解决方案。据我所知,ntdll.dll 没有公开这样的功能。坦率地说,我什至从未想过为什么。所以:好问题!

      由于 在定义上没有记录,除了较新的Windows SDK 中winternl.h 中的少数函数和类型,用户和内核模式之间共享的那些(主要是Rtl*Nt* 和@987654331 @) 记录在 WDK 中以及为记录它们所做的许多努力(ReactOS、this site、Process Hacker 源代码、WINE 等),只有 Microsoft 可以给你一个真正明确的答案。但即使他们也可能会要求您指定特定的 Windows 版本。

      但是,我们仍然可以根据可用信息做出最佳猜测。

      在我的 Windows 7 x64 上,我可以看到以下内容(与 dumpbin /exports ntoskrnl.exe|findstr /i Symbolic 相比):

      C:\Windows\System32>dumpbin /exports ntdll.dll|findstr /i Symbolic
              266   FB 000208BC NtCreateSymbolicLinkObject = _ZwCreateSymbolicLinkObject@16
              379  16C 00021150 NtOpenSymbolicLinkObject = _ZwOpenSymbolicLinkObject@12
              440  1A9 00021588 NtQuerySymbolicLinkObject = _ZwQuerySymbolicLinkObject@12
             1517  5E4 000208BC ZwCreateSymbolicLinkObject = _ZwCreateSymbolicLinkObject@16
             1628  653 00021150 ZwOpenSymbolicLinkObject = _ZwOpenSymbolicLinkObject@12
             1689  690 00021588 ZwQuerySymbolicLinkObject = _ZwQuerySymbolicLinkObject@12
      

      所以对于用户模式,我们似乎确实不走运。 ntdll.dll 是 - 据我所知 - 我们从用户模式访问 NT 本机 API 的唯一方法(不计算直接使用系统调用调度程序,这对于除少数特殊用例外的所有用例都是不切实际的)并且那里根本没有符合要求的功能。

      但是,如果您的问题恰好是针对内核模式提出的,那么 -- 作为驱动程序开发人员 -- 我可以很高兴地指出:IoDeleteSymbolicLinkIoCreateSymbolicLink 配对(和IoCreateUnprotectedSymbolicLink)并且DriverEntry内带有NtCreateSymbolicLinkObject(或ZwCreateSymbolicLinkObject)。从文档中可以看出,使用 I/O 管理器的函数从驱动程序创建符号链接对象并再次删除它是非常简单的。

      PS:你可能想看看 ReactOS 的源代码obname.coblink.cob)和symlink.cio/iomgr)似乎是不错的候选者。通常,您可以相对忠实地了解 Windows 将如何实现这一点。但差异,ReactOS 是一个移动的目标,因为他们过去更改了他们针对兼容性的 Windows 版本。此外,这些函数的行为也可以并且将会在 Windows 版本(甚至服务包)之间发生变化。

      【讨论】:

        猜你喜欢
        • 2016-09-15
        • 2014-04-14
        • 2015-05-30
        • 1970-01-01
        • 2010-09-17
        • 2017-06-10
        • 1970-01-01
        • 2019-03-31
        • 2020-11-10
        相关资源
        最近更新 更多