|
|
在EDK source中提供了对physical 和vitural disk的operation. Y/ i: [% v3 s+ I/ i) Z' V. C
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件3 t0 b; `8 N ?8 B- N3 x. o- J" r
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
5 A! I+ d# @% m+ W& G8 Y当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
! D5 ~! h0 Y7 M// set disk type,Physical or Virtual disk? and get the name4 d# Q: B4 K0 L4 m ?
if (DiskType == EfiWinNtVirtualDisks) {
* ^8 |1 n7 _9 S WinNtIo->WinNtThunk->SPrintf (& `& q- d7 h/ H$ O( Y2 m
Buffer,
9 x* o4 g2 ~+ O* O& R. N% y+ w L"Diskfile%d",
& X, s# ^9 u2 v' r9 r WinNtIo->InstanceNumber
2 Z. u# s8 G: ~ d0 g, i7 J );6 \, p) p: t/ u. j+ `1 C, F# M; F
} else {$ v* p1 ~9 O* d5 r5 h0 L7 i. ^
if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
' w0 Z& H* [/ E0 A WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);+ g: |) P8 V& N( |$ g! i; q! q# h3 B- P
} else {( W0 j+ \ a& ]$ [9 b1 Q; Z
WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);1 T$ }7 Q, J7 Y" S: s
}4 J( u/ d5 }( a$ @8 y/ \, i( N5 C; v
//create mapping 8 f* i6 B6 b5 G& X* o
Status = WinNtBlockIoCreateMapping (
' \) q& P; ~% W$ Z# m, ]. I9 ~! `, f WinNtIo,/ T) V* w9 Y, b
Handle,
! n/ s4 _0 P- Y$ H6 b. A$ B Buffer,
9 O' n7 g6 s+ k# n+ Q& g6 w WriteProtected,4 j( J5 y# p9 p y% e6 G4 g
RemovableMedia,
, D {% C1 P' P, B) \3 _. g NumberOfBlocks,
2 C! r0 d! i+ L, |5 F8 `0 T BlockSize,
: B9 y8 \; H ~# i* r$ K/ c0 r/ \ DiskType
R; t$ M3 q+ ]( N% E );: m# |# m0 ^& F: b9 Y9 l8 H! u
//register read or write blocks function2 O- y/ ]3 ?6 S& x+ P! [' k1 ^" b
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;5 e/ ~4 z0 U, o2 t/ j
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;) _0 ^8 }/ b# q4 Y( @
* y- r4 ~; u6 W! A0 P5 F8 H- V% I//in the WinNtBlockIoReadBlocks,read file API
2 B- n$ V" R% Q, a; z; R. u6 d% IFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: ^) d4 \: `; x2 J9 B% D4 |! F" {, U6 e4 A1 e9 f
问题如下:
& C# K- z7 C8 t: c# YEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
V; V. j$ p- @: K
, v H, r" p! Z6 P E[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ] |
|