Avshws avshws.h Try004
Avshws(AVStream simulated hardware sample driver)を見ていき、気になったところをピックアップします。
プロジェクト名と同じ名前のヘッダーファイルavshws.h
を見ます。冒頭からのツッコミ…
/* AVStream Simulated Hardware Sample Copyright (c) 2001, Microsoft Corporation. */
をぃ。これ書いている時点で20年前のソースコードorz
ざっと見ました。標準のヘッダーの参照や#define
群があります。このファイルは全ソースファイルに入れておくものでしょう。あとこのAvstreamで重要なヘッダーKs.h, Ksmedia.hの参照もこのファイルに記述されています。
PVOID operator new ( size_t iSize, _When_((poolType & NonPagedPoolMustSucceed) != 0, __drv_reportError("Must succeed pool allocations are forbidden. Allocation failures cause a system crash")) POOL_TYPE poolType );
new演算子の定義(deleteもある)…こんなのあるんだね。知らなかったわw というか、C++は全ての演算子をこうして定義できることは知っていたが、このようにわざわざ書くということは、メモリの確保の仕方が標準と違うのだろうな。
これは実際このような時に使われるそうな。
CClass *cp = new (/* POOLTYPE */ 0) CClass();
あと、見慣れない_When_()は、SALというらしい。パラメーターの補足説明になるらしい。
うむ。定義を見る段階では、これ以上差し当たって問題となるソースコードの内容は無いな。次はDriverEntry関数のあるdevice.cppから見ようっと。
寝る
Avshws Try003
Avshws(AVStream simulated hardware sample driver)をビルド~インストールまでやってみた。
Deploy the driver to the targer computerまでは、今までの検証結果からなんとかたどり着いた。以降、ポイントを記しておく。
Install the driver
デバイスマネージャーの起動からインストールの手順が記されているが、これは現在のWindows10では出来ない。よってhdwwiz(ハードウェアの追加ウィザード)を起動する。デバイスは、サウンド、ビデオおよびゲームコントローラー配下に表示されるとあるが、筆者のターゲットPCは、カメラ配下に表示された。
Run the sample
Graphedt.exe, proppage.dllとも、Windows Driver KitのTools配下に入っている。あと、regsvr32は既にどこかに入っている。(regsvr32は「まだあったのか!」という驚き)
Graphedtの実行
記事の内容通りに進める。「Insert Filter」ボタンで出来上がり。
カメラを起動
Windows10に標準でついているカメラアプリを起動する。うん、表示された。ショボイけど、中央下部に経過時間を表示するので、動画であることがわかる。
さて、動作まで確認できたので、ソースコードを追って理解を深めていくことにするよ。
じゃーね
Windows ドライバー Try001
Windowsドライバーを書くために情報を収集している。うーん、Microsoft Docの内容はメンテされていない。また、ドライバーサンプルもビルドに失敗する。せめてビルドから展開までしれっと動くものにして欲しい。
ドライバーサンプル辺りの情報は多分Git Hubで盛り上がっていると思いたい。盛り上がっているメンバーの誰かさん達は、是非Docの内容を更新してほしいものだ。
ドライバーサンプルソリューションをVS2019で開くといきなり警告が表示される。
<プロジェクトのパス>\<プロジェクト名>.vcxproj : warning : VC プロジェクトではプロジェクト項目のワイルドカードはサポートされていないため、Visual Studio IDE で予期しない動作、不安定な状態、パフォーマンスの低下を引き起こす可能性があります。サポートされているオプションについては、https://aka.ms/cpp/projectwildcards をご覧ください。
「はぁ?」いきなりモチベが落ちる。これに対してはMSBuildコマンドを使ってこの精神的攻撃を避ける。
/Qspectreオプションの問題
既定でオフとなっているオプションとあるが、規定でオンとなっているこのオプション。ビルドするとエラーが発生する。WindowsドライバーはSpectreライブラリを使うものは無い。ちなみに、インストーラーにあるSpectreモジュールの全てのバージョンをインストールしても、エラーMSB:8040は発生する。つまり…バグだろう…
これは、コード生成プロパティで無しに設定することで出なくなるのだが…
ドライバーパッケージプロジェクトを追加すると、再び現れる。このプロジェクトはコード生成をしないので、オプションを変更するプロパティーページが無い。現在困っているところ。
まずドライバーパッケージが作成できないと、ターゲットPCに展開できないので、この辺りをネチネチと調べる。ハァ…
これは、Try002で解決した。
寝る!
Hello World ドライバー 3 (元に戻す)
うーん…
次の内容を試したが、Windbgが反応しない。
- ファイアウォールの設定
- KDNETの設定
- BCDEDITの設定
KDNETコマンドの内容に、再起動時にNICの初期化に失敗しているという内容が表示されていた。ターゲットPCは、ノートPCで通常使用時はWi-fi。今回はWi-fiを殺してイーサネット接続をしたが、その辺りがまずいことになっているかもしれない。
ここで、頭とPC環境をリセットする。
まずは
テストコンピューターのプロビジョニングによって、ターゲットPCはデバッグ用ユーザーが自動でサインイオンする。これを直す。
表示された画面で、Remove Deviceを実行する。こうするとデバッグ用ユーザーが消える。
次に
このままだと、ターゲットPCの画面右下にテストモードの表示が残る。それを消す。
bcdedit /set TESTSIGNING OFF
リングは次
ありがたや。
さて、今度はデスクトップPCで試す。が疲れたのでまた今度。
Hello World ドライバー 2
ビルドが終わったら、
ドライバーを展開
この作業が必要。ドライバーのデバッグはPC2台必要となる。よって展開先はドライバーを配置するターゲットPCにするが、記事を注意深く読んでその通りにすれば、見慣れない操作だが、うまくいく。
まず、ターゲットPCをデバッグ環境用にプロビジョニングする。
ホストのVisual Studioから操作するのだが、プロビジョニング中は次のような進行画面となる。
ここで、最後に"Complete"と表示されればおk。
最終結果が次のように表示される。あとでこの情報を使うのでハードコピーを取っておくとよい。
書き忘れたが、Port, Key, Host IPは画面初期段階で編集できるのでそこで行う。
そして以下が僕のインストールの配置設定内容。
んで、ビルドメニューからソリューションの配置を実行する。これを行うとターゲットPCの所定位置にドライバーが配置される。確認は実際にターゲットPCの中身を見よう。
次は、
ドライバーのインストール
これも記事通りに慎重に行う。多分問題なく完了する。
次に、
ドライバーのデバッグ
記事通りにコマンドを実行する・・・
WinDbg -k net:port=50000,key=1.2.3.4
すると、表示される画面・・・
ここからが記事の説明と違う。中断クリックしても何も変わらない。画面は再接続を待っており、画面下部のステータスは接続されていないとあるので、中断は関係ないだろう。
さて困った。
ちょっと心当たりがあるので、今度はそれを実施してみる。
ということで、今日はここまでだ。