|
|
在EDK source中提供了对physical 和vitural disk的operation0 h7 n6 D# }$ U# W3 ?
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件) C4 w& u3 m2 j. G
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512: i2 x0 Q; f, E% B' c$ f' Y, ]. p1 w
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:9 J6 v. `: ~& t# D. g
// set disk type,Physical or Virtual disk? and get the name8 d' C7 c5 S% }6 _
if (DiskType == EfiWinNtVirtualDisks) {
4 s6 a+ a* Y" O7 J/ e5 N$ G WinNtIo->WinNtThunk->SPrintf (
; \$ [- F6 A" i7 _- Z" [1 R9 s Buffer,
2 ]6 t( Y4 R0 R5 K1 a" d L"Diskfile%d",
/ S6 Y9 I* l" A' ^- L WinNtIo->InstanceNumber
* H4 [1 R$ G; o; J. R2 g& | );
* k! m- f- I p* N) C } else {+ I. ^- k- U1 |' N
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
9 T; {: t! ^1 E$ _% b WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
$ E& S* P5 X8 r } else {1 F0 _: A3 x( I. U( f8 V: K+ W
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);/ ?2 R( L, K& G& m4 Q" w# p' S2 H5 m
}! l' r2 h. U( o9 E
//create mapping
* i. e5 d5 y8 E' ^5 w. f" ?1 c9 h' T Status = WinNtBlockIoCreateMapping (
' W" q, S) a0 `) N- N% n' V) t WinNtIo,
6 X7 N% m" O3 S7 ]7 x9 H# G' g Handle,
8 B5 L% D6 |1 T. u: k; C Buffer,
! M# b: e$ j% f1 N; @ WriteProtected,
, M- x: ~- ^: }3 r# m RemovableMedia,
( n0 Q+ _" O# Z5 B1 J- X% G V NumberOfBlocks,, g) h- Q2 L8 U
BlockSize,
7 s+ P/ z3 l& w: _ DiskType; E" O K1 }% f! Z0 c
);0 I0 {0 p( T8 i
//register read or write blocks function$ R- s# _, E3 q; L
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;" g* r% u& k7 q( |
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
: j4 I- P% ]" o: ~0 |+ W; m( H/ Y( c; R, @5 ~1 p5 _
//in the WinNtBlockIoReadBlocks,read file API
3 @/ m" }" m: y l4 W: oFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);' B! t5 j6 M' A, }5 C8 w; e
$ Z7 p( ?% {6 O% V) `问题如下:
% _# e8 W( f+ C4 G& rEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊, K7 p2 m( S8 u# \$ E! R3 u9 U
& j- U; N* j* _- z) v[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|