删除由NtCreateSymbolicLinkObject创建的符号链接

时间:2013-10-29 00:15:57

标签: windows winapi nt-native-api

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

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

2 个答案:

答案 0 :(得分:1)

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

由于在定义上没有记录,因此在新的Windows SDK中winternl.h中的少数功能和类型除外,这些功能和类型在用户和内核模式之间共享(大多数为Rtl*, WDK中记录了Nt*Zw*)以及无论如何都要对其进行记录的许多工作(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的唯一方法(不算直接使用系统调用分派器,这对于除一些特殊用例之外的所有情况都是不切实际的)而且根本没有适合的功能。

但是,如果您的问题碰巧被要求使用内核模式,那么作为驱动程序开发人员,我可以很高兴地将您指向:IoDeleteSymbolicLink与{ {3}}(和IoCreateSymbolicLink)和 not ,其中NtCreateSymbolicLinkObject中有ZwCreateSymbolicLinkObject(或DriverEntry)。从文档中可以看出,使用I / O管理器的功能从驱动程序创建符号链接对象然后再次将其删除非常简单。

PS:您可能想看一下ReactOS的来源obname.coblink.c(均为obsymlink.cio/iomgr)成为好候选人。通常,您可以相对忠实地了解Windows如何实现此目的。但是有一些差异,ReactOS是一个移动的目标,因为它们过去已经更改了其兼容性的Windows版本。此外,在Windows版本(甚至Service Pack)之间,这些功能的行为也可能会发生变化。

答案 1 :(得分:1)

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

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

除非可能跟踪或构建要链接的ntdll.dll导入库,否则可能需要对NT *()函数调用使用函数指针和GetProcAddress()。