在win32中创建命名设备

时间:2017-05-31 08:48:57

标签: winapi windows-kernel

我可以通过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设备名称空间非常好奇。)

1 个答案:

答案 0 :(得分:2)

我想我找到了它。 This comment,Harry Johnston的评论,以及一些浏览WinObj的人给我带来了解决方案。

char **array2 = malloc(num * sizeof(char *));
*array = array2;
...
for (i=0; i<num; i++) {
    char line[250];
    // read the line into "line"
    array2[i] = strdup(line);
}

这里发生的事情是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??访问路径,以及为什么CreateFile和CreateNamedPipe可以在\\.\GLOBAL??\pipe\test_pipe下找到它,我还不知道。我也不确定之后是否应该做一些清理工作。然而,这似乎有效。