我正在尝试使用需要“文件”的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的赏金。
答案 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'驱动程序?
驱动程序处理此调用的原因是因为
答案 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 module或Python C/C++ bindings(以及another link)与Python进行交互。