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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
! F7 b2 n8 T8 z& i7 I2 _" `参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
  x' ~- T/ P# e4 {/ }set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 q) [% q( Z9 v$ b; d* C  x3 ]' W当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
  d( p& c  a$ J4 j* L, E+ w0 r// set disk type,Physical or Virtual disk? and get the name
( H6 |* @9 m% Y+ V) Yif (DiskType == EfiWinNtVirtualDisks) {
. K/ l1 w1 l2 _9 Y    WinNtIo->WinNtThunk->SPrintf (
6 j, k) `3 c6 I9 z( l3 q- i8 n                          Buffer,
# E# [+ J8 J. ^2 i* j1 C  [                          L"Diskfile%d",
8 U& \8 q0 V; T1 n& g5 L8 }  K                          WinNtIo->InstanceNumber
* w4 ^# Y& w, u4 k- p/ p) Z                          );
6 h$ _1 o( R/ r. T  } else {* e4 k- n* q/ h+ v- }% J! d
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
5 u% I1 r8 c, O. E) w/ l, f$ w      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
) ^2 E8 K% \# J. U    } else {3 r% ~6 g' v3 v1 N; [6 q
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);& G0 G# v# m; C5 G4 z& B, b
    }
! `& `5 d" I1 L2 u- `: x//create mapping
; J0 ?& m8 S! P' R+ Q0 G0 j- a3 S& \ Status = WinNtBlockIoCreateMapping (: R& N5 e  r8 I# Z7 J% C4 q( O
                    WinNtIo,: U  L+ W8 {( d0 K0 }, L
                    Handle,$ ]9 A1 _# `3 u
                    Buffer,4 ?0 ^- r$ c- E4 S
                    WriteProtected,, j4 C* r: L& |! y# Y( c* y
                    RemovableMedia,
( j0 ^5 v* r# m, X9 [; |+ M                    NumberOfBlocks,9 ^$ R: `( y4 v8 z
                    BlockSize,5 w8 F8 c; z5 X# D; U  \
                    DiskType' f- Z$ U- [& }
                    );9 V. k* v; J/ F( z; y! r0 V
//register read or write blocks function) v( U' G- e3 m2 {( _' d# y4 r
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;  _# o$ Z. D; E, E4 R( w
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
) m5 e4 r+ |" l0 \5 Y0 X6 [; g" p6 @% }* f- `1 ]
//in the WinNtBlockIoReadBlocks,read file API( a) X4 ?  r2 Q7 T
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);8 U" Y' b0 l) Y- _0 f& [
3 S% v$ W" b- Z0 F! ~' o
问题如下:
% @; P. Z1 W. f+ F7 m( HEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
: C# y( \' s. t6 }* B1 p6 M* }& v& v5 }7 ]
[ 本帖最后由 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.3 F- ?( B) ]: B: \5 J& ?
# h% b9 W' g  F/ L
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 08:26 , Processed in 0.189798 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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