I've posted the problem before in thread:http://www.osronline.com/cf.cfm?PageURL=showlists.cfm?list=NTDEV
It looks the problem is caused by bounced buffer as described in thread:http://osronline.com/showThread.CFM?link=210428
There're two kinds of memory: SGL and memory returned by StorPortGetSystemAddress (SA). For the write SRB, data in SGL and SA memory are the same before it send to the storport driver. For the read SRB, our storport driver send the correct data to SA memory. But after StorPortNotification with RequestComplete, system will always copy data from SGL memory to SA memory. We've removed all function call to StorPortGetScatterGatherList. But it still do the memory copy.
Since our device can do page alignment only , we will always need to use StorPortGetSystemAddress to return data.
Either stop system from copying memory from SGL to SA or find a way to get virtual address for SGL memory will work. But HOW?