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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation2 |. e6 u* _7 C1 A. B  X
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件/ A5 z+ }# F1 p  J7 T2 |- o
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5127 B0 h& \$ `5 |
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
$ ~) z/ q6 d7 @# R. x// set disk type,Physical or Virtual disk? and get the name9 o, V; h( t& M  C" s1 ^) P  \
if (DiskType == EfiWinNtVirtualDisks) {
0 P0 h, I0 S/ e( E+ l. x    WinNtIo->WinNtThunk->SPrintf (
' S+ s1 d8 a8 j0 T; l                          Buffer,# ~; ^1 J' p6 T+ c
                          L"Diskfile%d",
5 `7 k* Z9 ^) t) ?! e                          WinNtIo->InstanceNumber. |' f5 k" B# i; J0 v
                          );% Z4 j( ?9 p" ~0 o: K: [
  } else {0 Q+ x3 j# M0 [7 I% b. y1 V4 |& T; _
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {! O: O3 L! g! q8 N1 I8 C; ~( k
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
5 ~" l$ n% r! n- @    } else {
$ Z6 l  c) N1 U8 w- _& s* h; Q      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
3 r# k6 y6 a6 ]: F# u. d! S    }) x% f8 E- u1 S5 k
//create mapping
" R7 |( q! ^5 P Status = WinNtBlockIoCreateMapping (. o: r" u, R! l, t
                    WinNtIo,
; D0 A+ Q3 r; G* Q  A0 ]                    Handle,
) _6 x  y7 o1 X% B, Z+ O$ L6 d                    Buffer,6 W! I" x. C% _; Z
                    WriteProtected,3 Y* t2 |/ R5 s# j3 J
                    RemovableMedia,9 G$ ^7 C" S2 D
                    NumberOfBlocks,2 j0 c; R8 l, ~* f
                    BlockSize,
( `: |, e  b& z$ Q- Y7 H2 Q                    DiskType
8 e& A0 M) Z# A/ y                    );/ j1 y4 m* C. G; V8 Q  N% \
//register read or write blocks function6 m) q+ q- ^- J# ~* B3 q5 e
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;- F2 A: X" ^" w$ m9 E
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
2 t, q4 K( [/ w
& K0 `7 Z4 {1 W3 O$ m//in the WinNtBlockIoReadBlocks,read file API
7 e1 d9 f& E5 X% e2 K, ?Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);, Q0 {2 k- C; F6 \9 J, b

7 v* p- B* ?0 s2 b问题如下:2 U% Q( L" A0 }1 S; g
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
3 ?+ t! Q0 D6 N3 I$ Y8 D
' d9 |" S9 L3 D/ m  B[ 本帖最后由 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.
' A, `2 |! {, E) e% I$ S4 q$ I' l! Y0 I' J3 X& y7 h
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:12 , Processed in 0.195820 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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