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 では、open() の代わりに win32file.CreateFile() を使用する必要があります。私がやろうとしていたことを教えてくれてありがとう、答えを見つけるのに役立ちました!

于 2008-10-20T14:07:25.040 に答える
3

Pythonについては何も知りませんが、ドライバーについては少し知っています。「カーネル空間でファイルを開こうとしている」のではなく、ファイルを開くように見えるデバイスへのハンドルを開こうとしているだけです。

CreateFileはユーザーモード関数であり、ここで行うことはすべてユーザーモードであり、カーネルモードではありません。

キセノンが言うように、まだドライバーをロードしていないか、CreateFileを実行するために使用しているPython呼び出しが書き込みパラメーターを渡していないために、呼び出しが失敗する可能性があります。

私自身はgiveio.sysを使用したことはありませんが、Pythonで動作させる前に、個人的には「C」またはC ++(または事前に作成されたアプリ)を使用して正しくロードされたことを確認しました。

于 2008-10-18T10:32:02.493 に答える
2

それが可能かどうかはわかりません。別の方法として、カーネル空間をすべて実行するC / C ++プログラムを作成し、サブプロセスモジュールまたはPython C / C ++バインディング(およびそのための別のリンク)を介してPythonでインターフェースすることもできます。

于 2008-10-18T07:54:21.453 に答える
2

あなたの質問は控えめに言っても非常に混乱しています。

1>貼り付けたコードは、トリックを使用して「DOSNAME」を使用してドライバーと通信しています。

\\.\DRIVERNAME

2>「giveio」ドライバーを作成してロードしましたか?

ドライバーがこの呼び出しを処理する理由は、これが原因です

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

于 2008-10-17T22:38:41.403 に答える
2

os.openが、非常に特定のパラメーターのセットを使用してCreateFileを呼び出すことと魔法のように等しくない理由をあなたが尋ねているように私には聞こえます。Kostyaの答えは、Win32pythonバインディングを使用してWin32APIであるCreateFileを直接呼び出すことができるという点で実用的です。

直接CreateFile/readFile / writeFile IOを実行する以外のことは、os.openがサポートするパラメーターに制限する別のレイヤー(Pythonファイルオブジェクトとその動作)を上に導入します。os.openは、Pythonファイルオブジェクトを作成します。これはまったく同じものではなく、Win32CreateFileのすべてのオプションを提供することを目的としたものではありません。

これは、たとえば、GENERIC_READ、OPEN_EXISTING、またはFILE_ATTRIBUTE_NORMALの正確な類似物が存在することが保証されていないことを意味します。

私の推測では、os.openは、使用しているような奇妙な目的で、CreateFileへの直接呼び出しを置き換えることを意図したものではありません。

Cが読めるなら、Pythonのソースを開いて、os.openの実装を読んでみませんか。本当にos.openを実行する必要がある場合は、それに渡すパラメーターを見つけることになります。そのため、最終的に、os.openの実装(C)は、上記の正しいパラメーターを使用してWin32APIのCreateFileを呼び出します。Kostyaの提案を使用するだけではなく、それはすべて仕事のように思えます。

于 2011-05-05T01:59:00.137 に答える
1

これには 2 つの方法があります。

最初の方法は、win32 python バインディングを使用することです

h = win32file.CreateFile

またはctypesを使用する

于 2011-05-03T14:11:26.537 に答える