|
在EDK source中提供了对physical 和vitural disk的operation% B! M5 k7 p; g/ f) ?, b
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
% F# h- b+ H4 ?/ E5 D0 y! ~9 nset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5122 u. L- ]$ D' n% I
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
- b* k b0 S9 R7 Q: c. K8 @2 {: h// set disk type,Physical or Virtual disk? and get the name; z8 J0 _4 p) D a
if (DiskType == EfiWinNtVirtualDisks) {. `- A; K8 S! T4 D/ [
WinNtIo->WinNtThunk->SPrintf (; f: k0 n! x# X# R _- ~
Buffer,( O! T7 t, w# W6 h2 W6 j
L"Diskfile%d",
# n+ J" J5 ]0 ] r) h x5 i0 P WinNtIo->InstanceNumber% Q7 N+ M2 i1 c$ t
);9 B, b9 E8 Q3 p
} else {
7 U4 c2 Z* m2 U/ F" ? if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
/ a6 ^5 [/ s/ X" F, _ WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);3 O( }2 T2 o. w8 k( |
} else {8 |8 S& t7 Y7 B o, F
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);! z; z! r4 A; z0 s8 d% e
}
, T' c2 w1 V8 f7 a. b) F//create mapping 3 N, g" S* _# i. L- }
Status = WinNtBlockIoCreateMapping (" @) I! B$ j3 U0 z9 r4 |
WinNtIo,2 e+ N1 @ ]- g B
Handle,
$ S. {9 y2 d; C& e7 A1 a Buffer,
- C/ [; s; Y5 A; m! }% @ WriteProtected,0 X: `% M% _, P s- P+ s
RemovableMedia,; g# h* k7 g" M8 E6 K0 f' _
NumberOfBlocks,
; P( k9 _4 x2 b: n5 \0 N4 s2 W. U9 X; l BlockSize,7 w: G& h* P) N& h8 n
DiskType
, n( E! o& G- D' r8 X/ ? );
) z9 V+ [* }# [( L, e$ w* ?//register read or write blocks function
3 @& a" ] d+ ?$ OBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;, f7 V) r ~# Z+ ^4 F+ H
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;! h3 ^, a# Y# e1 z- `$ D
9 v$ x7 a4 Z7 P% R8 ^4 j: Q
//in the WinNtBlockIoReadBlocks,read file API
, `/ K. @; A2 l6 q+ `6 e, a+ U( @Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
8 d _3 d; c5 {6 E; U
) |8 |& }0 t6 O问题如下:
% I; W+ q- J) I J1 Z! n# j. XEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
3 }( I3 a4 [5 n' B
5 F3 T5 |) Q0 T4 M& ][ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|