問題タブ [wdm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - デスクトップ DirectX サーフェス (WDM)
画面録画アプリを作ろうとしています。DirectX を使用して画面全体をキャプチャし、テクスチャとして保存する方法はありますか? これは WDM になります。ウィンドウのテクスチャを取得する方法があることは知っていますが、画面全体はどうでしょうか。
私は getDC(null) を使用する GDI メソッドを試しましたが、それは私の用途ではかなり遅いです。
windows - WDM デバイス スタックの反復処理
私が理解しているように、DEVICE_OBJECT には AttachedDevice メンバー (LowerDevice メンバーではない) があるため、WDM デバイスのデバイス スタックを下から上にのみ繰り返すことができます。幸いなことに、AddDevice コールバックは PhysicalDeviceObject を受け取るので、スタック全体を反復処理できます。
フィルター ドライバー内から、特定のデバイス オブジェクトを既にフィルター処理しているかどうかを判断しようとしています。(これには正当な理由があるとしましょう。ご容赦ください。) 私のアイデアは、スタック内のすべての DEVICE_OBJECT を調べて、その DriverObject メンバーを私のものと比較することでした。
IoGetAttachedDeviceReference の存在から判断すると、AttachedDevice にアクセスするだけでは安全ではないと思います。デバイスが突然なくなるリスクがあるからです。ただし、IoGetAttachedDeviceReference を使用すると、スタックの一番上に直接移動できます。これは私にとっては良くありません。
では、デバイス スタックを反復処理する安全な方法はありますか?
c++ - 仮想 PBDA ドライバーでの C++ の使用: 制限事項は何ですか?
既存の C++ プロジェクト (トランスポート ストリーム データを提供する) を Windows7 の仮想 DVB ドライバーに統合する予定です。明らかな出発点は、Microsoft WDK (バージョン 7600.16385.1) の SW Tuner サンプルのようです。Microsoft が提供するこのサンプルは、ローカル ファイルからトランスポート ストリーム データを読み取る仮想 PBDA ドライバーを既に実装しています。
私の質問は次のとおりです。カーネル ドライバーで使用できる (または使用できない) C++ の機能は何ですか?
Microsoft のページ"C++ for Kernel Mode Drivers: Pros and Cons"を読みましたが、基本的な C++ をカーネル ドライバーで使用することは一般的に可能ですか? Microsoft が正確な保証を提供していないことは理解できますが、3 年前、または現在でも、C++ を使用して実際に何が可能であったかについて、このテキストを読んで少し当惑しました。
STL はカーネル ドライバーで使用できますか? (WDK を見ると、"USE_STL" や "STL_VER" などのフラグと、WDK パスに STL60 と STL70 の 2 つのディレクトリがあります。ディスカッション スレッドは、やや不確実な場所で見つけることができました。SWTuner サンプルをビルドすることができました。 「USE_STL=1」ですが、それ以上のテストはまだ行っていません。) STL コンテナを使用してカーネル ドライバのメモリを管理できますか?
C++ 例外は利用できますか? 私が見つけたもの (fe at "Drivers, Exceptions and C++" ) から、C++ 例外 (try/throw/catch) は SEH にマップされているため、一般的に使用できるようですが、それでも回避策をいじる必要がありますか?
マルチスレッド コードはカーネル空間で動作しますか?
ドライバーの初心者として私が行おうとしている一般的な設計上の決定は次のとおりです。C++ プロジェクトを既存のサンプルに統合する方が実現可能でしょうか (これにより、インターフェイスに関する多くの手間が省けますが、"C++ in kernel driver" が付属しています)。または、C++ プロジェクトをアプリケーションにカプセル化し、まだ追加する必要があるインターフェイスを介して仮想ドライバーと通信する方が賢明でしょうか。
windows - IoBuildDeviceIoControlRequest のカーネル イベント オブジェクトをローカル スコープに割り当てられるか
私はドライバー開発の初心者です。基本的な質問があります。
WDM デバイス ドライバーの記述では、IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequestを呼び出して、別のターゲット ドライバーに渡す同期 IRP を割り当てることができます。基本的な要件の 1 つは、これらの関数を呼び出す前に イベントオブジェクトを割り当てる必要があることです。また、ターゲット ドライバーが IRP を完了するまでに、このイベント オブジェクトがまだ使用可能であることを確認する必要があります。
IoBuildDeviceIoControlRequest/ IoBuildSynchronousFsdRequestを呼び出す関数のローカル スコープからそのイベント オブジェクトを本当に割り当てることができるでしょうか。つまり、非ページ プールからではなく、カーネル スタックからです。サンプル コードの多くは、イベント オブジェクトをローカル スコープ、つまりカーネル スタックから割り当てるだけです。しかし、ターゲット ドライバーがまだ IRP を処理している間に、呼び出し元のドライバーがページ アウトされた場合、実際に問題が発生するでしょうか?
windows - WDM ドライバーでセッションの作成/終了を検出する方法は?
Windows 用のデバイス ドライバー (WDM ドライバー、32 ビット) を作成しています。ターミナル セッションの作成と終了を検出する必要があります。
呼び出し元プロセスのセッション ID を取得する方法を知っています (フラグZwQueryInformationProcess
付き)。ProcessSessionInformation
また、セッションへのグラフィックドライバーのロード/アンロードのイベントをインターセプトしています ( /でインターセプトZwSetSystemInformation
することにより)。SystemLoadImage
SystemUnLoadImage
そして、セッションの作成/終了イベントの後に/フラグをZwSetSystemInformation
使用した呼び出しが続くことを願っていました。しかし、残念ながらこれは起こりません。これまでのところ、セッションの作成/終了の適切な兆候は見つかりませんでした。SystemCreateSession
SystemDeleteSession
c# - WPF の特定のコントロール領域にエアロ グラスのぼかしを適用する
彼の本 ( Pro WPF in C# 2010 Windows Presentation Foundation in .NET 4 ) で Matthew MacDonald は次のように書いています。
...DwmEnableBlurBehindWindow() を使用して、ウィンドウ内の特定の領域にガラス効果を適用できます。
これは、エアロ グラス効果を特定のコントロール (または少なくともそれらが占める領域) に適用できるということですか?
C#でそれを行う方法の例を提供してください。
windows - コードをカーネル空間に移動すると、より正確なタイミングが得られますか?
背景情報:
私は現在、USBポートに接続するハードウェアデバイスを持っています。ハードウェアデバイスは、さまざまなネットワークに正確な定期的なメッセージを送信し、ネットワークも接続します。ハードウェアデバイスの中には、MicrochipdsPICがいくつかあります。動作には2つのモードがあります。
1つのシナリオは、単純な「ジョブ」をdsPICに送信し、それが.001msの精度で正確なメッセージを送信できる場合です。このアーキテクチャは、PCアプリケーション内で発生するイベントに基づいて変化する定期的なパケットを送信する必要がある、より複雑なメッセージングには理想的ではありません。したがって、PCアプリケーションが定期的なメッセージを送信し、dsPICがそれに応じて変換して送信するという2番目の操作モードがあります。ちなみに、これはすべて、当社のソフトウェアのエンドユーザーに対して透過的です。当社のハードウェアデバイスは、自動車分野で使用されるテストツールです。
現在、ハードウェアをPCソフトウェアに接続するために、FTDIおよびFTDIWindowsドライバーからのシリアルチップへのUSBを使用しています。
問題は、PCからメッセージを送信するモード2では、平均的なハードウェア範囲で約1ミリ秒を達成できることです。Windowsカーネルのプリエンプションの対象となります。私は次のようなことを改善するためにいくつかの「トリック」を試しました。
- 可能な場合は、リーダースレッドとライタースレッドが別々のCPUアフィニティで動作することを確認してください。
- リーダーのスレッド優先度を下げながら、ライターのスレッド優先度を上げます。
- 当社のソフトウェアを使用する際にスクリーンセーバーやその他のアプリケーションをオフにするようにユーザーに通知します。
- createthread呼び出しをCreateTimerQueueTimer呼び出しに置き換えます。
私たちのソフトウェアはすべてC/C++で書かれています。私は高度なWindowsプログラミングに非常に精通していて快適です。IO完了、重複I / O、ロックレススレッドキュー(実際には設計戦略)、ソケット、スレッド、セマフォなど...
しかし、私はWindowsドライバーの開発については何も知りません。KMDFとUDMFとWDMに関するいくつかの論文を読みました。
ベテランのWindowsカーネルモードドライバー開発者がここで応答することを期待しています...
次の回転。私たちのハードウェアの一部には、FTDIチップを交換して、dsPICのUSBインターフェイスを使用するか、場合によっては、オープンソースのLinux FTDIをWindowsに移植して、カスタムドライバー内でFTDIチップを引き続き使用するオプションがあります。PC側のカーネルモードドライバーに行くことで、プリエンプションやDMAを利用することなく、より正確な間隔で定期的なメッセージを送信できるカーネルドライバーを確立できると思います。
私たちのビジネスには、彼らのツールとまったく同じようなことをしていると思う競合他社がいます。私の知る限り、ユーザースペースアプリケーションは1msを超えるスレッドをスケジュールすることはできません。現在、スレッドでtimeGetTimeを使用しています。私は(CreateTimerQueueTimerを介して)タイマーキューを試しましたが、実際の改善はありませんでした。
WDMは、より正確なタイミングを実現するための正しいアプローチですか?
競合他社は、Windows駆動の信号からハードウェアへの非常に正確なタイミングをどのように達成しており、カーネルドライバー(.sys)をロードし、デバイスは私たちと同じようにUSB2.0上で実行されます。
WDMが進むべき道である場合、タイミングを設定するためにどのカーネル機能を研究する必要があるかについてアドバイスを得ることができますか?読んでくれてありがとう
c++ - 仮想オーディオドライバーからユーザーモードアプリケーションへのオーディオデータの送信
現在のタスクは、仮想オーディオドライバーからユーザーモードアプリケーションにオーディオデータを送信することです。
まず、ユーザーモードアプリケーションからその仮想オーディオドライバーのインスタンスを作成する必要があります...
以下のコードスニペットをご覧ください
その理由を教えてください。
上記のユーザーモードアプリケーションでは、次のようにIOCTLコードを記述していました...
私の間違いを指摘していただけませんか。テストの目的で、文字列(IOCTL-カーネルからのダイレクトインI / O、Portclの世界へようこそ)を後で出力バッファに渡し、オーディオデータに置き換えます。 ..ドライバーに渡した文字列を取得してもdeviceIoControlが失敗するのに、bytesReturn値は常にランダムな値であり、bRes値は常にfalseです。
windows - Windowsドライバープログラミング、スレッド関数のデータ引数が破損していませんか?
私はこのコードをテストしています:
このドライバーをロードすると、m / cが(IRQL_NOT_LESS_OR_EQUAL_TO)でクラッシュしKeWaitForSingleObject
ます。つまり、無効なアドレスにアクセスしようとしています。ただし、タイマーアドレスはハンドラーとstart_timerで同じです。KeWaitForSingleObjectがなければ、問題ありません。誰かが助けてくれるなら、私は何が悪いのかわかりません!
//////////////////////////////編集1////////////////// ////////////
すなわちKeWaitForSingleObject
なし
後でクラッシュします..ドライバを正常にインストールし、正常にアンロードします...その後、突然ブルースクリーンになります!Windowsドライバープログラミングは子供の遊びではありません!:(
両方の関数でまだ同じアドレス..ところで、スレッドなしで記述した場合は正常に機能します...(start_timer()のコードのコメント解除)しかし、スレッドを使用して実行する必要があります...やりたいのは、start_timer( )複数回異なる遅延があり、それに応じてハンドラーを呼び出す必要があります。これにより、他の実行がブロックされないため、スレッドが作成されます。
driver - WorkItem (IoQueueWorkItem) がエラー「PAGE_FAULT_IN_NONPAGED_AREA」で BSOD を返す
Windows7 64ビットを使用しています。WorkItem (IoQueueWorkItem) がエラー「PAGE_FAULT_IN_NONPAGED_AREA」で BSOD を返す 割り当てられたメモリも解放しています...何が問題なのかわかりません :(
これは私のドライバーコードです:
これは私のテストコードです:
このコードはラップトップをクラッシュさせます...どこが間違っているのかわかりません...メモリも解放しています。コメントすると、IoQueueWorkItem がなくても問題ありません。
////////////////// EDIT 1
解決しました!ここの DeviceObject が原因で、work->pio = IoAllocateWorkItem(pDeviceObject);
これpDeviceObject
は私のドライバーインスタンスではありません...したがって、失敗していました!