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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation. Y/ i: [% v3 s+ I/ i) Z' V. C
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件3 t0 b; `8 N  ?8 B- N3 x. o- J" r
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
5 A! I+ d# @% m+ W& G8 Y当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
! D5 ~! h0 Y7 M// set disk type,Physical or Virtual disk? and get the name4 d# Q: B4 K0 L4 m  ?
if (DiskType == EfiWinNtVirtualDisks) {
* ^8 |1 n7 _9 S    WinNtIo->WinNtThunk->SPrintf (& `& q- d7 h/ H$ O( Y2 m
                          Buffer,
9 x* o4 g2 ~+ O* O& R. N% y+ w                          L"Diskfile%d",
& X, s# ^9 u2 v' r9 r                          WinNtIo->InstanceNumber
2 Z. u# s8 G: ~  d0 g, i7 J                          );6 \, p) p: t/ u. j+ `1 C, F# M; F
  } else {$ v* p1 ~9 O* d5 r5 h0 L7 i. ^
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
' w0 Z& H* [/ E0 A      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);+ g: |) P8 V& N( |$ g! i; q! q# h3 B- P
    } else {( W0 j+ \  a& ]$ [9 b1 Q; Z
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);1 T$ }7 Q, J7 Y" S: s
    }4 J( u/ d5 }( a$ @8 y/ \, i( N5 C; v
//create mapping 8 f* i6 B6 b5 G& X* o
Status = WinNtBlockIoCreateMapping (
' \) q& P; ~% W$ Z# m, ]. I9 ~! `, f                    WinNtIo,/ T) V* w9 Y, b
                    Handle,
! n/ s4 _0 P- Y$ H6 b. A$ B                    Buffer,
9 O' n7 g6 s+ k# n+ Q& g6 w                    WriteProtected,4 j( J5 y# p9 p  y% e6 G4 g
                    RemovableMedia,
, D  {% C1 P' P, B) \3 _. g                    NumberOfBlocks,
2 C! r0 d! i+ L, |5 F8 `0 T                    BlockSize,
: B9 y8 \; H  ~# i* r$ K/ c0 r/ \                    DiskType
  R; t$ M3 q+ ]( N% E                    );: m# |# m0 ^& F: b9 Y9 l8 H! u
//register read or write blocks function2 O- y/ ]3 ?6 S& x+ P! [' k1 ^" b
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;5 e/ ~4 z0 U, o2 t/ j
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;) _0 ^8 }/ b# q4 Y( @

* y- r4 ~; u6 W! A0 P5 F8 H- V% I//in the WinNtBlockIoReadBlocks,read file API
2 B- n$ V" R% Q, a; z; R. u6 d% IFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
: ^) d4 \: `; x2 J9 B% D4 |! F" {, U6 e4 A1 e9 f
问题如下:
& C# K- z7 C8 t: c# YEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
  V; V. j$ p- @: K
, v  H, r" p! Z6 P  E[ 本帖最后由 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.
7 M9 K+ x* ?( x6 w  v; ], t: X- ~3 ~2 W
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 22:12 , Processed in 0.039992 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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