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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation" v& I. P8 r' X1 ~: a/ i
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
4 Z  D" s& d$ F  d' rset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
: A( w4 j, w1 f- y& u当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
4 M0 C9 j& O. G( |  M4 r4 M// set disk type,Physical or Virtual disk? and get the name6 r/ r9 P# v! p7 ?# i
if (DiskType == EfiWinNtVirtualDisks) {
7 p% s& P2 o! b( K9 b- z    WinNtIo->WinNtThunk->SPrintf (
0 U8 [0 ?- f* j                          Buffer,
  I7 t2 k6 u% A/ D                          L"Diskfile%d",
% ]2 f! J1 E  j2 |) f, U: ?                          WinNtIo->InstanceNumber
" R' B$ ?' O1 m3 Z4 ^                          );4 I. [4 n( j$ s7 ?- W1 d' r
  } else {/ o4 B" g3 `; ~8 C" M0 Z! l
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {5 j; G5 h( [3 g5 e& b
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
9 `# W- L! U) s( p( I' s( M    } else {9 l) d- s7 r; [2 U7 [) A+ `) T
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);8 F  U4 a1 s' c
    }
- Q: e$ z# C, d% _% ?1 D//create mapping
7 J  }. G3 `$ F: L6 k- L) i Status = WinNtBlockIoCreateMapping (5 o0 b7 X+ `" W  u. j
                    WinNtIo,6 B+ n! y) G: F7 _; _$ G# w! }$ c7 O
                    Handle,. |9 z( \: @  c  X; ~
                    Buffer,
6 ^( J) }7 e) n                    WriteProtected,
& n( Q/ @+ m. q9 B' j( B5 |4 g+ d                    RemovableMedia,
2 |( |7 s/ Q( ]8 T  `                    NumberOfBlocks,
9 E" \6 q- C: {$ W                    BlockSize,2 P) a5 H) ^: A
                    DiskType
, o/ f- U+ k- N3 K* `( L                    );9 _: A' S" O5 b
//register read or write blocks function
% v/ b8 w" G' G$ U& PBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
( z5 c2 z" X9 h. l! r9 ~BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
) y3 Z/ ?5 {3 F0 W6 X, q+ z( V- k& ?0 q6 X. @' I" C, Z* o! b6 Q- t( J! l
//in the WinNtBlockIoReadBlocks,read file API3 u7 I& ~! a7 u8 _' n% O; i. T! w
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);! }- }% G. h/ j" [' {9 k4 V4 n; U

7 ^# s3 x, A6 v5 \问题如下:1 |3 s) r1 ?4 \+ j, Q8 Z: T
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊0 Q) g' ^  D2 v3 ]0 `* e3 [
7 T8 _# Z( Z' M) T
[ 本帖最后由 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.# Z. }( U8 t# i2 [# o6 [4 V, _( i; U

/ i0 m) y- l; a5 j8 q参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 17:41 , Processed in 2.119950 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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