Portando um INF para seguir o isolamento do pacote de driver

Este artigo destina-se a ser um guia de pesquisa rápida para ajudá-lo a atualizar um arquivo INF para seguir o isolamento do pacote de driver como parte da atualização do pacote de driver para ser um Driver do Windows. As seções a seguir fornecem exemplos de algumas das coisas mais comuns que você pode ter no arquivo INF do pacote de driver com referências a informações sobre como atualizá-los para serem compatíveis com o isolamento do pacote de driver. Se o pacote de driver precisar oferecer suporte à maneira antiga de fazer algo para versões mais antigas do sistema operacional ao usar a nova maneira em versões mais recentes do sistema operacional, consulte Combinação de extensões de plataforma com versões do sistema operacional para saber como fazer isso em um INF.

DestinationDirs não é DIRID 13

Se a seção DestinationDirs especificar um destino para arquivos que não seja DIRID 13, o INF não será compatível com o isolamento do pacote de driver. Todos os arquivos no pacote de driver devem ser executados do Repositório de Driver, o que significa usar DIRID 13. Isso pode exigir atualizações para mais do que apenas a seção DestinationDirs. Outras operações realizadas pelo INF que se referem a arquivos pagos pelo INF também podem precisar de atualização. Por exemplo, talvez seja necessário atualizar a diretiva ServiceBinary em uma seção de instalação de serviço referenciada por uma diretiva AddService ou um valor do registro escrito por uma diretiva AddReg. Em geral, a execução a partir do Repositório de Driver tem suporte no Windows 10 1709 e versões posteriores do Windows, mas algumas pilhas de dispositivos podem não oferecer suporte a arquivos que se conectam a essas pilhas que estão sendo executados do Repositório de Driver até uma versão posterior. Para obter mais informações, consulte Executar do Repositório de Drivers.

Uso e AddReg para registrar provedores ETW e canais EventLog

Se o INF usar uma diretiva AddReg para registrar um provedor ETW e canais EventLog, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "OwningPublisher", 0x0, "{35356277-0b54-43da-b324-671006d74759}"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Enabled", 0x00010001, 1
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Isolation", 0x00010001, 1
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "ChannelAccess",0x0, \
"O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x3;;;BO)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x3;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Type", 0x00010001, 2
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}" , , 0x0, "ExampleProvider"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}", "ResourceFileName", 0x00020000, "%13%\ExampleBinary.sys"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}", "MessageFileName", 0x00020000, "%13%\ExampleBinary.sys"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", , 0x0, "ExampleProvider/Analytic"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", "Id", 0x00010001, 16
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", "Flags", 0x00010001, 0
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences", Count, 0x00010001, 1

Em vez de usar um AddReg para registrar provedores ETW e canais EventLog, eles devem ser registrados usando uma diretiva AddEventProvider de uma seção DDInstall.Events. Por exemplo:

[ExampleDDInstall.Events]
AddEventProvider={35356277-0b54-43da-b324-671006d74759}, Example_EVvntProvider_Inst

[Example_EventProvider_Inst]
ProviderName=ExampleProvider
ResourceFile=%13%\ExampleBinary.sys
MessageFile=%13%\ExampleBinary.sys
AddChannel=ExampleProvider/Analytic,0x3,Example_Channel_Inst ; Note that the type of the channel here is different than in the raw AddReg. Please see the AddEventProvider documentation for appropriate values

[Example_Channel_Inst]
Isolation=1
Access="O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x3;;;BO)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x3;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)"
Enabled=1
Value=16

O uso de uma diretiva AddEventProvider de uma seção DDInstall.Events tem suporte no Windows 10 1809 e versões posteriores do Windows.

Uso de AddReg para registrar um AutoLogger

Se o INF usar uma diretiva AddReg para registrar ou modificar um AutoLogger ETW, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, BufferSize, %REG_DWORD%, 0x00000040
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, GUID, %REG_SZ%, "{6f1373c7-eec8-495c-bfe5-1270336368df}"
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, Start, %REG_DWORD%, 0x00000001
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, MaximumBuffers, %REG_DWORD%, 0x00000040
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, LogFileMode, %REG_DWORD%, 0x400
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, EnableLevel, %REG_DWORD%, 0x00000004
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, MatchAnyKeyword, %REG_QWORD%, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, Enabled, %REG_DWORD%, 0x00000001

Em vez de usar um AddReg para registrar ou atualizar um AutoLogger, ele deve ser registrado ou atualizado usando uma diretiva AddAutoLogger ou UpdateAutoLogger de uma seção DDInstall.Events. Por exemplo:

[ExampleDDInstall.Events]
AddAutoLogger=ExampleAutoLogger,{6f1373c7-eec8-495c-bfe5-1270336368df},Example_AutoLogger_Inst

[Example_AutoLogger_Inst]
Start=1
BufferSize = 0x40
LogFileMode=0x400
MaximumBuffers=0x40
AddAutoLoggerProvider={35356277-0b54-43da-b324-671006d74759},Example_AutoLoggerProvider_Inst

[Example_AutoLoggerProvider_Inst]
Enabled=1
EnableLevel=0x4
MatchAnyKeyword=0

O uso de uma diretiva AddAutoLogger ou UpdateAutoLogger de uma seção DDInstall.Events tem suporte no Windows 11 e versões posteriores do Windows.

Uso do AddReg para adicionar uma entrada à chave RunOnce

Se o INF usar uma diretiva AddReg para adicionar uma entrada à chave RunOnce, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce, ExampleEntry, ,"application.exe"

Não há suporte para isso. Um INF não deve modificar entradas de registro global. Se uma ação de instalação única for necessária quando o pacote de driver for instalado, você poderá usar uma diretiva AddSoftware de dentro de um arquivo INF de componente para iniciá-lo. Isso é apenas para ações não críticas. A funcionalidade crítica para o dispositivo ou dispositivos instalados com este pacote de driver não deve depender da execução de ações externas à instalação do dispositivo.

Uso do AddReg para adicionar uma entrada à chave Run

Se o INF usar uma diretiva AddReg para adicionar uma entrada à chave Run, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM, Software\Microsoft\Windows\CurrentVersion\Run, ExampleEntry, ,"application.exe"

Não há suporte para isso. Um INF não deve modificar entradas de registro global. Se a entrada Run for para agregar valor agregado ao sistema, seu aplicativo deverá ser um aplicativo da Plataforma Universal do Windows e instalado usando uma diretiva AddSoftware de uma seção DDInstall.Software. Para obter mais informações, consulte Emparelhando um driver com um aplicativo da Plataforma Universal do Windows (UWP). Se esse software for um serviço que não precisa apresentar nenhuma interface do usuário, um serviço Win32 poderá ser registrado no pacote de driver com uma diretiva AddService. Ao registrar um serviço associado a um dispositivo, o serviço só deve estar em execução quando o dispositivo estiver presente. O serviço deve ter um tipo de início de 'início de demanda' e deve usar uma diretiva AddTrigger da seção de instalação do serviço para configurar os gatilhos que farão com que o serviço seja iniciado quando o dispositivo estiver presente no sistema. Isso é feito identificando uma interface de dispositivo que o driver no dispositivo irá expor e usando a diretiva AddTrigger para especificar que o serviço deve ser iniciado quando esse hardware for exibido. Em runtime, o serviço deve monitorar o dispositivo que está desaparecendo. Se o dispositivo for removido do sistema para que o serviço não precise continuar em execução, o serviço deverá parar. Para se registrar para notificações de chegada e remoção da interface do dispositivo, consulte CM_Register_Notification.

Uso de CopyFiles para adicionar arquivos aos diretórios de "Arquivos de Programas"

Se o INF usa uma diretiva CopyFiles para adicionar arquivos aos diretórios de "Arquivos de Programas", o INF não é compatível com o isolamento do pacote de driver. Isso inclui, mas não está limitado a, uso dos DIRIDs 16422, 16426, 16427 e 16428. Por exemplo, seu INF pode ter:

[DestinationDirs]
Example_CopyFiles = 16422, Contoso

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleFile.exe

Isso não tem suporte. Um INF não deve copiar arquivos para locais globais. Os diretórios de "Arquivos de Programas" são normalmente usados para instalar aplicativos de software, não drivers. Se o seu objetivo é criar e fornecer um aplicativo complementar para seu dispositivo que se comunique com seu driver, consulte as diretrizes do Aplicativo de Suporte de Hardware. Por exemplo, seu aplicativo pode ser um aplicativo da Plataforma Universal do Windows e instalado usando uma diretiva AddSoftware de uma seção DDInstall.Software. Consulte Emparelhamento de um driver com um aplicativo UWP (Plataforma Universal do Windows) para obter mais informações. Se a entrada CopyFiles não for para adicionar um aplicativo complementar ao sistema e os arquivos devem permanecer como parte do pacote de driver, eles precisam ser feitos para serem "executados do Repositório de Drivers".

CoInstaller que inicia a interface do usuário

Se o INF usa um CoInstaller para instalar um aplicativo com o qual o usuário deve interagir, o INF não é compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode registrar um CoInstaller como este:

[ExampleDDInstall.CoInstallers]
CopyFiles = CoInstallerCopyFilesSection
AddReg = Example_CoInstallers_AddReg

[CoInstallerCopyFilesSection]
ExampleCoInstall.dll

[Example_CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"ExampleCoInstall.dll,ExampleCoInstallEntryPoint"

Para obter informações sobre como lidar com essa situação, consulte Remoção de coinstaladores de Pacotes de Drivers.

Uso de AddReg para modificar um serviço que não é adicionado pelo INF

Se o INF usar uma diretiva AddReg para modificar o estado de um serviço que não é adicionado por uma diretiva AddService no INF, o INF não é compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM,SYSTEM\CurrentControlSet\Services\ServiceNotCreatedByThisInf\ExampleKey, ExampleValue, %REG_DWORD%, 1

Não há suporte para isso. Um INF só deve alterar as configurações nos serviços criados por esse INF e o INF deve remover esse AddReg.

Uso de AddReg para modificar o estado na raiz de um serviço

Se o INF usar uma diretiva AddReg para criar chaves ou valores na raiz do estado de um serviço, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst

[Example_Service_Inst]
DisplayName   = %SvcDesc%
ServiceType   = %SERVICE_KERNEL_DRIVER%
StartType     = %SERVICE_DEMAND_START%
ErrorControl  = %SERVICE_ERROR_NORMAL%
ServiceBinary = %13%\ExampleBinary.sys
AddReg = Example_Service_Registry

[Example_Service_Registry]
HKR,,ExampleValue,%REG_DWORD%,0x00000040
HKR,CustomSubkey,ExampleValue,%REG_DWORD%,0x00000040

Para ser compatível com o isolamento do pacote de driver, uma diretiva AddReg que fornece chaves e valores do Registro de serviço só pode modificar chaves e valores na subchave Parâmetros do serviço.

Se o INF estiver modificando o estado de serviço intrínseco, como o Grupo de Ordem de Carga, gatilhos de serviço etc., você precisará usar as diretivas INF internas para especificar esse estado, conforme descrito na diretiva AddService.

Se o INF estiver criando ou modificando outro estado sob a raiz do serviço, as configurações precisarão ser movidas sob a subchave Parâmetros do serviço e a subchave Parâmetros poderá ser acessada em tempo de execução com IoOpenDriverRegistryKey usando um RegKeyType de DriverRegKeyParameters. IoOpenDriverRegistryKey tem suporte no Windows 10, 1803 e versões posteriores do Windows.

Uso de HKCR AddReg para registrar um APO

Se o INF usa uma diretiva AddReg com uma raiz do Registro HKCR para registrar um APO (Objeto de Processamento de Áudio), o INF não é compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "FriendlyName", , %APO_FriendlyName%
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "Copyright", , %MfgName%
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MajorVersion", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinorVersion", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "Flags", 0x00010001, 0x0000000d
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinInputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxInputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinOutputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxOutputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxInstances", 0x00010001, 0xffffffff
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "NumAPOInterfaces", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "APOInterface0", , "{b0a50980-ded6-4f45-84cb-19d2d1245f6d}"

Em vez disso, as informações de registro do APO devem estar em uma seção referenciada por uma diretiva AddReg de uma seção DDInstall. A raiz do registro HKCR deve ser alterada para uma raiz do registro HKR para colocar as configurações relativas ao local do estado do registro "software" (também conhecido como "driver") do dispositivo. Para obter mais informações, consulte Registro de APOs para modos e efeitos de processamento no arquivo INF.

A versão do driver UMDF é inferior a 2

Se o pacote de driver carregar um driver UMDF (User-Mode Driver Framework) que usa uma versão UMDF anterior à versão 2, ele não é compatível com "Drivers do Windows". Para obter mais informações sobre como mover o driver UMDF para uma versão UMDF mais recente, consulte Como portar um driver de UMDF 1 para UMDF 2.

Uso de AddReg para adicionar um filtro superior ou inferior a uma pilha de dispositivos

Se o INF usar uma diretiva AddReg para adicionar um filtro superior ou inferior a uma pilha de dispositivos, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall.HW]
AddReg = FilterAddReg

[FilterAddReg]
HKR,,"UpperFilters",0x00010000,"ExampleFilterDriver" ; REG_MULTI_SZ value

Em vez disso, o filtro deve ser adicionado à pilha de dispositivos usando a diretiva AddFilter . Por exemplo:

[ExampleDDInstall.Filters]
AddFilter = ExampleFilterDriver,, ExampleFilterSection

[ExampleFilterSection]
FilterPosition = Upper

Consulte Pedido de driver de filtro de dispositivo para obter mais detalhes sobre como adicionar filtros de dispositivo.

Uso de AddReg para registrar valores de Nome de Categoria de Mídia

Se o INF usar uma diretiva AddReg para registrar um valor de Nome de Categoria de Mídia, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\MediaCategories\%ExampleGuid%,Name,,%ExampleName%

Em vez de usar um AddReg para registrar um nome de categoria de mídia no local do registro global, eles devem ser registrados no estado relativo do dispositivo usando um AddReg HKR da seção DDInstall. Por exemplo:

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKR,MediaCategories\%ExampleGuid%,Name,,%ExampleName%

O uso do estado relativo do dispositivo para registrar nomes de Categoria de Mídia tem suporte no Windows 10, versão 1809 e versões posteriores do Windows. Consulte Nomes amigáveis para dispositivos de ponto de extremidade de áudio para obter mais informações.

Uso de AddReg para registrar valores de Exibição de Categoria de Mídia

Se o INF usar uma diretiva AddReg para registrar um valor de Exibição de Categoria de Mídia, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\MediaCategories\%ExampleGuid%,Display,1,00,00,00,00

Esse valor não é usado e deve ser removido do INF.

Usando AddReg para registrar valores DmaSecurity\AllowedBuses

Se o seu INF usa uma diretiva AddReg para especificar valores na HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses chave de registro, o INF não será compatível com o isolamento do pacote de driver. Por exemplo, seu INF pode ter:

[ExampleDDInstall]
AddReg=DmaSecurityRegistration

[DmaSecurityRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses,"Example Friendly Name Description",0,PCI\VEN_ABCD&DEV_0123

A partir do Windows 11, versão 24H2, esse valor não é usado e deve ser removido do INF. Consulte Requisitos de hardware de criptografia automática de dispositivo do BitLocker para obter mais informações.