Hello list,

Please find attached an updated version of the Windows drivers scan system
for the Unattended project and some related informations about it.

This obsoletes all previous published code versions of this scanner.
Files and patches are based on the SVN version of the Unattended source code 
as of 2009-08-07.

Regards,

Pierre Bourgin

[below: inline copy of the README-search-win-drivers.txt file]


Changelog:
* 20090807 - Added DOSEMU support (in install/dosbin/install.pl)
* 20090807 - default folder name changed from 'drv-scan' to 'drvscan'.
* 20090807 - files linuxboot/*.patch are deprecated (now integrated into SVN).
* 20090807 - based on 2009-08-06 development version of Unattended (SVN).
* 20090807 - Rewrite this documentation.
* 20090710 - Added an example of script to check that cache files are 
up-to-date.

* 20090420 - Added cache support for Windows drivers collection (any sub-level).
* 20090420 - Added support of multiple Windows drivers root paths.
* 20090420 - code rewrite for better parsing of .INF files of Windows drivers.
* 20090420 - Added USB devices support via use of lsub.
* 20090420 - use "-m" option of lspci (output more "portable" accross linux 
distributions)
* 20090420 - Added HDAUDIO sound bus support 
             (via ALSA sound system kernel support)
* 20090420 - partial code rewrite: less 'pci' strings everywhere.

* 20090213 - Updated instructions related to site/config.pl content
             (reported by Steven Blackery)
* 20090213 - Added search-win-drivers.pl example output.
* 20090213 - Updated instructions related to site/config.pl content
             (reported by Juan Jose Pablo and Steven Blackery)
* 20081112 - case insensitive search on pattern PCI\\VEN 
             (reported by Jye Meier)
* 20081006 - deal with .INF encoded in UTF-16le format
* 20081003 - initial (public) revision

All Files and patches are based on 2009-04-20 CVS version of Unattended project.

-----------------------------------------------------------------------
Introduction
-----------------------------------------------------------------------

Implement an automated retrieval of Windows drivers for the current harwdare
platform to install with the Unattended Project by parsing a Windows
collection of drivers.
It is designed to work along with other functionalities related to drivers in
Unattended, ie manual choose of drivers and TXTSETUP stuff (adding driver for
text setup part of Windows installation).

Basically, it's a perl script that HINTS which Windows drivers COULD match
for the current platform hardware devices to install under Windows. 

The script (search-win-drivers.pl) retrieves informations from present hardware
devices and try to figure out which Windows drivers could apply to these
devices.

The matching drivers are then copied onto the hard drive (from which Windows
is installing) and unattend.txt file is updated in order that Windows Setup
uses them (update of its OemPnPDriversPath entry).

That way, the Plug-and-Play Windows mechanism will be able to choose among
these "hinted" drivers which one feets nicely (from its point of view).

The benefit is that you don't have to choose manually which Windows drivers to
install for hardware support with Unattended.

In case of a missing driver, you "just" have to add it into your Windows
drivers collection for the next time.

PCI, HDAUDIO and USB devices are supported.

-----------------------------------------------------------------------
Installation & configuration (basic)
-----------------------------------------------------------------------

As much as possible, try to install file(s) below folder
{unattended}/install/site/, it will help you for your unattended maintenance.

Convention: 

  full path to Unattended installation: {unattended}
  full path of content of this archive: {search-win-drivers-archive}

1. Build the Unattended from the Subversion repository code.
   Basically:

   $ svn export \
         http://unattended.svn.sf.net/svnroot/unattended/trunk \
         {unattended}

   $ cd {unattended}/linuxboot

   # or make keep-archive=1 downloadcache=/path/to/cache download
   $ make download

   $ make

2. Retrieve a collection of Windows drivers into the Windows drivers "root"
   directory. Default path for this root directory is 
   {unattended}/install/site/win_drivers/ .

   see example below with DriverPacks.net collection of Windows drivers.

3. From the attached archive, retrieve nt5x-install script as file
   {unattended}/install/site/nt5x-install .
   This is not necessary to update {unattended}/linuxboot/nt5x-install with
   it, we can further point easily which nt5x-install we want to use.

4. patch file {unattended}/install/dosbin/install.pl with the provided one.
   NOTE: this patch is generated against the SVN version of install.pl file:

   $ cd {unattended}
   $ patch -p 0 install/dosbin/install.pl \
              < {search-win-drivers-archive}/dosbin/install.pl.patch

5. Add script {unattended}/install/dosbin/search-win-drivers.pl with the one
   from the archive:

   $ cp -p {search-win-drivers-archive}/dosbin/search-win-drivers.pl \
           {unattended}/install/dosbin/.

6. Update your {unattended}/install/site/config.pl file with the following
   elements:
   
    ## Windows drivers scanning: uncomment to DISABLE its usage
    #$u->{'_temp'}->{'scan_windrivers'} = '';
    
    ## Windows drivers scanning: drivers collection root path:
    ## default is "/z/site/win_drivers"  (in search-win-drivers.pl):
    #$u->{'_temp'}->{'scan_windrivers_path'} = "/z/site/win_drivers" ;
    
    ## Windows drivers scanning: use our patched version of ntx5-install
    ## For use with DOSEMU installation method, simply comment or undef the 
    ## ntinstall_cmd entry.
    $u->{'_meta'}->{'ntinstall_cmd'} = '/z/site/nt5x-install' ;
    #undef $u->{'_meta'}->{'ntinstall_cmd'} ;  # use DOSEMU
    
    ## Windows drivers scanning:
    ##   howto exclude PCI_CLASSID Ethernet Controller (0x0200)
    ##   from search of Windows Drivers scanning
    #$u->{'_temp'}->{'scan_windrivers_options'} = '-c 0200' ;
    
    ## Windows drivers scanning: where to store matching driver(s)
    ##   (relative to %systemdrive% once Windows is installed):
    ## default is 'drvscan' (in dosbin/install.pl)
    #$u->{'_temp'}->{'scan_windrivers_dest'} = 'drvscan' ;

7. (recommended) generate a cache file for each Windows drivers collections in
   order to speedup the parsing time of Windows drivers collection.
   See details in section below.

8. Start a Windows installation via Unattended to use it. 
   The effect of this code happens before you choose (manually) which
   driver(s) to add to the installation. 
   You can check the scan result in the file
     /c/netinst/logs/search-win-drivers.log

You can also run search-win-drivers.pl script directly from the shell to see
what happens: it's a standalone script that just produce output like this one:

  $ /z/dosbin/search-win-drivers.pl -d /z/site/win_drivers
  # Check root paths of Windows drivers...
  # Windows drivers collections to use: /z/site/win_drivers
  # - Check PCI devices (via lspci output command)...
  #   found 18 PCI device(s) on current hardware platform.
  # - Check HDAUDIO devices...
  #   found 0 HDaudio codec (on 1 sound card).
  # - Check USB devices...
  #   found 6 USB usable devices on current hardware platform.
  # Hardware device list:
  # - desc=Intel Corporation 82915G/P/GV/GL/PL/910GL Memory Controller Hub (rev 
04)
  #   bustype=PCI busid=00:00.0 vendor=8086 device=2580 class=0600
  #   infstr=PCI\VEN_8086&DEV_2580
  # - desc=Intel Corporation 82915G/P/GV/GL/PL/910GL PCI Express Root Port (rev 
04)
  #   bustype=PCI busid=00:01.0 vendor=8086 device=2581 class=0604
  #   infstr=PCI\VEN_8086&DEV_2581
  # - desc=Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express 
Port 1 (rev 03)
  #   bustype=PCI busid=00:1c.0 vendor=8086 device=2660 class=0604
  #   infstr=PCI\VEN_8086&DEV_2660
  <snip output>
  # - desc=Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio 
Controller (rev 03)
  #   bustype=PCI busid=00:1e.2 vendor=8086 device=266e class=0401
  #   infstr=PCI\VEN_8086&DEV_266e
  # - desc=Intel Corporation 82801FB/FW (ICH6/ICH6W) SATA Controller (rev 03)
  #   bustype=PCI busid=00:1f.2 vendor=8086 device=2651 class=0101
  #   infstr=PCI\VEN_8086&DEV_2651
  # - desc=ATI Technologies Inc RV516 [Radeon X1300/X1550 Series]
  #   bustype=PCI busid=01:00.0 vendor=1002 device=7187 class=0300
  #   infstr=PCI\VEN_1002&DEV_7187
  # - desc=ATI Technologies Inc RV516 [Radeon X1300/X1550 Series] (Secondary)
  #   bustype=PCI busid=01:00.1 vendor=1002 device=71a7 class=0380
  #   infstr=PCI\VEN_1002&DEV_71a7
  # - desc=Broadcom Corporation NetXtreme BCM5751 Gigabit Ethernet PCI Express 
(rev 01)
  #   bustype=PCI busid=40:00.0 vendor=14e4 device=1677 class=0200
  #   infstr=PCI\VEN_14e4&DEV_1677
  # - desc=Primax Electronics, Ltd
  #   bustype=USB busid=003:003 vendor=0461 device=4d15 class=n/a
  #   infstr=USB\VID_0461&PID_4d15
  # 24 hardware device(s) to consider.
  # 20 distinct INF string(s) for hardware devices.
  #
  # loading INF strings from Windows drivers collection...
  # - path: /z/site/win_drivers
  # Parse .INF files below folder /z/site/win_drivers ...
  # - load cache file 
'/z/site/win_drivers/DriverPacks/search-win-drivers.cache' ...
  # - added 33365 INF strings
  # - load cache file '/z/site/win_drivers/dell/search-win-drivers.cache' ...
  # - added 1132 INF strings
  # - parsed 11 .INF files, added 9 INF strings.
  # Search matching drivers for current hardware platform
  # 34 driver folders to use:
  /z/site/win_drivers/DriverPacks/D/C/I/2k
  /z/site/win_drivers/DriverPacks/D/C/I/2k3
  /z/site/win_drivers/DriverPacks/D/C/I/xp
  /z/site/win_drivers/DriverPacks/D/G/A1
  <snip output>
  /z/site/win_drivers/DriverPacks/D/S/SMS
  /z/site/win_drivers/DriverPacks/D/S/V2
  /z/site/win_drivers/DriverPacks/D/S/zC
  /z/site/win_drivers/DriverPacks/D/S/zD2
  /z/site/win_drivers/dell/chipset-intel-M-45series/files/All
  # Enumerate unmatched devices: 1 devices
  #    (might be handled directly by Windows or indirectly by matching drivers 
above).
  # - unmatch device: USB\VID_0461&PID_4d15 (desc: 'Primax Electronics, Ltd ')

-----------------------------------------------------------------------
DEPRECATED - Add HDAUDIO and USB support
-----------------------------------------------------------------------

DEPRECATED: 
  As of 2009-08-07, support of HDAUDIO and USB has been included in the
  development version of Unattended (ie commited to its SVN repository): no
  more need to patch the linux part source files.

  As a REMINDER, the items were:
  
  - build a linux kernel with ALSA sound system support (for HDAUDIO devices)
  - patch /etc/master file in order to load ALSA kernel modules and use USB FS
  - rebuild/repackage the Unattended Solution including this kernel with ALSA
    support and USB tools (lsusb).

  The patch were:
    {search-win-drivers-archive}/linuxboot/linuxboot.Makefile.patch
    {search-win-drivers-archive}/linuxboot/linuxboot.misc.linux-config.patch
    {search-win-drivers-archive}/linuxboot/linuxboot.misc.master.patch


-----------------------------------------------------------------------
More Technical details
-----------------------------------------------------------------------

Script install/dosbin/search-win-drivers.pl, called by dosbin/install.pl,
enumerates PCI, HDAUDIO and USB devices on the current hardware platform by
parsing outputs of lspci and lsusb commands and by parsing content of
/proc/asound/ (ALSA sound support).

These informations provide Vendor Id, Product Id, etc. related to
each device.

Then for each device, It looks recursively in all *.INF file(s) below the
Windows driver collection ( pointed by
$u->{'_temp'}->{'scan_windrivers_path'}) to search for the INF string related
to this device. 
The INF string is how Windows driver INF file encodes its matching device(s).
Example: PCI device match string "PCI\VEN_[PCI_VENDOR]&DEV_[PCI_DEVICE]" .

Once finished, install/dosbin/search-win-drivers.pl returns a list of
folder(s) that contains matching Windows drivers to copy onto the hard drive.
Its output is written into file /c/netinst/log/search-win-drivers.log .
It also lists the hardware device(s) that no Windows driver matched.

install.pl then continues its usual operations and update the content
of string OemPnPDriversPath with the supplementary folder(s) provided by
search-win-drivers.pl output.

Script nt5x-install will take care of copying these directories onto the
hard-drive.

Please note that in order to limit the lengh of string "OemPnPDriversPath",
install.pl makes a map between the real path(s) of drivers and their
corresponding paths on hard drive. It also help to avoid collisions among
(manually choosed) driver folder(s).

So all drivers folders will be copied with the following names onto the
hard-drive : /c/drvscan/1/, /c/drvscan/2/, /c/drvscan/3/, ....
The maps between full drivers paths and their copied destination is
available in unattend.txt as [_meta]/'scan_windrivers_dest_map' string.


-----------------------------------------------------------------------
FAQ, Knowm limitations, Examples
-----------------------------------------------------------------------

- This mechanism shoud fit nice to small/medium organizations, espacially if
  having a lot of heterogeneous hardware platforms.
  For big companies or people that want/need a complete control of what is
  used during installation, it can be a usefull debug tool in order to check
  which drivers are missing to fully support a given hardware platform.

- Managing your Windows drivers collection:

  The DriverPacks.net project provides a huge collection of the most common
  Windows drivers (2.2GB uncompressed size as of 200901). It can be a good
  starting point to create your Windows collection of drivers.

  Retrieve all the .7z files from the DriverPacks.net project web site
  (http://driverPacks.net) and uncompress these archive files into
  {unattended}/install/site/win_drivers/ :

  $ mkdir -p {unattended}/install/site/win_drivers/DriverPacks
  $ cd {unattended}/install/site/win_drivers/DriverPacks
  $ ls ..../download/DriverPacks/*.7z | xargs -n 1 /usr/bin/7za x

  Depending on your needs, you will probably have to add some specific
  drivers: for instance, I have: 

  $ ls -d {unattended}/install/site/win_drivers/*/*
  dell/cardbus-ctlr-ti-7510
  dell/modem-conextant-d480
  dell/wlan-intel-bg2200
  DriverPacks/D
  DriverPacks/L
  [...]
  VMware-server-1.0.7-32bit/video
  [...]

- If using this scanner, you probably don't need anymore to do the full
  uncompress DriverPacks.net and PnP mechanism on GUI Windows installation
  part as described in the links below:

  http://ubertechnique.com/unattended/BTS_Driver_Packs
  (thread) 
http://www.mail-archive.com/unattended-i...@lists.sourceforge.net/msg05535.html

- You should also move your devices drivers from i386/$oem$/$1/ folder
  into the Windows drivers collection (below site/win_drivers/).

- this scanner may provides several drivers for each hardware device.
  If fact, this collection provide drivers for both  Windows 2000/XP/2003,
  so a given driver may imply 2 or 3 folders.
  The scanner can't distinguish between Windows flavors, since this
  information is not available in .INF files.
  This is not a problem since this is the Windows PnP's job.
    example: On a DELL Latitude D620 laptop, I have 57 folders ! 
             ... but it works (of course).
  ... Anyway, this is the expected behaviour: provides drivers that SHOULD
  match, NOT TRYING TO SUBSITUTE TO the Plug-and-Play mechanism of Windows.

  That is, you'll then have less control over which drivers are effectively in
  use: you have to trust the PnP mechanism of Windows in such a case.

- Windows drivers must provide an .INF file in order to be usable by this
  scan system. If they do not provide, try to unpack the provided files
  (un-cab, extract for .exe, etc.).

- works only with linux boot and nt5x-install : DOSEMU is not supported.

- Other driver mechanism from Unattended like TXTSETUP.OEM support (think mass
  storage driver support on text setup step of Windows installation) of manual
  choose of drivers are working fine along this solution.

- PCI devices exclusion of search-win-drivers.pl is only based on
  PCI_CLASSID; in the future, we should use a more generic form for
  exclusion, like '<class>:<vendor>:<device>'

- an "unmatched" hardware device does not means unsupported: it may be
  supported via buildin drivers collection of windows for instance,

- USB, HDAUDIO and PCI devices are supported. 

  Other hardware buses (SCSI, ...) are currently NOT supported.

  Bluetooth is unsupported ? Yes since most of time, hardware vendors do not
  provide only a driver but a complete installer: blootooth stack is not
  present/available into Windows, so this stack has to be installed first.

- " virtual " bus(es) that Windows use won't probably be never supported:
  the goal is to help installing, not replace the PnP Windows mechanism.

- This scanner does not support to be runned from Windows. It could be
  achieved by writing a devices scanner from Windows API that return Vendor
  ID, Product ID, etc. for each hardware device or an INF string that combines
  all these informations.

- search-win-drivers.pl support multiple Windows drivers collections (paths):
  several "-d" comand-line are possible.
  Each of these collection may have or not a cache file.
  Some checks are perfomed on these paths: they may not overlap between them,
  they must exist, remove duplicated entries.

- About cache file(s): purpose is to reduce the parsing time of Windows
  drivers. It takes about 30 to 40 seconds to parse a 2GB Windows drivers
  collection (1200 .INF files) each time you use Unattended, that is pretty
  long ... 
  And it will take only about 1 second if you use a or several cache files for
  the collection of Windows drivers.

  Since your Windows drivers collection may have quick update cycles (testing
  drivers for a new hardware platform for instance), it can be a good idea to
  add cache file only to stable sub-part of your collection, and thus avoiding
  the regenerate a unique cache file for the whole collection each time you
  update its content.

  Cache file can be generated from any host, not other requirement than perl
  and writable access to write the cache file.

  Example: one folder for DriverPacks.net (since it does not change often), 
           one folder for additional drivers, 
           one folder for testing drivers without cache file if not too many 
drivers.

  In such a case, have to generate cache files 
  and DO NOT FORGET to remove your old cache file ! : 

  $ cd {unattended}/install
  $ ls -dF site/win_drivers/*
  site/win_drivers/DriverPacks/
  site/win_drivers/Addtional/
  site/win_drivers/tests/

  $ rm site/win_drivers/search-win-drivers.cache
  $ cd site/win_drivers/DriverPacks \
       && .../dosbin/search-win-drivers.pl -g . > search-win-drivers.cache
  $ cd site/win_drivers/Additional  \
       && .../dosbin/search-win-drivers.pl -g . > search-win-drivers.cache

- ... We often add drivers but forget to update the cache (yes really !)
  a good pratice: check periodically (eg in a crontab) that your cache file(s)
  are up-to-date with the Windows drivers on your system. 

  Copy the example script (site/win-drivers-cache-check.sh.example),
  edit it to match your installation paths (variables ROOTDRIVERS and
  CACHEGEN) and use it in your crontab. 

  for instance, your crontab may look like:
   
    $ crontab -e 
    [...]
    # check cache of win drivers every sunday at 04:56 AM
    # and mail its output to a email address:
    mailto=an_em...@address
    56 04   *  *  sun /path/to/this/script/win-drivers-cache-check.sh

#end

Attachment: search-win-drivers-20090807.tar.gz
Description: GNU Zip compressed data

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
unattended-devel mailing list
unattended-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/unattended-devel

Reply via email to