1

私は c# でアプリケーションを開発しており、USB 大容量ストレージが挿入されたときに検証を行いたいと考えています。

問題は、その検証中に、大容量ストレージのメッセージをメッセージ キューから取り出したいことです。

男は、C#ではできず、アセンブリ言語を使用するCでのみ行うことができると私に言いました。

オペレーティング システムのメッセージ キューからメッセージを取得するために C# から使用できる C ライブラリを見つけるのを手伝ってくれませんか?

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {

                case Win32.WM_DEVICECHANGE: 


                    //OnDeviceChange(ref m);                

                    break;
            }
            base.WndProc(ref m);

        }

        void OnDeviceChange(ref Message msg)
        {
            int wParam = (int)msg.WParam;

            if (wParam == Win32.DBT_DEVICEARRIVAL)
            {
                label1.Text = "Arrival";
                //MessageBox.Show("" + wParam);
                //msg = Message.Create(new IntPtr(),1,new IntPtr(),new IntPtr());
            }
            else if (wParam == Win32.DBT_DEVICEREMOVECOMPLETE) label1.Text =
             "Remove";
        }

私はこれを行いましたが、何が起こったのかを伝えるだけです。

オペレーティング システムがデバイスについて認識しないようにメッセージをオフにしてから、検証が検証された場合にメッセージを再度オンにしたいと考えています。

4

2 に答える 2

2

起こらないだろう、男。Win32WM_DEVICECHANGEメッセージを受信するまでに、デバイスはすでに非常に多くロードされています。カーネルはデバイスを認識し、ドライバをロードしました。この場合、大容量記憶装置として、すでにボリュームを作成しています。これがすべて(ほとんど)カーネルモードのアクティビティです。次に、Win32(ユーザーモード)はこのメッセージをすべてのトップレベルウィンドウにブロードキャストします。Win32レベル、およびこのメカニズムでは、どの言語でもそれを行うことはできません。WM_DEVICECHANGE

これを行うには、デバイスドライバーを作成する必要があります。これらはCで記述され、カーネルモードで実行され、単純なC#アプリよりも実装が非常に困難です。私はあなたがあなたがやろうとしていることを達成するいくつかの他の解決策を探すことをお勧めします。ちなみに、これは...何ですか?

「それ以外の場合は、オペレーティングシステムがメッセージを認識しないように、メッセージを破棄します」

申し訳ありませんが、あなたは完全に要点を逃しています。OS(つまりWin32サブシステム)からすべてのトップレベルウィンドウWM_DEVICECHANGEに送信されます。これは単なる通知であり、このメッセージに関連付けられたコントロールはありません。デバイスへのアクセスを防ぐという目標には役立ちません。私が言ったように、これにはデバイスドライバー、おそらくファイルシステムフィルタードライバーが必要になります。そのドライバーに、デバイスへのアクセスを許可するIOCTL(ユーザーモードから)を送信します。WM_DEVICECHANGE

于 2012-05-24T15:05:30.750 に答える
1

OSはデバイスについて学習することに依存していないWM_DEVICECHANGEため、メッセージをブロックしても何の役にも立ちません。

デバイスにアクセスして検証を実行するには、OSドライバーとファイルシステムをロードする必要があるため、実行しようとしていることは非常に困難ですが、他のプログラムがそれを使用できないようにしたいようです。カーネルに実装されているウイルス対策ソフトウェアでさえ、スキャンされる前にデバイスが表示されるのを防ぐことはできません。

スキャンが完了するまでデバイスにファイルがないことを報告するファイルシステムフィルタードライバーを実装することもできますが、これにより、デバイスが表示されるのを確認するソフトウェアがひどく混乱しますが、ファイルは後で利用できます。また、C#はWindowsドライバーの実装には役立ちません。「C#で使用されるCのライブラリ」(p / invokeを意味すると思います)でもありません。C#コードは、カーネル内の環境と互換性がありません。

于 2012-05-24T15:04:33.283 に答える