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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation' m& V6 G- n8 t
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件7 N; h" o& a' S4 s
set EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512+ K" I3 U9 O" W. S3 f# @" }7 K; D! U1 v
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
" l  |8 U) Z) q5 P; M! Y. x// set disk type,Physical or Virtual disk? and get the name: f9 Z7 j9 K1 C' {' i: Z7 j
if (DiskType == EfiWinNtVirtualDisks) {$ Z7 {8 ~9 U9 {% `
    WinNtIo->WinNtThunk->SPrintf (
* Z9 t& J: U4 Y* [. l                          Buffer,' ^* A9 x% {: L* n8 a* ]5 B9 B+ M# _
                          L"Diskfile%d",
+ d! A. r& v: @9 G5 \5 O' ~0 I                          WinNtIo->InstanceNumber
# F5 K6 {( F# V/ L6 R                          );
& B: U9 K, [2 A5 P$ {% C  } else {
2 g8 x; {; D) K5 o! [( P6 u    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
2 Z1 y: J& ?* v) e9 ]      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);
; J, u. E# z2 N: g3 H    } else {
/ }4 |' d, |5 v9 @      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);! ~6 r8 H. {5 z1 H8 E* W
    }+ O+ K% q+ D; A9 H# j
//create mapping ; q6 ^" ~( N9 i  H
Status = WinNtBlockIoCreateMapping (0 m- n+ d, l" w; ^
                    WinNtIo,
' d' p. k4 I; f: r8 b' v                    Handle,1 U2 r  Y, ^% J9 L
                    Buffer,7 C% o" ?+ v2 e% e  b
                    WriteProtected,
8 G: c" I+ d9 s& l8 ?2 {# U" p& X                    RemovableMedia,. }% l% ]# Z8 V7 L
                    NumberOfBlocks,4 E: |& i  }: l$ s2 \; F
                    BlockSize,5 c5 L% a4 P" C# G2 k5 r: P4 w
                    DiskType
; v2 ^2 P6 w0 H* |' U                    );
# S0 e8 ~& q/ ^2 s//register read or write blocks function" \$ v7 a4 S' N
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;+ M. W7 P+ H+ ~- q9 A  K+ q+ B
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;; G0 g6 J3 c! I+ T+ |  R
! B' i# _1 k) I
//in the WinNtBlockIoReadBlocks,read file API
! q( Q5 d6 E5 _: t0 p/ p3 l$ V! O0 ?Flag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
7 Y+ m9 P' i$ e# g
1 e" L6 `2 z+ c- l! x6 S问题如下:0 p/ K9 [+ ]5 @6 Y5 e
EDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊' c' |$ ~% ?7 h. D6 N
% n. l  G; I& h  M) [. H
[ 本帖最后由 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.
+ ?/ i' ]9 Q* M6 h. {9 F8 C
8 x5 B# J; b, i: K  N- Q. k参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 19:03 , Processed in 0.322839 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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