|
|
在EDK source中提供了对physical 和vitural disk的operation& w% ~ K7 w8 e- M) {6 l! f, s9 [, |
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件/ b1 ^% c) D4 \" m9 C7 K4 q
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
' ?; L$ M- \' L* C2 H6 {3 t+ j8 s0 u2 _当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) X$ ~! s3 J) j; I( o" l
// set disk type,Physical or Virtual disk? and get the name' f) ]) F: P3 w' l6 ]
if (DiskType == EfiWinNtVirtualDisks) {$ }$ l, C# @% D6 s
WinNtIo->WinNtThunk->SPrintf (9 f1 k) L: H' }" H5 ^6 _
Buffer,! R5 h9 ^6 @* j; h8 |# }! Q3 ~
L"Diskfile%d",- R J; j) [ e9 j& o
WinNtIo->InstanceNumber
% T2 ~* {7 h- k+ N. P- j e1 P );
) C% U+ }/ B o8 {. ]1 d- t } else {' T# N7 C# S; G& o; C) {% X
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
! I, p! K3 A5 e8 |4 k2 H WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);& P* G# D0 g( n4 {& n7 ?# G- U2 |! P
} else {5 ^8 I" c3 H) B2 s
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
5 Z' ?0 D% x- y2 G: z }% V- h' C& n1 K
//create mapping
5 s+ G O$ M$ ]7 I7 M1 M$ z% e Status = WinNtBlockIoCreateMapping (
$ }! E8 j: a8 m9 P: D WinNtIo,
2 w( U$ G' ~: G2 `# A. s Handle,1 T5 q. M/ V% X9 E @
Buffer,
: X; `) X, ?+ G3 Q( ]- [# u8 T WriteProtected,, ]5 j8 i8 v( v! J1 p% C' H# c
RemovableMedia,
; T+ ` G. F' ^2 K0 Y" P NumberOfBlocks,! u# ^4 a3 |: }/ e9 C5 Q3 F$ b
BlockSize,2 [) r* Z1 f! F) I& P6 G9 y$ @
DiskType
: ?" ^3 w& L( E+ R' C9 r );
; X7 h$ a1 c4 c/ |% {( | N//register read or write blocks function
' Q/ _5 w, ~3 P8 o _* Y! JBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;! W( Q8 o' T0 G# {: g% w
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
0 @' S2 q ^0 P M* D D+ r$ n6 G* V' j( j2 n, L- l9 W3 {
//in the WinNtBlockIoReadBlocks,read file API
! }0 z2 l+ ]) \# y0 g6 t- M' ^Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);9 N" S! Z% r# h0 S8 n
. U2 m# D, l R: s. Y
问题如下:! l3 p$ x% ]4 a+ u- b
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
/ e v$ L" R2 \- s( M! g) \2 I) U7 f7 r2 _8 s+ e/ `$ E
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|