Открытие дескриптора устройства в Python в Windows - PullRequest
12 голосов
/ 17 октября 2008

Я пытаюсь использовать драйвер 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 ]

5 голосов
/ 20 октября 2008

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

3 голосов
/ 18 октября 2008

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

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

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

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

2 голосов
/ 05 мая 2011

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

Что-либо кроме выполнения прямого ввода-вывода CreateFile / readFile / writeFile собирается представить еще один слой сверху (объекты файла 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 с правильными параметрами, указанными выше. Все это больше похоже на работу, чем просто использование предложения Кости.

2 голосов
/ 03 мая 2011

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

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

h = win32file.CreateFile

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

2 голосов
/ 18 октября 2008

Ваш вопрос очень запутанный, если не сказать больше.

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

\\.\DRIVERNAME

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

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

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

1 голос
/ 18 октября 2008

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

...