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

physical disk operation in EDK NT32 platform

[复制链接]
发表于 2009-3-23 18:00:26 | 显示全部楼层 |阅读模式
在EDK source中提供了对physical 和vitural disk的operation# @; }( v- @1 Z8 m2 g0 o
参数设置:EDK_SOURCE\sample\platform\NT32\build中的system.cmd文件
$ \1 X# ]! v1 [% h) o/ aset EFI_WIN_NT_PHYSICAL_DISKS=a:RW;2880;512!//设置一个软盘,大小为1.44M,block size=512! M+ E2 @, E" E- j% d9 D
当我们在跑EDK的时候,可以去访问该软盘。其实在EDK中去追踪该代码的时候,会发现,其实质上是在WinNtBlockIoDriver中调用WIN api进行读写,源代码如下:
- ?! z8 B, \2 t! S) b  a// set disk type,Physical or Virtual disk? and get the name
6 Z/ w+ h( z) Hif (DiskType == EfiWinNtVirtualDisks) {
" H3 P0 e( w2 }2 m, `; I    WinNtIo->WinNtThunk->SPrintf (1 X/ }# }5 x$ `8 s" c5 S) R' k
                          Buffer,: D1 n) G6 u* r0 R2 k4 w
                          L"Diskfile%d",* ]9 T  ^8 _7 I! B& |
                          WinNtIo->InstanceNumber
* r; X6 B2 K, N7 p                          );
; \& ~; o: A5 r5 o  } else {
( u( ?& t& L2 u    if (*Str >= 'A' && *Str <= 'Z' || *Str >= 'a' && *Str <= 'z') {
4 |. J/ r. Z& H% r/ P& H( r      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\%c:", *Str);  K' B& C$ N- x1 \
    } else {
2 y! y. m8 B- w4 ?  Z      WinNtIo->WinNtThunk->SPrintf (Buffer, L"\\\\.\\PHYSICALDRIVE%c", *Str);
. R* d7 {0 e: ~( T; {& r2 i    }3 U7 V* y$ A- e! k
//create mapping . {9 {9 d+ H+ Q+ e- G+ T' |6 Q. d$ c
Status = WinNtBlockIoCreateMapping (
- v! S% D+ _* p+ x, J7 [9 ?0 Y2 G" b                    WinNtIo,3 L5 Y% s" Y, @7 [; ?8 N
                    Handle,9 W1 H6 s4 P% `) {  B& t( l
                    Buffer,
# |' y  ^  A6 d6 E                    WriteProtected,9 ]) ?9 C( g/ G+ J( A+ O
                    RemovableMedia,
$ W- L7 u: [0 A5 F2 ^+ k$ k                    NumberOfBlocks,: D+ m& G; [2 K2 t1 k
                    BlockSize,
: k* b' m7 _1 O7 b. `: P, ]0 ]                    DiskType
$ c' i- Z: R/ T  \3 S/ G3 @                    );
4 W8 c, i2 A) u+ M7 y//register read or write blocks function) U7 H& p$ G5 ]4 z. i( ~, `  ?& `/ z
BlockIo->ReadBlocks = WinNtBlockIoReadBlocks;5 `: ]5 r" {6 A/ v0 X. |( Q
BlockIo->WriteBlocks = WinNtBlockIoWriteBlocks;
( @' k% b. w; g
! k/ n: Q4 N  P7 q' X//in the WinNtBlockIoReadBlocks,read file API
0 f3 Q( k9 s) c8 P1 t$ K' RFlag = Private->WinNtThunk->ReadFile (Private->NtHandle, Buffer, (DWORD) BufferSize, (LPDWORD) &BytesRead, NULL);
3 B; R1 [  j# x5 a' Y1 b/ T7 c5 u$ Z7 \$ B8 m4 R# q
问题如下:
  m1 [5 D; c& c. U' g& ZEDK 的NT32下应该是不能对物理设备进行访问的,但是现在却可以访问一个物理disk,试问当connect controller to driver的时候,物理disk controller handle是怎么得到?希望高手解释一下啊
! d9 r* h, v- b. m2 y. a' m/ P! G* |; t# \$ \+ d
[ 本帖最后由 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.3 g4 b# X9 t  T: o$ {# B8 T% k- ]! [
0 i+ C0 ?4 E4 }/ j
参见 WinNtBusDriverBindingStart()
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 04:55 , Processed in 0.025955 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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