This section includes the following topics.
Creating an INF File for a File System Driver
The Windows Setup and Device Installer Services, known collectively as SetupAPI, provide the functions that control Windows setup and driver installation. The installation process is controlled by INF files.
A file system driver's INF file provides instructions that SetupAPI uses to install the driver. The INF file is a text file that specifies the files that must be present for your driver to run and the source and destination directories for the driver files. An INF file also contains driver configuration information that SetupAPI stores in the registry, such as the driver's start type and load order group.
You can create a single INF file to install your driver on multiple versions of the Windows operating system. For more information about creating such an INF file, see Creating INF Files for Multiple Platforms and Operating Systems and Creating International INF Files.
Starting with 64-bit versions of Windows Vista, all kernel-mode components, including non-PnP (Plug and Play) drivers such as file system drivers (file system, legacy filter, and minifilter drivers), must be signed in order to load and execute. For these versions of the Windows operating system, the following list contains information that is relevant to file system drivers.
INF files for non-PnP drivers, including file system drivers, are not required to contain [Manufacturer] or [Models] sections.
The SignTool command-line tool, located in the \bin\SelfSign directory of the WDK installation directory, can be used to directly "embed sign" a driver SYS executable file. For performance reasons, boot-start drivers must contain an embedded signature.
With Administrator privileges, an unsigned driver can still be installed on x64-based systems starting with Windows Vista. However, the driver will fail to load (and thus execute) because it is unsigned.
For detailed information about the driving signing process, including the driving signing process for 64-bit versions of Windows Vista, see Kernel-Mode Code Signing Walkthrough.
All kernel-mode components, including custom kernel-mode development tools, must be signed. For more information, see Signing Drivers during Development and Test (Windows Vista and Later).
INF files cannot be used to read information from the registry or to launch a user-mode application.
After creating an INF file, you will typically write the source code for your setup application. The setup application calls user-mode setup functions to access the information in the INF file and perform installation operations.
To construct your own file system driver INF file, use the following information as a guide. You can use the ChkINF tool to check the syntax of your INF file.
An INF file for a file system driver generally contains the following sections.
DestinationDirs (optional but recommended)
The Version section specifies the driver version information, as shown in the following code example.
[Version] Signature = "$WINDOWS NT$" Provider = %Msft% DriverVer = 08/28/2000,220.127.116.11 CatalogFile =
The following table shows the values that file system filter drivers should specify in the Version section.
In your own INF file, you should specify a provider other than Microsoft.
Leave this entry blank. In the future, it will contain the name of a WHQL-supplied catalog file for signed drivers.
The DestinationDirs section specifies the directories where the file system driver files will be copied.
In this section and in the ServiceInstall section, you can specify well-known system directories by using system-defined numeric values. For a list of these values, see INF DestinationDirs Section. In the following code example, the value "12" refers to the Drivers directory (%windir%\system32\drivers).
[DestinationDirs] DefaultDestDir = 12 ExampleFileSystem.DriverFiles = 12
The SourceDisksNames section specifies the distribution media to be used.
In the following code example, the SourceDisksNames section lists a single distribution media for the file system driver. The unique identifier for the media is 1. The name of the media is specified by the %Disk1% token, which is defined in the Strings section of the INF file.
[SourceDisksNames] 1 = %Disk1%
The SourceDisksFiles section specifies the location and names of the files to be copied.
In the following code example, the SourceDisksFiles section lists the file to be copied for the file system driver and specifies that the files can be found on the media whose unique identifier is 1 (This identifier is defined in the SourceDisksNames section of the INF file.)
[SourceDisksFiles] examplefilesystem.sys = 1
Note The CopyFiles directive should not refer to the catalog file or the INF file itself; SetupAPI copies these files automatically.
You can create a single INF file to install your driver on multiple versions of the Windows operating system. This type of INF file is created by creating additional DefaultInstall, DefaultInstall.Services, DefaultUninstall, and DefaultUninstall.Services sections for each operating system version. Each section is labeled with a decoration (for example, .ntx86, .ntia64, or .nt) that specifies the operating system version to which it applies. For more information about creating this type of INF file, see Creating INF Files for Multiple Platforms and Operating Systems.
In the following code example, the CopyFiles directive copies the files that are listed in the ExampleFileSystem.DriverFiles section of the INF file.
[DefaultInstall] OptionDesc = %ServiceDesc% CopyFiles = ExampleFileSystem.DriverFiles [ExampleFileSystem.DriverFiles] examplefilesystem.sys
In the following code example, the AddService directive adds the file system service to the operating system. The %ServiceName% token contains the service name string, which is defined in the Strings section of the INF file. ExampleFileSystem.Service is the name of the file system driver's ServiceInstall section.
[DefaultInstall.Services] AddService = %ServiceName%,,ExampleFileSystem.Service
The ServiceInstall section adds subkeys or value names to the registry and sets values. The name of the ServiceInstall section must appear in an AddService directive in the DefaultInstall.Services section.
The following code example shows the ServiceInstall section for the file system driver.
[ExampleFileSystem.Service] DisplayName = %ServiceName% Description = %ServiceDesc% ServiceBinary = %12%\examplefilesystem.sys ServiceType = 2 ; SERVICE_FILE_SYSTEM_DRIVER StartType = 1 ; SERVICE_SYSTEM_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL LoadOrderGroup = "File System" AddReg = ExampleFileSystem.AddRegistry
The DisplayName entry specifies the name for the service. In the preceding example, the service name string is specified by the %ServiceName% token, which is defined in the Strings section of the INF file.
The Description entry specifies a string that describes the service. In the preceding example, this string is specified by the %ServiceDesc% token, which is defined in the Strings section of the INF file.
The ServiceBinary entry specifies the path to the executable file for the service. In the preceding example, the value 12 refers to the Drivers directory (%windir%\system32\drivers).
The ServiceType entry specifies the type of service. The following table lists the possible values for ServiceType and their corresponding service types.
SERVICE_KERNEL_DRIVER (Device driver service)
SERVICE_FILE_SYSTEM_DRIVER (File system or file system filter driver service)
SERVICE_WIN32_OWN_PROCESS (Microsoft Win32 service that runs in its own process)
SERVICE_WIN32_SHARE_PROCESS (Win32 service that shares a process)
The ServiceType entry should always be set to SERVICE_FILE_SYSTEM_DRIVER for a file system driver.
The StartType entry specifies when to start the service. The following table lists the possible values for StartType and their corresponding start types.
For detailed descriptions of these start types to determine which one is appropriate for your file system driver, see What Determines When a Driver Is Loaded.
Starting with x64-based Windows Vista systems, the binary image file of a boot-start driver (a driver that has a start type of SERVICE_BOOT_START) must contain an embedded signature. This requirement ensures optimal system boot performance. For more information, see Kernel-Mode Code Signing Walkthrough.
For information about how the StartType and LoadOrderGroup entries determine when the driver is loaded, see What Determines When a Driver Is Loaded.
The ErrorControl entry specifies the action to be taken if the service fails to start during system startup. The following table lists the possible values for ErrorControl and their corresponding error control values.
SERVICE_ERROR_IGNORE (Log the error and continue system startup.)
SERVICE_ERROR_NORMAL (Log the error, display a message to the user, and continue system startup.)
SERVICE_ERROR_SEVERE (Switch to the registry's LastKnownGood control set and continue system startup.)
SERVICE_ERROR_CRITICAL (If system startup is not using the registry's LastKnownGood control set, switch to LastKnownGood and try again. If startup still fails, run a bug-check routine. Only the drivers that are needed for the system to startup should specify this value in their INF files.)
The LoadOrderGroup entry must always be set to "File System" for a file system driver. This is different from what is specified for a file system filter driver or file system minifilter driver where the LoadOrderGroup entry is set to one of the file system filter load order groups. For more information about the load order groups that are used for file system filter drivers and file system minifilter drivers, see Load Order Groups for File System Filter Drivers and Load Order Groups and Altitudes for Minifilter Drivers.
The AddReg directive refers to one or more INF writer-defined AddRegistry sections that contain any information to be stored in the registry for the newly installed service.
Note If the INF file will also be used for upgrading the driver after the initial install, the entries that are contained in the AddRegistry section should specify the 0x00000002 (FLG_ADDREG_NOCLOBBER) flag. Specifying this flag preserves the registry entries in HKLM\CurrentControlSet\Services when subsequent files are installed. For example:
In the following code example, the DelFiles directive removes the files that are listed in the ExampleFileSystem.DriverFiles section of the INF file.
[DefaultUninstall] DelFiles = ExampleFileSystem.DriverFiles DelReg = ExampleFileSystem.DelRegistry
The DelReg directive refers to one or more INF writer-defined DelRegistry sections that contain any information to be removed from the registry for the service that is being uninstalled.
The DefaultUninstall.Services section is optional but recommended if your driver can be uninstalled. It contains DelService directives to remove the file system driver's services.
In the following code example, the DelService directive removes the file system driver's service from the operating system.
[DefaultUninstall.Services] DelService = %ServiceName%,0x200
Note The DelService directive should always specify the 0x200 (SPSVCINST_STOPSERVICE) flag to stop the service before it is deleted.
Note There are certain classes of file system products that cannot be completely uninstalled. In this situation, it is acceptable to just uninstall the components of the product that can be uninstalled and leave installed the components of the product that cannot be uninstalled. An example of such a product is the Microsoft Single Instance Store (SIS) feature.
The Strings section defines each %strkey% token that is used in the INF file.
For example, the file system driver defines the following strings in its INF file.
[Strings] Msft = "Microsoft Corporation" ServiceDesc = "Example File System Driver" ServiceName = "ExampleFileSystem" ParameterPath = "SYSTEM\CurrentControlSet\Services\ExampleFileSystem\Parameters" Disk1 = "Example File System Driver CD"
You can create a single international INF file by creating additional locale-specific Strings.LanguageID sections in the INF file. For more information about international INF files, see Creating International INF Files.