|
|
在EDK source中提供了对physical 和vitural disk的operation
2 w' n: D. R4 `4 Z参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件1 S8 c* O: g/ V- K& G
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
, V& n& g' b1 Z9 w当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:6 v& S Z4 a1 O2 A
// set disk type,Physical or Virtual disk? and get the name
3 ]. g- m9 y. E# h7 V+ j6 w5 x1 Kif (DiskType == EfiWinNtVirtualDisks) {
% c4 o, ?9 O2 G3 \ WinNtIo->WinNtThunk->SPrintf ( ~( {7 t' J4 {) k1 {& B& ~1 L5 w
Buffer,
: d+ c$ P! S8 X: z% _; g; R L"Diskfile%d",
7 _' X# g7 ], I `5 S/ N* ~ WinNtIo->InstanceNumber" ?( H7 v9 n* ^- v
);
! Z m' D8 P0 S5 f5 f# K } else {
0 r. {, S5 v7 o1 O# l7 f! w& w if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
}( |8 f3 W p4 P6 L WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
& y0 P6 I+ C% H0 T0 d( {) h0 ] } else {5 r0 O- R3 V1 U2 B3 ]9 f
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);3 g, H4 i: J. q2 X. C6 g
}
' U) l9 x3 u v5 ~' n, i' ^//create mapping
+ G' p, T% M k& j Status = WinNtBlockIoCreateMapping (+ }; P O6 U7 N, g0 c
WinNtIo,
- S0 Z8 b3 [' m* \* f. d- I" \) {8 w/ q Handle,
" e1 q" b5 G; i Buffer,
" ^2 z: l) T. Z1 _! [ WriteProtected,; C% W: O6 c2 j/ ~% o9 s
RemovableMedia,$ \! l8 {) e( N m, n$ N* H
NumberOfBlocks,
/ F! u) e- v* |: |4 e* S# d# ] BlockSize,- C9 L, b: n6 L' q, O' [0 Z/ K
DiskType) F4 E1 N6 J3 P/ ~$ I
);" V$ {0 r A; ]: j1 f
//register read or write blocks function5 n6 ]; E; J6 k* q% n0 e. J
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;# [+ s( a( x4 [+ D, {% ~3 K5 D* Q
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
8 i% o) a" |; b; f
2 L9 B# E, |0 ]+ V( \# F( f! F3 X//in the WinNtBlockIoReadBlocks,read file API
# b9 Z- a/ `4 w2 H( j* A nFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: J6 n8 \, I* n6 D, H4 j3 o0 D1 z1 I* e0 N8 T
问题如下:
$ x" S/ m9 H- ~$ X/ I) [EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
( v3 g0 A! e5 k; i0 F+ V0 f* [7 Z' F& F! p7 a- G
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|