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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation% z8 M6 r- _8 m! D4 R0 B
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件5 [9 X! x) S4 g9 M) S2 F& I- u" o
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 W6 u, R9 A1 {7 T0 B; ^) O当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
" p8 J- _4 \+ U, O' p// set disk type,Physical or Virtual disk? and get the name& o3 Y  j# e: \2 K2 c
if (DiskType == EfiWinNtVirtualDisks) {( g7 S! J) {3 J! O, U, X- x
    WinNtIo->WinNtThunk->SPrintf (
6 Z; ~0 l4 }% e  P" h! Z: \/ S0 @                          Buffer,
/ M3 G7 C) o/ i( O) s$ w                          L"Diskfile%d",
% e  @2 }3 z3 s' Q* {$ r                          WinNtIo->InstanceNumber
1 E# W+ z5 |6 T# {* q5 L6 K+ e                          );
3 _1 b0 J% N. Q: e' l. {+ f/ B! F  } else {! z' d* y( s) p6 n) W8 c
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {  \6 a0 J. B  @, _: D
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);3 F* c, l8 i$ h+ k* ~
    } else {' R8 U: k8 q0 w$ R
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);  R9 I( i% N8 g# k! `! J7 L& z+ w
    }- U" b5 E( R6 G7 B" S0 _. d' Z4 K
//create mapping
$ j! c( ]( f+ f Status = WinNtBlockIoCreateMapping (
) N: d0 G8 [/ s6 ^. l2 L8 [                    WinNtIo,
, \' {# r! n7 E) b% ^! r                    Handle,
9 f  y: ?: H4 u/ r  T& }% C: {                    Buffer,
4 y: y3 P9 ^. F; ~! |* ?# }1 L& F                    WriteProtected," a1 Y/ \3 f) j, l
                    RemovableMedia,
- h* J0 i+ v# @. `                    NumberOfBlocks,2 p2 K1 b) G3 U2 S! O+ _, I
                    BlockSize,
' Z" m, M7 p7 ^# @7 l& R                    DiskType- F! _' d* X+ v8 d
                    );5 _  w2 w, s% p2 |  X5 W* J, w
//register read or write blocks function
8 L, y7 g4 I- l' D4 M5 v: IBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;) A8 ]* P2 z9 X1 H& V' o8 U
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
9 H  ?% @+ a; c3 {) s
4 p9 E* @/ }' A% a) N2 G3 @//in the WinNtBlockIoReadBlocks,read file API
: t/ s5 ^% l- @" t! C5 AFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
1 c0 u9 D8 v% ]% S1 J" q* ^; U1 G2 x: d
问题如下:
. J$ w1 f" ~/ w  q" n7 P! u, ZEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
  K- _4 Y+ b& f9 [1 |, [3 t9 d/ v% e9 z7 Q9 X$ J6 r* i- r- J  L  Q4 w
[ 本帖最后由 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.
( L* X, @: D/ i( n* I$ B; O
( j5 p# H. [$ I. _4 _$ p& N参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 06:47 , Processed in 0.661158 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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