13

我正在尝试使用需要打开“文件”才能访问受保护内存的 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)

为什么这不做同样的事情?

编辑以希望减少想法的混乱(感谢威尔)。我确实通过 AVRdude 附带的批处理文件验证了设备驱动程序是否正在运行。

进一步编辑以澄清 SamB 的赏金。

4

6 回答 6

6

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

于 2008-10-20T14:07:25.040 回答
3

I don't know anything about Python, but I do know a bit about drivers. You're not trying to 'open a file in kernel space' at all - you're just trying to open a handle to a device which happens to be made to look a bit like opening a file.

CreateFile is a user-mode function, and everything you're doing here is user-mode, not kernel mode.

As xenon says, your call may be failing because you haven't loaded the driver yet, or because whatever Python call you're using to do the CreateFile is not passing the write parameters in.

I've never used giveio.sys myself, but personally I would establish that it was loaded correctly by using 'C' or C++ (or some pre-written app) before I tried to get it working via Python.

于 2008-10-18T10:32:02.493 回答
2

至少可以说,您的问题非常令人困惑。

1>您粘贴的代码使用了一个技巧来使用它的“DOSNAME”与驱动程序进行通信,即

\\.\DRIVERNAME

2> 您是否创建并加载了“giveio”驱动程序?

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

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

于 2008-10-17T22:38:41.403 回答
2

我不确定这是否可能。作为替代方案,您可以编写一个 C/C++ 程序来为您完成所有内核空间工作,并通过子进程模块Python C/C++ 绑定(以及另一个链接)在 Python 中与它交互。

于 2008-10-18T07:54:21.453 回答
2

在我看来,您在问为什么 os.open 并不神奇地等于使用一组非常具体的参数调用 CreateFile。Kostya 的回答很实用,因为它告诉您可以使用 Win32 python 绑定直接调用 Win32 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 的建议。

于 2011-05-05T01:59:00.137 回答
1

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

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

h = win32file.CreateFile

或使用 ctypes

于 2011-05-03T14:11:26.537 回答