WDM プリンタINFファイル解析一般のソースを表示
新しいページはコチラ
移動:
案内
,
検索
== '''概要''' == WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。 管理人はNuance社製Paperportというアプリケーションを持っているので、それがどういう仕組みになっているのかを確認してみます。Paperportは亡くなった技術ですので、Paperportを入手して、一緒に確かめることは難しいと思います。 PaparPortは印刷してPDF化する仕組みをもったアプリで主にjpg画像をpdfに変換する機能やOCR機能で読み取れた文字を画像の文字列部分に文字情報をOverlapすることができるツールです。ほかにもIMGやPDFの簡単な編集といった機能をもっていてPDFの積み重ね機能も含めて文書管理としての機能を体現しています。 === ''' 印刷機能 ''' === Nuance PaperPortで、印刷機能のインストールがどんな感じになっているかを確認してみようと思います。 PaperPort Image Printerという名前で、他の機能とは完全に分離されていますが、ディレクトリには以下のようなファイル群がある。 <syntaxhighlight2 lang="txt"> ImagprnMigrate.exe ImgPrnSetupLib.dll Nuan.gpd NuanImageConvert.exe nuanoemuires.dll NuanPrint.inf NuanPrn.ini nuanui.dll NuanUNI.dll </syntaxhighlight2> この中のNuanPrint.infがインストールするときに実行するインストールファイルとなる。このファイルを右クリックして表示される[インストール]を選択する方法も多いですが、コマンドラインからインストールを起動する方法もあります。Windows10の管理人PCではどうやって起動するのがよいのかはわかっていません。まずはコマンドラインについてみてみましょう。 <syntaxhighlight2 lang="txt"> rundll32 printui.dll,PrintUIEntry /if /b "プリンタ名" /f NuanPrint.inf /r "lpt1:" /m "プリンタデバイス名" </syntaxhighlight2> 上記のような感じのコマンドでインストールする方法があるらしい。上記のコマンドは、なかなかお目にかかるものではないです。なんじゃこれ!って感じ。ヘルプを出してみましょう。 <syntaxhighlight2 lang="txt"> rundll32 printui.dll,PrintUIEntry /? </syntaxhighlight2> と、こんな感じにすると、違うウィンドウが起動して各種オプションに関する説明が得られます。 <syntaxhighlight2 lang="txt"> 使用法: rundll32 printui.dll,PrintUIEntry [オプション] [@コマンドファイル] /a[ファイル] バイナリ ファイル名 /b[名前] 基本プリンター名 /c[名前] UNC コンピューター名 (リモート コンピューターで実行される場合) /dl ローカル プリンターを削除します /dn ネットワーク プリンター接続を削除します /dd プリンター ドライバーを削除します /e 印刷設定を表示します /f[ファイル] inf ファイルまたは出力ファイル /F[ファイル] /f で指定された INF ファイルが依存する INF ファイルの場所です /ga コンピューターごとのプリンター接続を追加します (接続はログオン時にユーザーに伝達されます) /ge コンピューターごとのプリンター接続を列挙します /gd コンピューターごとのプリンター接続を削除します (接続はユーザー ログオン時に削除されます) /h[アーキテクチャ] ドライバー アーキテクチャが x86、x64 または Itanium のうちの 1 つです。 /ia inf ファイルを使ってプリンター ドライバーをインストールします /id プリンター ドライバーの追加ウィザード使ってプリンター ドライバーをインストールします /if inf ファイルを使ってプリンターをインストールします /ii inf ファイルとプリンターの追加ウィザード使ってプリンターをインストールします /il プリンターの追加ウィザード使ってプリンターをインストールします /im プリンターの追加ウィザードで、ネットワーク プリンターをスキップしてプリンターをインストールします /in ネットワーク プリンター接続を追加します /ip ネットワーク プリンターのインストール ウィザードを使用してプリンターをインストールします /j[プロバイダー] プロバイダー名を印刷します /k 指定されたプリンターでテスト ページを印刷します (プリンターのインストール時にはこのコマンドは使えません) /l[パス] プリンター ドライバー ソース パス /m[モデル] プリンター ドライバー モデル名 /n[名前] プリンター名 /o プリンター キューを表示します /p プリンターのプロパティを表示します /q QUIET モード、エラー メッセージを表示しません /r[ポート] ポート名 /s サーバー プロパティを表示します /Ss プリンターの設定をファイルに保存します /Sr ファイルからプリンターの設定を復元します コマンドの最後に追加されるプリンター設定オプション フラグの保存または復元: 2 PRINTER_INFO_2 7 PRINTER_INFO_7 c 色のプロファイル d プリンター データ s セキュリティ記述子 g グローバル デバイス モード m 最小限の設定 u ユーザー デバイス モード r 名前の競合を解決する f 名前を強制する p ポートを解決する i ドライバー名の競合 /u ドライバーが既にインストールされている場合は、それを使います /t[#] 開始するインデックス ページ (0 から始まります) /v[バージョン] ドライバーのバージョンは "Type 2 - カーネル モード" と "Type 3 - ユーザー モード" のどちらかです /w 指定されたドライバーが inf ファイルにない場合にユーザーに確認します /y 通常使うプリンターに設定します /Xg プリンター設定を取得します /Xs プリンター設定を設定します /z このプリンターを自動共有にしません /Y プリンター名を自動生成しません /K /h オプションで 2、3、4 の値をそれぞれ x86、x64、Itanium として認識するように変更し、/v オプションで 3 の値を "Type 3 - ユーザー モード" として認識するように変更します /Z このプリンターを共有にします。/if オプションと組み合わせる必要があります /? このヘルプを表示します @[ファイル] コマンド ライン引数ファイル /Mw[メッセージ] コマンドを実行する前に警告メッセージを表示します /Mq[メッセージ] コマンドを実行する前に確認メッセージを表示します /W[フラグ] ウィザード用のフラグとスイッチを指定します (APW および APDW) r ウィザードの最終ページでウィザードを再実行できるようにします /G[フラグ] グローバルのフラグとスイッチを指定します w セットアップ時にドライバー警告 UI を表示しません (Super Quiet モード) /R 既存のドライバーを選択したドライバーに強制的に置き換えます 例: サーバー プロパティの実行: rundll32 printui.dll,PrintUIEntry /s /t1 /c\\machine プリンター プロパティの実行: rundll32 printui.dll,PrintUIEntry /p /n\\machine\printer ローカルでプリンターの追加ウィザードの実行: rundll32 printui.dll,PrintUIEntry /il \\machine でプリンターの追加ウィザードを実行: rundll32 printui.dll,PrintUIEntry /im /c\\machine キュー表示の実行: rundll32 printui.dll,PrintUIEntry /o /n\\machine\printer inf インストールの実行: rundll32 printui.dll,PrintUIEntry /if /b "Test Printer" /f c:\infpath\infFile.inf /r "lpt1:" /m "Brother DCP-128C" inf インストールの実行 (inf に依存)。例では、prnbr002.inf は ntprint.inf に依存します。 rundll32 printui.dll, PrintUIEntry /ia /m "Brother DCP-128C" /K /h x64 /v 3 /f "c:\infpath\prnbr002.inf" /F "c:\infpath\ntprint.inf" inf を使ったプリンターの追加ウィザードの実行: rundll32 printui.dll,PrintUIEntry /ii /f c:\infpath\infFile.inf 付属のプリンター ドライバーを使ったプリンターの追加: rundll32 printui.dll,PrintUIEntry /if /b "Test Printer" /r "lpt1:" /m "Brother DCP-128C" コンピューターごとのプリンター接続の追加 (接続はログオン時にユーザーに伝達されます): rundll32 printui.dll,PrintUIEntry /ga /c\\machine /n\\machine\printer /j"LanMan Print Services" コンピューターごとのプリンター接続の削除 (接続はユーザー ログオン時に削除されます): rundll32 printui.dll,PrintUIEntry /gd /c\\machine /n\\machine\printer コンピューターごとのプリンター接続の列挙: rundll32 printui.dll,PrintUIEntry /ge /c\\machine inf を使ったプリンター ドライバーの追加: rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m "Brother DCP-128C" /h "x86" /v "Type 3 - User Mode" /f c:\infpath\infFile.inf inf を使ったプリンター ドライバーの追加: rundll32 printui.dll,PrintUIEntry /ia /K /c\\machine /m "Brother DCP-128C" /h "x86" /v 3 付属のプリンター ドライバーの追加: rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m "Brother DCP-128C" /h "Intel" /v "Type 3 - Kernel Mode" プリンター ドライバーの削除: rundll32 printui.dll,PrintUIEntry /dd /c\\machine /m "Brother DCP-128C" /h "x86" /v "Type 3 - User Mode" プリンター ドライバーの削除: rundll32 printui.dll,PrintUIEntry /dd /K /c\\machine /m "Brother DCP-128C" /h "x86" /v 3 通常使うプリンターとして設定: rundll32 printui.dll,PrintUIEntry /y /n "printer" プリンター コメントの設定: rundll32 printui.dll,PrintUIEntry /Xs /n "printer" comment "My Cool Printer" プリンター設定の取得: rundll32 printui.dll,PrintUIEntry /Xg /n "printer" プリンター設定の結果をファイルに保存: rundll32 printui.dll,PrintUIEntry /f "results.txt" /Xg /n "printer" プリンター設定コマンドの設定の使用法: rundll32 printui.dll,PrintUIEntry /Xs /n "printer" ? すべてのプリンター設定をファイルに保存: rundll32 printui.dll,PrintUIEntry /Ss /n "printer" /a "file.dat" すべてのプリンター設定をファイルから復元: rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" レベル 2 のプリンター情報をファイルに保存 : rundll32 printui.dll,PrintUIEntry /Ss /n "printer" /a "file.dat" 2 プリンター セキュリティ記述子をファイルから復元: rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" s プリンター グローバル デバイス モードとプリンター データをファイルから復元: rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" g d 最小設定をファイルから保存とポート名の解決: rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" m p プリンターのクライアント サイド レンダリングの有効化: rundll32 printui.dll,PrintUIEntry /Xs /n "printer" ClientSideRender enabled プリンターのクライアント サイド レンダリングの無効化: rundll32 printui.dll,PrintUIEntry /Xs /n "printer" ClientSideRender disabled </syntaxhighlight2> 上記の内、通常のプリンタインストールでよく使うオプションは */if :inf ファイルを使ってプリンターをインストール。 */b [名前] : 基本プリンター名。 */f [ファイル] :inf ファイルまたは出力ファイル */r [ポート] :ポート名 */m [モデル] :プリンター ドライバー モデル名 ===''' infファイル '''=== 上記のようなプリンタインストールコマンドがありますが、結局のところ、infファイルに記述される一連のインストール情報に従って、プリンタシステムが構築されているようです。 どういう風にプログラム群を配置するとpdfのようなプリンタ出力システムが構築されるのかを確認します。個々のプログラムファイルの作り方はもう少し難しいと思うので、まずは、どんなふうにファイルが配置されるのかをinfファイルの理解と共に知っていこうと思います。 まずはPaperPortインストールのテキストファイルがどうなっているかを見てみます。 <syntaxhighlight2 lang="INI" line=1> ; ; @file NuanPrint.inf for 32 and 64Bit System ; [Version] Signature="$Windows NT$" Provider=%AUTHOR% LayoutFile=ntprint.inf ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} Class=Printer ; Date & version of driver package DriverVer=05/12/2006,1.0.0.0 ; ; Manufacturer section ; [Manufacturer] "Scansoft" = Scansoft,NTamd64 ; ; Model Sections ; ; These sections correspond with an entry listed in the ; [Manufacturer] section above. The models will be displayed in the order ; that they appear here. ; [Scansoft] "PaperPort Image Printer" = Nuan.gpd [Scansoft.NTamd64] "PaperPort Image Printer" = Nuan.gpd ; ; Installer Sections ; ; These sections control file installation, and reference all files that ; need to be copied. The section name will be assumed to be the driver data ; file, unless there is an explicit DataFile section listed. ; [Nuan.gpd] CopyFiles=@Nuan.gpd,@NuanPrn.ini,DLLFILES DataSection=UNIDRV_DATA DataFile=Nuan.gpd Include=NTPRINT.INF Needs=UNIDRV.OEM,UNIDRV_DATA ; ; Copy Sections ; [DLLFILES] NuanUNI.DLL NuanUI.DLL Nuanoemuires.dll NuanImageConvert.exe ; ; Data Sections ; ; These sections contain data that is shared between devices. ; ; ; Call SetupSetDirectoryId with 66000 to set the target directory at runtime ; (depending on which environment drivers are getting installed) ; [DestinationDirs] DefaultDestDir=66000 ; ; diskid = description,tagfile,unused,subdir ; [SourceDisksFiles.x86] Nuanuni.dll = 1,,,,,,,11,\i386 Nuanui.dll = 1,,,,,,,11,\i386 Nuanoemuires.dll= 1,,,,,,,11,\i386 NuanImageconvert.exe= 1,,,,,,,11,\i386 [SourceDisksFiles.amd64] Nuanuni.dll = 1,,,,,,,11,\amd64 Nuanui.dll = 1,,,,,,,11,\amd64 Nuanoemuires.dll= 1,,,,,,,11,\amd64 NuanImageconvert.exe= 1,,,,,,,11,\amd64 ; ; Localizable Strings ; [Strings] AUTHOR="Scansoft wintone" </syntaxhighlight2> ===''' INFファイルの読み解き'''=== マイクロソフトの公式の解説は[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/install/overview-of-inf-files#:~:text=INF%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E3%80%81%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE,%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82 公式解説]で記載されています。公式解説。正直エグイほど、ややこしいけど適格な情報。管理人のような素人には太刀打ちできない難しさがあります。プリンタインストールだけに限ればこれほど膨大な情報は必要ないのかもしれない。ここでは最低限の理解から始めてみます。 INFファイルはINIファイルともよくている構造になっています。両方に共通することもありそうです。まずはファイルの先頭あたりから理解していきます。 *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">4行目:[Version]</span> : [Version]のような記述がタイトルのようになって表記されます。これをセクションと呼んでいます。区分ですね。たしかに、[Version]のような記述ごとに分けられて記述があるように感じます。納得できる。 : その前に、行頭のセミコロン(;)とかは、コメントの記述に使われます。その行のセミコロンの後ろはコメントとして扱えるようです。行の途中からでもコメントが添えられますが、コメント化の打消しはできないので、;を入力したらINFコマンドの内容としては、その行はおしまいなのでしょう。 : イコール(=)はプログラムで使われるものと同じ意味を持っていて、イコールの右側(右辺値)の値をイコールの左側(左辺値)のキーワードに代入あるいは関連付けるという動きをします。 : INFファイルにおけるセクション名は変数のような意味を持つ場合があります。例えば、27行目の=の後ろNuan.gpdは39行目の[Nuan.gpd]の事を意味していて39行目の[Nuan.gpd]からのセクションの値をすべて27行目のNuan.gpdが指し示しています。27行目のNuan.gpdが"PaperPort Image Printer"という値だと指示しています。 : INFファイルにおけるセクションはINIファイルよりも意味がある。 *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">5行目:Signature="$WINDOWS NT$"</span> : $WINDOWS NT$は何かのパスを指し示しいるわけではなく、署名はWINDOWS NTというすべてのシステムに対応する署名方式を使いますというお決まりの記述です。すべてのWindowsシステムで共通の値です。深く考える必要はないと思います。Signature="$Chicago$"でも同じ意味だそうですが、こちらの記述を使ったINFファイルを見かけたことはありません。 *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">6行目:Provider=%AUTHOR%</span> : Providerはドライバの製造元を表す文字列を指定します。Providerキーワードの右辺値は文字列を指定します。ダブルクォーテーションで囲った文字列をProvider="Scansoft wintone"のように指定しても良いですし、このinfファイルのように%AUTHOR%と指定して、AUTHORという変数の中身を製造元に指定するというやり方でも良いです。%AUTHOR%と指定した場合は、後に出てくる85行目の[Strings]セクションで、変数の中身を指定する必要があります。86行目でAUTHOR="Scansoft wintone"という記述で文字列変数のようにAUTHORキーワードに文字列を紐づけることができます。 : 製造元情報はプリンタインストール後にもプリンタのプロパティとして参照できる値ですので、この仕組みを実現するためにあると思われます。マイクロソフトが製造元の場合はProvider=%msft%と指定され、[Strings]セクションでmsft="microsoft"と指定されるような構造になっているのを見かけます。 *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">7行目:LayoutFile=ntprint.inf</span> : LayoutFileは共通するINFファイルの情報を読み込んだりするためにあります。windows2000、windowsXPで使われていたようで、現在では使わないことが推奨されています。INCLUDEというキーワードでntprint.infを取り込むのが主流のようです。Windows10でもpaperportのプリンタインストールはうまく出来ているので、使えなくもない指定方法なのかなと感じます。公式の解説文書はあまり深く言及していない、謎だわぁ。LayoutFileはDisplayドライバのインストールをするときには利用することにはなっているみたいです。なので、[Version]セクションではLayoutFileの指定をせず、INCLUDEキーワードでntprit.infの読み込みを指定するのが正しいやり方のように感じます。それが証拠に45行目でもINCLUDE=NTPRINT.INFと指定されています。 : ntprint.infって何?って感じですが、マイクロソフトユニバーサルプリンタドライバ (Unidrv) を意味していて、この共通の部品をインストールして、独自のドライバと併せて動かすことができます。
WDM プリンタINFファイル解析一般
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ