|
在EDK source中提供了对physical 和vitural disk的operation
: Y4 T' p- i9 L" o D" r( D( @参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件2 g/ ^. U6 @# X5 f/ a* B5 k
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5124 w! Q3 s' K+ C' u& I
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) S1 W5 k0 A s3 E3 L+ C$ h
// set disk type,Physical or Virtual disk? and get the name1 V4 Z3 N( d% C: {: b+ B/ h
if (DiskType == EfiWinNtVirtualDisks) {
: M8 b! \# x6 A5 N) N WinNtIo->WinNtThunk->SPrintf (7 u8 O) d2 B9 C8 i) u
Buffer,/ W! K$ J4 ?/ {- n7 ^; @
L"Diskfile%d",* h( ?- X- P* o6 @/ {
WinNtIo->InstanceNumber3 S: ^8 A! R, I
);
6 p" _6 B7 t3 N } else {
& F1 {# B! T5 P( A if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
. H* j0 T8 v6 x! e% M% K a' ]0 ~ WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
, M& O) z1 U' I G6 S! x( L } else {# ?2 [3 c' B6 D# ^
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);; ?, _/ g* J- u) O2 n
}
+ S( {- ?, N( E' X3 L7 U//create mapping
; I; X+ a$ Z& K Status = WinNtBlockIoCreateMapping (' n7 i8 I; b+ W$ ]
WinNtIo,8 I8 d/ K( y1 f' V
Handle,
) g+ E* G) E- i Buffer,' P: {) b1 P! H( G
WriteProtected,/ Z/ ]0 z2 K. _2 B) r
RemovableMedia,
7 l/ ?+ d9 M) R; W* r NumberOfBlocks,0 |4 D; m7 D5 E; |$ ~3 n) ^
BlockSize,
: `2 v. ^* ^, l. ^6 u- o2 G DiskType5 t N8 W4 `+ u5 i6 G
);
" @0 \0 s- h! h8 B//register read or write blocks function
$ E$ m4 b! n, ?6 L6 M1 P9 a: G, DBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
! }0 Z7 F( N/ J( p% b( YBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;6 C1 {2 T }- }7 c
/ K4 x7 I L6 J& I# z. n0 j//in the WinNtBlockIoReadBlocks,read file API! ~7 ~3 b' p/ u. X# r/ ^
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);+ F5 M8 O5 C5 }8 Y+ C! k
; O( O- j* H: B& b/ y. g4 ^$ B问题如下:
- m3 A$ x2 k, d5 t, ZEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊: e: J* n7 n$ F9 c2 p% H9 V
# h# j9 z5 G3 [5 e% o[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|