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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
' Z/ S7 w+ @1 w) W1 J- ]5 ^参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
4 ]0 u, i" j6 F' Lset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
9 R- d( ~2 s# I2 A5 T* z$ G7 M当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:* C1 t3 K0 y4 o& n3 g5 W  l: c8 E
// set disk type,Physical or Virtual disk? and get the name( t, U( h2 d6 C* C9 b
if (DiskType == EfiWinNtVirtualDisks) {9 D/ f# y0 I1 i8 H
    WinNtIo->WinNtThunk->SPrintf (  F5 a4 T& ?- n
                          Buffer,% {' w1 }4 `: R7 p6 R0 ~
                          L"Diskfile%d",
; |) W. E+ q) i3 ?                          WinNtIo->InstanceNumber6 p5 y# e+ y5 d. F
                          );9 C; l% i, X; u+ ~2 V; r+ V) n
  } else {5 b: {$ Z2 W' w, @
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
2 ~; t+ m9 b- ?1 @1 w9 |3 B      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
1 Q3 J6 f# t/ Z6 g- F& f    } else {8 d7 F, f  \4 E/ U
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);9 I/ h8 u7 M% g
    }8 H! Y8 s! V# ?1 _4 O- j
//create mapping 2 c2 z% P; g6 _4 y* j$ @0 Y
Status = WinNtBlockIoCreateMapping (
% d# W8 _/ @- P& }) |4 a' T                    WinNtIo,
5 v1 H  o" R+ a; @: L) B7 [                    Handle,+ j1 L( H) ?, K" p
                    Buffer,
7 i0 Z+ R$ t" y$ S. c! A! w                    WriteProtected,
  _' h% M% v% g5 B                    RemovableMedia,2 A# r! d* ^: k$ o
                    NumberOfBlocks,- y# \5 Q( y' _. t' m
                    BlockSize,& \* y0 y9 A& }
                    DiskType% M: g$ N6 Y! j, N0 m- B
                    );6 G0 Z% Q- @8 b
//register read or write blocks function
3 Z! A9 \' x: f9 w4 E" u8 JBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;6 G/ ]( k6 t5 p& e
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;: a- k- F% T: L  r1 l2 t6 `, y
/ e5 w8 A5 w/ _; Q3 a+ v
//in the WinNtBlockIoReadBlocks,read file API
6 n0 w) j5 R+ h* y/ F& zFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);. f6 v& q# h( u, Y

' D3 X& W5 k( {! ~' M  @问题如下:8 E) s$ n, ~/ ?% k& d& Z% E, E
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
  c' B; N# }* u, P" l0 v1 Z. d" ]* N6 E
[ 本帖最后由 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.8 G- A, C$ R! Y3 ?# q
% `3 O! i) Y2 Q* b; f, ~) {$ D
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:42 , Processed in 0.102922 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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