|
在EDK source中提供了对physical 和vitural disk的operation# @; }( v- @1 Z8 m2 g0 o
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
$ \1 X# ]! v1 [% h) o/ aset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512! M+ E2 @, E" E- j% d9 D
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
- ?! z8 B, \2 t! S) b a// set disk type,Physical or Virtual disk? and get the name
6 Z/ w+ h( z) Hif (DiskType == EfiWinNtVirtualDisks) {
" H3 P0 e( w2 }2 m, `; I WinNtIo->WinNtThunk->SPrintf (1 X/ }# }5 x$ `8 s" c5 S) R' k
Buffer,: D1 n) G6 u* r0 R2 k4 w
L"Diskfile%d",* ]9 T ^8 _7 I! B& |
WinNtIo->InstanceNumber
* r; X6 B2 K, N7 p );
; \& ~; o: A5 r5 o } else {
( u( ?& t& L2 u if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
4 |. J/ r. Z& H% r/ P& H( r WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str); K' B& C$ N- x1 \
} else {
2 y! y. m8 B- w4 ? Z WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
. R* d7 {0 e: ~( T; {& r2 i }3 U7 V* y$ A- e! k
//create mapping . {9 {9 d+ H+ Q+ e- G+ T' |6 Q. d$ c
Status = WinNtBlockIoCreateMapping (
- v! S% D+ _* p+ x, J7 [9 ?0 Y2 G" b WinNtIo,3 L5 Y% s" Y, @7 [; ?8 N
Handle,9 W1 H6 s4 P% `) { B& t( l
Buffer,
# |' y ^ A6 d6 E WriteProtected,9 ]) ?9 C( g/ G+ J( A+ O
RemovableMedia,
$ W- L7 u: [0 A5 F2 ^+ k$ k NumberOfBlocks,: D+ m& G; [2 K2 t1 k
BlockSize,
: k* b' m7 _1 O7 b. `: P, ]0 ] DiskType
$ c' i- Z: R/ T \3 S/ G3 @ );
4 W8 c, i2 A) u+ M7 y//register read or write blocks function) U7 H& p$ G5 ]4 z. i( ~, ` ?& `/ z
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;5 `: ]5 r" {6 A/ v0 X. |( Q
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
( @' k% b. w; g
! k/ n: Q4 N P7 q' X//in the WinNtBlockIoReadBlocks,read file API
0 f3 Q( k9 s) c8 P1 t$ K' RFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
3 B; R1 [ j# x5 a' Y1 b/ T7 c5 u$ Z7 \$ B8 m4 R# q
问题如下:
m1 [5 D; c& c. U' g& ZEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
! d9 r* h, v- b. m2 y. a' m/ P! G* |; t# \$ \+ d
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|