Re[4]: Да все нормально делается в виде инсталятора ....
От: dachny  
Дата: 06.11.06 07:46
Оценка:
вот для примера скрипт инсталятора для Innosetup

; Copyright © 2002-2006 Alexander V Sagaidachny FGUP "SNIIGG&MS"

[Setup]
AppName=.......
AppVerName=...
AppPublisher=....
AppPublisherURL=....
AppSupportURL=...
AppUpdatesURL=....
AppVersion=5.2.0.61
CreateAppDir=no
LicenseFile=License.txt
Compression=lzma/ultra
SolidCompression=yes
DisableProgramGroupPage=yes
MinVersion=5.0,5.0
PrivilegesRequired=admin
AppCopyright=....
TouchDate=2006-02-15
Uninstallable=no
WizardImageFile=SetupModern.bmp
WizardSmallImageFile=SetupModernSmall.bmp
VersionInfoVersion=5.2.0.61
VersionInfoCompany= ...


[Files]
Source: "xxxxx.inf"; DestDir: "{win}\inf"; Flags: ignoreversion;
Source: "xxxxx.sys"; DestDir: "{sys}\drivers"; Flags: ignoreversion ; AfterInstall: InstallDrv


[Code]

function CM_Connect_Machine(  notNeed0: Integer ; var hMachine: Integer ): Integer ;
external 'CM_Connect_MachineA@setupapi.dll stdcall';


function CM_Locate_DevNode_Ex(  var DevInst: Integer ;
                                notNeed0: Integer ;
                                Flags: Integer ;
                                hMachine: Integer ): Integer ;
external 'CM_Locate_DevNode_ExA@setupapi.dll stdcall';


function CM_Reenumerate_DevNode_Ex(  DevInst: Integer ;
                            Flags: Integer ;
                            hMachine: Integer ): Integer ;
external 'CM_Reenumerate_DevNode_Ex@setupapi.dll stdcall';

function CM_Disconnect_Machine(hMachine: Integer ): Integer ;
external 'CM_Disconnect_Machine@setupapi.dll stdcall';


function UpdateDriverForPlugAndPlayDevices( hwndParent: HWND;
                                            HardwareId: String;
                                            FullInfPath: String;
                                            InstallFlags: Integer;
                                            var bRebootRequired: Boolean): Boolean;
external 'UpdateDriverForPlugAndPlayDevicesA@newdev.dll stdcall';

function SetupCopyOEMInf( SourceInfFileName:String ;
                          notNeed0: Integer ;
                          OEMSourceMediaType:Integer;
                          notNeed1: Integer;
                          oemPath: String;
                          oemPathSize: Integer;
                          notNeed4: Integer;
                          notNeed5: Integer ): Boolean;
external 'SetupCopyOEMInfA@setupapi.dll stdcall';



var
  needRest: Boolean;
  thePath:  String;
  res:     Boolean;
  theHNWD: Integer;
  oemPath:  String;
  hMachine: Integer;
  DevInst: Integer;
  
  ProgressPage: TOutputProgressWizardPage;

  


procedure InstallDrv();
begin
    Sleep(2000);
    
    ProgressPage := CreateOutputProgressPage('Installing',    'Please wait while Setup installs .....on your PC');
    ProgressPage.SetText('Register drivers...', '');
    ProgressPage.SetProgress(0, 10);
    ProgressPage.Show;
 
    
    CM_Connect_Machine( 0, hMachine);
    CM_Locate_DevNode_Ex( DevInst , 0, 0, hMachine);
    CM_Reenumerate_DevNode_Ex( DevInst , 0,  hMachine);
    CM_Disconnect_Machine ( hMachine );
     
    ProgressPage.SetProgress(1, 10);


    Sleep(500);

    ProgressPage.SetProgress(2, 10);


    thePath := ExpandConstant('{win}') + '\inf\xxxxx.inf';
    theHNWD := StrToInt ( ExpandConstant('{wizardhwnd}') );
    
    needRest := false;
    res := UpdateDriverForPlugAndPlayDevices( theHNWD, 'PCI\VEN_xxxx&DEV_xxxx', thePath, 1, needRest);
    
    ProgressPage.SetProgress(5, 10);


    if res = false then
      begin
         SetLength( oemPath, 260);
         res := SetupCopyOEMInf( thePath,
                                  0,
                                  1,
                                  0,
                                  oemPath,
                                  260,
                                  0,
                                  0 );
      end;
     
    ProgressPage.SetProgress(10, 10);

      ProgressPage.SetText('Register drivers...Done', '');
    
    Sleep(500);


    ProgressPage.Hide;


end;


function NeedRestart(): Boolean;
begin
    Result := needRest;
end;


а вот инф файл


[Version]
Signature="$Windows 95$"
Provider="........."

Class=NewDeviceClass
ClassGUID=........
DriverVer=......

[ClassInstall32]
Addreg=Class_AddReg

[Class_AddReg]
HKR,,,,"......."
HKR,,Icon,,"-5"

[Manufacturer]
"..............."=Mfg0

[Mfg0]
"...................."=xxxxxxxx_DDI, PCI\VEN_xxxx&DEV_xxxx

[xxxxxxxx_DDI.NT.Services]
Addservice = xxxxxxxx, 0x00000002, xxxxxxxx_AddService

[xxxxxxxx_AddService]
DisplayName    = ".........................."
ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
StartType      = 3                  ; SERVICE_DEMAND_START
ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL
ServiceBinary  = %10%\System32\Drivers\xxxxxxxx.sys


обрати внимание что копирование инф происходит непосредственно в windows\inf
и бинарник драйвера в sistem32\drivers тоже копируется инсталатором

В самом инфе нет указаний на копирование каких либо файлов

В фукцию SetupCopyOEMInf передаетсяся путь инффайла windows\inf\твойинф.inf
и тогда она генерирует не файлы oemXX.inf и oemXX.pnf а только один файл твойинф.pnf
тоесть у тебя в папке windows\inf\ получается пара твойинф.pnf и твойинф.inf
И винда думает что твой дров ето часть дистрибутива винды и не намекает на вское там полписывание драйверов

код
    CM_Connect_Machine( 0, hMachine);
    CM_Locate_DevNode_Ex( DevInst , 0, 0, hMachine);
    CM_Reenumerate_DevNode_Ex( DevInst , 0,  hMachine);
    CM_Disconnect_Machine ( hMachine );


провоцирует винду поискать новые устройства

проверено на 2000 XP и 2003
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.