[Success] HP Z230 Tower Workstation

This is my first post, so hello all :slight_smile:

My setup: HP Z230 Tower Workstation, flashed with latest bios BIOS L51 v01.63, dated 4/22/2020 + Samsung 980 NVMe in PCIE 2x4.

A. Long story short.
(NEVER EVER try this if your PC is not Z230 Tower Workstation or your bios version is not L51 v01.63! And if you decide to try, perhaps re-calculate the offsets, just to be sure)

1) download WIN64.zip:

2) copy the file NvmExpressDxe_4.ffs to where fptw64.exe is, then execute in elevated command prompt:
.\fptw64.exe -A 0x910868 -L 0x5160 -D test.bin
.\fptw64.exe -A 0x910868 -L 0x5160 -F test.bin
(the above 2 commands are safe, just a test if you can write where you need to; if you see an error, go to X) below)

3) now, the real deal, execute:
.\fptw64.exe -A 0x910868 -L 0x5160 -F NvmExpressDxe_4.ffs
reboot, enter bios, load defaults, done!

X) in case of fptw64.exe write error - in EFI GRUB Shell (Deathbringer unlock), execute:
setup_var 0x96 0x0
setup_var 0x97 0x0
setup_var 0x98 0x0
setup_var 0x99 0x0
setup_var 0x9a 0x0
(those offsets, that I took from the forum thread mentioned above, are also valid for HP Z230, I checked)

B. Now, the long story

After going through driver insertion, and then trying to unlock the firmare with diffrerent methods - I could not get past error 28, Protected Range Registers. So decided to compare original bios file with modified one - to perhaps flash only smaller regions of firmware. I expected a few differences, but there was just one: continuous block of 21 kilo bytes: the driver file itself; its content was unchanged, nor anything else was changed in bios image.

So I decided to simply flash the driver file, NvmExpressDxe_4.ffs (flash only 21KB, and not 10MB or so). I used the already mentioned command:
.\fptw64.exe -A 0x910868 -L 0x5160 -F NvmExpressDxe_4.ffs
and it succeeded.

Offset explanation:
0x910868 = start address of my bios (0x580000) + offset where MMTool.exe puts that driver (0x390868)
0x5160 = length of NvmExpressDxe_4.ffs file in bytes

After that I rebooted my PC, entered BIOS, loaded defaults, PC rebooted twice, and then I was able to install Win10 onto NVMe drive.

So, the procedure would be like this:
- first, get fptw64.exe that is proper for your ME firmware version (my system ME fw is 9.1.43, so I could use fptw64.exe from WIN64.zip download mentioned at the begining of this post)
- dump bios, eg.: .\fptw64.exe -bios -D bios.rom
- note its starting address, eg.: .\fptw64.exe -I
(regions - bios - base)
- use either UEFITool.exe or MMTool.exe to insert that driver (I used MMTool.exe because my bios had pad files)
- compare modified bios image with the original (I used WinMerge in binary mode), note the address where those 2 files begin to differ
ATTENTION: if you see, there are more differences than just a single block of 21KB, you cannot proceed or you have to modify the procedure!
- add the number discovered above to bios starting addres: this is what you should put after -A in fptw64.exe command; I will call it “your_number”
- 0x5160 is the size of NvmExpressDxe_4.ffs (constant)
- now, after you have all data, test dump what you’re about to override; execute:
.\fptw64.exe -A your_number -L 0x5160 -D test.rom
Load that into hex editor and make sure, it’s what you expect it to be (probably all bytes = 0xFF). You can also dump a region that starts a few bytes before your_number, and check that (the point is to dump something meaningfull, not only 0xFF bytes - hope I’m clear enough).
- after making sure that “your_number” is proper address, where NvmExpressDxe driver should be, execute:
.\fptw64.exe -A your_number -L 0x5160 -F NvmExpressDxe_4.ffs

Good luck!

PS: this forum is very good, lots of useful informations and tools
PS2: excuse my English :slight_smile: