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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
: w& p  V( E# S7 ]. ^/ _- x& y8 Z6 ^参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件! M% z9 K$ L* s! m% p1 L% M
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
' b+ o# S$ u3 H1 y% _$ H) _当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
8 P. @% X& A6 S- W// set disk type,Physical or Virtual disk? and get the name; _; m& n, L+ a  \3 z
if (DiskType == EfiWinNtVirtualDisks) {
9 S5 j1 R* A* M+ s9 b! {    WinNtIo->WinNtThunk->SPrintf (+ S( [2 V% \2 q. c. }$ j" f$ d3 O* J
                          Buffer,+ ~7 g; r, \7 u8 }  R
                          L"Diskfile%d",  i) `1 o3 O+ k3 c' X% m* _* t
                          WinNtIo->InstanceNumber
) s7 O4 T0 H; {( M- F7 A- Q                          );
/ B+ ^0 _9 ?" J# E+ `  } else {
. f1 m- |4 l7 g& ^5 d    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {" F/ C+ I, O' l) W5 p' a- o
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);1 o4 O! G& B+ i. ^0 i2 e  E6 g
    } else {
5 A' ]+ l* Y) z8 q      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
9 b3 L% L4 B  p    }
9 b* E9 X+ H4 s( Z2 D//create mapping
# V  M$ b" M- K. l. i$ E Status = WinNtBlockIoCreateMapping (
% `7 S. F5 O* q* J                    WinNtIo,
4 O( }8 g; Z% v) a                    Handle,
, E5 s; l, ~; s  b! L5 g* m                    Buffer,
& X, S. h# N. t8 D4 _# @( e                    WriteProtected,6 e/ K" s' S; e' y) ]- |
                    RemovableMedia,2 C) S; x6 B8 |& ]4 Y2 L1 Q
                    NumberOfBlocks,
8 R/ @- P8 j! [$ B5 Q                    BlockSize,3 ?9 X& o- k, u# t  U8 R- |& E
                    DiskType
! X3 d' Q' v$ F. }- P                    );/ ]0 K5 ]" i! l# a
//register read or write blocks function! K. n9 F% i" W
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
7 O* p3 g7 g6 }: ~$ z6 GBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;% \$ Q. h7 t) X# m+ L' c

) y% s# W' K/ |# {) h% V( Y) h+ x//in the WinNtBlockIoReadBlocks,read file API
' J, a/ P6 E5 T3 E9 W, }) q) e* lFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);3 O- Q- t8 n, ~! y7 y$ f2 V
9 u+ _4 R2 ~3 m' d! D# W# ?
问题如下:
3 E9 [; t* A; lEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊. J3 c/ z# k& N! B3 r
, E' y5 V4 j$ ^# E$ y: D1 f
[ 本帖最后由 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.  g+ L3 Z' V+ c1 X1 n- {
; Y0 q/ V6 m6 R9 W4 A. l. f5 k) ^- @1 ^
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 19:22 , Processed in 0.039171 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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