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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation
: ?% N- l$ G" c! m  E参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件  q: U, T0 t$ w9 l+ p1 V& g0 Y
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512
, ^% y! t# {, o) A1 A" S& ~当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:- B  \5 k* ]5 I& B
// set disk type,Physical or Virtual disk? and get the name3 d# A( F- a4 ]# @
if (DiskType == EfiWinNtVirtualDisks) {( k1 ~  m' y" ^" a; k; \1 Q. @* m/ i
    WinNtIo->WinNtThunk->SPrintf (9 i$ I' c% O6 H
                          Buffer,% }, X. @0 {" c/ _5 m
                          L"Diskfile%d",# p+ H% X9 c! i" a' r
                          WinNtIo->InstanceNumber9 Q4 |, l2 e. e' V) z0 e
                          );
3 Z7 d" [/ r3 W* m; S$ l  } else {4 U, q5 b% L* I% z4 k
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
* R! @# m! h* X) F% t      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
/ o6 N. r0 R; a& Y' U1 f  V" g6 u    } else {
- F' [; [8 b. }3 H9 @  Z5 \2 P* D# f      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
# v3 _5 z0 v7 Y    }% U+ P: O) F6 ]# t& ^
//create mapping ( V4 F/ ~2 u( H- O' ?0 R  l9 B
Status = WinNtBlockIoCreateMapping (
! G0 o2 A/ A: c2 ]/ _                    WinNtIo,
/ F# o* ^' x$ @# m                    Handle,4 F0 J2 n- G: p) Z
                    Buffer,
" j; b" r7 F* J6 D- n                    WriteProtected,4 B' t9 ]6 r7 y& ~' }0 V
                    RemovableMedia,
: m, p+ d7 P* c: E                    NumberOfBlocks,* Q- s* P6 d( p2 c1 b6 l% v6 P3 ]' X5 q
                    BlockSize,
8 ^2 q; c4 I! k6 p7 N& M                    DiskType
( S! F# t+ C8 f                    );7 O& t* \4 o5 c) [- [
//register read or write blocks function) T7 r4 S4 }' j8 ]
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;
3 F# M+ R* b- [3 j- c2 c( J$ @0 s* eBlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
# E/ a; }1 M5 h* R8 X4 ]# i. k$ H
8 Y; F0 e" R5 ~//in the WinNtBlockIoReadBlocks,read file API
3 {# a' z2 n9 J  mFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);5 l. F: u6 P+ p* B) v
$ a- L( a9 A3 i! M: |5 ^4 L: u
问题如下:
! H" C: }( F) U* H% o0 vEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊: L5 y/ u& u4 s: V  |" C$ L

, Q2 `6 w4 e# f2 B0 k4 r( C[ 本帖最后由 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.
$ Q! e8 S' @* v4 O$ x- y( _% Y4 J- k
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:47 , Processed in 0.042362 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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