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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
7 C% q; `; P; Z4 a; I1 N参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
# b1 {; Q5 \# m9 G1 {/ b# Wset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
- k. o/ p1 c. g4 n当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:! Y% r- {9 u4 M
// set disk type,Physical or Virtual disk? and get the name
3 I  I5 G6 `9 e5 R( uif (DiskType == EfiWinNtVirtualDisks) {( `1 D! w; O1 l' ?
    WinNtIo->WinNtThunk->SPrintf (
2 |- w2 M) \/ v# d( T' V) K                          Buffer,* d. b: B2 ~2 U; Z$ p2 H: W* I
                          L"Diskfile%d",# _- y: B: S* S- J! _5 l
                          WinNtIo->InstanceNumber
2 o2 u' z6 o6 Z0 q. a# K" m                          );
# ~+ r0 c0 H, v! w( g* T  } else {
. \, M1 {% d! r  S; d/ S    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
$ G. R+ O, a6 t3 S9 t/ z      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
7 E0 ~6 f6 q' p0 C    } else {
% o# p" \3 _5 l/ A, J) m3 y      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);* B; I, B  t# _! m, A( X6 Q% U/ F
    }& A$ s# w6 O5 A9 Y
//create mapping
. b( ^) p! F* q$ y$ Z4 w% L% { Status = WinNtBlockIoCreateMapping (
5 r9 D; ^: u) a$ G& L                    WinNtIo,% a0 Q! F. j- [) n
                    Handle,
* Y8 H3 e) D$ w! n  A                    Buffer,# _2 x9 d* C0 N; g8 I8 B
                    WriteProtected,- `' [8 C+ s0 O
                    RemovableMedia,+ g' s( C, |7 X' F& R4 n
                    NumberOfBlocks,
" N1 E/ S6 K4 ?# l6 P                    BlockSize,5 W9 Y1 H9 }1 X! g& j$ o! N( C
                    DiskType  ^0 y+ z9 `3 K( @7 X) W
                    );8 U* ~9 c: E& O  i+ H
//register read or write blocks function+ D! e" l- ]: D; k3 |, }8 M
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
7 T! j/ h5 ~  \- |BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;5 d  R# ~# U) t4 B7 u
* C9 X& f0 F7 ^+ e! C* v! e
//in the WinNtBlockIoReadBlocks,read file API5 G8 H- U& n) b& S0 W+ k3 q
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: I$ O- R, m6 V& i  i% s) d
3 {1 W7 S- g8 y! Q1 R9 K" z问题如下:; i  M) }* t) e1 R4 i
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊  q2 [1 ]6 r) Q" D2 F* s. h

" e, J$ E. V# |6 r* F. w[ 本帖最后由 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.) N9 o$ [- i0 u) f8 z6 b6 R
9 b, P/ J! f* r
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 08:38 , Processed in 0.146175 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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