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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation% B! M5 k7 p; g/ f) ?, b
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
% F# h- b+ H4 ?/ E5 D0 y! ~9 nset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=5122 u. L- ]$ D' n% I
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
- b* k  b0 S9 R7 Q: c. K8 @2 {: h// set disk type,Physical or Virtual disk? and get the name; z8 J0 _4 p) D  a
if (DiskType == EfiWinNtVirtualDisks) {. `- A; K8 S! T4 D/ [
    WinNtIo->WinNtThunk->SPrintf (; f: k0 n! x# X# R  _- ~
                          Buffer,( O! T7 t, w# W6 h2 W6 j
                          L"Diskfile%d",
# n+ J" J5 ]0 ]  r) h  x5 i0 P                          WinNtIo->InstanceNumber% Q7 N+ M2 i1 c$ t
                          );9 B, b9 E8 Q3 p
  } else {
7 U4 c2 Z* m2 U/ F" ?    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
/ a6 ^5 [/ s/ X" F, _      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);3 O( }2 T2 o. w8 k( |
    } else {8 |8 S& t7 Y7 B  o, F
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);! z; z! r4 A; z0 s8 d% e
    }
, T' c2 w1 V8 f7 a. b) F//create mapping 3 N, g" S* _# i. L- }
Status = WinNtBlockIoCreateMapping (" @) I! B$ j3 U0 z9 r4 |
                    WinNtIo,2 e+ N1 @  ]- g  B
                    Handle,
$ S. {9 y2 d; C& e7 A1 a                    Buffer,
- C/ [; s; Y5 A; m! }% @                    WriteProtected,0 X: `% M% _, P  s- P+ s
                    RemovableMedia,; g# h* k7 g" M8 E6 K0 f' _
                    NumberOfBlocks,
; P( k9 _4 x2 b: n5 \0 N4 s2 W. U9 X; l                    BlockSize,7 w: G& h* P) N& h8 n
                    DiskType
, n( E! o& G- D' r8 X/ ?                    );
) z9 V+ [* }# [( L, e$ w* ?//register read or write blocks function
3 @& a" ]  d+ ?$ OBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;, f7 V) r  ~# Z+ ^4 F+ H
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;! h3 ^, a# Y# e1 z- `$ D
9 v$ x7 a4 Z7 P% R8 ^4 j: Q
//in the WinNtBlockIoReadBlocks,read file API
, `/ K. @; A2 l6 q+ `6 e, a+ U( @Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
8 d  _3 d; c5 {6 E; U
) |8 |& }0 t6 O问题如下:
% I; W+ q- J) I  J1 Z! n# j. XEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
3 }( I3 a4 [5 n' B
5 F3 T5 |) Q0 T4 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.
1 W. W9 u0 ?5 L+ c1 b8 P' P3 Y
/ Z+ a5 K. E, a9 D参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:55 , Processed in 0.017336 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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