본컬럼에대한모든저작권은 DevGuru에있습니다. 컬럼을타사이트등에기재및링크또는컬럼내용을인용시반드시출처를밝히셔야합니다. 컬럼들을 CD나기타매체로배포하고자할경우 DevGuru에동의를얻으셔야합니다. c DevGuru Corporation. All rights reserved 기타자세한질문사항들은웹게시판이나 support@devguru.co.kr 으로 문의하기바랍니다. http://www.devguru.co.kr - 1 -
INF (Information file) 파일에대해 c 2003 Devguru ( Device driver Guru ), Inc. INF 파일이란? 드라이버를제작하고나서, 마지막으로해야할작업은사용자에게배포를할수있게인스톨프로그램을만들거나, 설치화일을만드는것이다. 그중에서 INF 파일을작성하는것은가장복잡하고, 난해한내용을가진것중에하나이다. Microsoft Windows Drivers 는설치를하기위해 INF 파일이필요하다. INF 파일은셋업구성요소에의해사용할드라이버파일, 레지스트리정보, 버전정보등등설치할디바이스와파일에대한모든필요한정보를포함하는텍스트파일이다. INF 파일의구조 INF 파일은섹션 ( Section ) 이라고불리는테이블들로구성되어있다. 각각의섹션은이름을가지 고, [] 대괄호로둘러싸여진다. Ex ) [SectionName] 모든섹션이름은대소문자구분이없이, 이론적으로 255 공백이없는 ANSI or Unicode 문자를 가질수있다. ( 대신, Win9x 에서는 19 ANSI 문자보다적어야한다.). 공백, 탭, 다른컨트롤 문자들 [%];" 은허용이안된다. ( 경우에따라서는될때도있다 ) 섹션이름에여러개의단어를사용하기위해서. 를사용하면안된다. 왜냐하면그문자는 이미 Microsoft 에서예약된것이기때문이다. 대신 _ 또는 - 를사용하면된다. Ex ) [My_model-section] 각각의섹션에는디렉티브 ( directives ) 를가진다. 그것은섹션에존재하지않을수도있고, 디렉티브 ( directives ) 는무엇을할지시스템디바이스인스톨러 ( System device installer ) 에게말한다. ( 파일복사, 레지시트리에엔트리추가등등 ). 주석문자는세미콜론 (;) 이고, 그것은줄에아무곳에서나사용할수있다. INF 에사용하는것에서비교문장같은것은없다. IF-THEN-ELSE 나다른비슷한구조를가질수없다. 그러나섹션이름은특정플랫폼에서인스톨할때구분을할수있게플랫폼에맞는접미사로만들수있다. Ex ) [SectionName.NT] Windows 2000 이후버전 http://www.devguru.co.kr - 2 -
위의섹션은 Windows 2000 이나그이후의윈도우에서만작동한게된다. 섹션들은파일에서보여지는순서대로실행되는것이아니라, 인스톨과정에맞게실행된다. 그러므로, 섹션은파일에어느곳이든지나타날수있다. 대신습관적으로, [version] 섹션은 항상처음에오고, [Strings] 섹션은항상마지막에온다. INF 파일에는사용자에게보여지는여러문자들이있다. 그것들은 C 언어의 #define 매크로와 같이문자열대입할수있는것이있다. 문자열대체매크로는 [Strings] 섹션에정의된다. 섹션에디렉티브들은문자열매크로로정의된다. Ex ) [Strings] my_company = "California Death Beams and Stuff" my_device = "Basselope 2003 Stealth Weapons System" 시스템디바이스인스톨러는 % 매크로이름 % 형태의호출을하는곳에서찾은위치에매크로대체를 수행한다. Ex ) [Manufacturer] %my_company% = install_my_stuff 일반적으로컴퓨터를사용하중에영어권뿐만아니라비영어권사람들도많이사용한다. 그래서컴퓨터화면에도영어뿐만아니라각각의언어에맞게보여지길원한다. 그래서 INF 파일에도언어에따라보여지는문자를선택하게할수있다. 그리고, 시스템디바이스인스톨러는사용자가시스템에설치된언어에기반해서올바른문자열을선택할것이다. 여러분들은여러개의 [Strings] 섹션에의해이것을정의할수있다. 각각의 String 섹션은 Laguage ID 로선언될수있고, Language ID 는 SDK 에서사용되는것과같은형태를가진다. 16 비트중에하위 10 비트는주언어를나타내고, 상위 6 비트는 sublanguage 를나타낸다. 예를들면, U.S English 는 0409 이다. Language 와 SubLanguage ID 의정의는 SDK 에있으니그걸참고하기바란다. 예를들면, 다음과같다. [Strings] one = "One" two = "Two" ; Default, US English [Strings.040c] French (Standard) one = "Un" two = "Deux" http://www.devguru.co.kr - 3 -
[Strings.080a] one = "Uno" two = "Dos" ; Spanish (Mexico) 위에 [strings] 섹션에서, 시스템디바이스인스톨러가 INF 파일에서 %one% 또는 %two% 를만나게되면, 그문자들은 [string] 섹션의문자열로대체될것이다. 만약사용자가 [string] 섹션에지정되지않은다른언어를시스템에서사용하고있으면, 시스템은기본 [string] 섹션을선택할것이다. 주로사용되는 Sections 들 여러분들이 INF 파일에대한 DDK 문서를보면, 여러분들은거기에시스템디바이스인스톨러에 의해서이해할수있는 39 개정도의섹션들이있다. 그리고, 그섹션들은처음에언급한것처럼, INF 파일의섹션대부분이계층구조형태로되어있다. < 그림 1 > http://www.devguru.co.kr - 4 -
< 그림 1> 에보여지는그림처럼왼쪽의섹션들은계층에속한부분이아니고, INF 파일의전체에서필요한부분이다. 계층에서가장맨위계층은 [Manufacturer] 섹션이다. 그리고. 섹션이름들이요구된다. 왜냐하면시스템디바이스인스톨러에의해호출받기때문이다. (Manufacturer, Strings, Version,.Service,.HW 등등 ) 다른섹션이름은여러분들이작성한 INF 파일내에서참고되기때문에여러분들이좋아하는이름으로작성할수있다. 다음은자주사용되는섹션과그섹션내에서의디렉티브들에대해알아보자. 섹션의디렉티브와디렉티브들에대한내용은 DDK 문서를참고하자. Version 이섹션은모든 INF 파일들의기본적으로사용되는헤더부분이다. 이곳에서는 O/S 와 Class Installer 가이 INF 파일을파싱할기본적인내용들을작성한다. Ex ) [Version] Signature = "$Chicago$" ; or $Windows NT$ for 2000/XP Class = Test class name ClassGUID = {30320101-C613-11d2-9647-0020AFEB03E0}; My GUID Provider = %my_company% ; My company CatalogFile = MyCat.cat ; WHQL checksum file DriverVer = 04/01/2003,1.0.121.1 ; Driver date & version Signature 어느 O/S 가이 INF 파일을사용할수있는지를지정한다. $Chicago$ ('Chicago 는 Windows 95 의코드명이다. ) 는윈도우의모든버전에서사용할수있다는것을가르키고, $Windows NT$ 는 Windows 2000 과그이후의버전에서사용할수있다는것을가르킨다. Class - 디바이스가속한종류의이름을나타낸다. 미리정의된디바이스종류와 GUID 들은 DevGUID.H 파일에서찾아볼수있다. 여기에서는내가클래스를만들었다. Test class. If you create your own class name, then you must also have a ClassInstall32 section. ClassGUID INF 파일에디바이스 class GUID 에대한내용을지정한다. Class 와 ClassGUID 는같아야하고, 같지않으면인스톨을실패한다. 만약여러분이새로 class 를만들었다면, 새로운 GUID 는 SDK 나 DDK 에있는 GUIDGEN 프로그램을이용해서만들어야한다. 만약여러분이알고있는 Class 를사용한다면, DevGUID.h 에 GUID 를찾아서사용하면된다. http://www.devguru.co.kr - 5 -
Provider INF 파일을작성한사람을나타낸다. 일반적으로이곳은디바이스를만든회사가될 것이다. 그러나자주 Microsoft 가되어있는걸볼것이다. 이것은 MS 가미리벤더들을위해 많은 INF 파일을만들었기때문이다. CatalogFile - 드라이버와 INF 파일에대해서디지털서명을받은파일을지정한다. 이파일은디바이스 / 드라이버가하드웨어호환성테스트에합격해서로고를받은후에 WHQL 로부터받는다. 개발하는동안에는 catalog 파일은없을것이기때문에. 이부분은생략되거나아무것도없는것으로나타낼수있다. DriverVer 드라이버가만들어진날짜와버전을나타낸다. 시스템디바이스인스톨러는사용할 INF 파일이어떤것인지를선택하고, 찾기위해서이정보를사용한다. SourceDisksNames 이섹션은인스톨할때시스템으로복사할파일을포함하고있는인스톨디스크를지정한다. ex ) [SourceDisksNames] 1 = "Fishbowl Installation Disk #1" 2 = "Fishbowl Installation Disk #2" SourceDisksNames 섹션에서사용되는디렉티브들은다음과같다. disk-id = disk-description[,[tag-file],[unused,path][,flags]] disk-id - 간단히디스크의순서번호이다. 일반적으로디스크는 1 부터시작해서하나씩 증가한다. disk-description - 디스크를나타내는문자열이다. 시스템디바이스인스톨러가시스템에삽일할 디스크를요구할때, 사용자에게보여진다. tag-file - 그디스크에서만알고있는파일의이름이다. Unused - Windows 2000 이나그이후의 Windows 에서는사용하지않는다. Windows 9x 에서사용된다. 자세한것은 Windows 98 DDK 를살펴보면된다. path - 지정된디스크에있는서브디렉토리를가르킨다. flags - 파일이있는 cabinet 파일의이름을지정할 tag-file 를따른다. WinXP 와그이후에 버전에서, cabinet 파일이사용되면, 그다음 tag-file 이름이 flags 필드를뒤따른다. http://www.devguru.co.kr - 6 -
SourceDisksFiles 이섹션은인스톨과정에서시스템으로복사할모든파일을나타낸다. ex ) [SourceDisksFiles] Fish.hex = 1 ; on disk #1 Fishbowl.sys = 2 ; on disk #2 SourceDisksNames 섹션과연관성을가지고실행된다. 디렉티브의형식은다음과같다. filename = disk-id[,[sub-directory][,size]] filename - 인스톨디스크에있는파일의이름 disk-id 파일을포함하는디스크이다. SourceDisksNames 섹션에서선언되어있다. sub-directory 파일이위치한디스크의서브디렉토리를나타낸다. size 바이트로파일의압축안된크기이다. 일반적으로사용하지않는다. DestinationDirs 이섹션은파일을복사할시스템의디렉토리를지정한다. 파일과디렉토리번호의리스트를 포함하는섹션의이름을지정한다. Ex ) [DestinationDirs] Fb-W98-Driver-Files = 10,System32 Drivers Fb-W2K-Driver-Files = 12 [Fb-W98-Driver-Files] driver.sys another_file.dat [Fb-W2K-Driver-Files] driver.sys different_file.dat http://www.devguru.co.kr - 7 -
이섹션에서의디렉티브를위한형식은다음과같다. section-name = directory-id[,sub-directory] section-name INF 파일만드는사람이만든섹션이름이다. 이섹션에서는특정디렉토리로 복사할파일이름의리스트를담고있다. directory-id - 시스템디렉토리를위해미리정의된식별자이다. 대부분의주로드라이버작성자들을위한디렉토리 ID 들을사용한다. 11 = %WinDir% System32, 이고, 12 = %WinDir% System32 Drivers, %WinDir% 는 string 섹션에있는매크로가아니라, 여러분의시스템에미리정의된환경변수를가르킨다. sub-directory - directory-id 에의해지정된서브디렉토리이다. Strings 이섹션에서는 INF 파일내에서사용할문자열매크로정의를제공한다. Ex ) [Strings] ClassName = "Fishbowl" MfgName = "Sannas Consulting, LLC." Fishbowl = "Fishbowl USB Demonstration Device" ServiceDesc = "Fishbowl driver" 이섹션의포맷은다음과같다. macro-name = "some string" macro-name - 문자열을위해정의한매크로이름이다. 퍼센트 (%) 문자로둘러싸여서 INF 파일의 여러곳에서참조하서사용한다. 예 ) %macro-name%. "some string" - 매크로정의내용이다. 이것은 INF 파일에서보여지는매크로의내용을이 문자열로대치할것이다. Manfacturer http://www.devguru.co.kr - 8 -
이섹션은디렉토리와매우비슷하다. 그것들은디바이스가 INF 파일에의해지원되는모든회사들을보여준다. 외부회사를위해, 하나이상의회사가거기에있는것은드물다. 그러나, 마이크로소프트에서만든 INF 파일은하나의 INF 파일안에서술되어있는회사들이여러개있다. Manufacture 섹션은나머지섹션을위한계층의맨위에있다. ( 그림 1 참조 ) ex ) [Manufacturer] %MfgName% = Sannas 이섹션을위한문법은 INF 파일의다른섹션과는다르다. 만약여러분이디렉티브를보면, 큰따옴표로되어있는문장이 ( 매크로로대체되기도함 ) 식별자로사용하고있는것을볼수있다. 그리고, 등호기호는할당하는연산자로사용되지않는다. 대신분리자로써사용된다. 이섹션은시스템디바이스인스톨러가인스톨과정처음에 Hardware id 와 Compatible ID 와같은 INF 를찾는데사용된다. 이섹션은형식은다음과같다. manufacturer-name = models-section-name manufacturer-name - 회사를나타내는문자열이다. models-section-name - 이 INF 파일로지원하는회사들의디바이스모델들의리스트를포함하는 섹션이름이다. ( 이름은 INF 파일작성자가만든다.) Models 이섹션은 INF 파일에서지원하는회사들의다양한디바이스모델들을나타낸다. 이섹션의 이름은 INF 파일작성자에의해결정되고, Manufacture 섹션에서참조한다. Ex ) [our_devices] %device1-name% = product-install, hardware_id, hardware_id %device2-name% = product-install, compatible_id 이섹션의형식은다음과같다. device-description = install-section-name, PNP-id[,PNP-id] device-description - 디바이스를설명하는문자열 ( 주로매크로로나타낸다. ) http://www.devguru.co.kr - 9 -
install-section-name INF 파일작성자가만든섹션이름이다. 디바이스를위한드라이버를 인스톨할내용을담은디렉티브이다. PNP-id - hardware ID 와 compatible ID 이다각각의장치에고유한값이다. 다음의예제를통해어떻게 INF 파일을 O/S 가해석하는지알아보자. 먼저, 시스템디바이스인스톨러가특정디바이스를위한 INF 파일을찾을때 Manufacture 섹션부터시작할것이다. 그리고, Model 섹션을찾을것이다. [California_Death_Beams], 이 INF 파일에의해지원된회사로부터디바이스의목록을포함한다. 만약 [California_Death_Beams] model 섹션에서인스톨러가찾는 hardware IDs 나 compatible IDs 가같지않으면, 그것들은 Manufacture 섹션의다음엔트리를찾을것이다. 그리고, [Texas_Techo_Gizmo] models 섹션을위한 INF 파일을찾을것이다. 그리고, 리스트에서 hardware IDs 와 compatible IDs 들을조사할것이다. 만약, 같은것을찾으면, 인스톨러는이 INF 파일이디바이스를지원하는것이라고결정하고, 지정된 install-section-name 은디바이스를위한드라이버를인스톨한다. [Manufacturer] %cdbs% = California_Death_Beams %ttg% = Texas_Techno_Gizmo [California_Death_Beams] %phaser% = install-phaser, pci ven_9876&dev_1234 %blaster% = install-blaster, pci ven_9876%dev_5678 [Texas_Techno_Gizmo] %bass% = install-bass, dog type_basselope&model_2003 [install-phaser] [install-blaster] [install-bass] http://www.devguru.co.kr - 10 -
[install-bass.nt] [strings] cdbs = "California Death Beams and Stuff, Inc." ttg = "Texas Techo Gizmo, LLC." phaser = "Hand-held phaser, model 1234" blaster = "Hand-held blaster, model 5678" bass = "Basselope 2003 Stealth Weapons Platform" InstallComponent 이섹션 ( DDK 문서에서는 DDInstallSection 라고하기도한다 ) 은디바이스를위한드라이버를 인스톨하기위해요구되는동작을수행한다. 이섹션의이름은 INF 파일작성자에의해결정된다. 그리고, 이섹션은 Models 섹션에서참조된다. ex ) [Fishbowl] CopyFiles = Fb-W98-Driver-Files AddReg = AddReg-Win98, AddReg-All [Fb-W98-Driver-Files] Fishbowl.sys Fish.hex [AddReg-Win98] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,Fishbowl.sys [AddReg-All] HKR,,DebugLevel,0x00010001,2 HKR,,FirmwareFile,0x00000000, SystemRoot System32 Drivers Fish.hex HKR,,AutoloadFirmware,0x00010001,1 이섹션은많은디렉티브들을지원한다. 대부분 CopyFiles 과 AddReg 이다. CopyFiles - 파일이름의리스트를포함하는 INF 파일작성자에복사할파일의이름을지정한다. ( 전에 SourceDisksFiles 섹션에서지정 ) http://www.devguru.co.kr - 11 -
AddReg 레지스트리에추가할내용을포함하는섹션의이름 ( INF 파일작성자에의해만든다 ) 을포함한다..Services InstallComponent 섹션이실행된후에, 시스템디바이스인스톨러는 INF 파일에서 InstallComponent 섹션과동일한섹션이름,.Services 로끝나는섹션을찾는다..Services 섹션은서비스컨트롤매니저에게드라이버를설명하는, 레지스트리의 services 키에엔트리를추가할때사용된다. [Fishbowl.NT.Services] AddService = Fishbowl, 0x00000002, Add-Service [Add-Service] DisplayName = %ServiceDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %11% Drivers Fishbowl.sys 이섹션에서는여러개의디렉티브들을사용한다. 그러나대부분은 AddService 를사용한다. AddService 드라이버를설명하는디렉티브들을포함하는 INF 파일작성자에의해만들어진 섹션의이름을지정한다..HW 이섹션은주로 PnP 필터드라이버를설치하는데사용된다..Services 섹션이실행된후에, 시스템디바이스인스톨러는 InstallComponent 섹션과동일한이름을가진섹션,.HW 로끝나는이름을 INF 파일에서찾는다..HW section 은주로 hardware 키에엔트리를추가할때사용한다. (HKLM System CCS Enum <enumerator> <device-id> <instance-id>). [Snoopy.NT.HW] AddReg = AddReg-HW http://www.devguru.co.kr - 12 -
[AddReg-HW] HKR,,"UpperFilters",0x00010000,"Snoopy" 이섹션은여러개의다른디렉티브를지원한다. 그러나대부분은 AddReg 이다. 레지스트리에추가할엔트리를포함하는섹션을지정한다. upper filter ( FDO 의위에 ) 로로딩하기위해서 UpperFilters 키를지정한다. 그리고, lower filter ( FDO 의밑에 ) 로로딩되기위해서 "LowerFilters" 키를지정한다. 지금까지 INF 파일작성에사용되는섹션들에대해알아봤다. 맺음말 드라이버를사용자에게배포하기필요한 INF 작성에대해설명했습니다. 드라이버를만들고나서 설치를어떻게할지몰라서어려워하는개발자들에게도움이되었으면합니다. 다음칼럼에서는 INF 파일이외에다른드라이버설치관련내용들을다뤄보도록하겠다. http://www.devguru.co.kr - 13 -