|
|
在EDK source中提供了对physical 和vitural disk的operation
) [% m. {) j. }4 z2 |/ d参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件8 E/ V3 ^. J2 s$ k
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 E4 Y! n: v B2 @$ W9 _当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:. |5 t1 i& E8 x4 @
// set disk type,Physical or Virtual disk? and get the name
- u2 ^( e+ T" T) Y' Z. c0 Lif (DiskType == EfiWinNtVirtualDisks) {/ L# ]9 U1 \) x2 J* M
WinNtIo->WinNtThunk->SPrintf (
* H" L2 `: r$ Y- q. S Buffer,
; Z2 W$ v/ j u* N L"Diskfile%d",2 X& |, Q& a) _( D
WinNtIo->InstanceNumber6 Y& P/ u) A1 o/ G4 |
);
% y" ]9 ~5 S- l( a } else {0 c. D' l4 p3 L! f' P0 W- q
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
3 Y+ ]3 f: D8 `! [ WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);( @8 T1 C6 m! u" p+ G
} else {& e4 t- z Q5 `& \, n" `6 N w
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);. R x3 a. H0 F+ o% S! d0 |, u
}7 m/ d- x1 ^: A+ C: r
//create mapping
: x* L8 i- {% Q, U& \) w Status = WinNtBlockIoCreateMapping (
9 @- j; \" I. w3 s WinNtIo,) a8 i1 M6 `$ }- z1 L# Z ]3 t
Handle,5 y( E+ K/ ]3 z, W- n! S0 }5 b
Buffer,
C+ D- k1 j P: s) n WriteProtected,# f* |* C/ n2 y1 ]' B! j2 j0 W
RemovableMedia,2 Y; ^7 Z) J0 V% p$ q4 L8 L+ h
NumberOfBlocks,
: Y$ W- U7 m, A BlockSize,3 }/ |( N% l1 Y2 P
DiskType
% a4 B( E$ B7 |( Z. X ); i. |+ s( f ~. _- X
//register read or write blocks function
+ P: p: k/ J: {4 @! y I! CBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;7 }' K8 f# M& i3 x2 x
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;- F4 N+ `& u( z; O
1 R) w: D3 m4 T0 l4 n/ y8 L
//in the WinNtBlockIoReadBlocks,read file API0 p1 m; a" M) K2 ^' \
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
$ }, i; U, H% {, u3 f, _
) r, n8 c; a) \: f* H% L问题如下:
* O$ A `& s. \EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
: g5 ^1 r9 W# o4 d* f; K- G9 P0 v& G! u: A. H4 f: U7 @* W0 X4 F* O
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|