|
|
在EDK source中提供了对physical 和vitural disk的operation
7 C% q; `; P; Z4 a; I1 N参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
# b1 {; Q5 \# m9 G1 {/ b# Wset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
- k. o/ p1 c. g4 n当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:! Y% r- {9 u4 M
// set disk type,Physical or Virtual disk? and get the name
3 I I5 G6 `9 e5 R( uif (DiskType == EfiWinNtVirtualDisks) {( `1 D! w; O1 l' ?
WinNtIo->WinNtThunk->SPrintf (
2 |- w2 M) \/ v# d( T' V) K Buffer,* d. b: B2 ~2 U; Z$ p2 H: W* I
L"Diskfile%d",# _- y: B: S* S- J! _5 l
WinNtIo->InstanceNumber
2 o2 u' z6 o6 Z0 q. a# K" m );
# ~+ r0 c0 H, v! w( g* T } else {
. \, M1 {% d! r S; d/ S if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
$ G. R+ O, a6 t3 S9 t/ z WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
7 E0 ~6 f6 q' p0 C } else {
% o# p" \3 _5 l/ A, J) m3 y WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);* B; I, B t# _! m, A( X6 Q% U/ F
}& A$ s# w6 O5 A9 Y
//create mapping
. b( ^) p! F* q$ y$ Z4 w% L% { Status = WinNtBlockIoCreateMapping (
5 r9 D; ^: u) a$ G& L WinNtIo,% a0 Q! F. j- [) n
Handle,
* Y8 H3 e) D$ w! n A Buffer,# _2 x9 d* C0 N; g8 I8 B
WriteProtected,- `' [8 C+ s0 O
RemovableMedia,+ g' s( C, |7 X' F& R4 n
NumberOfBlocks,
" N1 E/ S6 K4 ?# l6 P BlockSize,5 W9 Y1 H9 }1 X! g& j$ o! N( C
DiskType ^0 y+ z9 `3 K( @7 X) W
);8 U* ~9 c: E& O i+ H
//register read or write blocks function+ D! e" l- ]: D; k3 |, }8 M
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
7 T! j/ h5 ~ \- |BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;5 d R# ~# U) t4 B7 u
* C9 X& f0 F7 ^+ e! C* v! e
//in the WinNtBlockIoReadBlocks,read file API5 G8 H- U& n) b& S0 W+ k3 q
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: I$ O- R, m6 V& i i% s) d
3 {1 W7 S- g8 y! Q1 R9 K" z问题如下:; i M) }* t) e1 R4 i
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊 q2 [1 ]6 r) Q" D2 F* s. h
" e, J$ E. V# |6 r* F. w[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|