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