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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
- x+ A3 f; {" Z+ s3 O参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件" P* I+ F& {0 Z; F# O) E. Z
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512; _) }4 w# H* r9 |
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:4 ~# e) W) `7 ]6 }$ A  z( Y
// set disk type,Physical or Virtual disk? and get the name
" o/ r6 G# c; T5 i7 Dif (DiskType == EfiWinNtVirtualDisks) {+ q8 i3 J) ?& j# }9 x) h% }" z
    WinNtIo->WinNtThunk->SPrintf (; p% r$ i  \+ ?8 r# h% i
                          Buffer,
; H' H. ]( ~+ q. n9 \6 N                          L"Diskfile%d",
. F+ X  C/ W+ H$ [                          WinNtIo->InstanceNumber
* D3 N6 I0 k9 G8 L% ^! ^/ Z                          );
2 O! |1 ^0 m) k* Y) O  \7 b- V  } else {- m6 H4 F( ~6 J# @) A5 C8 j
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
3 y7 E% v  L0 g8 h& A0 Q      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);3 ~$ J# m% q( Q# N/ t
    } else {
# [; \: L& G& N# K0 h* s      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
& d( ?$ V( z4 U1 \6 v    }
6 V. }9 _7 }' C0 P//create mapping
* h% n7 c7 l* f+ v4 M Status = WinNtBlockIoCreateMapping (
+ o8 z( ?, ^) v* O0 |                    WinNtIo,
# k9 G& u2 [7 u7 r; m; C% ?1 ~                    Handle,- _8 [( Q% |1 m. A+ a2 n( g9 C' }7 U
                    Buffer,8 r* z; u- R. Q% j2 d" B' o
                    WriteProtected,  m5 d  R) Z- i1 |9 h
                    RemovableMedia,! s! ^2 C* m% h  o! h( k0 b4 p" E
                    NumberOfBlocks,
% T! G" {+ ~% x# \                    BlockSize,
! P0 {  F9 ~( ]6 v% A+ ]                    DiskType+ T5 Z6 x. b% N8 D+ U3 U* M/ H
                    );& L& V( e6 w0 s0 u
//register read or write blocks function
6 a. |* M# Q( M& t9 fBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
8 H6 ~0 {( H( PBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
7 O; u2 v( U  t; g, q# K: @- P
+ j" e* N7 _4 q4 U//in the WinNtBlockIoReadBlocks,read file API' M1 Z5 o+ N" s4 m! ^% v4 m( ~" R% J
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
0 \8 l4 G# v3 q
6 b. O. S+ ]' r1 u) s2 g: w问题如下:
) r3 J6 S" l$ X/ P( cEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
1 w: e5 O$ f# p9 D) ~
9 N+ d1 U! B9 j* 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.
9 Q! I* L' Y" n$ u  A' K+ A$ u
" w# y4 \) B2 u! e参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:09 , Processed in 0.230244 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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