【问题标题】:Create named device in win32在win32中创建命名设备
【发布时间】:2017-05-31 08:48:56
【问题描述】:

我可以通过CreateNamedPipe 在 Windows 中创建命名管道。

p = win32pipe.CreateNamedPipe(r'\\.\pipe\test_pipe',
    win32pipe.PIPE_ACCESS_DUPLEX,
    win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
    1, 65536, 65536,300,None)

这是一个类似文件的对象,与 Linux FIFO 相比,它并不存在于主文件系统中,而是存在于一个特殊的内核命名空间中(这就是 \\.\pipe 的用途)。现在,我有一个位于//./xillybus_read_32 的设备,并且想模拟它以进行测试,即创建一个行为类似它的假货。根据 MSDN,这是Win32 device namespace。如果可能的话,我怎样才能在那里创建一个类似管道的对象?是否需要编写驱动程序,或者是否有用户空间API?

(当然,我可以更改消费代码以使用我的管道,或者通过其他十几种方式解决它。但我真的对这个 Win32 设备命名空间很好奇。)

【问题讨论】:

  • 不是您问题的答案,但您可能对 Sysinternal 的 WinObj(可从 Microsoft 网站下载)感兴趣,它允许您查看内核命名空间的内容。
  • 认为解释 \\.foo 的方式意味着您可以使用 DefineDosDevice 在设备命名空间中创建从 xillybus_read_32 到命名管道的符号链接.但我不确定细节。

标签: winapi windows-kernel


【解决方案1】:

我想我找到了。 This comment,来自 Harry Johnston 的 cmets,以及一些浏览 WinObj 的人让我找到了解决方案。

import win32pipe, win32file, win32con

win32file.DefineDosDevice(win32con.DDD_RAW_TARGET_PATH, r'test_device', r'\??\GLOBAL\pipe\test_pipe')

fileHandle = win32file.CreateFile(r"//./test_device",
                              win32file.GENERIC_READ | win32file.GENERIC_WRITE,
                              0, None,
                              win32file.OPEN_EXISTING,
                              0, None)
data = win32file.ReadFile(fileHandle, 4096)
print (data)

这里发生的是\?? 将您留在\Sessions\0\DosDevices\[LogonID]。在该文件夹中,有一个符号链接 GLOBAL 指向 \GLOBAL??,命名管道位于其中。

为什么我不能直接通过\\.\GLOBAL??\pipe\test_pipe访问路径,为什么CreateFile和CreateNamedPipe可以在\\.\pipe\test_pipe下找到,我还不知道。我也不确定我是否应该在之后进行一些清理。不过,这似乎可行。

【讨论】:

  • 可以通过\\?\pipe\test_pipe路径访问。路径\\.\GLOBAL??\pipe\test_pipe被win32转换为\??\GLOBAL??\pipe\test_pipe无效。同样在电话DefineDosDevice 中,您可以使用\GLOBAL??\pipe\test_pipe\Device\NamedPipe\test_pipe 代替您使用的路径
  • nt-path \??\ 是虚拟的 - 它不存在 - Ob-manager 在查看时尝试将其转换为 2 个路径 - 首先是 \Sessions\0\DosDevices\ LogonID (如果您不在 LocalSystem luid 下运行),然后(如果找不到第一个路径) - 到 \GLOBAL??\ 。如果您想按原样使用直接路径并访问 \GLOBAL??\ direct - 您需要使用 Nt* api。 win32 api 使用自己的命名空间,并在调用本机 api 之前将其转换为 nt-form。但没有任何本机路径具有 win32 等效项。说 \GLOBAL??\ - 没有。和 win32 层将 \\.\ 和 \\?\ 转换为 \??\
猜你喜欢
  • 2016-07-11
  • 2014-06-21
  • 2020-11-05
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多