▼自作 *.INF ファイルのカン所▼

*.INFファイルを右クリックすると「インストール(I)」てのが 出てきますが、これを使うと

といった、ちょっとした設定実行ツールとして使えます。


*.INFの書式の参考文献としては Windows NT DDK,2.3.1 INF File Format Reference がかなり良い …が今タダで閲覧できるんかいな

Windows 95 Resource Kit, Appendix, Windows 95 INF Files も参照できるが、 NTDDKのほうが説明が詳しい。

$Id: inf.html,v 1.2 2004/02/13 15:24:11 kabe Exp $


▼95型の*.INFで可能なこと

(signature="$Chicago$")

▼95型の*.INFではできないこと

▼ REG_SZ,REG_BINARY 以外の指定:

(signature="$Chicago$"でも可能)

addregセクションで

	hive,keyname,valuename,0x20000,"%SystemRoot%"
他の値は下を参照。

<URL:http://msdn.microsoft.com/library/ddkdoc/ntddk/native/ddk/pg/src/102instl_10.htm>
FLG_ADDREG_BINVALUETYPE 	(0x00000001)
FLG_ADDREG_NOCLOBBER		(0x00000002)
FLG_ADDREG_DELVAL		(0x00000004)
FLG_ADDREG_APPEND		(0x00000008)
FLG_ADDREG_TYPE_MASK		(0xFFFF0000 | FLG_ADDREG_BINVALUETYPE)
FLG_ADDREG_TYPE_SZ		(0x00000000)
FLG_ADDREG_TYPE_MULTI_SZ	(0x00010000)
FLG_ADDREG_TYPE_EXPAND_SZ	(0x00020000)
FLG_ADDREG_TYPE_BINARY		(0x00000000 | FLG_ADDREG_BINVALUETYPE)
FLG_ADDREG_TYPE_DWORD		(0x00010000 | FLG_ADDREG_BINVALUETYPE)
FLG_ADDREG_TYPE_NONE		(0x00020000 | FLG_ADDREG_BINVALUETYPE)
ただしWin95のsetupは0と1 (SZ,BIN)しか理解しない。

▼アンインストーラ

NT:
rundll32.exe syssetup.dll,SetupInfObjectInstallAction DefaultUninstall 132 %17%\XXXXXXX.inf
95:
rundll.exe setupx.dll,InstallHinfSection DefaultUninstall 132 %17%\XXXXXXX.INF
%17%は標準のINF置き場。(%windir%\INF)
NT(,Win98SE?)では *.PNF も消すようにしておくべし。

ちなみに「インストール(I)」は

NT:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %1
(なんでアンインストーラと違うんだろ)

▼AddRegセクションをアンインストール時に流用すると

値は消えるがサブキーまでは消えないため、完全ではない。 ちゃんとアンインストール専用のDelRegセクションを書くほうがよい。

**あるいは、AddRegの先頭にサブキーだけを書いた行を書いておく。 (AddReg時は意味がないので無視されるが、DelReg時に全部消えるようになる)

▼AddReg行の分割

[NT] では、[DefaultInstall*]セクションにAddReg行を複数書いてやれば全部実行してくれる。 DelRegも同様。

[95] では最初のAddRegしか実行してくれないようだ。分割不可。

▼[DefaultInstall]の修飾子

[NT]では、[DefaultInstall.nt], x86NTでは [DefaultInstall.ntx86] が存在していれば、[DefaultInstall]に代わり起動される模様。

[95]では[DefaultInstall]のみか?
<URL:http://msdn.microsoft.com/library/ddkdoc/ntddk/native/ddk/pg/src/102instl_21.htm> によると、95では".win"が使えるらしい。(未確認)
→だめだった。無印の"DefaultInstall"しか使えない?

▼NTではadmin以外はINFをインストールできない?

*.infはadministrator以外で「インストール」すると 「失敗しました」と言われる。(インストール自体はされている)
[version]signatureと[DefaultInstall]空、でも文句いわれるので相当重症だ。 %systemroot%\INF\に書き込み権限がない(*.PNFが作れない)ため?
ファイルコピーなどは行われている。

→<URL:http://support.microsoft.com/support/kb/articles/Q169/1/23.ASP> RunOnceにGrpConv.exeを書こうとするため、らしい。 問題だとは言っているがNTでは直ってないようだ。(Win2000では?)

▼空のレジストリ階層

(サブキーだけで値なし、REGEDIT4の @="")

[add.reg]
HKCU,test\test

サブキーだけで名前も値もなしだとキーだけ作られる。[NT,?95]

▼(")を含むエントリの扱い:

まずkey=value全体を(")で囲み、 次に値自体に含まれる(")を("")に変える。(BASIC?)

データとして "W:\hoge" を入れたいときは
....,,"""W:\hoge""" と書く。 (""W:\hoge""ではダメ)

データとしての % は %% と書く。

▼REG_SZに改行コードが入っているとINFでは書けない…

Binaryとして書くしかないがどっちにしても再現性がなくなる。

▼95では常に""でくくらないといけない?

UpdateInis=...
[...]
%10%\IEXPLORE.INI,Services,,"HTTP_Proxy_Server=http://proxy1.server.jp:8080/"
の" "を抜くと *.ini に書き込まれない。スペース入ってないのに… (更新時刻は変化するので何かはしようとしたようだ) NTではちゃんと書かれる。

▼[string]が有効にならないんですけど

[strings]です。

▼CopyFileが使えません

CopyFilesです。

▼95では[SourceDisksNames]必須?

[NT]ではINF自分自身など、*.infと同じディレクトリにあるファイルをコピーするにしても CopyFilesと[DestinationDirs]だけで済むみたいだが、 [95]では

	[SourceDisksNames]
	;NT doesn't need this
	55 = "ディスク名",,1
がないとコピーできない。 番号は任意だと思う。ここ以外で55番は使ってなくても必要なのが謎。
…それでも「見つからん」とソースディレクトリを聞かれる?
→CopyFilesで右辺と左辺を間違えていた。

▼[要調査]*.PNFて何?

(%windir%\INF\ ; NT (とWin98?)にある)

アンインストール時に一緒に消す必要がある?
→らしい。<URL:http://ourworld.compuserve.com/homepages/Guenter_Born/tipse.htm>
NTだけ?INFをコンパイルしたもの?
→Win98 SE にもあるらしい? <URL:http://www.winmag.com/library/1999/0801/sol0060.htm>
一般ユーザーでエラーが出るのはPNFを作れないため?

▼RunPostSetupCommands

よく分からんが、
http://support.microsoft.com/support/kb/articles/Q193/1/14.asp

↓NT5用infで使える形式?
http://windowsupdate.microsoft.com/nt5help/Server/en/cmak_ops_65.htm

▼他のTips:

<URL:http://mspress.microsoft.com/MSPRESS/PRODUCTS/1039/tipse.htm>
	Key names containing blanks 
	Long filenames in INF files 
	What's with duplicate CopyFiles commands? 
	How to modify the uninstall part for Windows NT 4.0 
	What's HKR?

▼[要調査]95では[SourceDisksFiles]のsubdirは使えない?

リソースキットにはdisk-numberしか指定できないような書かれ方になってるが… NTではfilename=disk-number[,subdir] と書ける。
→使えるみたい。

▼[要調査NT]95ではファイル名は8.3しか使えない?

[copyfile.win] username95.adm は「見つからない」エラーになる。

[copyfile.win] username95.adm=USERNA~1.ADM だと一応入るのだが、username.adm と 8.3に切られてコピーされてしまう。

実際は、%windir%\wininit.ini に書き換えコマンド

	[rename] D:\WINDOWS\INF\username95.adm=D:\WINDOWS\INF\username95.001
が入るのだが、%windir%\INF には 8.3 でコピーされている。 また、Restart句がなくても再起動を促されるようになってしまう。

「*.infで放り込むのは8.3ファイルにしておいたほうがよい」

ところが [poledit2.win]POLEDIT.EXE,95zak-jp.exeは再起動もかからないんだな。

◆◆リソースキットには何も記述がないが、
◆◆[CopyFiles]file1,file2 だと単純リネームで、
◆◆[CopyFiles]file1=file2 だとwininit.iniに仕込むリネーム? (file1,file2,file3の省略形?)
(file1が8.3に切られてしまうのは変わらない)

[調査済]""でくくるとLFNも使えたりしないか?
→ダメ。[95][copyfile.win]"username95.adm",usernm95.admとしてもusername.admとしてコピーされた。

▼ネットワークごしだと*.infはキャッシュされる?

95で、ネットワークごしに*.infインストールを*.infを修正しながらやっていると、 *.infが更新されたはずなのに古い内容のままのインストール動作をすることがある。 (95側のメモ帳で開くとちゃんと更新されているのでSMBのせいではないような気がする)

DOS再起動をかければ直る。(再ログオンではどうか?)

▼[DestinationDirs] 30

30 はRoot directory of the boot driveと説明されているが、 実際はsystem drive (NTでは常にC:\)

24 はNTDDKではApplications directory,95では説明なしだが、 NTでは%SystemDrive%になった。[要調査95]

26 はNTDDKでは説明なし、95ではWinbootとなっているが、 NTでは%windir%\system32\unknown\ となった。(なんじゃこりゃ)

00 はinfのあるカレントディレクトリになった。(00,MSIE302は .\MSIE302)
subdirとして%SystemDrive%などと書いても"%SystemDrive%"そのままで展開されない。

10,..\PROGRA~1\MSIE302 (%windir%\..\PROGRA~1\MSIE302) は失敗する。

29は説明なし。%windir%\system32\unknown\になった。 知らんIDはここに格納される?

▼RunOnceに仕掛けたものはその場で実行される?

[NT][95] どうも HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce に物を仕掛けると、 再起動(次回エクスプローラ起動)時ではなく、「インストール(I)」時に実行されてしまう、らしい。 GUIを伴うものは実行できないみたいだが…

同期実行やUIありは RunOnce\Setup か "!"をnameに前置するかみたいなのがあるらしい

たぶんこの機能はsyssetup.dllの機能。普通のインストーラ(MSIEとか)は自動実行しないから。

▼(FAQ?)AddRegでレジストリ値として %10% (%windir%相当) は使えるのか?

使える。"%10%"と括っても使える。


かべ@sra-tohoku.co.jp