Свежие обсуждения
Компьютеры

Модернизация драйверов

1 3

Конкретно, речь о драйверах FT232R (но, полагаю, подойдёт и для других).
Как сделать, что б в секции [FtdiPort.NT.HW.AddReg] файла ftdiport.inf, можно было загружать разный HKR,,"ConfigData", в зависимости от комбинации VID-PID?

[Version]
Signature="$Windows NT$"
DriverPackageType=PlugAndPlay
DriverPackageDisplayName=%DESC%
Class=Ports
ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318}
Provider=%FTDI%
CatalogFile=ftdiport.cat
DriverVer=04/10/2012,2.08.24

[SourceDisksNames]
1=%DriversDisk%,,,

[SourceDisksFiles]
ftser2k.sys=1,i386
ftserui2.dll=1,i386
ftcserco.dll = 1,i386

[SourceDisksFiles.amd64]
ftser2k.sys=1,amd64
ftserui2.dll=1,amd64
ftcserco.dll = 1,amd64

[DestinationDirs]
FtdiPort.NT.Copy=10,system32\drivers
FtdiPort.NT.CopyUI=10,system32
FtdiPort.NT.CopyCoInst=10,system32

[ControlFlags]
ExcludeFromSelect=*

[Manufacturer]
%FTDI%=FtdiHw,NTamd64

[FtdiHw]
%VID_0403&PID_6001.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6001
%VID_0403&PID_6010.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6010
%VID_0403&PID_6011.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6011
%VID_0403&PID_6014.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6014
%VID_0403&PID_6015.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6015

[FtdiHw.NTamd64]
%VID_0403&PID_6001.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6001
%VID_0403&PID_6010.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6010
%VID_0403&PID_6011.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6011
%VID_0403&PID_6014.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6014
%VID_0403&PID_6015.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6015

[FtdiPort.NT.AddService]
DisplayName = %SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\system32\drivers\ftser2k.sys
LoadOrderGroup = Base

; -------------- Serenum Driver install section
[SerEnum_AddService]
DisplayName = %SerEnum.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\serenum.sys
LoadOrderGroup = PNP Filter

[FtdiPort.NT.AddReg]
HKR,,EnumPropPages32,,"ftserui2.dll,SerialPortPropPageProvider"

[FtdiPort.NT.Copy]
ftser2k.sys

[FtdiPort.NT.CopyUI]
ftserui2.dll

[FtdiPort.NT.CopyCoInst]
ftcserco.dll

[FtdiPort.NT]
CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI
AddReg=FtdiPort.NT.AddReg

[FtdiPort.NTamd64]
CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI
AddReg=FtdiPort.NT.AddReg

[FtdiPort.NT.HW]
AddReg=FtdiPort.NT.HW.AddReg

[FtdiPort.NTamd64.HW]
AddReg=FtdiPort.NT.HW.AddReg

[FtdiPort.NT.Services]
AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService
AddService = Serenum,,SerEnum_AddService
DelService = FTSERIAL

[FtdiPort.NTamd64.Services]
AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService
AddService = Serenum,,SerEnum_AddService
DelService = FTSERIAL

[FtdiPort.NT.HW.AddReg]
HKR,,"UpperFilters",0x00010000,"serenum"
HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00
HKR,,"MinReadTimeout",0x00010001,0
HKR,,"MinWriteTimeout",0x00010001,0
HKR,,"LatencyTimer",0x00010001,16

[FtdiPort.NT.CoInstallers]
AddReg=FtdiPort.NT.CoInstallers.AddReg
CopyFiles=FtdiPort.NT.CopyCoInst

[FtdiPort.NTamd64.CoInstallers]
AddReg=FtdiPort.NT.CoInstallers.AddReg
CopyFiles=FtdiPort.NT.CopyCoInst

[FtdiPort.NT.CoInstallers.AddReg]
HKR,,CoInstallers32,0x00010000,"ftcserco.Dll,FTCSERCoInstaller"

;---------------------------------------------------------------;

[Strings]
FTDI="FTDI"
DESC="CDM Driver Package - VCP Driver"
DriversDisk="FTDI USB Drivers Disk"
PortsClassName = "Ports (COM & LPT)"
VID_0403&PID_6001.DeviceDesc="USB Serial Port"
VID_0403&PID_6010.DeviceDesc="USB Serial Port"
VID_0403&PID_6011.DeviceDesc="USB Serial Port"
VID_0403&PID_6014.DeviceDesc="USB Serial Port"
VID_0403&PID_6015.DeviceDesc="USB Serial Port"
SvcDesc="USB Serial Port Driver"
SerEnum.SvcDesc="Serenum Filter Driver"

 

Что конкретно нужно сделать? Записывать разные ConfigData в зависимости от VID/PID?
В секцию FtdiHw прописываем свой девайс по аналогии с имеющимися, только вместо FtdiPort.NT указываем свою DDI секцию.

Что-то вроде такого:

[FtdiHw]
%VID_0100&PID_0500.DeviceDesc%=FtdiPort2.NT,FTDIBUS\COMPORT&VID_0100&PID_0500

[FtdiHw.NTamd64]
%VID_0100&PID_0500.DeviceDesc%=FtdiPort2.NTamd64,FTDIBUS\COMPORT&VID_0100&PID_0500

[FtdiPort2.NT]
CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI
AddReg=FtdiPort.NT.AddReg

[FtdiPort2.NTamd64]
CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI
AddReg=FtdiPort.NT.AddReg

[FtdiPort2.NT.HW]
AddReg=FtdiPort2.NT.HW.AddReg

[FtdiPort2.NTamd64.HW]
AddReg=FtdiPort2.NT.HW.AddReg

[FtdiPort2.NT.Services]
AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService
AddService = Serenum,,SerEnum_AddService
DelService = FTSERIAL

[FtdiPort2.NTamd64.Services]
AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService
AddService = Serenum,,SerEnum_AddService
DelService = FTSERIAL

[FtdiPort2.NT.HW.AddReg]
HKR,,"UpperFilters",0x00010000,"serenum"
HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00
HKR,,"MinReadTimeout",0x00010001,0
HKR,,"MinWriteTimeout",0x00010001,0
HKR,,"LatencyTimer",0x00010001,16

[FtdiPort2.NT.CoInstallers]
AddReg=FtdiPort.NT.CoInstallers.AddReg
CopyFiles=FtdiPort.NT.CopyCoInst

[FtdiPort2.NTamd64.CoInstallers]
AddReg=FtdiPort.NT.CoInstallers.AddReg
CopyFiles=FtdiPort.NT.CopyCoInst

[Strings]
VID_0100&PID_0500.DeviceDesc="My Super Port"

Только придется пересоздать и подписать cat файл.
Подписывать, я так понимаю, у вас нечем?

 

E.S,: Что конкретно нужно сделать?
Нужно, что бы в зависимости от VID/PID, параметр HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00 изменялся.

 

не понял чем плох рa одной драйвер

 

Gregory: Нужно, что бы в зависимости от VID/PID, параметр HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00 изменялся.

Тогда нужно добавить в INF то, что я написал.

Какие Винды должны поддерживаться?

 

E.S,: Тогда нужно добавить в INF то, что я написал

Так что-то не пойму, а где альтернативный параметр?

E.S,: Только придется пересоздать и подписать cat файл.

А почему такие сложности?
И до такого я ещё не "дорос".

Может я плохо объяснил?
Попробую ещё раз:
Делаю ещё один девайс, и назначаю ему, PID, скажем, 6500.
Добавляю в inf соответствующие строки в секции: [FtdiHw], [FtdiHw.NTamd64] и [Strings]
Теперь мне надо, что б для девайса с PID=6500 бралась модифицированная строка
HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00
а для всех остальных - "штатная"

 

Gregory: Делаю ещё один девайс, и назначаю ему, PID, скажем, 6500.
Добавляю в inf соответствующие строки в секции: [FtdiHw], [FtdiHw.NTamd64] и [Strings]
Теперь мне надо, что б для девайса с PID=6500 бралась модифицированная строка
HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00
а для всех остальных - "штатная"

В моем примере VID=100, PID=500, строку для этого девайса нужно прописать в секцию [FtdiPort2.NT.HW.AddReg], для остальных - в [FtdiPort.NT.HW.AddReg]

Gregory: А почему такие сложности?
И до такого я ещё не "дорос".

Винда x64 не загрузит неподписанный драйвер без помощи бубна. x86 - ругнется, но загрузит.
Для подписывания нужно получить сертификат, а он стоит денег и частным лицам их не особо охотно выдают.

 

E.S,: В моем примере VID=100, PID=500, строку для этого девайса нужно прописать в секцию [FtdiPort2.NT.HW.AddReg], для остальных - в [FtdiPort.NT.HW.AddReg]

Кажись, "дошло", наконец.
Буду пробовать.
Кстати, предлагали вариант: создать отдельный inf. Так понимаю, примерно то же (по объёму).
А имеет значение как располагать пункты оригинальные и с цифрой 2? Т.е. сперва все оригинальные, затем - 2, или можно вперемежку?

E.S,: Винда x64 не загрузит неподписанный драйвер без помощи бубна. x86 - ругнется, но загрузит.

Ни разу с x64 так не "попадал". Наверное, драйвера все были подписаны, да и пользовался x64, откровенно говоря, довольно мало.
А есть какой способ это "обойти"?
P.S.: Я правильно понял, что драйвер становится "не подписанным", при любом изменении в inf?

 

Gregory: А есть какой способ это "обойти"?

Переключить систему в тестовый режим.
Я ставил так не подписанный драйвер на 7-ю винду х64 для доступа к портам из своей программы. Писал тут на форуме.
Как переключить в тестовый режим

 

Gregory: А имеет значение как располагать пункты оригинальные и с цифрой 2? Т.е. сперва все оригинальные, затем - 2, или можно вперемежку?

Без разницы.

Gregory: Кстати, предлагали вариант: создать отдельный inf. Так понимаю, примерно то же (по объёму).

С отдельным inf проще. Нужно просто прописать в каждом свои настройки и убрать лишние VID/PID, но с подписыванием будут те же проблемы + лишний inf.

Gregory: А есть какой способ это "обойти"?
P.S.: Я правильно понял, что драйвер становится "не подписанным", при любом изменении в inf?

В целом - да, любое изменение делает подпись inf-файла невалидной.
Но там не все так просто. К примеру, на неподписанные user-mode драйвера Винда ругается, но устанавливает. В данном же случае у sys-файла наверняка есть валидная подпись, поэтому стоит попробовать, мало ли.

Арс: Переключить систему в тестовый режим.
Я ставил так не подписанный драйвер на 7-ю винду х64 для доступа к портам из своей программы. Писал тут на форуме.

Так это и есть бубен
Загружаться так придется постоянно, т.к. даже если неподписанный драйвер установлен, Винда его загрузит только в отладочном режиме.