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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation$ K) p, ~) o) C( l
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
- n8 Z. g* E# @* w$ T2 v; vset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512' ?6 D+ d+ s9 t/ i
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
( f. \. S+ z. ]( x// set disk type,Physical or Virtual disk? and get the name- s# F# R! r+ D9 C
if (DiskType == EfiWinNtVirtualDisks) {9 `$ G# H; Y# W  A. D( l* ?
    WinNtIo->WinNtThunk->SPrintf (
5 g3 e$ x8 F$ W2 P" Q9 A                          Buffer,7 I1 \& g2 V3 f
                          L"Diskfile%d",1 c$ Z0 i0 \6 P8 z
                          WinNtIo->InstanceNumber0 L8 ?$ J+ W' ?6 d
                          );
% _- y  u  [' H. I. B+ j: S; H  } else {0 B! z2 q4 w, u( h
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {1 N* F# Q9 F+ z% g
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
- X7 W$ u% u# O/ S    } else {; G8 }; e/ M: ]( d4 U* ~( V  i
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
& W8 A! V- I- o  M4 k  r    }6 O2 U/ @; Y) Z! O
//create mapping 1 p% d5 i8 {0 |7 K, x( ~
Status = WinNtBlockIoCreateMapping (, g* Q2 ~( R- ~* v0 F3 v$ ?
                    WinNtIo,, r- V& `) {0 H$ ]: b, C
                    Handle,1 i* X; }& _9 e5 N1 g
                    Buffer,
# Q' M$ s# b- Z! @3 `- C, R: s                    WriteProtected,9 G7 w4 s% k" Y& G
                    RemovableMedia,
4 k1 M# [3 d2 l. \, s- Z9 e9 J                    NumberOfBlocks,% T" s1 {, H2 c7 {
                    BlockSize,
2 `/ W& D- [' F& ~. D5 f                    DiskType% R1 x/ ^6 d# n6 q3 F9 d
                    );7 l$ w6 o+ |2 C/ j  [! c5 e$ `
//register read or write blocks function
4 e& I6 ~+ s& q6 t8 MBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
9 K+ S! R% _0 m0 C8 @  `BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
+ q% b' w+ r3 [' _9 m) e8 y4 |" Q1 C- R0 ?4 Y! y( v& x  I
//in the WinNtBlockIoReadBlocks,read file API; I8 D% s1 T" T! t
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);  Q: u& f7 c/ e* y4 b. P

( z2 a$ l- h/ r+ R# U问题如下:) K2 [) O, b- r- l& q9 l" s% ~
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
; D. z. ^/ X+ v  m+ X! S: m( w2 O0 p" [4 w  H8 R3 Y
[ 本帖最后由 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.
% a& N% ^) G+ P# S1 n& C% m* A4 P
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 15:15 , Processed in 0.161638 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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