找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 8881|回复: 1

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation2 @  ]9 ]3 q/ W% {
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
; |5 c5 f. @) z) R' Lset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
# B) N4 c8 f# A. G! j1 a  D当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
8 l/ T6 i' L; O5 b// set disk type,Physical or Virtual disk? and get the name
) z/ N6 [! w: Mif (DiskType == EfiWinNtVirtualDisks) {, T! X, _) o, p0 }
    WinNtIo->WinNtThunk->SPrintf (1 H6 H4 ^( |9 b7 Z. s
                          Buffer,
4 j* a8 O- j: \+ [0 Q* X7 E! ?                          L"Diskfile%d",
& m3 Y* a% h. n  _3 [                          WinNtIo->InstanceNumber2 J6 K7 K& L# ]& s8 J) R4 d
                          );, c7 z* d" e" B! `9 p: @6 \5 [
  } else {
. [+ a0 q7 [4 I7 f- \    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
* @4 g* w/ ?+ Z# u: p      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);3 A" H; ^) |2 F  \8 T
    } else {
# B3 q& q  x- r: r      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
0 G! S; v% K& v' y' b  u2 R' n    }$ x- p8 _9 S: u- I, i
//create mapping
2 \6 Z5 J4 ?/ [( j6 f2 f- _ Status = WinNtBlockIoCreateMapping (
! Z. e/ Y/ b% i4 z1 y                    WinNtIo,
* r* b' H( ?4 f- @                    Handle,
. |5 f+ s& A3 @  Z: r                    Buffer,. J. H1 K1 T& H7 w
                    WriteProtected,  w0 C7 I" r  P) k; p1 @
                    RemovableMedia,
& x0 @* `& O1 G7 ?                    NumberOfBlocks,: |5 y' a* E- t5 o2 M% l  e
                    BlockSize,7 N' p8 }5 q' y8 |: h$ J1 K) j7 f
                    DiskType! [  H" m' R; q% I3 F* K
                    );4 o7 b5 v# r! `9 r5 X% B
//register read or write blocks function- H! \  E" G4 b5 c: O
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
# o4 c6 q/ [* \3 t4 IBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
0 J+ S: D% ~8 A6 X
. c- K1 J* \% X) [0 a% \//in the WinNtBlockIoReadBlocks,read file API
+ x! [. v. `! F/ dFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
! o4 \; o# q5 D  J, Q) h4 k0 c5 q4 f5 G( ^9 T) a8 w; o7 p, \4 l
问题如下:) L) e0 C/ x7 I5 ?2 J+ d% e
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊4 ?2 I* n9 ^2 k, S
2 z, w  T/ ~, f" Q: P5 [$ C
[ 本帖最后由 libeili 于 2009-3-23 18:01 编辑 ]
发表于 2009-3-24 16:52:44 | 显示全部楼层
没有物理disk controller handle,Win NT bus driver为所有virtual NT thunk device创建device handle.
8 C) E- C* V3 c1 }' {. D- a$ x/ I* W! y
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-11-3 23:13 , Processed in 0.200686 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表