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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation- R& B# J4 o1 V5 m
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件( p& o/ K# M/ K
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512: k: @+ G2 s) ]# `+ }0 O/ @! ^9 V
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
: X, U/ _  a. ?6 m9 a, h// set disk type,Physical or Virtual disk? and get the name
* e+ X- s. X- y. Mif (DiskType == EfiWinNtVirtualDisks) {$ k. v  _: ^  y. A
    WinNtIo->WinNtThunk->SPrintf (
6 g! ]% m/ [% N$ }* n                          Buffer,
9 o; d- X: s# O8 Z. O                          L"Diskfile%d",
3 b8 S4 j+ s3 B4 S  W                          WinNtIo->InstanceNumber
# u7 L) b0 ~% I7 o- t/ Q% \                          );* z2 R/ I; n8 T
  } else {1 l  m& C' @; y
    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {2 I8 b' }4 I. F+ a1 Q" F9 F
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);9 _! q2 N! c/ q; f
    } else {% f7 P7 l7 D. q; U  s# C) J
      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);7 o/ r" Z9 ]! N) N
    }' _! ?7 p) r7 D7 w1 T: _4 H
//create mapping
3 w' `7 G: k7 V. D Status = WinNtBlockIoCreateMapping (( X8 c  Q! ~7 @9 _7 [% }. u) C
                    WinNtIo,% Q; a9 L3 ?3 `* [- Y" I
                    Handle,
! X# p7 D8 o5 P! K                    Buffer,
6 G8 ~& p3 j0 j! v& y. x: L1 ?                    WriteProtected,9 ~; k; v5 o0 }% h* x
                    RemovableMedia,
2 J4 m' u' V$ Q                    NumberOfBlocks,
) B, z5 z. f) q! p* o. I* c' k1 r                    BlockSize,% v* w$ @+ ?/ y8 U: F) ~6 m5 j4 m) ?
                    DiskType
8 ]+ h/ s1 g  e; G* Q( i2 v. W                    );
! w% R- |; ~* |//register read or write blocks function
6 I( A) N2 l  u8 b! x% BBlockIo->ReadBlocks = WinNtBlockIoReadBlocks;; l! b# P0 y9 U! \4 w& F
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;% }; H) s  K% H2 T- C
  \% x; e1 r- b  \# |
//in the WinNtBlockIoReadBlocks,read file API6 z. L5 u# z' W6 g
Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);: h2 \) P6 [; {3 \7 |3 p
1 v; X( g9 T( \7 B! p* D2 G
问题如下:
4 Q2 \. M7 q8 G6 KEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
  `% p' @0 C# M2 k& I$ p- j' j5 a0 n1 T
[ 本帖最后由 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.) U# \* R: F  q5 f# M

( ~* q& a% L* R! \% l0 D  D8 q参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:21 , Processed in 0.814927 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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