Подтвердить что ты не робот

Открытие дескриптора устройства на 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)

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

\\.\DRIVERNAME

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

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

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

Ответ 4

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

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

h = win32file.CreateFile

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

Ответ 5

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

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