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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
: Y4 T' p- i9 L" o  D" r( D( @参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件2 g/ ^. U6 @# X5 f/ a* B5 k
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5124 w! Q3 s' K+ C' u& I
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:) S1 W5 k0 A  s3 E3 L+ C$ h
// set disk type,Physical or Virtual disk? and get the name1 V4 Z3 N( d% C: {: b+ B/ h
if (DiskType == EfiWinNtVirtualDisks) {
: M8 b! \# x6 A5 N) N    WinNtIo->WinNtThunk->SPrintf (7 u8 O) d2 B9 C8 i) u
                          Buffer,/ W! K$ J4 ?/ {- n7 ^; @
                          L"Diskfile%d",* h( ?- X- P* o6 @/ {
                          WinNtIo->InstanceNumber3 S: ^8 A! R, I
                          );
6 p" _6 B7 t3 N  } else {
& F1 {# B! T5 P( A    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
. H* j0 T8 v6 x! e% M% K  a' ]0 ~      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
, M& O) z1 U' I  G6 S! x( L    } else {# ?2 [3 c' B6 D# ^
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);; ?, _/ g* J- u) O2 n
    }
+ S( {- ?, N( E' X3 L7 U//create mapping
; I; X+ a$ Z& K Status = WinNtBlockIoCreateMapping (' n7 i8 I; b+ W$ ]
                    WinNtIo,8 I8 d/ K( y1 f' V
                    Handle,
) g+ E* G) E- i                    Buffer,' P: {) b1 P! H( G
                    WriteProtected,/ Z/ ]0 z2 K. _2 B) r
                    RemovableMedia,
7 l/ ?+ d9 M) R; W* r                    NumberOfBlocks,0 |4 D; m7 D5 E; |$ ~3 n) ^
                    BlockSize,
: `2 v. ^* ^, l. ^6 u- o2 G                    DiskType5 t  N8 W4 `+ u5 i6 G
                    );
" @0 \0 s- h! h8 B//register read or write blocks function
$ E$ m4 b! n, ?6 L6 M1 P9 a: G, DBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
! }0 Z7 F( N/ J( p% b( YBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;6 C1 {2 T  }- }7 c

/ K4 x7 I  L6 J& I# z. n0 j//in the WinNtBlockIoReadBlocks,read file API! ~7 ~3 b' p/ u. X# r/ ^
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);+ F5 M8 O5 C5 }8 Y+ C! k

; O( O- j* H: B& b/ y. g4 ^$ B问题如下:
- m3 A$ x2 k, d5 t, ZEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊: e: J* n7 n$ F9 c2 p% H9 V

# h# j9 z5 G3 [5 e% o[ 本帖最后由 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 f; d4 A/ r+ G6 V7 d: O: g* v
4 Z, g2 ~$ j& k8 j2 |- X参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 05:14 , Processed in 0.027895 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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