|
|
在EDK source中提供了对physical 和vitural disk的operation
8 b0 J3 v) Z5 A2 h e参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件% W, U: n/ I# v7 y1 g
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512" C7 }8 @2 U& f- ^* c, R/ z
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
' U% `! y6 Z; s: [) b0 T' z// set disk type,Physical or Virtual disk? and get the name
4 B% v3 t6 m, jif (DiskType == EfiWinNtVirtualDisks) {' B Z/ e) ~0 @5 G
WinNtIo->WinNtThunk->SPrintf (6 r2 X7 v3 n8 M/ Q* g
Buffer,0 c4 v- T9 T( h: J$ J% T2 f) F+ N
L"Diskfile%d",
) ^3 z4 s0 `- l% K# f. G WinNtIo->InstanceNumber
: e8 ~, `4 p. e+ p5 `' ~ );3 S7 | }' _3 L, K1 V2 D" u- {* k p
} else {: c j e' N. F, z1 H0 Q
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {0 C* U9 J7 Y( c
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
1 A! l3 ~1 Q# U% `1 C- A3 ] } else {
' K! ], Y0 D' {$ b- V( X WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
. b* d; {0 k8 j) _7 S: h }
$ l9 K& ^; {+ r7 q# }+ O* Y$ I//create mapping
, _ a3 f. {' I! h Status = WinNtBlockIoCreateMapping (# T, T' i) _* }1 e9 M
WinNtIo,: z" h* |/ j o& _6 q0 P
Handle,% l4 O3 y% E/ q) m7 K Q
Buffer,
7 I* x! p- m# v2 p( j7 w WriteProtected,# Y$ n4 @' s- @
RemovableMedia,
- E* {( t6 P |1 r. m) s NumberOfBlocks,
+ o0 [4 L4 b- i$ s( g% Y7 V3 `" u BlockSize,4 ]1 W% a! s5 a6 \
DiskType) O ]9 ?7 J1 Z7 s" h- M
);7 I: N2 q2 r& K) X0 O; o: O
//register read or write blocks function
" A) F* `$ }' A, I% f# h7 eBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
6 h, a* g m4 l$ D A: J! u# }BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;# e# O4 O. Y# i3 S3 h# T5 s' g
/ ^6 Q8 a* T$ z+ N# W. X% I" w3 P
//in the WinNtBlockIoReadBlocks,read file API# K _& d/ b: y3 m
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);8 c- K* w) ~$ F1 D
! Z" Y; D T% E( W" @5 p8 L. O8 S问题如下:9 \7 ~+ q" Z% _3 B" z
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊* w p( x+ k1 V; S4 M5 w9 b& t! s
4 k/ M& G. K7 x- y[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|