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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation2 _; |2 `; m7 C. q2 K  E4 A6 O
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件4 d6 S/ |/ b. ^9 }, d
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
1 [6 f" j4 K3 ?4 b8 S当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
9 ^! ^* Y! h* Y0 T( f+ z/ e$ r) ]// set disk type,Physical or Virtual disk? and get the name1 u6 b4 s6 n; Q: j1 k% {4 q
if (DiskType == EfiWinNtVirtualDisks) {
8 l# `5 Y- F5 `* A7 H5 _! m    WinNtIo->WinNtThunk->SPrintf (
3 ~& z* L0 [) G+ B0 J1 l+ Y                          Buffer,9 }; r# H( a4 R& I4 s8 u7 n' f
                          L"Diskfile%d",
# ]( c! E3 D5 u6 ?: M8 Q# f8 V# `                          WinNtIo->InstanceNumber
3 t( c" ~3 G6 n7 ?5 p; M$ }! ~. @                          );' J9 N1 X4 }+ }
  } else {, S. W( q  k. ]4 F6 q
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
4 V6 `% h- ~! T6 }( D2 u      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
* {/ a9 `! O0 S* i    } else {. z5 }& }3 M/ l
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
4 K6 r4 E9 u4 m9 z$ D. h    }- b! [6 H$ R  c: L( T
//create mapping
& e' C7 Q: z, C" w/ X- E$ z Status = WinNtBlockIoCreateMapping (- @7 ?1 E, a4 k
                    WinNtIo,
1 Z0 O4 Z. U6 I! s" w& O+ @                    Handle,
4 l; {. L7 }5 E6 |: g7 t                    Buffer,
, g" t9 B4 L/ i' b, N8 m* G% n! B                    WriteProtected,
* I6 @5 Y0 `/ y! b) `; n& x                    RemovableMedia,
3 ]6 u2 o' d. _; i% X- N1 J7 u+ O                    NumberOfBlocks," u& V- h: q8 T( u% D) s, u
                    BlockSize,( ^' n4 q! @% [% [+ _1 ~+ K* ]$ z
                    DiskType
, W; }% u$ L9 N6 N                    );
% S  ]% Q. [0 g# X; f% F1 o//register read or write blocks function
% G3 ?+ m' G+ t* D1 MBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;; g# z+ f7 W( R9 Y; l2 U! K
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
- ~0 f# Q" N( q
3 E+ k7 U1 \6 I9 Q//in the WinNtBlockIoReadBlocks,read file API" n1 e' V: t  C6 z5 s
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);. z# ~4 A6 A# x1 e  Z
1 n  ~/ E/ |0 w. l- M9 v8 K0 C
问题如下:
9 n( g2 T' R. V! ?EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊. g" E0 x2 S/ z; ?6 I5 D8 c

0 e+ h' l# W/ @/ g, C( `& b( `2 \/ e8 m[ 本帖最后由 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.
4 M9 P; p3 ~( x- K- w8 c4 b1 L4 d# M. V, o6 G$ V
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:09 , Processed in 0.047171 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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