NtCreateSymbolicLinkObject
在 Windows 对象管理器中创建一个对象(您可以使用系统内部的 WinObj 实用程序查看此类链接)。
删除符号链接对象的正确方法是什么?我注意到使用
NtOpenSymbolicLinkObject
可以在 DELETE
(仅限位 16)中指定 ACCESS_MASK
进行删除访问,但我需要知道的是如何实际执行删除?
要从用户模式删除本机对象命名空间符号链接:构建一个描述链接对象的 OBJECT_ATTRIBUTES 结构,然后:
...
if (NtOpenSymbolicLinkObject( &handle, DELETE, &objectAttributes) == STATUS_SUCCESS)
{
NtMakeTemporaryObject( handle);
NtClose( handle);
}
您可能需要使用函数指针和 GetProcAddress() 来进行 NT*() 函数调用,除非您可以追踪或构建要链接的 ntdll.dll 导入库。
您的问题实际上并未指定您是否要求用户模式或内核模式。我的猜测是,由于您also指定了winapi,因此您正在寻找用户模式下的解决方案。据我所知,
ntdll.dll
中没有公开此类功能。坦率地说,我从来没有想过为什么。所以:好问题!
由于 nt-native-api 根据定义未记录,除了较新的 Windows SDK 中
winternl.h
中的少数函数和类型外,那些在用户模式和内核模式之间共享的函数和类型(主要是 Rtl*
、Nt*
和Zw*
)记录在 WDK 中以及记录它们的许多努力(ReactOS、 这个网站,Process Hacker源代码,WINE等等),只有微软才能给你真正确定的答案。但即使他们也可能会要求您指定特定的 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
,它与IoCreateSymbolicLink
(和)配对IoCreateUnprotectedSymbolicLink
)和不与NtCreateSymbolicLinkObject
(或 ZwCreateSymbolicLinkObject
)在 DriverEntry
内。正如您从文档中可以看出,使用 I/O 管理器的函数从驱动程序创建符号链接对象并再次删除它是非常简单的。
PS:您可能想看一下 ReactOS 源代码
obname.c
、oblink.c
(ob
)和 symlink.c
(io/iomgr
) 似乎都是不错的选择。通常,您可以相对准确地了解 Windows 如何实现这一点。但还是有一些差异,ReactOS 是一个不断变化的目标,因为他们过去为了兼容而改变了 Windows 版本。此外,这些函数的行为也可能并且将会在 Windows 版本(甚至服务包)之间发生变化。