|
|
在EDK source中提供了对physical 和vitural disk的operation
! F7 b2 n8 T8 z& i7 I2 _" `参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
x' ~- T/ P# e4 {/ }set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 q) [% q( Z9 v$ b; d* C x3 ]' W当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
d( p& c a$ J4 j* L, E+ w0 r// set disk type,Physical or Virtual disk? and get the name
( H6 |* @9 m% Y+ V) Yif (DiskType == EfiWinNtVirtualDisks) {
. K/ l1 w1 l2 _9 Y WinNtIo->WinNtThunk->SPrintf (
6 j, k) `3 c6 I9 z( l3 q- i8 n Buffer,
# E# [+ J8 J. ^2 i* j1 C [ L"Diskfile%d",
8 U& \8 q0 V; T1 n& g5 L8 } K WinNtIo->InstanceNumber
* w4 ^# Y& w, u4 k- p/ p) Z );
6 h$ _1 o( R/ r. T } else {* e4 k- n* q/ h+ v- }% J! d
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
5 u% I1 r8 c, O. E) w/ l, f$ w WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
) ^2 E8 K% \# J. U } else {3 r% ~6 g' v3 v1 N; [6 q
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);& G0 G# v# m; C5 G4 z& B, b
}
! `& `5 d" I1 L2 u- `: x//create mapping
; J0 ?& m8 S! P' R+ Q0 G0 j- a3 S& \ Status = WinNtBlockIoCreateMapping (: R& N5 e r8 I# Z7 J% C4 q( O
WinNtIo,: U L+ W8 {( d0 K0 }, L
Handle,$ ]9 A1 _# `3 u
Buffer,4 ?0 ^- r$ c- E4 S
WriteProtected,, j4 C* r: L& |! y# Y( c* y
RemovableMedia,
( j0 ^5 v* r# m, X9 [; |+ M NumberOfBlocks,9 ^$ R: `( y4 v8 z
BlockSize,5 w8 F8 c; z5 X# D; U \
DiskType' f- Z$ U- [& }
);9 V. k* v; J/ F( z; y! r0 V
//register read or write blocks function) v( U' G- e3 m2 {( _' d# y4 r
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks; _# o$ Z. D; E, E4 R( w
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
) m5 e4 r+ |" l0 \5 Y0 X6 [; g" p6 @% }* f- `1 ]
//in the WinNtBlockIoReadBlocks,read file API( a) X4 ? r2 Q7 T
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);8 U" Y' b0 l) Y- _0 f& [
3 S% v$ W" b- Z0 F! ~' o
问题如下:
% @; P. Z1 W. f+ F7 m( HEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
: C# y( \' s. t6 }* B1 p6 M* }& v& v5 }7 ]
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|