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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
8 b0 J3 v) Z5 A2 h  e参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件% W, U: n/ I# v7 y1 g
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512" C7 }8 @2 U& f- ^* c, R/ z
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
' U% `! y6 Z; s: [) b0 T' z// set disk type,Physical or Virtual disk? and get the name
4 B% v3 t6 m, jif (DiskType == EfiWinNtVirtualDisks) {' B  Z/ e) ~0 @5 G
    WinNtIo->WinNtThunk->SPrintf (6 r2 X7 v3 n8 M/ Q* g
                          Buffer,0 c4 v- T9 T( h: J$ J% T2 f) F+ N
                          L"Diskfile%d",
) ^3 z4 s0 `- l% K# f. G                          WinNtIo->InstanceNumber
: e8 ~, `4 p. e+ p5 `' ~                          );3 S7 |  }' _3 L, K1 V2 D" u- {* k  p
  } else {: c  j  e' N. F, z1 H0 Q
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {0 C* U9 J7 Y( c
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
1 A! l3 ~1 Q# U% `1 C- A3 ]    } else {
' K! ], Y0 D' {$ b- V( X      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
. b* d; {0 k8 j) _7 S: h    }
$ l9 K& ^; {+ r7 q# }+ O* Y$ I//create mapping
, _  a3 f. {' I! h Status = WinNtBlockIoCreateMapping (# T, T' i) _* }1 e9 M
                    WinNtIo,: z" h* |/ j  o& _6 q0 P
                    Handle,% l4 O3 y% E/ q) m7 K  Q
                    Buffer,
7 I* x! p- m# v2 p( j7 w                    WriteProtected,# Y$ n4 @' s- @
                    RemovableMedia,
- E* {( t6 P  |1 r. m) s                    NumberOfBlocks,
+ o0 [4 L4 b- i$ s( g% Y7 V3 `" u                    BlockSize,4 ]1 W% a! s5 a6 \
                    DiskType) O  ]9 ?7 J1 Z7 s" h- M
                    );7 I: N2 q2 r& K) X0 O; o: O
//register read or write blocks function
" A) F* `$ }' A, I% f# h7 eBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
6 h, a* g  m4 l$ D  A: J! u# }BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;# e# O4 O. Y# i3 S3 h# T5 s' g
/ ^6 Q8 a* T$ z+ N# W. X% I" w3 P
//in the WinNtBlockIoReadBlocks,read file API# K  _& d/ b: y3 m
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);8 c- K* w) ~$ F1 D

! Z" Y; D  T% E( W" @5 p8 L. O8 S问题如下:9 \7 ~+ q" Z% _3 B" z
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊* w  p( x+ k1 V; S4 M5 w9 b& t! s

4 k/ M& G. K7 x- y[ 本帖最后由 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.
# N5 Y% M% O. h3 K7 m9 @) B2 x4 ~6 x( x6 E* ?/ L+ e5 f" I# x2 ?, k
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:21 , Processed in 3.942497 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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