Modern systems usually offer different SATA Operation Modes such as ATA, AHCI or IRRT.

The AHCI mode offers extra features such as hot swapping and native command queuing.

Many vendors set the SATA Operation Mode to ATA by default because it’s the most compatible mode but there are a few reasons why you might want to change it:

  • AHCI has a higher performance than ATA.
  • AHCI is a requirement for the TRIM command.
  • AHCI is required for self encrypting hard drives

Please note that the IRRT (integrated raid) mode is supposed to support all functionality of AHCI but in my experience it doesn’t.

So the question is: how do we switch the SATA Operation Mode from ATA or IRRT to AHCI?

The switch itself is very easy, just go to your bios and change the setting. On my Dell laptop, the setting is System Configuration | SATA Operation:

Dell Precision M4500 BIOS SATA Operation Mode AHCI

But if we change this setting after we have installed the Operating System it will crash on boot with a STOP 0x0000007B INACCESSABLE_BOOT_DEVICE error:

STOP 0x0000007B INACCESSIBLE BOOT DEVICE BSOD

There is a Microsoft KB Article that describes the steps required to fix this problem. However for Intel SATA Controllers (the most common) we need to perform a few additional steps.

After some experiments I was able to create a recipe for it:

  1. Set the Microsoft MSAHCI driver to Autostart
  2. Add the Hardware (PnP) Id of your SATA controller to the Critical Device Database in the registry
  3. Add Intel’s iaStor driver to both registry and drivers folder
  4. Add the Device Instance Path of your SATA controller to the iaStor registry key.

On a Dell Precision M4500 the reg file to accomplish these steps looks like this:

Registry File for Dell Precision M4500 Switch AHCI mode

Unfortunately both the Hardware Id and Device Instance Path differ for each SATA controller. So how do we obtain the correct values?

If you have another machine with the same SATA controller which is already in AHCI mode then you can simply look up the values in Device Manager.

Just find your AHCI controller under IDE ATA/ATAPI controllers:

Device Manager

Right Click, select properties and on the Details tab select Hardware Ids. The PNP id is the bottom value:

SATA AHCI Controller Properties

Then select the Device Instance Path Property:

SATA AHCI Controller Device Instance Path

But how do we obtain the proper values if you are not fortunate enough to have another system?

I figured the easiest way would be to write a tool that can lookup these values programmatically and run that under Windows PE (from CD/DVD or USB).

So how does it work? Assuming you already have a Windows PE bootdisk, the steps are:

Switch the SATA Operation Mode to AHCI, boot Windows PE and start my tool (sci.exe). It will automatically search for and display all SATA storage controllers:

SATA Controller Identifier Screenshot

Select the controller for which you would like to generate a reg file and click the Save button which allows you to pick the name and place where you want to save the reg file:

SNAGHTMLeb55b2

Update 21-06-2011: The Save File Dialog didn’t work properly under Windows PE, I have uploaded a new version of the tool (1.1) that contains a fix.

Here is an example file for a Dell Latitude E6500:

Now we need to import the generated reg file in your Windows installation. To be able to do this, you have to first switch back the SATA Operation Mode to the previous setting to prevent the BSOD.

After importing the generated reg file, copy the iaStor file to the Drivers folder (usually C:\Windows\System32\Drivers) and reboot.

Final step is to switch the SATA Operation Mode to AHCI for the last time and boot into the OS.

Although not strictly required it’s a good idea to install the full intel drivers (Intel Rapid Storage Technology). At the time of writing the latest version was 10.1.0.1008 which can be found here.

It would nice if we could compile a list of popular SATA controllers so we can help other people so please consider running the tool on your system and adding the results as a comment here.

SATA Controller Identifier (5512 downloads )