|
在EDK source中提供了对physical 和vitural disk的operation
! B* G1 T, d* L/ k参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件5 i7 P! c/ L" G% f" e3 W0 b& W n' B
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512# `4 E! l- M1 f# [& s/ j
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下: h2 f5 C! p, D( U
// set disk type,Physical or Virtual disk? and get the name8 C3 _+ ]. V0 x
if (DiskType == EfiWinNtVirtualDisks) {
! T: A7 `+ a. m WinNtIo->WinNtThunk->SPrintf (
0 s4 H1 l9 s( X1 m- C9 j Buffer,
# O+ X( \, K4 c9 g L"Diskfile%d",
6 p8 n% ?+ O, r% i% S WinNtIo->InstanceNumber% C3 Z& z- F0 Z
);9 p0 ?( @# v# h0 V/ h7 p' G
} else {
- A0 k* {' s- c9 e if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {$ S- U5 ]- \, {9 a6 S8 V7 Q
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);, e$ {2 x' I! F' B' n4 |2 u5 k
} else {' d( h; Y5 `; W8 ?& H
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);7 l! Q# `$ D( f; U! q
}
9 L' Z0 n5 ~% G//create mapping ! W1 p+ L C: T2 W% q& r- }$ L, b6 V
Status = WinNtBlockIoCreateMapping (
* [" F: y9 M! r1 T$ H0 d, `) A WinNtIo,4 S" k5 I1 L$ P8 v
Handle,: r0 [) b1 y$ u+ i" M
Buffer,
, [" f# }0 _- I5 W. q( [* H) e WriteProtected,
$ |$ [/ K! M# \: P- _. I RemovableMedia,
7 e8 G% F# A, q, d! X( p NumberOfBlocks,
* u5 k' W7 V& ^/ t- ~ BlockSize,
9 b. l5 C6 |, b1 ~ DiskType* W* D$ Z5 x8 q, v
);
4 C' ]4 p' w, _4 ]//register read or write blocks function6 `# w, L+ D3 |( o
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
+ X6 W8 v9 b- o* d( G$ S& eBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
# N0 ^ y7 _" [2 z. j
0 u1 `2 T# u% B, s) h2 ]//in the WinNtBlockIoReadBlocks,read file API
) t. y: p4 d5 c6 w J9 p- oFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: u: x5 s' ~) [* v
! ?, g2 K, K- h2 S; M问题如下:' V8 R O6 q* u3 H
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊0 r% X+ Q1 Y5 D. `, b2 D
& A" R1 C: e; \ ]5 q[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|