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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
- {, M1 }$ W! l2 C参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
0 P) k' V! K1 y, h0 C7 F# V; ?set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5125 _7 n7 o/ _/ `. @3 k% B4 q
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:/ {* k, G- M; j6 s
// set disk type,Physical or Virtual disk? and get the name
! b- S+ C8 k: D4 ?, K: y: Aif (DiskType == EfiWinNtVirtualDisks) {; N  _( Y+ `$ v8 F- a- C3 b  J
    WinNtIo->WinNtThunk->SPrintf (5 ~% I2 R# S% y1 n$ _
                          Buffer,7 C% ?$ }# L, j4 o! S: r
                          L"Diskfile%d",9 Z. g- f' [2 B5 F6 C
                          WinNtIo->InstanceNumber
+ E! J& A: e( `( d! R                          );
9 ]8 O( _0 T' g  n9 g6 x/ q% y  } else {& f1 B! e! E/ K7 ~/ Z. t% d" c8 P* k
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {: {2 n3 _! j: |9 @
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);0 v* B1 V& D% o# R9 S
    } else {
8 N! @* A' l, [- S& `$ K$ m' Y: z      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
3 y( S' S: R) j4 H6 x    }
! i8 Z3 v0 D& i8 `//create mapping 1 I2 d- T3 g* _. d) m& Q
Status = WinNtBlockIoCreateMapping (
9 m9 k; P, }: S; I7 q+ n                    WinNtIo,& j' s- V: ]( n" x" Y$ g1 |% d
                    Handle,2 L* j3 V% U5 c9 p8 R* _- M
                    Buffer,
& u# R3 \( C8 m1 H4 |                    WriteProtected,) c9 w6 z1 V, {9 q1 v9 M! k
                    RemovableMedia,
0 s5 m# y% j5 F0 y% B/ _, N                    NumberOfBlocks,; P* \( \9 w9 F: A
                    BlockSize,
* g# B: F4 `  X& p  d                    DiskType
9 N) d) n; U9 X. Y' k                    );% Z5 r* T, \+ e& K0 k
//register read or write blocks function
. F) _4 E% {; j* W, I3 m3 LBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;, C8 I( X- r# I: ^
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;2 i' p4 n$ C9 I) g' v
% O2 D* x3 g. e# ^, q' z
//in the WinNtBlockIoReadBlocks,read file API- c; E8 r) n. ~* p$ n  W
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);2 d( o4 ]& z1 w# v- l7 h

' b) j; d# Q6 [问题如下:% l( a: s5 [7 L3 n, R
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
1 X8 |( Y( T3 _( @7 E9 o. t6 w* z4 M. ^
[ 本帖最后由 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." d& a4 C. N) t9 _; Y# [4 `; `
$ A4 m0 o' r5 V6 X# ]6 q! l
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 20:32 , Processed in 0.666795 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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