2008-10-17 21 views
12

Estoy tratando de usar el controlador giveio.sys que requiere que se abra un "archivo" para poder acceder a la memoria protegida. Estoy mirando un ejemplo de C WinAVR/AVRdude que utiliza la sintaxis:Abrir un identificador a un dispositivo en Python en Windows

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

pero esto no parece funcionar en Python - Acabo de obtener un "La ruta especificada no es válido", tanto para

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

y

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

¿Por qué no hace esto lo mismo?

Editado con la esperanza de reducir la confusión de ideas (gracias Will). Verifiqué que el controlador del dispositivo se ejecuta a través de los archivos por lotes que vienen con AVRdude.

Modificó para aclarar la generosidad de SamB.

+0

@SamB ¿por qué tiene esto una recompensa ofrecida? fue resuelto y cerrado hace mucho tiempo ... – theheadofabroom

+0

@BiggAl: Esperaba que alguien explicara por qué (para tomar prestado el ejemplo de OP) 'os.open (" \\\\. \\ giveio ", os.O_RDONLY)' no hace esencialmente lo mismo que el anterior C. En retrospectiva, creo que debería haberlo dicho para empezar? – SamB

+0

@SamB ¿actualizarías la pregunta para reflejar eso? – theheadofabroom

Respuesta

2

Su pregunta es muy confusa, por decir lo menos.

1> El código que ha pegado está utilizando un truco para comunicarse con el controlador mediante su 'DOSNAME' es decir,

\\.\DRIVERNAME 

2> ¿Ha creado & carga del conductor giveio '?

La razón por la que el conductor maneja esta llama es debido a esto

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

1

No estoy seguro de si eso es posible. Como alternativa, podría escribir un programa C/C++ que haga que todo el espacio del kernel trabaje para usted e interactuar con él en Python a través de the subprocess module o Python C/C++ bindings (y another link para eso).

+0

El controlador GIVEIO.SYS hace que todo el espacio del kernel trabaje para usted. Todo lo que tiene que hacer con ese controlador es hablarle como si fuera a hablar con un puerto COM (llame a CreateFile para abrir el enlace de comunicación). –

3

No sé nada de Python, pero sé un poco sobre los controladores. No estás tratando de "abrir un archivo en el espacio del kernel" en absoluto; solo estás tratando de abrir un identificador para un dispositivo que parece estar hecho para parecerse un poco a la apertura de un archivo.

CreateFile es una función de modo de usuario, y todo lo que está haciendo aquí es el modo de usuario, no el modo kernel.

Como dice xenón, su llamada puede estar fallando porque no se ha cargado el controlador todavía, o lo que sea, porque Python llamada que está utilizando para hacer el CreateFile no está pasando los parámetros de escritura en.

I' Nunca utilicé giveio.sys, pero personalmente establecía que se cargó correctamente usando 'C' o C++ (o alguna aplicación preescrita) antes de intentar ponerlo en funcionamiento a través de Python.

5

Solución: en python debe usar win32file.CreateFile() en lugar de open(). Gracias a todos por decirme lo que estaba tratando de hacer, ¡me ayudó a encontrar la respuesta!

2

Hay 2 formas de hacerlo.

La primera forma es utilizar los enlaces Win32 pitón

h = win32file.CreateFile 

O usando ctypes

+1

Esta respuesta sería mejor si mostrara cómo dar los parámetros ... – SamB

+0

Los parámetros son los mismos que los que mencionó en la publicación original. Pero podrías descubrirlo por ti mismo si realmente te molestaste en realizar una simple búsqueda en Google. – Grim

2

Me suena como que está preguntando por qué os.open no es mágicamente igual a llamar a CreateFile con una muy conjunto específico de parámetros. La respuesta de Kostya es práctica, ya que te dice que puedes utilizar los enlaces de python de Win32 para llamar directamente a CreateFile que es una API de Win32.

Cualquier cosa que no sea directa CreateFile/readFile/writeFile IO va a introducir otra capa en la parte superior (los objetos del archivo python y sus comportamientos) que lo restringe a los parámetros admitidos por os.open. os.open crea un objeto de archivo python, que no es exactamente lo mismo, y no pretende proporcionar todas las opciones de Win32 CreateFile.

Eso significa, por ejemplo, que no existe ninguna analogía exacta de GENERIC_READ, o OPEN_EXISTING, o FILE_ATTRIBUTE_NORMAL.

Mi mejor opción es que os.open no está destinado a reemplazar las llamadas directas a CreateFile, para propósitos tan extraños como el que está usando.

Si puede leer C, ¿por qué no abre las fuentes de python y lee la implementación de os.open? Si realmente debe ir a través de os.open, va a averiguar qué parámetros debe pasar, de modo que, al final, la implementación de os.open (en C) llama a CreateFile en la API de Win32 con los parámetros correctos anteriores. Todo eso parece más trabajo, que solo usar la sugerencia de Kostya.

+0

En realidad, ['os.open'] (http://docs.python.org/library/os.html#os.open) se supone que es una envoltura muy directa alrededor de la función' open() 'del CRT (llamada ['_open()'] (http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx) en Visual C++) y, por lo tanto, devuelve un "descriptor de archivo" (un 'int' que hace referencia a la apertura archivo). Creo * que la capa que interferiría probablemente estaría allí, no en el código de Python ... – SamB

+0

Sí. Ahí vas. Es una envoltura alrededor de la función abierta de C Runtime Library, que tiene una semántica similar a posix, carente de las diversas características únicas que CreateFile expone. –

+0

Si esta es la mejor respuesta, debe aceptarla, ¿verdad, Sam? –

Cuestiones relacionadas