|
|
在EDK source中提供了对physical 和vitural disk的operation
/ D/ Z4 j: F( M# D参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
) O+ d' d6 i, y+ a- _4 |4 uset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512- c6 i1 N4 J6 i1 o7 a- R
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:2 L) o1 I/ k* _
// set disk type,Physical or Virtual disk? and get the name. w7 h" F' K8 M4 a0 l
if (DiskType == EfiWinNtVirtualDisks) {! i2 L6 k% y; P" i) b- m
WinNtIo->WinNtThunk->SPrintf (; |" ^( z2 L' }! g) V, r/ H
Buffer,
2 f9 N( Q3 ]" O/ [. O+ S7 [; h4 z L"Diskfile%d",$ A7 y' m O- C; T; o: k
WinNtIo->InstanceNumber
- b% j% x+ J5 ] [ );* r; Y) q% e8 |, K" _7 ~
} else {
% @( l7 D* z5 D if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {5 n1 `+ \! N& C
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str); x5 P/ a- X8 K, |# f% ?; r# h. r
} else {
, g n$ |5 C0 M) G3 ~- L h! T WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);/ h0 k9 A8 }! t9 Z/ L& I: \; u' m
}
5 S' L. J K6 i9 u8 R3 g- C; ?" r//create mapping : v9 ]' S/ v$ ?' w
Status = WinNtBlockIoCreateMapping (5 @& m6 C! ~' `. E9 F
WinNtIo,* z, |+ X! Q/ _1 z
Handle,
- k) v7 V5 u! F7 y Buffer,
0 R2 Y# d5 ^8 X# W+ [' J- l; ~1 C WriteProtected,
0 K& f: d) d. e$ v: T w9 U RemovableMedia,
9 x" s4 B: Q( r" F NumberOfBlocks,
( F8 x( O( k. ^% _' X9 l" M* | BlockSize,
; m- n; P4 u1 N8 s* W DiskType
0 [0 q0 X0 j2 R' u );5 p. f/ D) E3 @+ K% P5 ~, B
//register read or write blocks function
4 Y. U' t( W* d1 k5 L: U' VBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
7 F( Y+ N: x% S0 i' hBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
" |( C! L/ a' t- B
' v4 Q, E' z% B* E$ F. X: M//in the WinNtBlockIoReadBlocks,read file API5 W- r. \: B) ^' q F$ t
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
7 Y! O4 f) y) y/ F/ Q( I/ I( k9 p( |! i; E5 T2 Z( C/ d
问题如下:
! Q/ y- b. z; i) wEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊/ s# _1 P m3 t8 _9 r
5 e6 V+ _- |4 Y0 \+ L- K[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|