在Win32中创建命名设备



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

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

这是一个类似文件的对象,与Linux FIFOS相反,它不存在于主文件系统中,而是在特殊的内核名称空间中(这就是\.pipe的目的(。现在,我有一个居住在//./xillybus_read_32的设备,并想嘲笑它进行测试,即创建一种表现上的假货。根据MSDN的说法,这是Win32设备名称空间。如果可能,如何在那里创建一个类似管道的对象?编写驱动程序是必要的,还是有用户空间API?

(当然,我可以更改使用管道的消耗代码,或以其他十几种方式解决。但是我真的很好奇这个Win32设备名称空间。(

我想我找到了它。此评论,哈里·约翰斯顿(Harry Johnston(的评论以及一些通过winobj浏览的评论使我进入了解决方案。

import win32pipe, win32file, win32con
win32file.DefineDosDevice(win32con.DDD_RAW_TARGET_PATH, r'test_device', r'??GLOBALpipetest_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)

这里发生的是??将您留在SessionsDosDevices[LogonID]中。在该文件夹中,有一个符号链接GLOBAL导致GLOBAL??,其中命名管为实时。

为什么我无法通过\.GLOBAL??pipetest_pipe直接访问路径,为什么CreateFile和CreateNamedPipe可以在\.pipetest_pipe下找到它,我还不知道。我也不确定之后是否应该进行一些清理。尽管如此,这似乎有效。

相关内容

  • 没有找到相关文章

最新更新