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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
0 \9 ^, g) r# d7 C$ L4 }参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
. V- d7 L* R: w' P4 \, b! f* }9 zset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5125 V- {2 A: S$ j
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) C& w* f- }+ q# B* P
// set disk type,Physical or Virtual disk? and get the name
8 b' s1 L# j+ y; D: w, |if (DiskType == EfiWinNtVirtualDisks) {
( _+ y+ m: y9 R    WinNtIo->WinNtThunk->SPrintf (- W  |* L+ f' L. U. d, S0 r
                          Buffer,
4 d: F" z* y$ Z                          L"Diskfile%d",
, |& D! g8 L; M, c8 k7 G                          WinNtIo->InstanceNumber
: J$ ~" n# {0 Z$ I* ~                          );
% w' p" p' l/ Z) k/ `5 q: V  } else {
' w7 I: b9 G9 e+ p- v* o6 ?7 q    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {! t3 D2 `6 m) Q- R2 i2 Z
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
/ h- `/ h  Q4 P2 @% M    } else {8 V% d9 M0 J. t2 U% w
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
) P) j: |% \0 q9 Q. Z" m  q    }, o3 \# D' h, y! P: _. I
//create mapping
8 G. B: G$ X9 Y: u Status = WinNtBlockIoCreateMapping (  U; ~% {, R% u& L
                    WinNtIo,
* v2 o* O6 u$ ^                    Handle,- S4 K2 C6 c6 t1 Q
                    Buffer,
( V* i- L% @6 E$ K                    WriteProtected,# w# z7 x2 u, H5 ]: `
                    RemovableMedia,7 Q3 z5 v" \. I7 H: E
                    NumberOfBlocks,; r4 q( a* n: ^) _
                    BlockSize,
& e% u4 z3 o/ V, V                    DiskType( }, ]9 U3 L; ^# {" o1 r" n
                    );! ^9 w8 D7 Y9 r7 J2 ]9 {# c6 [
//register read or write blocks function
' H1 G. L0 y5 j+ Z2 w3 F% TBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
' [4 _' x  G) I$ @( D! pBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;* v- |6 B7 e  B- S0 Y8 }+ k
* v+ s! s. D5 r0 q$ `
//in the WinNtBlockIoReadBlocks,read file API' y0 p! A$ \6 T
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);9 ]0 H9 X: e' s
& F; f% |& A0 F; S1 I
问题如下:/ L  O( @7 z3 E% g
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊1 N4 g6 |" ~$ m: _% k  T
2 s# l% B& N0 f9 o' N$ Y2 M$ ]5 h! u
[ 本帖最后由 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.
5 [' G' B9 T* ]  ]4 g( ]$ \; z" j0 U* @
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 16:17 , Processed in 0.020057 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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