|
|
在EDK source中提供了对physical 和vitural disk的operation% z8 M6 r- _8 m! D4 R0 B
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件5 [9 X! x) S4 g9 M) S2 F& I- u" o
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 W6 u, R9 A1 {7 T0 B; ^) O当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
" p8 J- _4 \+ U, O' p// set disk type,Physical or Virtual disk? and get the name& o3 Y j# e: \2 K2 c
if (DiskType == EfiWinNtVirtualDisks) {( g7 S! J) {3 J! O, U, X- x
WinNtIo->WinNtThunk->SPrintf (
6 Z; ~0 l4 }% e P" h! Z: \/ S0 @ Buffer,
/ M3 G7 C) o/ i( O) s$ w L"Diskfile%d",
% e @2 }3 z3 s' Q* {$ r WinNtIo->InstanceNumber
1 E# W+ z5 |6 T# {* q5 L6 K+ e );
3 _1 b0 J% N. Q: e' l. {+ f/ B! F } else {! z' d* y( s) p6 n) W8 c
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') { \6 a0 J. B @, _: D
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);3 F* c, l8 i$ h+ k* ~
} else {' R8 U: k8 q0 w$ R
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str); R9 I( i% N8 g# k! `! J7 L& z+ w
}- U" b5 E( R6 G7 B" S0 _. d' Z4 K
//create mapping
$ j! c( ]( f+ f Status = WinNtBlockIoCreateMapping (
) N: d0 G8 [/ s6 ^. l2 L8 [ WinNtIo,
, \' {# r! n7 E) b% ^! r Handle,
9 f y: ?: H4 u/ r T& }% C: { Buffer,
4 y: y3 P9 ^. F; ~! |* ?# }1 L& F WriteProtected," a1 Y/ \3 f) j, l
RemovableMedia,
- h* J0 i+ v# @. ` NumberOfBlocks,2 p2 K1 b) G3 U2 S! O+ _, I
BlockSize,
' Z" m, M7 p7 ^# @7 l& R DiskType- F! _' d* X+ v8 d
);5 _ w2 w, s% p2 | X5 W* J, w
//register read or write blocks function
8 L, y7 g4 I- l' D4 M5 v: IBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;) A8 ]* P2 z9 X1 H& V' o8 U
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
9 H ?% @+ a; c3 {) s
4 p9 E* @/ }' A% a) N2 G3 @//in the WinNtBlockIoReadBlocks,read file API
: t/ s5 ^% l- @" t! C5 AFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
1 c0 u9 D8 v% ]% S1 J" q* ^; U1 G2 x: d
问题如下:
. J$ w1 f" ~/ w q" n7 P! u, ZEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
K- _4 Y+ b& f9 [1 |, [3 t9 d/ v% e9 z7 Q9 X$ J6 r* i- r- J L Q4 w
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|