Avshws avshws.h Try004

Avshws(AVStream simulated hardware sample driver)を見ていき、気になったところをピックアップします。

github.com

プロジェクト名と同じ名前のヘッダーファイルavshws.hを見ます。冒頭からのツッコミ…

/*
    AVStream Simulated Hardware Sample
    Copyright (c) 2001, Microsoft Corporation.
*/

をぃ。これ書いている時点で20年前のソースコードorz

ざっと見ました。標準のヘッダーの参照や#define群があります。このファイルは全ソースファイルに入れておくものでしょう。あとこのAvstreamで重要なヘッダーKs.h, Ksmedia.hの参照もこのファイルに記述されています。

docs.microsoft.com

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)をビルド~インストールまでやってみた。

github.com

Deploy the driver to the targer computerまでは、今までの検証結果からなんとかたどり着いた。以降、ポイントを記しておく。

Install the driver

バイスマネージャーの起動からインストールの手順が記されているが、これは現在のWindows10では出来ない。よってhdwwiz(ハードウェアの追加ウィザード)を起動する。デバイスは、サウンド、ビデオおよびゲームコントローラ配下に表示されるとあるが、筆者のターゲットPCは、カメラ配下に表示された。

f:id:megusuritan:20210820152217j:plain

Run the sample

Graphedt.exe, proppage.dllとも、Windows Driver KitのTools配下に入っている。あと、regsvr32は既にどこかに入っている。(regsvr32は「まだあったのか!」という驚き)

Graphedtの実行

f:id:megusuritan:20210820152438p:plain

f:id:megusuritan:20210820152543j:plain

記事の内容通りに進める。「Insert Filter」ボタンで出来上がり。

f:id:megusuritan:20210820152727p:plain

カメラを起動

Windows10に標準でついているカメラアプリを起動する。うん、表示された。ショボイけど、中央下部に経過時間を表示するので、動画であることがわかる。

f:id:megusuritan:20210820152900j:plain

さて、動作まで確認できたので、ソースコードを追って理解を深めていくことにするよ。

じゃーね

Windows ドライバー Try002

/Qspectreオプションの問題

最新の情報によると、デフォルトでオンになっているとのこと。インストーラーを確認したところ、下図の下線にしめすライブラリにチェックを入れることでビルドエラーが発生しなくなった。

f:id:megusuritan:20210819202253j:plain

これで、パッケージを作る際のビルドエラーもでなくなるかも。

先に進む

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コマンドの内容に、再起動時にNICの初期化に失敗しているという内容が表示されていた。ターゲットPCは、ノートPCで通常使用時はWi-fi。今回はWi-fiを殺してイーサネット接続をしたが、その辺りがまずいことになっているかもしれない。

ここで、頭とPC環境をリセットする。

まずは

テストコンピューターのプロビジョニングによって、ターゲットPCはデバッグ用ユーザーが自動でサインイオンする。これを直す。

f:id:megusuritan:20210813214308p:plain

表示された画面で、Remove Deviceを実行する。こうするとデバッグ用ユーザーが消える。

次に

このままだと、ターゲットPCの画面右下にテストモードの表示が残る。それを消す。

bcdedit /set TESTSIGNING OFF

リングは次

hayamizbg.net

ありがたや。

さて、今度はデスクトップPCで試す。が疲れたのでまた今度。

Hello World ドライバー 2

ビルドが終わったら、

ドライバーを展開

この作業が必要。ドライバーのデバッグはPC2台必要となる。よって展開先はドライバーを配置するターゲットPCにするが、記事を注意深く読んでその通りにすれば、見慣れない操作だが、うまくいく。

まず、ターゲットPCをデバッグ環境用にプロビジョニングする。

docs.microsoft.com

ホストのVisual Studioから操作するのだが、プロビジョニング中は次のような進行画面となる。

f:id:megusuritan:20210812202603j:plain

f:id:megusuritan:20210812202621j:plain

ここで、最後に"Complete"と表示されればおk。

終結果が次のように表示される。あとでこの情報を使うのでハードコピーを取っておくとよい。

f:id:megusuritan:20210812202902j:plain

書き忘れたが、Port, Key, Host IPは画面初期段階で編集できるのでそこで行う。

そして以下が僕のインストールの配置設定内容。

f:id:megusuritan:20210812201533j:plain

DriverIInstallプロパティ

んで、ビルドメニューからソリューションの配置を実行する。これを行うとターゲットPCの所定位置にドライバーが配置される。確認は実際にターゲットPCの中身を見よう。

 

f:id:megusuritan:20210812203753p:plain

次は、

ドライバーのインストール

これも記事通りに慎重に行う。多分問題なく完了する。

次に、

ドライバーのデバッグ

記事通りにコマンドを実行する・・・

WinDbg -k net:port=50000,key=1.2.3.4

すると、表示される画面・・・

f:id:megusuritan:20210812204548p:plain

ここからが記事の説明と違う。中断クリックしても何も変わらない。画面は再接続を待っており、画面下部のステータスは接続されていないとあるので、中断は関係ないだろう。

さて困った。

ちょっと心当たりがあるので、今度はそれを実施してみる。

ということで、今日はここまでだ。