|
|
在EDK source中提供了对physical 和vitural disk的operation7 [$ s; ]( I! w% w' G; `
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
& w2 ?; A- W: |set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512( L- @1 [5 h& _
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:. b0 @& ]! }# O1 T
// set disk type,Physical or Virtual disk? and get the name
$ w5 A9 h' X f7 t: Mif (DiskType == EfiWinNtVirtualDisks) {
+ n9 m! @+ A; U WinNtIo->WinNtThunk->SPrintf (: L9 Z( N- M1 D0 g
Buffer,
$ E8 j8 ?8 L& i; V9 D L"Diskfile%d",' T" k* C' I8 l1 `
WinNtIo->InstanceNumber
4 n3 i$ h# [; A5 O ~! J9 ] );
6 C% W8 D+ l, P } else {7 o& F* j5 W- ~9 d
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
( Y: X8 y8 d4 D! Z WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
" C& g+ X$ S! R/ k5 d } else {$ B# @& a* s" w( B' E: g4 b0 o$ g4 S$ B9 H
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);. v/ z' P* y: i I; w
}0 }% i2 b# x1 a
//create mapping 2 Z" N4 G) P. W* G
Status = WinNtBlockIoCreateMapping (, k4 \1 J/ k) E
WinNtIo,
' l% c! [& [: v2 x$ k Handle,; d. s. _; x4 x& r' T7 h
Buffer,
5 H4 E' D+ L' ^& a2 e WriteProtected,
, u( g5 [ h2 V& u RemovableMedia,
$ Y$ N7 K2 ?6 ]+ E+ j# t6 k+ A NumberOfBlocks,0 }- r7 F* F/ `, A) D
BlockSize,
: k8 k4 G$ d# s5 ~5 ] DiskType
2 @* |5 e9 c$ _" D5 _ );! \# P5 \" t: K# _+ \9 U
//register read or write blocks function# j% v5 r- c) @* T1 @ Q& y
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
, e# v) z4 e+ O8 h8 U; i1 t% ABlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
$ B) g/ A' u5 L! j2 A$ h/ e m, k3 H6 j& S3 `; p: S5 M+ s
//in the WinNtBlockIoReadBlocks,read file API
' }3 t: y/ `; I/ VFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);: w% l7 W( v, }: J$ \2 c0 U
0 R/ k7 H5 ~* n% s
问题如下:
2 d2 `$ i7 s3 p# _EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
( [7 w- Y4 L7 k& J
* w: D$ g* J" ]3 ^9 F( }[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|