|
|
在EDK source中提供了对physical 和vitural disk的operation' b/ b7 @/ f) Z* N
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
& F$ T/ Y' J; |3 _: L* rset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
( y* I3 ?" k& d2 E当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:" R' k/ N8 Q" n: c5 A" z
// set disk type,Physical or Virtual disk? and get the name
6 u/ l/ C0 t4 n& `5 c: `if (DiskType == EfiWinNtVirtualDisks) {
4 ~8 }" i0 T9 ?- {5 w WinNtIo->WinNtThunk->SPrintf (. W9 t: ]% j$ M; k2 @
Buffer,
9 _/ u8 V% w- Q4 Z L"Diskfile%d",9 ?+ |( }# B. _& O v( c' a) _ d
WinNtIo->InstanceNumber' d9 v& I9 z1 {" R) R
);: F6 \' f, i- _
} else {3 r) P- ~# T% `! [# Z+ e8 M0 Y
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
. F" m) P6 H3 N WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
4 R* j0 w8 t) R. d3 k5 g! P$ { } else {
0 r# X6 P% G9 K: h' c WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);# x5 E: Y' L; o; t5 ], l
}
0 M; @! Q) ?9 }: [+ @! X3 D//create mapping 6 {0 Z; k J7 J" k a: `1 E
Status = WinNtBlockIoCreateMapping (0 L4 e$ ?8 |# i
WinNtIo,* t9 Z' x+ f; W3 E- D% M1 s
Handle,
, z0 M& ]" W) A% b1 u% L$ x/ x/ I+ h Buffer,
4 D+ O/ D, N" U o WriteProtected,
% C, V+ p5 p4 K$ h RemovableMedia,
1 j: T3 }6 [* @6 l1 H" r- G5 L$ N NumberOfBlocks,
+ X! X" h6 @1 o$ G7 H8 m BlockSize,; O( Z- d8 g7 {+ S; [1 J
DiskType" P, _+ C3 v# @- C* I& h0 z
);
* h6 ^6 C" T( K3 r- R/ b8 F6 C//register read or write blocks function0 S! J1 R" x4 p. l* D% ]
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;4 T6 `0 J9 `1 A% v! Y
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
/ i4 y( }7 Z! t% O. z% G
7 t- P2 V* j; i& b: C; P: d2 Z. v//in the WinNtBlockIoReadBlocks,read file API! C3 h3 p1 m; {8 b( @! Y/ y
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
) k }6 f0 \ G% ^ x* A
+ j; p" Y" T* s! w ^! O问题如下:' d9 l2 d1 V5 u# [0 L! G- r
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊. H5 d, `% ?4 G, V! ]0 @( S
. L n, ?# }: I9 P+ \& ^! N[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|