Создать именованное устройство в win32
Я могу создать именованный канал в Windows через CreateNamedPipe
,
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. Если возможно, как я могу создать подобный трубе объект там? Будет ли необходимо написать драйвер, или есть API пользовательского пространства?
(Конечно, я могу просто изменить потребляющий код для использования моего канала или решить его десятком других способов. Но мне действительно любопытно это пространство имен устройства Win32.)
1 ответ
Я думаю, что нашел это. Этот комментарий, комментарии Гарри Джонстона и некоторые просмотры 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
Пока не знаю Я также не уверен, должен ли я сделать некоторую очистку после этого. Тем не менее, это похоже на работу.