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

提供: yonewiki
移動: 案内, 検索
(Model Sections)
 
1行: 1行:
 +
[[Windows Driver Model]]に戻る
 
== '''概要''' ==
 
== '''概要''' ==
 
 WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。
 
 WDM プリンタインストールの解析記事です。最近はPrinterってPDFに出力するだけだったりすることも多いですが、そういったプリンタのインストールってどんな感じの動きをするのかを知るのがこの記事になります。管理人程度の知識ではさほど解析できないと思いますが、まずはやってみましょう。
424行: 425行:
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td></tr>
+
<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 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 Server 2012 R2</td><td align=left>6</td></tr>
444行: 445行:
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td></tr>
+
<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 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.1</td><td align=left>6</td></tr>
457行: 458行:
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">Windows version</span></td><td align=left><span style="font-weight: bold;">Major version</span></td></tr>
+
<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 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 2012</td><td align=left>6</td></tr>
475行: 476行:
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">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><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 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.1</td><td align=left>6</td><td align=left>3</td></tr>
488行: 489行:
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">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><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 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 2012</td><td align=left>6</td><td align=left>2</td></tr>
525行: 526行:
  
  
: 例えば、Intel Atom プロセッサのWindows10はamd64アーキテクチャなので、[Scansoft.NTamd64]のセクション内容が適用されます。ここまでで、
+
: 例えば、Intel Atom プロセッサのWindows10はamd64アーキテクチャなので、[Scansoft.NTamd64]のセクション内容が適用されます。そうするとIntel AtomプロセッサのWindows10はここまでの設定で
  
 
[Versions]
 
[Versions]
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">Var</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr>
+
<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>  Signature</td><td align=left>"\$Windows NT\$"</td></tr>
<tr><td align=right>  Provider</td><td align=left>6</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> 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>  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>      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>
 
</table>
 
</ymath>
 
</ymath>
 +
 +
 
[Manufacturer]
 
[Manufacturer]
 
<ymath>
 
<ymath>
 
<table border=0>
 
<table border=0>
<tr><td align=right><span style="font-weight: bold;">Var</span></td><td align=left><span style="font-weight: bold;">Value</span></td></tr>
+
<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>
+
<tr><td align=right> "Scansoft" </td><td align=left>Scansoft,NTamd64 ; [Scansoft.NTamd64]</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>
+
 
</table>
 
</table>
 
</ymath>
 
</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
 +
 +
 
  
 
=== ''' NTPRINT.INI '''===
 
=== ''' NTPRINT.INI '''===
830行: 974行:
  
 
</syntaxhighlight2>
 
</syntaxhighlight2>
 +
 +
 
 +
 +
[[Windows Driver Model]]に戻る

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



個人用ツール
名前空間

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