在Windows上打开Python设备的句柄

时间:2008-10-17 15:47:40

标签: python windows device

我正在尝试使用需要“文件”的giveio.sys驱动程序才能访问受保护的内存。我正在看WinAVR / AVRdude中使用语法的C示例:

 #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的赏金。

6 个答案:

答案 0 :(得分:5)

解决方案:在python中你必须使用win32file.CreateFile()而不是open()。谢谢大家告诉我我想要做什么,它帮助我找到答案!

答案 1 :(得分:3)

我对Python一无所知,但我对驱动程序有所了解。你根本不是试图“在内核空间中打开一个文件” - 你只是试图打开设备的句柄,这看起来有点像打开一个文件。

CreateFile是一个用户模式函数,你在这里所做的一切都是用户模式,而不是内核模式。

正如xenon所说,你的调用可能失败了,因为你还没有加载驱动程序,或者因为你用来做CreateFile的Python调用没有传递写入参数。

我自己从未使用过giveio.sys,但在我尝试通过Python工作之前,我个人会确定它是通过使用'C'或C ++(或一些预先编写的应用程序)正确加载的。

答案 2 :(得分:2)

至少可以说,你的问题非常混乱。

1>您粘贴的代码使用诀窍与驱动程序使用其“DOSNAME”进行通信,即

\\.\DRIVERNAME

2 - ;你创造了&加载'giveio'驱动程序?

驱动程序处理此调用的原因是因为

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

答案 3 :(得分:2)

有两种方法可以做到这一点。

第一种方法是使用win32 python绑定

h = win32file.CreateFile

或使用ctypes

答案 4 :(得分:2)

听起来像你在问为什么os.open与使用一组非常具体的参数调用CreateFile并不神奇相等。 Kostya的答案是实用的,因为它告诉您可以使用Win32 python绑定直接调用WinF API的CreateFile。

除了直接创建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中)使用上面的正确参数调用Win32 API中的CreateFile。所有这些看起来更像是工作,而不仅仅是使用Kostya的建议。

答案 5 :(得分:1)

我不确定这是否可行。作为替代方案,您可以编写一个C / C ++程序,它可以为您完成所有内核空间的工作,并通过the subprocess modulePython C/C++ bindings(以及another link)与Python进行交互。