您的问题实际上并未指定您是在要求用户模式还是内核模式。我的猜测是,由于您也指定了winapi,因此您正在寻找用户模式下的解决方案。据我所知,ntdll.dll 没有公开这样的功能。坦率地说,我什至从未想过为什么。所以:好问题!
由于nt-native-api 在定义上没有记录,除了较新的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 的唯一方法(不计算直接使用系统调用调度程序,这对于除少数特殊用例外的所有用例都是不切实际的)并且那里根本没有符合要求的功能。
但是,如果您的问题恰好是针对内核模式提出的,那么 -- 作为驱动程序开发人员 -- 我可以很高兴地指出:IoDeleteSymbolicLink 与 IoCreateSymbolicLink 配对(和IoCreateUnprotectedSymbolicLink)并且不在DriverEntry内带有NtCreateSymbolicLinkObject(或ZwCreateSymbolicLinkObject)。从文档中可以看出,使用 I/O 管理器的函数从驱动程序创建符号链接对象并再次删除它是非常简单的。
PS:你可能想看看 ReactOS 的源代码obname.c、oblink.c(ob)和symlink.c(io/iomgr)似乎是不错的候选者。通常,您可以相对忠实地了解 Windows 将如何实现这一点。但有差异,ReactOS 是一个移动的目标,因为他们过去更改了他们针对兼容性的 Windows 版本。此外,这些函数的行为也可以并且将会在 Windows 版本(甚至服务包)之间发生变化。