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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
) x: b8 L# K( L+ G: Q6 L. T参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件: Z5 _4 A2 ]: z) T4 z7 C+ P
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5127 |3 `* K: {2 H& {9 j& |, }5 P) F  r
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) s7 {5 O* I' [$ K8 ~7 {
// set disk type,Physical or Virtual disk? and get the name( s7 d1 c; s. O" y% U
if (DiskType == EfiWinNtVirtualDisks) {% I" w0 G7 q6 B: H# i( E0 g9 {
    WinNtIo->WinNtThunk->SPrintf (
2 \7 o8 {5 d0 _3 I7 c! v/ O5 s                          Buffer,; a1 t, }( h# n- V* w
                          L"Diskfile%d",
. Y6 Y/ \! z" [# ~5 y/ T                          WinNtIo->InstanceNumber; N$ Q; i% F3 B
                          );
& d$ T  l* D( y0 B( m  } else {
0 I  |+ i3 J* @2 w6 u- F    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {9 T. B3 ~2 ~$ O% Y3 B6 ]' m7 n
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);6 s- q9 `# |) D6 X4 i
    } else {6 ^9 W. U- u% Q) \0 V
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
' O* t' l; g+ `    }# \8 j! o/ ?( t# `
//create mapping
- }5 S) J9 b+ w& V: o( q Status = WinNtBlockIoCreateMapping (
- X) ^  Z- @  B4 D                    WinNtIo,
4 d, ^  l$ d# o( V8 Q6 d& B                    Handle,
. n7 {; F: C0 c  \4 k2 C                    Buffer,, U4 B. ]# n5 o6 o3 F4 `9 D
                    WriteProtected,
' ]+ t  R/ S: c% G1 v3 k- s  f2 s                    RemovableMedia,: l) u: a# ^5 k/ V- W
                    NumberOfBlocks,5 w) |* O$ P0 |
                    BlockSize,
1 O! [( D1 X0 j                    DiskType3 Q4 w0 n& j' q' }/ c2 [$ I7 ?) k
                    );
- w% c. S) {+ \. L6 s) ^# [3 ]( F3 S//register read or write blocks function
' S, [5 |! X+ R: M/ T. lBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
+ l; p4 ?! I/ ?7 g+ Q/ r+ QBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;  m0 I& q6 Z( [

8 a' i$ z0 ~0 ^) `6 s, K% z% P1 k/ L//in the WinNtBlockIoReadBlocks,read file API. U  Z# h7 m6 \
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
# h& j; S% E) \2 ^
% \" p0 y! I$ {) s, q7 k- W问题如下:
5 A" U4 q3 U& `6 {% e2 oEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
! w# u; ?. I: w& d# Z# M
7 A* Q) T' a! b, A[ 本帖最后由 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." g1 }! q, d6 D7 N. e" A+ Q
, y$ S& w: s, R+ ?4 ^, `+ f1 n" s
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:53 , Processed in 0.047414 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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