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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
) [% m. {) j. }4 z2 |/ d参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件8 E/ V3 ^. J2 s$ k
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 E4 Y! n: v  B2 @$ W9 _当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:. |5 t1 i& E8 x4 @
// set disk type,Physical or Virtual disk? and get the name
- u2 ^( e+ T" T) Y' Z. c0 Lif (DiskType == EfiWinNtVirtualDisks) {/ L# ]9 U1 \) x2 J* M
    WinNtIo->WinNtThunk->SPrintf (
* H" L2 `: r$ Y- q. S                          Buffer,
; Z2 W$ v/ j  u* N                          L"Diskfile%d",2 X& |, Q& a) _( D
                          WinNtIo->InstanceNumber6 Y& P/ u) A1 o/ G4 |
                          );
% y" ]9 ~5 S- l( a  } else {0 c. D' l4 p3 L! f' P0 W- q
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
3 Y+ ]3 f: D8 `! [      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);( @8 T1 C6 m! u" p+ G
    } else {& e4 t- z  Q5 `& \, n" `6 N  w
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);. R  x3 a. H0 F+ o% S! d0 |, u
    }7 m/ d- x1 ^: A+ C: r
//create mapping
: x* L8 i- {% Q, U& \) w Status = WinNtBlockIoCreateMapping (
9 @- j; \" I. w3 s                    WinNtIo,) a8 i1 M6 `$ }- z1 L# Z  ]3 t
                    Handle,5 y( E+ K/ ]3 z, W- n! S0 }5 b
                    Buffer,
  C+ D- k1 j  P: s) n                    WriteProtected,# f* |* C/ n2 y1 ]' B! j2 j0 W
                    RemovableMedia,2 Y; ^7 Z) J0 V% p$ q4 L8 L+ h
                    NumberOfBlocks,
: Y$ W- U7 m, A                    BlockSize,3 }/ |( N% l1 Y2 P
                    DiskType
% a4 B( E$ B7 |( Z. X                    );  i. |+ s( f  ~. _- X
//register read or write blocks function
+ P: p: k/ J: {4 @! y  I! CBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;7 }' K8 f# M& i3 x2 x
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;- F4 N+ `& u( z; O
1 R) w: D3 m4 T0 l4 n/ y8 L
//in the WinNtBlockIoReadBlocks,read file API0 p1 m; a" M) K2 ^' \
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
$ }, i; U, H% {, u3 f, _
) r, n8 c; a) \: f* H% L问题如下:
* O$ A  `& s. \EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
: g5 ^1 r9 W# o4 d* f; K- G9 P0 v& G! u: A. H4 f: U7 @* W0 X4 F* O
[ 本帖最后由 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.+ x# |6 @6 M2 S3 ~7 B, [$ A# N
- M: y$ C  E2 s7 ^
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 16:19 , Processed in 0.043986 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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