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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation& w% ~  K7 w8 e- M) {6 l! f, s9 [, |
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件/ b1 ^% c) D4 \" m9 C7 K4 q
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
' ?; L$ M- \' L* C2 H6 {3 t+ j8 s0 u2 _当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) X$ ~! s3 J) j; I( o" l
// set disk type,Physical or Virtual disk? and get the name' f) ]) F: P3 w' l6 ]
if (DiskType == EfiWinNtVirtualDisks) {$ }$ l, C# @% D6 s
    WinNtIo->WinNtThunk->SPrintf (9 f1 k) L: H' }" H5 ^6 _
                          Buffer,! R5 h9 ^6 @* j; h8 |# }! Q3 ~
                          L"Diskfile%d",- R  J; j) [  e9 j& o
                          WinNtIo->InstanceNumber
% T2 ~* {7 h- k+ N. P- j  e1 P                          );
) C% U+ }/ B  o8 {. ]1 d- t  } else {' T# N7 C# S; G& o; C) {% X
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
! I, p! K3 A5 e8 |4 k2 H      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);& P* G# D0 g( n4 {& n7 ?# G- U2 |! P
    } else {5 ^8 I" c3 H) B2 s
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
5 Z' ?0 D% x- y2 G: z    }% V- h' C& n1 K
//create mapping
5 s+ G  O$ M$ ]7 I7 M1 M$ z% e Status = WinNtBlockIoCreateMapping (
$ }! E8 j: a8 m9 P: D                    WinNtIo,
2 w( U$ G' ~: G2 `# A. s                    Handle,1 T5 q. M/ V% X9 E  @
                    Buffer,
: X; `) X, ?+ G3 Q( ]- [# u8 T                    WriteProtected,, ]5 j8 i8 v( v! J1 p% C' H# c
                    RemovableMedia,
; T+ `  G. F' ^2 K0 Y" P                    NumberOfBlocks,! u# ^4 a3 |: }/ e9 C5 Q3 F$ b
                    BlockSize,2 [) r* Z1 f! F) I& P6 G9 y$ @
                    DiskType
: ?" ^3 w& L( E+ R' C9 r                    );
; X7 h$ a1 c4 c/ |% {( |  N//register read or write blocks function
' Q/ _5 w, ~3 P8 o  _* Y! JBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;! W( Q8 o' T0 G# {: g% w
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
0 @' S2 q  ^0 P  M* D  D+ r$ n6 G* V' j( j2 n, L- l9 W3 {
//in the WinNtBlockIoReadBlocks,read file API
! }0 z2 l+ ]) \# y0 g6 t- M' ^Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);9 N" S! Z% r# h0 S8 n
. U2 m# D, l  R: s. Y
问题如下:! l3 p$ x% ]4 a+ u- b
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
/ e  v$ L" R2 \- s( M! g) \2 I) U7 f7 r2 _8 s+ e/ `$ E
[ 本帖最后由 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.
% P8 e- l8 i8 P* p7 Y  L: v) O8 Z5 \  T8 Q1 J
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 22:15 , Processed in 0.054319 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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