Hi Andrew and Mike,
First of all, please allow me to say THANK YOU for giving me so much detail 
advise. With the direction that both of you point out, I gain more 
confidence. At least right now, I know where I can go. I'll dig into UEFI 
Driver Writer's Guide and UEFI spec to get solid knowledgebase on UEFI 
driver. After that, I'll start to work on that block I/O protocol filter 
driver.

Thanks again for helping.

David

-----Original Message----- 
From: Andrew Fish
Sent: Tuesday, February 12, 2013 5:04 PM
To: edk2-devel@lists.sourceforge.net
Subject: Re: [edk2] block I/O protocol filter driver


On Feb 12, 2013, at 2:50 PM, "Kinney, Michael D" 
<michael.d.kin...@intel.com> wrote:

> David,
>
> It Is possible to use the UEFI Driver Model to create a filter driver for 
> any protocol. The method is to open the protocol the needs to be filtered 
> BY_DRIVER and produces a child handle with the same protocol interface 
> with filter logic in the filter driver implementation along with a new 
> Device Path Protocol instance that is a copy of the original device path 
> plus an extra device path node that would usually be a VenHw() device path 
> node.  Since your filter opened BY_DRIVER, no other driver can open it. 
> The rest of the UEFI Driver services that would have opened the original 
> protocol will now open your filtered protocol.
>
> This method requires the filter driver to connect to the protocol that 
> needs to be filtered first.  You can use the ConnectController() 
> precedence rules that Andrew listed below.  The other option is to use an 
> open mode of BY_DRIVER | EXCLUSIVE.  The EXCLUSIVE flag attempts to kick 
> off all other drivers off that protocol first.  If that open succeeds, 
> then you can create your child handle with your filtered protocol.  If the 
> open fails, then you can not provide a filter for that specific protocol.
>
> The only other caution on this design is that you need to prevent an 
> infinite recursion of your filter when it tries to filter the filter.  You 
> can install an extra protocol on your child handle (usually 
> gEfiCallerIdGuid of your filter driver), and your Start() function should 
> ignore handles that already have your gEfiCallerIdGuid protocol installed.
>

Thanks Mike you beat me to it.

The only thing I was going to add is the firmware usually carries a 
partition driver and a FAT32 driver. What you want is for these drivers to 
layer on your filter driver. I think the OS is going to look for the short 
form device path that starts with the Hard Drive node, and this handle is 
going to be created by the partition driver.

UEFI 2.3.1 section 3.1.2

The boot manager must also support booting from a short-form device path 
that starts with the first element being a hard drive media device path (see 
Table 74). The boot manager must use the GUID or signature and partition 
number in the hard drive device path to match it to a device in the system. 
If the drive supports the GPT partitioning scheme the GUID in the hard drive 
media device path is compared with the UniquePartitionGuid field of the GUID 
Partition Entry (see Table 17). If the drive supports the PC-AT MBR scheme 
the signature in the hard drive media device path is compared with the 
UniqueMBRSignature in the Legacy Master Boot Record (see Table 12). If a 
signature match is made, then the partition number must also be matched. The 
hard drive device path can be appended to the matching hardware device path 
and normal boot behavior can then be used. If more than one device matches 
the hard drive device path, the boot manager will pick one arbitrarily. Thus 
the operating system must ensure the uniqueness of the signatures on hard 
drives to guarantee deterministic boot behavior.


A driver that creates a child handle is called a bus driver in UEFI. You can 
read about this in the UEFI Driver Writer's Guide 
http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Driver_Developer

On your child handle with the filtered Block IO you are going to want to 
copy the device path of the hardware block IO device and append your own 
device path node. You can use a Vendor-Defined Media Device Path for your 
node.

Good Luck,

Andrew

> Best regards,
>
> Mike
>
> -----Original Message-----
> From: David Wu [mailto:david.wu8...@sbcglobal.net]
> Sent: Tuesday, February 12, 2013 10:50 AM
> To: edk2-devel@lists.sourceforge.net
> Subject: Re: [edk2] block I/O protocol filter driver
>
> Hi Andrew,
> Thank you very much for your input. You ask me why I need to filter the 
> data
> and what problem I'm trying to solve. I need to decrypt the hibernation 
> file
> during hibernation resuming. We encrypt the hibernation file hiberfil.sys 
> during
> hibernation preparing. So we need to decrypt it during resuming. In legacy 
> BIOS,
> hibernation file is read back via INT 13H during resuming. So, I decrypt 
> it via
> INT 13h hook when hibernation file disk offset is matched. But in UEFI, it 
> is
> read back via block I/O protocol. That is why I'm seeking the possibility 
> to
> using block I/O protocol filter. I tried on Dump_Read() in Windows 
> hibernation
> dump filter also(
> http://msdn.microsoft.com/en-us/library/windows/hardware/hh439713(v=vs.85).aspx.
> ) But it doesn't work.
>
>
> Any advise in that case?
>
> Thanks again.
>
> David


------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel 


------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to