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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation" k. ?$ `7 O6 B2 [) h& @
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件0 m  z# o* Y. w1 h/ Y' Z& `6 k
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
' F) ]3 u3 G, L7 ]当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:2 a. o1 `* ^9 M
// set disk type,Physical or Virtual disk? and get the name
/ A# T  E7 ^. e: Nif (DiskType == EfiWinNtVirtualDisks) {. }, ^% G9 s( [4 Z3 l8 @; f7 o
    WinNtIo->WinNtThunk->SPrintf (3 w' ]' C( K: S/ q+ c/ W% u! Q
                          Buffer,
+ b: g2 m7 l0 ~' l                          L"Diskfile%d",
1 y# m/ A1 w" j                          WinNtIo->InstanceNumber) N& Q$ s; ~+ I9 f
                          );2 u# ]. @$ ^+ g+ P* s" @$ l
  } else {
& g+ P' D5 |" O( L    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
& i  U5 u  \7 {4 W+ [      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
0 P/ B7 v. ?' j+ B; A# {    } else {/ j9 c* I, h6 [5 B0 ?
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
% w5 k( S* X1 X" D. R9 g    }
6 S( [) N7 @9 H, U5 W4 C! G1 n, b: K//create mapping 9 ~4 q) S2 Q. Q( v
Status = WinNtBlockIoCreateMapping (
3 f8 X6 z& U2 r: o                    WinNtIo,& g: G1 I+ A0 s5 e$ Y8 R: W4 X
                    Handle,
, w- r. M: x6 d% ?$ I# ]1 I7 f                    Buffer,! w1 Y7 T. B  u3 d# t3 `  N
                    WriteProtected,
4 S- r  U" e  y  }7 a                    RemovableMedia,; K7 f0 ]: m0 S! H" P2 e; F# [
                    NumberOfBlocks,% {) g3 @( {. k  j
                    BlockSize,
/ V- m$ }" x  H: h5 s                    DiskType( ]2 r+ U  s( g; ~9 N  e
                    );( G: s0 r4 x2 O3 R  r0 @: q
//register read or write blocks function* h7 |2 ?" b( A
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
. j& Q* v& I# n% `6 IBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
8 c! w4 E3 U8 s4 ]; b7 Y
1 ^  }/ x( i, A9 v0 n1 C1 V" f8 L//in the WinNtBlockIoReadBlocks,read file API1 J9 N+ J. {& l( a" f3 N
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);4 V$ u' o) f/ x$ X- S1 X1 j9 i

" X' d, u3 z6 T问题如下:
. `5 |- i* [# q# |/ BEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊5 `4 A3 @6 ]) F

1 B8 @: a; J: x5 B5 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.9 o, c" W/ j7 _5 s

3 }9 f6 X$ a) b0 |参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 05:36 , Processed in 0.055910 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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