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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation! h' m+ Q# d/ H0 F: f* s  n
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
- \; H/ z) b2 M1 R% T4 V, r, s, Oset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
$ Y! p3 p5 W4 U  v: \# c' b当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
0 b* r7 ]0 z. Y2 n8 y// set disk type,Physical or Virtual disk? and get the name
. [7 n( T5 m4 f6 O; sif (DiskType == EfiWinNtVirtualDisks) {1 F4 U1 Y7 ?9 }- Q
    WinNtIo->WinNtThunk->SPrintf (
4 h4 y) F" C% v                          Buffer,
- V4 z5 `9 R+ c8 p5 Q4 d                          L"Diskfile%d",
$ U2 ^7 ~. ]0 }4 x, a) o                          WinNtIo->InstanceNumber
4 m$ ?* C  B- o7 X# Q5 U3 d9 I                          );# ]& m2 ]5 l, W0 X
  } else {2 I8 r0 B- n9 d- R
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
$ Q% Z+ Z! e  ^3 S9 e4 H      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);( ?3 W: |% v. x( @* E  c/ L" `
    } else {- W) R" Y6 I7 K9 h% X( p
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
# Q+ {; V, N# w    }* X. f0 m* q9 X. O0 M
//create mapping
: ]. O6 J4 Z$ T0 ]9 o+ \ Status = WinNtBlockIoCreateMapping (1 ?$ f! o% C) j; }; Z% E% U- _
                    WinNtIo,
* V4 L0 _2 J; V                    Handle,8 i' E' P3 N, _( ~8 Y. g; v3 q
                    Buffer,4 D4 `, I: b: \' u& t2 b5 T
                    WriteProtected,7 g7 m( Z, {# h4 z$ |, g
                    RemovableMedia,
) @) `! m. `# Q3 C+ C                    NumberOfBlocks,
! J8 a3 F) p* @  ~                    BlockSize,
( T/ B5 r: |- X* r                    DiskType
& f4 G; X2 G6 ]- Z- A                    );
- k; e- `8 Q; n& d6 C; d//register read or write blocks function
$ ]/ F. H  F+ ?/ |, xBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;( i: V7 W1 h, U, r
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;5 y- c, v6 s" W  r; f
/ k+ j# Z8 B* L+ p9 t
//in the WinNtBlockIoReadBlocks,read file API8 k; H6 g4 m. v6 F, r
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);4 W) g( M( v+ H1 v7 k7 u
6 |7 W" W0 k- n- C
问题如下:
, r& e1 E$ d# S/ {- b& wEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
. B# n0 y; h2 H$ k% o
2 }& l& Y4 f& [. a) z[ 本帖最后由 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.
  f; D8 _) O0 r/ ^5 n. A# T- E
. u9 L2 r' i6 b  Y! K8 V' F1 ~1 h参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 05:39 , Processed in 0.196776 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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