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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation2 W$ p/ ]# D9 u! B. R0 |
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
; B5 D% J' I; ?+ B6 H4 sset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
: h# j' l8 K& ~& {% G; O当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:' {7 h& z9 F( Z! A6 I4 {* ?
// set disk type,Physical or Virtual disk? and get the name
; L- ]* u- J& t' h; W( Vif (DiskType == EfiWinNtVirtualDisks) {
8 E- R, |3 d$ L    WinNtIo->WinNtThunk->SPrintf (
& A" \4 d5 s8 _0 c% v* y, N, E                          Buffer,& Z# u0 U2 l. A, l9 M
                          L"Diskfile%d",
/ ]8 Y8 d' w) v. m7 {                          WinNtIo->InstanceNumber
# Z) }+ S' I3 ~$ ^! Z3 A                          );
- Z- Z7 S: |% x' i2 c5 t  } else {
3 T( t! _; V/ l    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {" t, S( Y8 g0 p- X9 Q- v
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);# {7 \0 }- B* F4 J6 F  i* d! _. `
    } else {
, r" A' p: {, `9 F$ d      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);4 s$ {3 r( }& I' }" @0 s
    }# t' A! x. E/ e# [
//create mapping 7 N# ]/ @2 i5 d$ B" \
Status = WinNtBlockIoCreateMapping (0 K  Q9 ?% ~0 @% U5 j2 ~
                    WinNtIo,
+ P( F4 E7 m* k6 c  F: x                    Handle,
7 N" J7 }' U6 @                    Buffer,) }8 O) H; d$ Q
                    WriteProtected,
* [* Z! q3 u! K$ v                    RemovableMedia,: Z4 I5 v- d( N/ U( m) g
                    NumberOfBlocks,+ w, I& J. {) }- I) o
                    BlockSize,. C+ }4 n) t& k" q
                    DiskType# a  S! n" p0 |  I0 a1 V- W- w4 ^, P
                    );
5 V/ Y6 K5 k. _4 N" {//register read or write blocks function
" \- G* w9 g0 y6 z9 q4 S4 v1 Y5 eBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
; |* X6 [( }' b8 L. Y' Z+ ~BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
0 b9 G  V3 n8 `. {' p4 P9 [
# u/ A+ m/ k, C% D% t3 z6 m7 n0 U& H//in the WinNtBlockIoReadBlocks,read file API: a; ?0 J8 r* R* d' i6 |% |
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);. u1 W+ Q& K. T0 y$ ?/ W
$ v# {$ U, a7 y# I& Z
问题如下:! r0 ^7 b1 m( z5 ~; S$ O: b, w' ?
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊2 _5 ?7 b9 Y1 S* P2 a/ E
$ s. T. @7 y4 {+ X0 @
[ 本帖最后由 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 w6 x% q  G5 Z3 f+ u* {

5 G! A% c# P3 W- ^参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:49 , Processed in 0.080257 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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