apt-get install kernel-wedge
 cd ~/download
 svn co debian-installer http://alioth.debian.org/...
 cd debian-installer
 cd packages/kernel/linux-kernel-di-i386-2.6

 # Add the third party module and its dependent modules such as
 # ieee80211, ieee80211_crypt, ieee80211_crypt_wep, arc4 and so on.
 # It is implied that the third party module is already compiled
 # against the current kernel.
 vi modules/i386/nic-modules

 vi kernel-versions     # Update the version and flavour.
 # See a sample list of modifications in this file:
 #   ~/work/d-i/packages_kernel_linux-kernel-di-i386-2.6.patch
 # To apply the patch, run "patch -i FILE.patch".
 
 kernel-wedge gen-control > debian/control
 kernel-wedge build-all
 # If the above command fails on "kernel-wedge copy-modules ...", edit the
 # respective file under modules/i386/ until kernel-wedge copy-modules
 # succeeds.  Then restart kernel-wedge build-all.

 cd /var/tmp
 su
   mount -o loop,ro ~/download/debian-net-install.iso /mnt
   cp -a /mnt .
   mv mnt di
   chown -R USER di
   chmod -R u+rw di
   umount /mnt
 mkdir di-rd ; cd di-rd
 gzip -dc ../di/install/2.6/initrd.gz | cpio -ivd

 cd lib/modules
 mkdir -p 2.6.$NEW/kernel
 cd 2.6.$OLD/kernel
 
 find -type f | \
     while read f ; do \
        n="${f##*/}" ; \
        d="${f%/*}" ; \
        k="/lib/modules/2.6.$NEW/kernel/$f" ; \
        test -f "${k}" && { \
           cp -av "${k}" \
            "../../../../../di-rd/lib/modules/2.6.$NEW/kernel/${d}/" ; \
        } || echo "-- ${f}" ; \
     done

 cd ../..
 rm -rf 2.6.$OLD
 cd ../..
 vi var/lib/dpkg/status  # Replace 2.6.$OLD with 2.6.$NEW.

 # Without libgcc_s.so.1, "retrieving libc6-udeb" fails.  Perhaps, this
 # dependency is not recognized automatically because apt-ftparchive below
 # re-writes dpkg files.
 cp -a /lib/libgcc_s.so.1 lib/

 # Now create the new compressed RAM disk image.
 # find . -depth -print0 | cpio -0 -H newc -ov | gzip -c > ../di/install/2.6/initrd.gz
 # The -depth option is to specify restrictive permissions.  It prevents
 # the Linux kernel from mounting the image.  For testing, try 
 #   cpio -iv < /tmp/initrd 
 # without the "d" option.  A cpio image created without the find -depth 
 # option will create a full tree while the one created with -depth will
 # generate file creation errors.
 find . -print0 | cpio -0 -H newc -ov | gzip -c > ../di/install/2.6/initrd.gz

 cd ../di
 cd pool/main/l/linux-kernel-di-i386-2.6/
 # Copy .udeb's created in ~/download/debian-installer/packages/kernel.
 # Delete kernel-image-2.6.$OLD and respective module .udeb's.
 cd -

 cd ~/work/d-i/release
 vi config # according to http://wiki.debian.org/DebianInstaller/Modify
 apt-ftparchive generate config
 cd -   # Back to /var/tmp/di.

 cp -a /root/driver .  
 # Keep the third party driver's source code on CD to compile it later
 # against the installed kernel headers.

 # Update md5sums.txt and Packages.
 md5sum $(find -follow -type f) > md5sum.txt

 vi md5sum.txt  # Remove the line with md5sum.txt (?)
 cd ..
 mkisofs -o test.iso -r -J -no-emul-boot -boot-load-size 4 \
   -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat di
 qemu -net user -cdrom test.iso
 # For serial emulation, run Linux from isolinux prompt with
 #   install console=ttyS0
 # Then switch to the serial console with Ctrl-Alt-3.

 sudo cdrecord -dev /dev/cdrw -v test.iso  # Burn this to a CD-RW or CD-R.

 # Boot the real computer from the new image, pause between
 # the dialogs, press Alt-2 and Enter to start the shell.
 # Check if the disk is already mounted by running "mount".
 # If it is, the mount point will be /cdrom.  Otherwise, mount the disk:
 mount -o ro -t iso9660 /dev/hdb /mnt/
 udpkg -i /mnt/pool/main/l/linux-kernel-di-i386-2.6/crypto-modules*.udeb
 modprobe arc4   # or insmod /lib/modules/*/kernel/crypto/arc4.ko
 modprobe ieee80211_crypt_wep
 modprobe adm8211
 # Similarly, make sure iwconfig can be launched.  If not, install
 # libiw*.udeb from w/wireless-tools.
 iwconfig eth0 key s:XXXXXXXXXXXXX
 iwconfig eth0 key open
 iwconfig eth0 channel 6
 ifconfig eth0 up
 ifconfig eth0 A.B.C.D  # Assign an unused address from the LAN.
 
 udpkg -i /...l/linux-kernel-di-i386-2.6/sata-modules*.udeb
 modprobe ahci  # For SATA AHCI drives.
 modprobe sata-uli  # Or another driver for the SATA controller according
                    # to the list in lspci.

 # In case the "Detect hard disk" or "Partition the disk" steps of d-i fail,
 # one should load an appropriate driver.
 ls -la /proc/ide /proc/scsi
 udpkg -i /.../p/parted/libparted*.udeb
 parted /dev/sda print
 # If parted complains about the missing library libparted$n.so.0:
 cd /lib
 ln -s libparted*.so.1 libparted$n.so.0
 # Go back to the d-i menu and choose "Detect hard disks" again.