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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
1 K' x" Z+ o; Y9 ]! v参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件" o. n# p8 A2 o- S% X9 e
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
! M# k7 X  x; `/ {& h$ j4 p当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
# y7 r! D! k+ e0 [// set disk type,Physical or Virtual disk? and get the name
' a2 n0 ~6 L" u0 G9 Xif (DiskType == EfiWinNtVirtualDisks) {  o8 Q' r' c- M1 ?
    WinNtIo->WinNtThunk->SPrintf (5 ]1 v" ~* G" L0 T4 Y2 [! O3 {
                          Buffer,
+ Y$ ^/ [% A# b1 r- b                          L"Diskfile%d",
; I& X2 @7 b9 z& o' g) l                          WinNtIo->InstanceNumber
% t) |- V+ o3 g% L7 |" b: J) L                          );) i2 @4 I3 _, M$ g$ c" u
  } else {1 {0 ?$ [( N8 j4 j
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
% W. g* T. ^! V$ B, A      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);! k. L: H6 y. C5 `* h
    } else {
  Y9 S$ P8 j, E5 O      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);- N) |/ S2 U7 N8 E/ L4 A
    }: d- K2 k1 U% z8 C; O
//create mapping 1 X* t/ O7 l6 x; n! b# \
Status = WinNtBlockIoCreateMapping (
2 M9 E/ T, S6 E                    WinNtIo,
% n) \  R0 w/ q6 ?% E                    Handle,
, m5 d/ F; C0 M2 b3 c8 \8 g: ~& K! ]                    Buffer,
6 u. S* k; X, g: \                    WriteProtected,8 d, s* w/ F& F0 R7 o8 [
                    RemovableMedia,# B- j6 d% j* O* T
                    NumberOfBlocks,7 q2 |) t. A/ F) G8 q- x0 {, @
                    BlockSize,
7 l1 k) [# r# n  i* l0 x                    DiskType1 e$ u8 m+ @7 [6 q- q- W7 s
                    );
' ~0 P, Q2 d3 x, t0 R//register read or write blocks function7 N/ n) C7 h4 P* D8 k
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;( ~: Q, O/ r2 O6 p/ n
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;, [) O0 ]9 J+ b3 R* c

* q' S& j8 I/ A1 a% a- L/ o//in the WinNtBlockIoReadBlocks,read file API
9 V: _* g% X6 G. |% r! x: cFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);& \( f  I$ Y4 {

8 [1 V1 I* j2 M) o) j4 L问题如下:8 n2 Q5 H. x" Z! m
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊1 y6 a6 C: l( W) r3 ^" b1 B, n

) J& n. ?+ S3 q4 j9 o) `& g[ 本帖最后由 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.! v# a3 C: d9 T* ?  H

/ w4 w8 p1 C/ O9 o: _参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:13 , Processed in 1.501229 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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