|
|
在EDK source中提供了对physical 和vitural disk的operation3 L8 ?% U, x4 \/ R: l4 F! o
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件* w- C& X9 E/ H- t3 O
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
8 e8 I' E% E! Q% @当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:3 y8 W0 e: G. p/ }( i, ~7 A! J
// set disk type,Physical or Virtual disk? and get the name
7 }$ u# T6 {6 o/ K5 F+ A- t" Lif (DiskType == EfiWinNtVirtualDisks) {
% c. F0 {: P7 x9 U6 Q9 H. B& S$ i" X WinNtIo->WinNtThunk->SPrintf (% a9 b5 i: i1 H0 r3 \# J
Buffer,& K+ O% c. W+ |" A" H. Q9 e
L"Diskfile%d",$ y+ \9 a" _3 t5 |! H
WinNtIo->InstanceNumber% M1 c3 G3 }: s% H" H J/ M i
);
' |0 ^+ Y& O/ {- Z& e7 e4 L) W3 n1 V } else {
8 K* g8 Y( z" I! g; Q if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
& Q% w4 k x( Y- r7 @- ]2 } WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);( P" v$ t! e! Z {8 W" y
} else {7 j* o7 A' u/ E# g2 r
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
) F# g1 L4 f. n# @3 z7 G- _( B* H3 z }% M. S" k: Z9 `0 n a
//create mapping ; u3 z3 a+ \; n: k8 e* n8 v8 @- @
Status = WinNtBlockIoCreateMapping (3 |1 r/ f* L8 v1 }0 h5 B
WinNtIo,/ J! Z2 R" L9 A. k* z* Z
Handle,: v: O. M& r- S- b- W+ x
Buffer,
( y% N& z5 R/ ~8 k) `1 `7 y" w( U) Q WriteProtected,
4 `5 L, o$ l* J4 q# J1 L$ ^ B0 U3 I RemovableMedia," d8 W& p2 B. j: F* I) P
NumberOfBlocks,& {$ K7 _8 X; x2 F% n
BlockSize,
C2 ? B5 b$ b4 T6 h DiskType
( @- l# C9 N2 Y, D" N# K; o! v );
0 b+ q) Y# S1 ~! i o b//register read or write blocks function+ v& a( w- O2 R1 {
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;( D/ j) n e! E8 _
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
6 R9 S+ [# m9 Y) ]( B9 Q# T" U: ?7 @& U
//in the WinNtBlockIoReadBlocks,read file API% C% ^' X3 J, p4 n# g+ Z. I
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
& G1 [2 Z4 {: M% @1 d' y5 R5 H- L# N) O, b7 K
问题如下:
* f- X8 B0 n% K9 `( M/ Y3 bEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊 c$ T0 h, z g1 e! P' v4 V9 P; S
0 Z! A2 P8 B! N+ {$ {! u; \. I
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|