I've been using a hardware independent deployment strategy in my office for a little over a year now. For the entity of that year, it turns out the various computer models we’ve been deploying too have all had a south bridge chipset that could be driven by the “Intel Matrix Storage Manager Driver”. That is, all ICH6 through ICH8 compatible devices.
We recently purchased a batch of T500 laptops, who's harddrivers are now controlled by the ICH9 driver set. Specifically the “Intel(R) ICH9M-E/M SATA AHCI Controller”. And suddenly when I deploy to these laptops with my HII system, I get the accursed 0x7B stop BSOD.
This has made it apparent to me that my HII system is not deploying dynamic MSD drivers to target computers. Instead, the Version 7.0.0.1020 Intel(R) Matrix driver used in our original image reference machine has been secretly included and used by every computer we’ve deployed to ever since the image was generated. Until now that’s been functional since this driver is capable of driving all ICH6 through ICH8 devices, but with these new T500’s it’s not sufficient.
Here’s my issue: I don’t know why mini setup is not picking up the Version 8.2.4.1005 Matrix drivers being injected into the target after image deployment.
Here’s some quick and rough background on our HII system.
It comes in two phases:
Phase 1) Scripted OS install to a reference machine
Phase 2) Deployment of sealed image from referenced machine.
For simplicities sake, I’m focusing this topic on my Phase 2 steps.
Here are some quick details on my environment:
Code:
DS Version: Deployment Solution 6.8
Operating System being Deployed: Windows XP SP2
Target Devices: IBM/Lenovo family laptops and desktops. Single/dual core, IDE/SATA drives.
Here are some assumptions I’ve built my strategy around:
A) You can script any thing…*any thing*, and I have thus intentionally avoided using HIITools and the built in Altiris Deployment Job tasks designed to help deploy HII images. The history for this reason is a little long and convoluted, but suffice to say, I manage driver injections and every thing else related to both Phase 1 and 2 via hand written batch scripts and careful control of my HII system.
B) All drivers required by a target computer are injected to that machine just after image deployment but before reboot to production. Mini Setup, IE the moment the shrink wrapped OS unpacks itself and commences initializing the operating system, is expected to find these drivers and install them on demand.
C) It is assumed that Mass Storage Device drivers can be installed by mini-setup at execution time, just the same as any other driver.
D) On the deployment server, all device drivers are stored in <server>\express\sysprep\models\<targetmodel>\driv ers\
E) On the Deployment Server, Mass Storage Device drivers are stored in <server>\express\sysprep\models\MSD\. This folder contains subdirectories holding specific drivers for each type of controller: IE drivers for Intel Matrix ICH7 and ICH8 devices are stored in the “ICH7SATA” and “ICH8SATA” folders.
It also holds a TEXTMODE folder that contains the initial 7.0.0.1020 Version of the Intel Matrix driver. This folder is used for scripted OS install during Phase 1, which isn’t being discussed yet.
F) On the target computer, all drivers, both model specific and MSD drivers, are stored in C:\drivers\.
G) Model Specific drivers are organized into “buckets” with in the “drivers” directory. Thus, a directory structure like this is used:
Code:
C:\drivers\
+---Audio
+---NIC
+---SYS1
+---SYS2
…
+---SYS9
\---Video
The NIC, Audio and Video buckets are self evident.
The Sys[1-9] buckets contain device drivers for chipset, card readers, finger print scanners, etc; In short, any other various and incidental device driver other than the core three. (Chipset drivers aren’t “incidental”, but what ever)
This is how we are currently doing our Phase 2 Deployments:
1) Deploy our HII image to a target computer
2) From Dos Managed Boot and execute a batch script that will inject device drivers into a computer. This script is one of the major work horses in this phase, so I will break it down here
2a) Detect a computers product name and read through a series of batch IF statements constructed like this:
Code:
if "%#!computer(at)prod_name%" =="818332U" goto 818332U
Posters Note: I had to replace the -at- symbol here with (at) because I was being told I couldn't post external links.
If a match is found, the 818332U subroutine is jumped into and drivers/HALs for that model are injected via FIRM. Drivers are stored in C:\Drivers\ and the Hals are dispersed into C:\windows\system32
2b) Once model specific drivers are injected, an install package for the aclient is injected via Firm. It is stored in C:\drivers\Aclient
2c) Next the Mass Storage Device Drivers are injected into the computer.
2d) Finally, the actual Sysprep program is injected into C:\sysprep. Note that this DOES NOT include the sysprep.inf file.
3) Still in Dos Managed Boot, a second script runs that does three things:
3a) Uses the “REM ReplaceTokens” command to cause Altiris to do a variable replacement on our customized sysprep.inf. This token replacement sets the computers name to it’s embedded Asset Tag. The updated .inf is then copied into the target computer.
NOTE that this sysprep.inf does NOT contain a [SysprepMassStorage] section.
3b) Next the separate file syspmsd.inf is copied from here: copy <server>\express\sysprep\Models\MSD\syspmsd.inf. That file contains ONLY the [SysprepMassStorage] section. It has been updated with the device ID’s for our various target computers, and points each device id explicitly to the appropiate MSD driver. So, for example:
Code:
PCI\VEN_8086&DEV_2825=%SystemDrive%\drivers\ICH8SATA\ICH8SATA.inf
Or
Code:
PCI\VEN_8086&DEV_2821&CC_0106=%SystemDrive%\drivers\82801HEM\iaahci.inf
3c) Finally, this script will concatenate the two files and produce one, complete sysprep.inf that is then stored in C:\sysprep\ for use at mini-setup.
4) The computer is then restarted into production mode to allow the deployed OS to unwrap and run through Mini Setup. It’s at this point that I get the 0x7B stop for unmountable boot volume.
Sysprep and other stuff:
Ok, so at this point I should explain quickly how I’m syspreping my reference system and designing the sysprep.inf file.
I shrink wrap the reference computer using the following command:
Code:
C:\sysprep\sysprep.exe -quiet -mini -reseal –reboot
And my sysprep.inf file is here:
Code:
[Unattended]
DriverSigningPolicy=Ignore
InstallFilesPath=C:\Drivers
OemPnpDriversPath="windows\inf;windows\system32;drivers\SYS1;drivers\SYS2;drivers\SYS3;drivers\SYS4;drivers\SYS5;drivers\SYS6;drivers\SYS7;drivers\SYS8;drivers\SYS9;drivers\SYS10;drivers\NIC;drivers\WNIC;drivers\Audio;drivers\Video;drivers\MODEM"
OemSkipEula=Yes
UpdateInstalledDrivers=Yes
[GuiUnattended]
AutoLogonCount=1
AutoLogon=Yes
AdminPassword="<Local Admin Password>"
EncryptedAdminPassword=NO
OemSkipWelcome=1
OEMSkipRegional=1
TimeZone=35
[UserData]
ComputerName=%ASSETTAG%
FullName="Fasken Martineau DuMoulin LLP"
OrgName="Fasken Martineau DuMoulin LLP"
ProductKey=<Serial For OS>
[Display]
BitsPerPel=32
Vrefresh=60
Xresolution=1024
YResolution=768
[Networking]
InstallDefaultComponents=Yes
[Identification]
DomainAdmin=<Domain Administrator>
DomainAdminPassword=<Domain Admin password>
JoinDomain=<our domain>
[Proxy]
Proxy_Enable=0
Use_Same_Proxy=0
[GuiRunOnce]
Command0="c:\drivers\aclient\Aclient.cmd"
Command1="c:\drivers\aclient\Addgroup.cmd"
Command2="ping -w 60000 -n 1 199.199.199.199 >NUL"
Command3="sc start aclient"
[SysPrep]
BuildMassStorageSection=No
I’m really scratching my head. The mini-setup detects and pulls in every other driver if I set the computer’s ACHI system to “compatibility”. That’s the only way to make these T500’s boot until I can fix this dynamic injection problem. I refuse to work around a system I built though. It will work or I’ll burn it to the ground before I *compromise* with it.
It’s a lot of information to sort through, and just me writing this post has given me some ideas, but if any one out there catches something I’ve missed, or can debunk one of my underlying assumptions I’d really appreciate the feed back.
Many thanks in advance for the help and shared ire.