Открытие дескриптора устройства на Python в Windows

Я пытаюсь использовать драйвер giveio.sys, для которого требуется открыть «файл», прежде чем вы сможете получить доступ к защищенной памяти. Я смотрю пример C из WinAVR / AVRdude, который использует синтаксис:

#define DRIVERNAME "\\\\.\\giveio" HANDLE h = CreateFile(DRIVERNAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

но это, похоже, не работает в Python – я просто получаю ошибку «Указанный путь недействителен», для обоих

 f = os.open("\\\\.\\giveio", os.O_RDONLY) 

а также

 f = os.open("//./giveio", os.O_RDONLY) 

Почему это не делает то же самое?

Отредактировано, чтобы надеяться уменьшить путаницу идей (спасибо Уилл). Я проверил, что драйвер устройства работает через пакетные файлы, которые поставляются с AVRdude.

Далее отредактирован, чтобы уточнить щедрость SamB.

6 Solutions collect form web for “Открытие дескриптора устройства на Python в Windows”

Решение: в python вам нужно использовать win32file.CreateFile () вместо open (). Спасибо всем за то, что рассказали мне, что я пытаюсь сделать, это помогло мне найти ответ!

Я ничего не знаю о Python, но я немного знаю о драйверах. Вы вообще не пытаетесь «открыть файл в пространстве ядра» – вы просто пытаетесь открыть дескриптор устройства, которое должно быть похоже на открытие файла.

CreateFile – это функция пользовательского режима, и все, что вы здесь делаете, это режим пользователя, а не режим ядра.

Как говорит ксенон, ваш вызов может быть неудачным, потому что вы еще не загрузили драйвер, или потому, что любой вызов Python, который вы используете для создания CreateFile, не передает параметры записи.

Я никогда не использовал giveio.sys самостоятельно, но лично я бы установил, что он был загружен правильно, используя «C» или C ++ (или некоторое предварительно написанное приложение), прежде чем я попытался заставить его работать через Python.

Вы сомневаетесь, что это смущает, если не сказать больше.

1> Код, который вы вставили, использует трюк для связи с драйвером, используя его «DOSNAME», т.е.

 \\.\DRIVERNAME 

2> Вы создали и загрузили драйвер 'giveio'?

Причина, по которой водитель обрабатывает эти вызовы, объясняется этим

http://msdn.microsoft.com/en-us/library/ms806162.aspx

Есть два способа сделать это.

Первый способ – использовать привязки python win32

 h = win32file.CreateFile 

Или используя ctypes

Это звучит так, как будто вы спрашиваете, почему os.open не волшебным образом соответствует вызову CreateFile с очень специфическим набором параметров. Ответ Кости практичен тем, что он говорит вам, что вы можете использовать привязки python Win32 для прямого вызова CreateFile, который является API Win32.

Все что угодно, кроме прямого DirectFile / readFile / writeFile IO, представляет новый слой сверху (объекты файла python и их поведение), который ограничивает вас параметрами, поддерживаемыми os.open. os.open создает объект файла python, который не совсем то же самое, и не предназначен для предоставления всех параметров Win32 CreateFile.

Это означает, например, что никакой точный аналог GENERIC_READ, OPEN_EXISTING или FILE_ATTRIBUTE_NORMAL не существует.

Мое лучшее предположение заключается в том, что os.open не предназначен для замены прямых вызовов CreateFile, для таких нечетных целей, как тот, для которого вы его используете.

Если вы можете прочитать C, почему бы не открыть источники для python и прочитать реализацию os.open. Если вам действительно нужно пройти через os.open, вы узнаете, какие параметры должны пройти к нему, так что в итоге реализация os.open (в C) вызывает CreateFile в Win32 API с правильными параметрами выше. Все это больше похоже на работу, чем на использование Кости.

Я не уверен, что это возможно. В качестве альтернативы вы можете написать программу на C / C ++, которая делает все это пространство ядра для вас и взаимодействовать с ним в Python с помощью модуля подпроцесса или связок Python C / C ++ (и еще одной ссылки для этого).

  • Не удается запустить службу Windows, написанную на Python (win32serviceutil)
  • цикл над пакетным скриптом, который не заканчивается
  • Что именно делает win32com.client.Dispatch («WScript.Shell»)?
  • UnicodeEncodeError при использовании функции компиляции
  • Изменение фона Windows с Python
  • Запуск командного файла в другом каталоге в python
  • Windows - работает .py прямо против запуска python blah.py ведет себя по-другому
  • Как установить PyCrypto в Windows?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.