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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
! B* G1 T, d* L/ k参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件5 i7 P! c/ L" G% f" e3 W0 b& W  n' B
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512# `4 E! l- M1 f# [& s/ j
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:  h2 f5 C! p, D( U
// set disk type,Physical or Virtual disk? and get the name8 C3 _+ ]. V0 x
if (DiskType == EfiWinNtVirtualDisks) {
! T: A7 `+ a. m    WinNtIo->WinNtThunk->SPrintf (
0 s4 H1 l9 s( X1 m- C9 j                          Buffer,
# O+ X( \, K4 c9 g                          L"Diskfile%d",
6 p8 n% ?+ O, r% i% S                          WinNtIo->InstanceNumber% C3 Z& z- F0 Z
                          );9 p0 ?( @# v# h0 V/ h7 p' G
  } else {
- A0 k* {' s- c9 e    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {$ S- U5 ]- \, {9 a6 S8 V7 Q
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);, e$ {2 x' I! F' B' n4 |2 u5 k
    } else {' d( h; Y5 `; W8 ?& H
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);7 l! Q# `$ D( f; U! q
    }
9 L' Z0 n5 ~% G//create mapping ! W1 p+ L  C: T2 W% q& r- }$ L, b6 V
Status = WinNtBlockIoCreateMapping (
* [" F: y9 M! r1 T$ H0 d, `) A                    WinNtIo,4 S" k5 I1 L$ P8 v
                    Handle,: r0 [) b1 y$ u+ i" M
                    Buffer,
, [" f# }0 _- I5 W. q( [* H) e                    WriteProtected,
$ |$ [/ K! M# \: P- _. I                    RemovableMedia,
7 e8 G% F# A, q, d! X( p                    NumberOfBlocks,
* u5 k' W7 V& ^/ t- ~                    BlockSize,
9 b. l5 C6 |, b1 ~                    DiskType* W* D$ Z5 x8 q, v
                    );
4 C' ]4 p' w, _4 ]//register read or write blocks function6 `# w, L+ D3 |( o
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
+ X6 W8 v9 b- o* d( G$ S& eBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
# N0 ^  y7 _" [2 z. j
0 u1 `2 T# u% B, s) h2 ]//in the WinNtBlockIoReadBlocks,read file API
) t. y: p4 d5 c6 w  J9 p- oFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: u: x5 s' ~) [* v
! ?, g2 K, K- h2 S; M问题如下:' V8 R  O6 q* u3 H
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊0 r% X+ Q1 Y5 D. `, b2 D

& A" R1 C: e; \  ]5 q[ 本帖最后由 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.! j' v: x% a# S/ j; u
( |1 K/ N# b: z5 j/ x; F' m8 w$ G
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 10:43 , Processed in 0.049858 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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