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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation' b/ b7 @/ f) Z* N
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
& F$ T/ Y' J; |3 _: L* rset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
( y* I3 ?" k& d2 E当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:" R' k/ N8 Q" n: c5 A" z
// set disk type,Physical or Virtual disk? and get the name
6 u/ l/ C0 t4 n& `5 c: `if (DiskType == EfiWinNtVirtualDisks) {
4 ~8 }" i0 T9 ?- {5 w    WinNtIo->WinNtThunk->SPrintf (. W9 t: ]% j$ M; k2 @
                          Buffer,
9 _/ u8 V% w- Q4 Z                          L"Diskfile%d",9 ?+ |( }# B. _& O  v( c' a) _  d
                          WinNtIo->InstanceNumber' d9 v& I9 z1 {" R) R
                          );: F6 \' f, i- _
  } else {3 r) P- ~# T% `! [# Z+ e8 M0 Y
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
. F" m) P6 H3 N      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
4 R* j0 w8 t) R. d3 k5 g! P$ {    } else {
0 r# X6 P% G9 K: h' c      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);# x5 E: Y' L; o; t5 ], l
    }
0 M; @! Q) ?9 }: [+ @! X3 D//create mapping 6 {0 Z; k  J7 J" k  a: `1 E
Status = WinNtBlockIoCreateMapping (0 L4 e$ ?8 |# i
                    WinNtIo,* t9 Z' x+ f; W3 E- D% M1 s
                    Handle,
, z0 M& ]" W) A% b1 u% L$ x/ x/ I+ h                    Buffer,
4 D+ O/ D, N" U  o                    WriteProtected,
% C, V+ p5 p4 K$ h                    RemovableMedia,
1 j: T3 }6 [* @6 l1 H" r- G5 L$ N                    NumberOfBlocks,
+ X! X" h6 @1 o$ G7 H8 m                    BlockSize,; O( Z- d8 g7 {+ S; [1 J
                    DiskType" P, _+ C3 v# @- C* I& h0 z
                    );
* h6 ^6 C" T( K3 r- R/ b8 F6 C//register read or write blocks function0 S! J1 R" x4 p. l* D% ]
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;4 T6 `0 J9 `1 A% v! Y
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
/ i4 y( }7 Z! t% O. z% G
7 t- P2 V* j; i& b: C; P: d2 Z. v//in the WinNtBlockIoReadBlocks,read file API! C3 h3 p1 m; {8 b( @! Y/ y
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
) k  }6 f0 \  G% ^  x* A
+ j; p" Y" T* s! w  ^! O问题如下:' d9 l2 d1 V5 u# [0 L! G- r
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊. H5 d, `% ?4 G, V! ]0 @( S

. L  n, ?# }: I9 P+ \& ^! N[ 本帖最后由 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 a9 t4 H: i% e3 o5 e5 _3 d4 T' O  o$ x- @
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:48 , Processed in 0.140435 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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