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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation3 L8 ?% U, x4 \/ R: l4 F! o
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件* w- C& X9 E/ H- t3 O
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
8 e8 I' E% E! Q% @当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:3 y8 W0 e: G. p/ }( i, ~7 A! J
// set disk type,Physical or Virtual disk? and get the name
7 }$ u# T6 {6 o/ K5 F+ A- t" Lif (DiskType == EfiWinNtVirtualDisks) {
% c. F0 {: P7 x9 U6 Q9 H. B& S$ i" X    WinNtIo->WinNtThunk->SPrintf (% a9 b5 i: i1 H0 r3 \# J
                          Buffer,& K+ O% c. W+ |" A" H. Q9 e
                          L"Diskfile%d",$ y+ \9 a" _3 t5 |! H
                          WinNtIo->InstanceNumber% M1 c3 G3 }: s% H" H  J/ M  i
                          );
' |0 ^+ Y& O/ {- Z& e7 e4 L) W3 n1 V  } else {
8 K* g8 Y( z" I! g; Q    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
& Q% w4 k  x( Y- r7 @- ]2 }      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);( P" v$ t! e! Z  {8 W" y
    } else {7 j* o7 A' u/ E# g2 r
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
) F# g1 L4 f. n# @3 z7 G- _( B* H3 z    }% M. S" k: Z9 `0 n  a
//create mapping ; u3 z3 a+ \; n: k8 e* n8 v8 @- @
Status = WinNtBlockIoCreateMapping (3 |1 r/ f* L8 v1 }0 h5 B
                    WinNtIo,/ J! Z2 R" L9 A. k* z* Z
                    Handle,: v: O. M& r- S- b- W+ x
                    Buffer,
( y% N& z5 R/ ~8 k) `1 `7 y" w( U) Q                    WriteProtected,
4 `5 L, o$ l* J4 q# J1 L$ ^  B0 U3 I                    RemovableMedia," d8 W& p2 B. j: F* I) P
                    NumberOfBlocks,& {$ K7 _8 X; x2 F% n
                    BlockSize,
  C2 ?  B5 b$ b4 T6 h                    DiskType
( @- l# C9 N2 Y, D" N# K; o! v                    );
0 b+ q) Y# S1 ~! i  o  b//register read or write blocks function+ v& a( w- O2 R1 {
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;( D/ j) n  e! E8 _
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
6 R9 S+ [# m9 Y) ]( B9 Q# T" U: ?7 @& U
//in the WinNtBlockIoReadBlocks,read file API% C% ^' X3 J, p4 n# g+ Z. I
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
& G1 [2 Z4 {: M% @1 d' y5 R5 H- L# N) O, b7 K
问题如下:
* f- X8 B0 n% K9 `( M/ Y3 bEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊  c$ T0 h, z  g1 e! P' v4 V9 P; S
0 Z! A2 P8 B! N+ {$ {! u; \. I
[ 本帖最后由 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.  @; I; T3 F$ d: V+ @0 p' F
# C" X7 S& E2 R' |1 f- l+ ^: H
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 05:20 , Processed in 0.063805 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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