WDM プリンタINFファイル解析一般 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(INFファイルの読み解き)
 
1行: 1行:
 +
[[Windows Driver Model]]に戻る
 
== '''概要''' ==
 
== '''概要''' ==
 
 WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。
 
 WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。
304行: 305行:
  
  
: その前に、行頭のセミコロン(;)とかは、コメントの記述に使われます。その行のセミコロンの後ろはコメントとして扱えるようです。行の途中からでもコメントが添えられますが、コメント化の打消しはできないので、;を入力したらINFコマンドの内容としては、その行はおしまいなのでしょう。
+
: その前に、行頭のセミコロン<span>(</span>;<span>)</span>とかは、コメントの記述に使われます。その行のセミコロンの後ろはコメントとして扱えるようです。行の途中からでもコメントが添えられますが、コメント化の打消しはできないので、;を入力したらINFコマンドの内容としては、その行はおしまいなのでしょう。
  
  
: イコール(=)はプログラムで使われるものと同じ意味を持っていて、イコールの右側(右辺値)の値をイコールの左側(左辺値)のキーワードに代入あるいは関連付けるという動きをします。
+
: イコール<span>(</span>=<span>)</span>はプログラムで使われるものと同じ意味を持っていて、イコールの右側<span>(</span>右辺値<span>)</span>の値をイコールの左側<span>(</span>左辺値<span>)</span>のキーワードに代入あるいは関連付けるという動きをします。
  
  
317行: 318行:
  
  
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">5行目:Signature="$WINDOWS NT$"</span>
+
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">5行目:Signature="\&#x24;WINDOWS NT\&#x24;"</span>
: $WINDOWS NT$は何かのパスを指し示しいるわけではなく、署名はWINDOWS NTというすべてのシステムに対応する署名方式を使いますというお決まりの記述です。すべてのWindowsシステムで共通の値です。深く考える必要はないと思います。Signature="$Chicago$"でも同じ意味だそうですが、こちらの記述を使ったINFファイルを見かけたことはありません。
+
: \$WINDOWS NT\$は何かのパスを指し示しいるわけではなく、署名はWINDOWS NTというすべてのシステムに対応する署名方式を使いますというお決まりの記述です。すべてのWindowsシステムで共通の値です。深く考える必要はないと思います。Signature="\&#x24;Chicago\&#x24;"でも同じ意味だそうですが、こちらの記述を使ったINFファイルを見かけたことはありません。
  
  
338行: 339行:
  
 
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">8行目:ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}</span>
 
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">8行目:ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}</span>
: ClassGUIDはINFファイルの属性を示すIDでPrinterドライバは上記のようなIDになります。わけのわからない数字と英字の連続に見えますが、GUID(Globally Unique Identifier)生成器を使えば100年間ずっと毎秒10億個発番しつづけても重複しないといわれている唯一のIDになっています。世界の人口の10人に1人が毎秒1個発番する専属の担当と指名されたとしても、休みなく発番しつづけても重複しないということです。専属の人なんているわけないし、10人に1人が発番しているなんていうことも考えられません。そうすると上記番号は、この世界における単一目的のために発番した唯一のIDで、このIDがprinterドライバを表すIDになっているということです。これだけ長い英数字でありながらprinterドライバなら同じように4D36E979-E325-11CE-BFC1-08002BE10318が指定されます。
+
: ClassGUIDはINFファイルの属性を示すIDでPrinterドライバは上記のようなIDになります。わけのわからない数字と英字の連続に見えますが、GUID<span>(</span>Globally Unique Identifier<span>)</span>生成器を使えば100年間ずっと毎秒10億個発番しつづけても重複しないといわれている唯一のIDになっています。世界の人口の10人に1人が毎秒1個発番する専属の担当と指名されたとしても、休みなく発番しつづけても重複しないということです。専属の人なんているわけないし、10人に1人が発番しているなんていうことも考えられません。そうすると上記番号は、この世界における単一目的のために発番した唯一のIDで、このIDがprinterドライバを表すIDになっているということです。これだけ長い英数字でありながらprinterドライバなら同じように4D36E979-E325-11CE-BFC1-08002BE10318が指定されます。
  
  
351行: 352行:
  
 
 
 
 
 +
 
==== ''' Manufacturer '''====
 
==== ''' Manufacturer '''====
 
<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">17行目:"Scansoft" = Scansoft,NTamd64</span>
 
<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">17行目:"Scansoft" = Scansoft,NTamd64</span>
 
: 先述のAUTHORのように%MANURACTURERNAM%のように変数を記述して[Strings]セクションでその実態を%MANURACTURERNAM%="製造元名"として表記することができます。変数を使わずに直接、二重引用符で製造元名を記述しても良いです。ここでは"Scansoft"=となっているので二重引用符で製造元名を指定しています。右辺値にはプリンタモデルについて記載されるセクションの値を記入する必要があります。CPUのモデルやOSのバージョンによってプリンタモデルのセクションの適用箇所を自動的に判別して、必要なプリンタモデルを選択できる仕組みがあるため、製造元名=の右辺値は複雑な決まりがいくつかあります。次の段落では右辺値のメカニズムについてを簡単にまとめたものを記述します。
 
: 先述のAUTHORのように%MANURACTURERNAM%のように変数を記述して[Strings]セクションでその実態を%MANURACTURERNAM%="製造元名"として表記することができます。変数を使わずに直接、二重引用符で製造元名を記述しても良いです。ここでは"Scansoft"=となっているので二重引用符で製造元名を指定しています。右辺値にはプリンタモデルについて記載されるセクションの値を記入する必要があります。CPUのモデルやOSのバージョンによってプリンタモデルのセクションの適用箇所を自動的に判別して、必要なプリンタモデルを選択できる仕組みがあるため、製造元名=の右辺値は複雑な決まりがいくつかあります。次の段落では右辺値のメカニズムについてを簡単にまとめたものを記述します。
 +
 +
 +
 製造元名=に続く値は一つ以上のセクション名が必要ですが、セクション名と同一のセクションが後述のINFファイル内に存在しなくても良いです。無い場合は、すべてのCPUアーキテクチャーについてのセクションが必要となります。
 +
 +
 +
 セクション名と同じものを含む場合
 +
 +
 +
<syntaxhighlight2 lang="INI">
 +
[Manufacturer]
 +
"Scansoft" = Scansoft
 +
 +
[Scansoft]
 +
……
 +
……
 +
</syntaxhighlight2>
 +
 +
 +
 +
 右辺値がセクション名と同じものを含まない場合
 +
 +
 +
<syntaxhighlight2 lang="INI">
 +
[Manufacturer]
 +
"Scansoft" = Scansoft,NTx86,NTamd64,NTia64,NTarm,NTarm64
 +
 +
[Scansoft.NTx86]
 +
……
 +
[Scansoft.NTamd64]
 +
……
 +
[Scansoft.NTia64]
 +
……
 +
[Scansoft.NTarm]
 +
……
 +
[Scansoft.NTarm64]
 +
……
 +
</syntaxhighlight2>
 +
 +
 +
 上記のように対応するアーキテクチャーすべてについてのセクションが無いとすべてのWindowsシステムへのドライバインストールを網羅はできません。共通のインストール処理で問題ない場合は、上記の例で[Scansoft]というセクションを配置して、セクションの中で必要なドライバインストール指示を記述します。
 +
 +
 +
 アーキテクチャは以下のように分類されます。
 +
<ytmath>
 +
<style>
 +
table td {
 +
background: #eee;
 +
        padding-left:10px;
 +
}
 +
table tr:nth-child(odd) td {
 +
background: #fff;
 +
}
 +
</style>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">アーキテクチャ略称</span></td><td align=left><span style="font-weight: bold;">説明</span></td></tr>
 +
<tr><td align=right>x86</td><td align=left>intel x86 32bitアーキテクチャ<span>(</span>amd製も含まれる<span>)</span></td><tr><td align=right>amd64</td><td align=left>amd x64 64bitアーキテクチャ<span>(</span>32bit互換/Intel製も含まれる<span>)</span><tr><td align=right>ia64</td><td align=left>Intel Itanium64bitアーキテクチャ</td></tr>
 +
<tr><td align=right>arm</td><td align=left>arm 32bitアーキテクチャ</td></tr>
 +
<tr><td align=right>arm64</td><td align=left>arm 64bitアーキテクチャ</td></tr>
 +
</table>
 +
</ytmath>
 +
 +
 +
 amd64アーキテクチャーが今の流行りだと思います。CPUと聞くとIntelなイメージがありますが命令セット名はamd64という名前がついています。Intel Core i3/i5/i7 IntelAtomプロセッサもamd64です。サーバ側はiaなのでIntelという意味がねじ込んでありますが、i3/i5/i7 IntelAtomプロセッサがamd64命令セットであるのはIntelにとっては気持ちのいいものではないのかもしれません。やるなAMD<span>(</span>アドバンストマイクロデバイセズ<span>)</span>
 +
 +
 +
 アーキテクチャーの下でさらに細分化してセクションを分類できます。
 +
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td></tr>
 +
<tr><td align=right>Windows 10</td><td align=left>10</td></tr>
 +
<tr><td align=right>Windows Server 2012 R2</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows 8.1</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2012</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows 8</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2008 R2</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows 7</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2008</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Vista</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2003 R2</td><td align=left>5</td></tr>
 +
<tr><td align=right>Windows Server 2003</td><td align=left>5</td></tr>
 +
<tr><td align=right>Windows XP</td><td align=left>5</td></tr>
 +
<tr><td align=right>Windows 2000</td><td align=left>5</td></tr>
 +
</table>
 +
</ymath> 
 +
 +
Windows Client
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td></tr>
 +
<tr><td align=right>Windows 10</td><td align=left>10</td></tr>
 +
<tr><td align=right>Windows 8.1</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows 8</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows 7</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Vista</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows XP</td><td align=left>5</td></tr>
 +
</table>
 +
</ymath> 
 +
 +
Windows Server
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td></tr>
 +
<tr><td align=right>Windows Server 2012 R2</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2012</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2008 R2</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2008</td><td align=left>6</td></tr>
 +
<tr><td align=right>Windows Server 2003 R2</td><td align=left>5</td></tr>
 +
<tr><td align=right>Windows Server 2003</td><td align=left>5</td></tr>
 +
<tr><td align=right>Windows 2000</td><td align=left>5</td></tr>
 +
</table>
 +
</ymath>
 +
 +
 +
 Windowsのシステム名が変わるほどの変更で、あきらかに大きな変更なのに案外メジャーバージョンの番号って上がらない。実際は、マイナーバージョンまで記述して、やっとで思うような切り分けができそうな感じさえする。
 +
 +
 +
Windows Client
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td><td align=left><span style="font-weight: bold;">Minor version</span></td></tr>
 +
<tr><td align=right>Windows 10</td><td align=left>10</td><td align=left>0</td></tr>
 +
<tr><td align=right>Windows 8.1</td><td align=left>6</td><td align=left>3</td></tr>
 +
<tr><td align=right>Windows 8</td><td align=left>6</td><td align=left>2</td></tr>
 +
<tr><td align=right>Windows 7</td><td align=left>6</td><td align=left>1</td></tr>
 +
<tr><td align=right>Windows Vista</td><td align=left>6</td><td align=left>0</td></tr>
 +
<tr><td align=right>Windows XP</td><td align=left>5</td><td align=left>1</td></tr>
 +
</table>
 +
</ymath> 
 +
 +
Windows Server
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td><td align=left><span style="font-weight: bold;">Minor version</span></td></tr>
 +
<tr><td align=right>Windows Server 2012 R2</td><td align=left>6</td><td align=left>3</td></tr>
 +
<tr><td align=right>Windows Server 2012</td><td align=left>6</td><td align=left>2</td></tr>
 +
<tr><td align=right>Windows Server 2008 R2</td><td align=left>6</td><td align=left>1</td></tr>
 +
<tr><td align=right>Windows Server 2008</td><td align=left>6</td><td align=left>0</td></tr>
 +
<tr><td align=right>Windows Server 2003 R2</td><td align=left>5</td><td align=left>2</td></tr>
 +
<tr><td align=right>Windows Server 2003</td><td align=left>5</td><td align=left>2</td></tr>
 +
<tr><td align=right>Windows 2000</td><td align=left>5</td><td align=left>0</td></tr>
 +
</table>
 +
</ymath>
 +
 +
 +
 例えばWindows10ビルド19042.867に対応するセクションを作りたい場合は
 +
 +
<syntaxhighlight2 lang="INI">
 +
[Manufacturer]
 +
"ManufacturerID"=ManufacturerID,NTamd64.10.0...19042
 +
 +
[ManufacturerID.NTamd64.10.0...19042]
 +
……
 +
</syntaxhighlight2>
 +
 +
 のようにします。 右辺値に記述した値はモデル名として扱われます。まぁでも、INFファイルって意外に自動判定とかの機能が働くんすね。すごい。Windowsのバージョン番号とかアーキテクチャーをこんな簡単に判断するなんて、昔から高度な機能を実装してたんですね。
 +
 +
 
 +
 +
==== ''' Model Sections '''====
 +
 Manufacrurerの右辺値に設定したモデル名ごとのプリンタ設定を記述するセクションの指定をします。例では、2つのモデル名ScansoftとScansoft.NTamd64を指定しています。このセクションの中で設定する左辺値はプリンタドライバ名で右辺値はインストーラセクション名になります。モデル名で分岐したものが結局は同じインストーラセクション名になることがあります。今回の例でも、同じインストーラセクションになっています。
 +
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">26行目:[Scansoft]</span>
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">27行目:"PaperPort Image Printer" = Nuan.gpd</span>
 +
: [Scansoft]セクションはCPUのアーキテクチャーamd64以外で適用される、OSの種類に関係なくアクティブになるセクションです。プリンタドライバ名はPaperport Image Printerで、その中身であるインストーラセクションはNuan.gpdセクションを参照するように設定しています。
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">26行目:[Scansoft.NTamd64]</span>
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">27行目:"PaperPort Image Printer" = Nuan.gpd</span>
 +
: [Scansoft.NTamd64]セクションも、[Scansoft]セクションと同じ設定になっています。
 +
 +
 +
: 例えば、Intel Atom プロセッサのWindows10はamd64アーキテクチャなので、[Scansoft.NTamd64]のセクション内容が適用されます。そうするとIntel AtomプロセッサのWindows10はここまでの設定で
 +
 +
[Versions]
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Var</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr>
 +
<tr><td align=right>  Signature</td><td align=left>"\$Windows NT\$"</td></tr>
 +
<tr><td align=right>  Provider</td><td align=left>"Scansoft"</td></tr>
 +
<tr><td align=right> LayoutFile</td><td align=left>ntprint.inf ; 無効な行</td></tr>
 +
<tr><td align=right>  ClassGUID</td><td align=left>{4D36E979-E325-11CE-BFC1-08002BE10318}</td></tr>
 +
<tr><td align=right>      Class</td><td align=left>Printer</td></tr>
 +
<tr><td align=right>      DriverVer</td><td align=left>05/12/2006,1.0.0.0</td></tr>
 +
</table>
 +
</ymath>
 +
 +
 +
[Manufacturer]
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Var</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr>
 +
<tr><td align=right>  "Scansoft" </td><td align=left>Scansoft,NTamd64 ; [Scansoft.NTamd64]</td></tr>
 +
</table>
 +
</ymath>
 +
 +
 +
[Scansoft.NTamd64]
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Var</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr>
 +
<tr><td align=right>  "PaperPort Image Printer" </td><td align=left>Nuan.gpd</td></tr>
 +
</table>
 +
</ymath>
 +
 +
 +
: のように設定されたことになります。
 +
 +
==== ''' Installer Sections '''====
 +
 Manufacrurerの右辺値に設定したモデル名ごとのプリンタ設定を記述するセクションの指定をします。例では、2つのモデル名ScansoftとScansoft.NTamd64を指定しています。このセクションの中で設定する左辺値はプリンタドライバ名で右辺値はインストーラセクション名になります。モデル名で分岐したものが結局は同じインストーラセクション名になることがあります。今回の例でも、同じインストーラセクションになっています。
 +
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">39行目:[Nuan.gpd]</span>
 +
 +
: Model Sectionsで指定した[Nuan.gpd]というセクションでInstallに必要な情報記述するインストーラセクションの情報を記述します。
 +
 +
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">40行目:CopyFiles=@Nuan.gpd,@NuanPrn.ini,DLLFILES</span>
 +
 +
: インストーラセクション中の左辺値CopyFilesはインストールドライバ元で用意したファイルの内コピーするファイルを右辺値で指定します。@マークがついている名称はファイルの実体そのものの名称であることを示していて、変数とかではないことを意味しています。例でいうと、ドライバのINFファイルがあるディレクトリと同じ階層にNuan.gpdとNuanPrn.iniがあることを意味していて、これらをコピーすることを意味しています。@マークのついていないDLLFILESは[DLLFILES]というセクションで個別にコピーするファイルを指定することを意味しています。
 +
 +
 +
*<span style = "background:linear-gradient(transparent 75%, #ff7f7f 75%); font-weight:bold; ">41行目:DataSection=UNIDRV_DATA</span>
 +
 +
: インストーラセクション中の左辺値DataSectionは各種プリンタで共通するインストールドライバを読み込むために指定します。マイクロソフトINFプリンタNtprint.infでは3つの有効なドライバセクションが存在しています。
 +
 
 +
 +
Microsoft's DataSection
 +
<ymath>
 +
<table border=0>
 +
<tr><td align=right><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>■共通プリンタードライバ<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>
 +
</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
  
 
 
 
 
637行: 974行:
  
 
</syntaxhighlight2>
 
</syntaxhighlight2>
 +
 +
 
 +
 +
[[Windows Driver Model]]に戻る

2021年5月12日 (水) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス