|
|
在EDK source中提供了对physical 和vitural disk的operation3 | W0 M/ X' a) v0 U
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
( T8 f8 o) L* O8 y" cset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512- l% b" ^" R6 Y' Z7 `0 {
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:' ~! m, r+ {2 H
// set disk type,Physical or Virtual disk? and get the name# W& l' O9 O, X( m; O- t* ?: ]( q9 p
if (DiskType == EfiWinNtVirtualDisks) {
: \2 |# s, V+ y( d, N9 P' z WinNtIo->WinNtThunk->SPrintf (* `; o( }/ j( ]$ v6 _" _7 O
Buffer,
% e+ a m1 a" l* _! H: @) e L"Diskfile%d",
1 |) T. U. @& v WinNtIo->InstanceNumber
0 O0 N' x2 r8 k, }* o );
Y. j( ^/ }) I. g( ^ } else {
! i0 a9 b7 S; u& a$ L if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
: C |' g0 t$ e6 ~" r, T* }* a$ a WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);2 L* B0 J, m! X
} else {
" U0 C3 x1 h2 b3 j& U! {3 L WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);1 Y0 Z, Z& n/ h, b: p o9 \$ [# ?
}/ E- x4 P4 ], I, d8 D
//create mapping
3 B) k2 K" N1 f; b; W! |' S Status = WinNtBlockIoCreateMapping (" E- s$ z. w/ g( D1 r
WinNtIo,3 V$ ?/ J: h+ o# v; D
Handle,
1 ^ ?; C$ [: p6 J! T: ]4 f- F Buffer,
& A* u) r9 t: |' y WriteProtected,# U: C' n2 n! d
RemovableMedia,
$ h l4 J5 k" ]: n4 ~% B. @- h NumberOfBlocks,$ _; o, T0 [" c q2 v( P
BlockSize,4 @ m& G8 F" \5 [+ Z
DiskType4 O. m5 ~ b8 j, s
);6 p0 e) w! D F7 l6 u! |/ @1 e
//register read or write blocks function4 Q6 M; e i+ D7 E
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;4 g; `, o9 I- m/ z$ U9 R" L
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;9 T$ p# o0 m# a0 T6 }. ]6 X3 b. p+ z9 p
6 e7 F+ Y0 n. `1 r1 m% D//in the WinNtBlockIoReadBlocks,read file API& l/ n, t( |; X' g
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);" H& q( e8 s& C h' X
" N! |) H1 X+ i* J% \; m* h
问题如下:
, h5 D; J" g7 Y) i" U" _EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
+ q6 f: M/ J+ l7 c v- q* A1 F# @
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|