|
|
在EDK source中提供了对physical 和vitural disk的operation5 ?1 @: G; y# M. ^- Z
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件0 f6 P6 x" Q; m) v4 F% \; P
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
8 S5 b* N) v% A. K当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
; C }) D! F/ C {: C4 L// set disk type,Physical or Virtual disk? and get the name; A0 {& A5 ]5 e F9 F
if (DiskType == EfiWinNtVirtualDisks) {
4 C7 E; U, A; c8 e WinNtIo->WinNtThunk->SPrintf (8 @2 A% h- R" ^. {4 o; h% S# S' ]
Buffer,
) {) W2 D7 ?: t* c$ k; M% r8 C L"Diskfile%d",* ^3 j: g: Q& v* Q* P' s
WinNtIo->InstanceNumber
3 o, Z3 m( y& ]9 J" M5 m' ? );5 ?8 Z" Y( _( M1 j& r H
} else {
5 m+ G6 k' _2 Z. E+ Q9 { if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
! _7 A0 W& w/ v# F7 U% C WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);! S, o3 J4 ?, ^
} else {
[" F" A- J! E& m# s! O3 { WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);/ e7 }# s' e: G$ \* C
}$ s6 p2 _1 K' [" H" Y
//create mapping
9 D: j8 \! A* h! e) z1 j. b, ~! w Status = WinNtBlockIoCreateMapping (4 ? e7 [! Y' m
WinNtIo,7 t2 f9 w, e8 j
Handle,5 m3 b: ^& h+ Y, \" ]% g* f! q7 E4 \( g
Buffer,* y% |1 D1 O- I0 u
WriteProtected,
7 {. Z0 J( K# t, }' c( w RemovableMedia,
, ?- j3 L& p5 h& i" F" B6 K( Q; Q8 _ ? NumberOfBlocks,
9 u% |2 N5 b2 X. U1 ]+ N! P BlockSize,
1 j" M, q" f2 @6 v. s& w" { DiskType- w2 W$ w7 ^: p1 }
);' B/ x) M3 @/ F8 R9 P& H1 H
//register read or write blocks function. M6 K5 C( H! o5 S- b% D
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
1 _4 W: R; l9 x9 G0 P" |5 ~7 xBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
# m1 g2 }, d8 O- B. h0 H4 l0 F2 x; k# a( m2 f: | M! o3 z
//in the WinNtBlockIoReadBlocks,read file API
$ s1 v, p9 W6 ]' s% [" V4 }. \Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
* Z- k5 ^8 h; o4 F5 }% _, b6 w7 q/ M- t
问题如下:9 h6 F6 J$ c4 |: p- U' _( {
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
' f4 D8 j' v8 G% Z0 v2 ^
' U7 h2 |2 q, G( y! D" s, _9 Q[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|