WDM プリンタINFファイル解析一般 新しいページはコチラ
提供: yonewiki
(→Installer Sections) |
|||
1行: | 1行: | ||
+ | [[Windows Driver Model]]に戻る | ||
== '''概要''' == | == '''概要''' == | ||
WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。 | WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。 | ||
583行: | 584行: | ||
<table border=0> | <table border=0> | ||
<tr><td align=right><span style="font-weight: bold;"> DataSection</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr> | <tr><td align=right><span style="font-weight: bold;"> DataSection</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr> | ||
− | <tr><td align=right>UNIDRV_DATA</td><td align=left> | + | <tr><td align=right>UNIDRV_DATA</td><td align=left>■共通プリンタードライバ<br />・Driverファイル<br />・Configファイル<br />・Help |
+ | ファイル<br />の値を割り当てる</td></tr> | ||
+ | <tr><td align=right>PSCRIPT_DATA</td><td align=left>■ポストスクリプトプリンタードライバ<br />・Driverファイル<br />・Configファイル<br />・Help | ||
+ | ファイル<br />の値を割り当てる</td></tr> | ||
+ | <tr><td align=right>UNIDRV_BIDI_DATA</td><td align=left>■双方向プリンターの場合<br />Microsoftユニバーサル プリンター ドライバー<br />・Driverファイル<br />・Configファイル<br />・Help | ||
+ | ファイル<br />・言語モニターエントリ<br />の値を割り当てる</td></tr> | ||
</table> | </table> | ||
</ymath> | </ymath> | ||
+ | |||
+ | |||
+ | *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">42行目:DataFile=Nuan.gpd</span> | ||
+ | |||
+ | : インストーラセクション中の左辺値DataFileはドライバーに関連付けられたデータファイルの名前 <span>(</span>GPD、PPD ファイルなど<span>)</span>を指定します。GPD<span>(</span>Generic Printer Description<span>)</span>ファイルやPPD<span>(</span>PostScript Printer Description<span>)</span>ファイル自体も記述する項目に決まりのあるドライバデータとなっています。[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/print/introduction-to-gpd-files GPDファイル概要]、[https://docs.microsoft.com/ja-jp/samples/microsoft/windows-driver-samples/oem-printer-customization-plug-in-samples/ OEMプリンタカスタムGPDサンプル]、[https://docs.microsoft.com/ja-jp/samples/microsoft/windows-driver-samples/print-auto-configuration-sample/ プリンタ設定GPDサンプル]はこちらの手順で取得できます。[https://www.cups.org/doc/postscript-driver.html PPDファイル開発]はこちらが詳しいでしょうか。難しいですけど。 | ||
+ | |||
+ | |||
+ | *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">43行目:Include=NTPRINT.INF</span> | ||
+ | |||
+ | : インストーラセクション中の左辺値Includeは追加のシステム提供のINFファイルを指定します。 このエントリを指定すると、通常はNeedsエントリも指定されます。NTPRINT.INFを指定することが多いでしょう。 | ||
+ | |||
+ | |||
+ | *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">44行目:Needs=UNIDRV.OEM,UNIDRV_DATA</span> | ||
+ | |||
+ | : インストーラセクション中の左辺値Needsは、追加のシステム提供のINFファイルから取り込むセクションを指定します。例の場合、NTPRINT.INFから[UNIDRV.OEM]セクションと[UNIDRV_DATA]セクションを取り込むことを意味しています。 | ||
+ | |||
+ | |||
+ | ==== ''' Copy Sections '''==== | ||
+ | InstallセクションのCopyFilesでファイル名そのものではなく、セクションを指定したときの個別のファイル名を記述するセクションです。 | ||
+ | |||
+ | |||
+ | *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">49行目:[DLLFILES]</span> | ||
+ | : DLLFILESは任意でつけられた名前ですが、InstallSectionsのCopyFilesの中で@無しの名前としてファイルをセクションで指定することを意図したものです。このセクションには、セクション名以降でファイル名を1行1ファイルで羅列します。 | ||
+ | |||
+ | |||
+ | |||
+ | ==== ''' [DestinationDirs] '''==== | ||
+ | ファイルのコピー先を指定する部分です。DefaultDestDir=66000は既定の配布先を指定するもので66000はプリンタドライバの配置をする既定のディレクトリ名を示します。番号が特定のディレクトリ名を保持していて、この番号によるディレクトリ名指定の管理はかなりの数が登録されています。66000はGetPrinterDriverDirectoryというAPIを実行して返却される値です。diridと呼ばれています。Windows10のamd64アーキテクチャーの場合はC:\Windows\System32\spool\drivers\x64が返ってきます。[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/install/using-dirids dirid]についてはリンク先に記述があります。 | ||
+ | |||
+ | |||
+ | エクセルがあれば、以下のコードを[[VBA]]のエディタに張り付けてGetPrnterDriverDirectoryの内容を確かめることができます。 | ||
+ | <syntaxhighlight2 lang="VB"> | ||
+ | Declare PtrSafe Function BeepAPI Lib "kernel32.dll" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long | ||
+ | Declare PtrSafe Function GetPrinterDriverDirectory Lib "winspool.drv" Alias "GetPrinterDriverDirectoryA" _ | ||
+ | (ByVal pName As String, _ | ||
+ | ByVal pEnvironment As String, _ | ||
+ | ByVal level As Long, _ | ||
+ | ByVal pDriverDirectory As String, _ | ||
+ | ByVal cbBuff As Long, _ | ||
+ | pcbNeeded As Long) As Long | ||
+ | |||
+ | Sub GetDir() | ||
+ | Dim level As Long | ||
+ | Dim cbBuff As Long | ||
+ | Dim pcbNeeded As Long | ||
+ | Dim pName As String | ||
+ | Dim pEnvironment As String | ||
+ | Dim pDriverDirectory As String | ||
+ | |||
+ | level = 1 'must be 1 | ||
+ | cbBuff = 0 'must be 0 initially | ||
+ | pDriverDirectory = vbNullString 'must be null string initially | ||
+ | |||
+ | pName = vbNullString | ||
+ | |||
+ | pEnvironment = vbNullString | ||
+ | |||
+ | If GetPrinterDriverDirectory(pName, _ | ||
+ | pEnvironment, _ | ||
+ | level, _ | ||
+ | pDriverDirectory, _ | ||
+ | cbBuff, _ | ||
+ | pcbNeeded) = 0 Then | ||
+ | '1回目の呼び出しでは返却で必要な文字数を返すために呼び出します。 | ||
+ | '最初はディレクトリ値は得られません。 | ||
+ | |||
+ | pDriverDirectory = Space$(pcbNeeded) | ||
+ | cbBuff = Len(pDriverDirectory) | ||
+ | |||
+ | If GetPrinterDriverDirectory(pName, _ | ||
+ | pEnvironment, _ | ||
+ | level, _ | ||
+ | pDriverDirectory, _ | ||
+ | cbBuff, _ | ||
+ | pcbNeeded) = 1 Then | ||
+ | '2回目の呼び出しでは返却で必要な文字数設定して呼び出しているので | ||
+ | 'ディレクトリ値が得られます。 | ||
+ | |||
+ | Debug.Print Left$(pDriverDirectory, pcbNeeded) | ||
+ | '取得できた値がイミディエイトウィンドウに表示されます。 | ||
+ | End If | ||
+ | End If | ||
+ | End Sub | ||
+ | |||
+ | |||
+ | |||
+ | </syntaxhighlight2> | ||
+ | |||
+ | |||
+ | |||
+ | ==== ''' [SourceDisksFiles] '''==== | ||
+ | [SourceDisksFiles]は[SourceDisksFiles.amd64]のようにアーキテクチャー情報が付加されたものを対象にすることができます。この欄で先述したCopyFileセクションで記載したファイル一つ一つの詳細情報を記述する部分です。ファイルがどこにあるのかといた情報をつけ足します。たとえINFファイルと同じ位置にあったとしても、ディレクトリの位置がどこなのかを明示する必要があります。 | ||
+ | |||
+ | |||
+ | *<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">78行目:DNuanuni.dll = [1]1<span>(</span>=diskid<span>)</span>,[2]<span>(</span>=subdir<span>)</span>,[3]<span>(</span>upgradecode<span>)</span>,[4]<span>(</span>newinstallcode<span>)</span>,[5]<span>(</span>spare<span>)</span>,[6]<span>(</span>spare<span>)</span>,[7]<span>(</span>newfilename<span>)</span>,11<span>(</span>=diskid<span>)</span>,\amd64<span>(</span>=subidir<span>)</span></span> | ||
+ | : これを紐解くのは難しい。なんで1の後ろにカンマ7つもあるん?コレって感じです。1と11を先述したdiridで1はINFファイルがあるInstalFileドライブを意味しています。11はC:¥Windows¥System32です。WindowsディレクトリはほとんどのPCで共通ですが、名前を変更することもできるので、11が同じ役割のフォルダという風に紐づけられています。diridはややこしいけど、プリンタドライバをインストールする技術としては必要不可欠な便利なシステムです。 | ||
+ | |||
+ | |||
+ | : カンマ7つは別の意味をもっています。[1]diskid, [2]subdir, [3]upgradecode, [4]newinstallcode, [5]spare, [6]spare, [7]newfilename | ||
+ | |||
+ | |||
=== ''' NTPRINT.INI '''=== | === ''' NTPRINT.INI '''=== | ||
867行: | 974行: | ||
</syntaxhighlight2> | </syntaxhighlight2> | ||
+ | |||
+ | |||
+ | |||
+ | [[Windows Driver Model]]に戻る |