|
在EDK source中提供了对physical 和vitural disk的operation
0 \9 ^, g) r# d7 C$ L4 }参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
. V- d7 L* R: w' P4 \, b! f* }9 zset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5125 V- {2 A: S$ j
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) C& w* f- }+ q# B* P
// set disk type,Physical or Virtual disk? and get the name
8 b' s1 L# j+ y; D: w, |if (DiskType == EfiWinNtVirtualDisks) {
( _+ y+ m: y9 R WinNtIo->WinNtThunk->SPrintf (- W |* L+ f' L. U. d, S0 r
Buffer,
4 d: F" z* y$ Z L"Diskfile%d",
, |& D! g8 L; M, c8 k7 G WinNtIo->InstanceNumber
: J$ ~" n# {0 Z$ I* ~ );
% w' p" p' l/ Z) k/ `5 q: V } else {
' w7 I: b9 G9 e+ p- v* o6 ?7 q if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {! t3 D2 `6 m) Q- R2 i2 Z
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
/ h- `/ h Q4 P2 @% M } else {8 V% d9 M0 J. t2 U% w
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
) P) j: |% \0 q9 Q. Z" m q }, o3 \# D' h, y! P: _. I
//create mapping
8 G. B: G$ X9 Y: u Status = WinNtBlockIoCreateMapping ( U; ~% {, R% u& L
WinNtIo,
* v2 o* O6 u$ ^ Handle,- S4 K2 C6 c6 t1 Q
Buffer,
( V* i- L% @6 E$ K WriteProtected,# w# z7 x2 u, H5 ]: `
RemovableMedia,7 Q3 z5 v" \. I7 H: E
NumberOfBlocks,; r4 q( a* n: ^) _
BlockSize,
& e% u4 z3 o/ V, V DiskType( }, ]9 U3 L; ^# {" o1 r" n
);! ^9 w8 D7 Y9 r7 J2 ]9 {# c6 [
//register read or write blocks function
' H1 G. L0 y5 j+ Z2 w3 F% TBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
' [4 _' x G) I$ @( D! pBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;* v- |6 B7 e B- S0 Y8 }+ k
* v+ s! s. D5 r0 q$ `
//in the WinNtBlockIoReadBlocks,read file API' y0 p! A$ \6 T
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);9 ]0 H9 X: e' s
& F; f% |& A0 F; S1 I
问题如下:/ L O( @7 z3 E% g
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊1 N4 g6 |" ~$ m: _% k T
2 s# l% B& N0 f9 o' N$ Y2 M$ ]5 h! u
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|