|
|
发表于 2009-11-11 16:21:18
|
显示全部楼层
我寫了一個 File io 的 EFI shell app
/*
' y3 M7 d/ i# B; G% D * myfileio.c
* r" A* e" f0 |5 K * Apps
) R4 k' |+ U) L& F. Y: H- {/ N% w */5 K- I# I/ p! z+ ]* i m
, M! d7 p% O2 g5 R0 H
#include "efi.h"+ Q4 A* c3 L5 h: @5 _0 J) V+ ^4 Y
#include "efilib.h"8 U. t/ s" |& v; Q: j$ R
0 \7 L/ t, c# H+ C# U#define FILE_ATTRIB_CREATENEW EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE
2 e+ l9 G8 F: u6 T$ e, m* _! \! o! M0 g7 D2 B! ~) w, ~6 _/ L! g
static EFI_STATUS WaitForKeyOrReset(VOID)$ c; U. B9 E. T) u6 U, e
{- A7 R4 m; J2 ~3 m3 ~
EFI_STATUS Status;" _! O- N& c% _2 W( y$ G3 _" x3 e- W
EFI_INPUT_KEY key;9 j- H0 Y+ Q" M3 t' n
UINTN index;" S0 ?* q6 T/ L {, X! y
! O' j4 k7 T+ E# R2 J8 s( L9 }
for(;;) {$ g' F" M! f! N6 a, t9 D z1 T1 z9 Y8 J
Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key);6 [* R3 r' B& U5 j) p
if (Status == EFI_NOT_READY)
0 R$ U. Q6 t- x! e" }4 J# Q BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index);
7 U& b: O, }0 q( q7 H- I. g4 p else
6 [- a1 X" c0 `, N break;% [7 n; w* l" Y0 Z- C% s
}, G9 B, V4 _; z1 w4 r& S
if (!EFI_ERROR(Status)) {( W+ k9 w% Q4 m6 ]# E
if (key.ScanCode == SCAN_ESC)
3 l- j$ ^' d1 a5 r8 v' V! [4 D RT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);
9 y0 I, e" @- A2 V5 X }4 E. e" D3 k' o% y' c5 \) C5 s
) _4 ^$ U1 ~! e% e {" L: t
return Status;
{* y! ^& G. ]2 h# X9 Y& E& }+ R}2 q: l+ A" O, g/ ]
6 _, w( A4 |* i( O( o0 Z* ]
EFI_STATUS; J3 a2 d& u# R
EFIAPI
! }, Z1 m0 T$ H8 T8 @7 P5 I% S9 rMyfileioMain (IN EFI_HANDLE ImageHandle,
6 g4 L; J. t5 g; B8 w: ` IN EFI_SYSTEM_TABLE *SystemTable)4 A5 h* a: V3 K
{+ }' Q' f; y% ~
EFI_STATUS Status;- }, w+ U3 |/ [& G* O5 [8 O% b# F
EFI_HANDLE *DestAddr; 7 ^4 v' w- R* U1 _& h) T
EFI_LOADED_IMAGE *FileHandle01;
- E- a4 H5 P. ?! r EFI_DEVICE_PATH *FileHandle02; 5 f( f) ~5 d1 u. H9 m$ F; H6 \
EFI_FILE_IO_INTERFACE *FileHandle03;9 E6 H7 O1 B; a' l/ X
EFI_FILE *FileHandle04;
) W& a; X M& u% z EFI_FILE *FileHandle05;
% ~ W* U( U! N9 \1 ?$ G6 j CHAR16 *FileName;' S2 ]4 D6 J: ^3 v2 W/ t
CHAR16 *BufferA, *BufferB, *BufferC, *Space_Key;* M7 [: @" v3 M" s, x: C
UINTN BufferSize = 8, BufferSizeKeySpace = 2;
8 {) H) X& ?6 \( x- d; r int Bit0, Bit1, Key_Space;
% L$ A! X0 A. m* @/ ?+ u, ?+ T
: ~5 T6 N9 A/ }/ P$ A' {! D: d( A FileName = L"NewFile.txt";
* w6 H5 w8 J$ X* t7 e4 k) @ Space_Key = L" ";3 E7 ~/ X; b$ A! Y
2 n4 Q7 r& n: c; L0 Q6 U
BufferA = L"ABCD";0 F. T8 n& y% X6 _' Q' f( J
BufferB = L"EFGH";
E+ B: G8 Y3 q1 W BufferC = L"IJKL";6 U3 C( g* q }7 b9 k
+ D. N0 k \( e2 L
Bit0 = 0xff;
# {/ x, t4 a) f' _% B Bit1 = 0xfe;
- S8 B, M2 P* M. ^; D 1 x% U0 P" }. m5 u' w. z
Key_Space = 0x0020;
6 {0 J; n4 v, A+ m, l1 b5 ^. f
7 W7 }2 v+ @3 t4 O" ] InitializeLib (ImageHandle, SystemTable);
5 s+ G! i/ s" B! a, B6 z3 z5 L- Q6 j
$ f0 Z2 F8 g8 e! j DestAddr = AllocatePool (BufferSize); ! S# s& Z$ I- p+ ]( [; Q4 i
) b( D0 {7 u: D% H
Print (L"Value of Bit0 is %x\n", Bit0);
- p' y3 G8 ~' T, Z Print (L"Value of Bit1 is %x\n", Bit1);
' U ?6 S! \" B
% _! }. X; L$ w; d0 K2 ^ " j5 n+ G- O- o; o& v
Status = BS->HandleProtocol(ImageHandle, &LoadedImageProtocol, (VOID*)&FileHandle01);- V( |; G' U% _( m0 `
if (EFI_ERROR(Status)) {# @' N) m0 X* O3 ^( \; u* D
Print (L"Could not obtain Image, FileHandle01 err code is %x\n",Status);
7 i% J8 S- V0 F5 G2 l5 }) T return EFI_LOAD_ERROR;+ c3 I0 F' z7 s% D4 p0 A
}
' b* [7 v8 J2 M& U' H" v7 b5 N0 z- v9 v9 S4 r
Status = BS->HandleProtocol(FileHandle01->DeviceHandle,&DevicePathProtocol,(VOID*)&FileHandle02);. g9 K$ B- `. U9 c8 i& M) y
if (EFI_ERROR(Status)) {2 s2 c% G+ J7 e/ t+ c' s% o
Print (L"Could not obtain Device Path, FileHandle02 err code is %x\n",Status);3 R" q4 O9 j: x7 x- }6 g2 w
return EFI_LOAD_ERROR;- Y' L" K9 p* B. s
} , \' w$ |8 w; ^+ M. N' m3 ^: s/ C
- O D3 [; t) Y- G8 D3 ^" w Status = BS->HandleProtocol (FileHandle01->DeviceHandle,&FileSystemProtocol,(VOID*)&FileHandle03);: t7 K" t$ e2 B' N
if (EFI_ERROR(Status)) {
" `! _, e9 I& t5 N, s8 y: c' q6 g Print (L"Could not obtain File System, FileHandle03 err code is %x\n",Status);( o: h3 q0 w! q+ f9 ?$ [
return EFI_LOAD_ERROR;
0 \1 E+ P# n2 c8 W }
% g7 l1 J @( j. W: p8 g; Z: H8 S7 f0 x8 n6 W
Status = FileHandle03->OpenVolume(FileHandle03, &FileHandle04);
; F; g$ X( r& O" C if (EFI_ERROR(Status)) {
4 M+ S4 J3 A; l. f) n8 c( ]" R Print (L"Could not open volume, FileHandle04 err code is %x\n",Status);* Y$ b& c k( t8 D
return EFI_LOAD_ERROR;$ K: a. o! H' L8 V0 l$ Y
}
7 |+ A E( s. x, m v 4 x# d# a4 j9 r- n; u, ~% w) v
Status = FileHandle04->Open(FileHandle04, &FileHandle05, FileName, FILE_ATTRIB_CREATENEW, 0x20);4 E* W1 h* P6 C, V! ?. |8 i
if (EFI_ERROR(Status)) {, B% Q" v( D, C( l; L
Print (L"Could not open file, FileHandle05 err code is %x\n",Status);
$ F3 X7 z) x$ n, K; S return EFI_LOAD_ERROR;0 |0 }& n% M9 I0 o4 L8 C
}
( Y# R% H5 l1 J5 M |7 Z. I: R ( c# v) N J3 U7 }( A
Status = FileHandle05->SetPosition(FileHandle05, 0); # W2 }4 ], F# Q$ `: z! B1 j. m
if (EFI_ERROR(Status)) {
4 G- ~6 ^# N( C7 N' ` Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
3 b2 o1 X' T( y7 t6 L* k return EFI_SUCCESS;
; e- n, [' L# H. T1 B }) @4 U+ f$ t8 t" K# A0 w: P
7 [, I' M% Y6 X& P% K# d% P Status = FileHandle05->Write(FileHandle05, &BufferSize, &Bit0);
5 u* n: h5 ~0 p2 _( Q Print (L"File Buffersize is %x\n\n", BufferSize);
# O' O; }! f- r: B if (EFI_ERROR(Status)) {1 @ _2 q& w0 B" H
Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);0 f( j5 F* t' _0 Y" D, Y% }
return EFI_SUCCESS;8 Q. E- c: V4 m
}
+ g4 E D; O8 L0 r: O9 }* R+ T9 x4 Y7 y
Status = FileHandle05->SetPosition(FileHandle05, 1); : Z/ q! Z% ?) l2 u! T$ }+ E
if (EFI_ERROR(Status)) {) _+ |/ v7 W8 D/ ~; U( {8 [5 l2 k
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
1 ~; i/ h, H) e) y return EFI_SUCCESS;0 f* F+ y( q1 b2 ?+ Q
}
- T) E9 y2 r8 o( b" G) g
) w1 F; S# Q x$ \/ k9 P1 j Status = FileHandle05->Write(FileHandle05, &BufferSize, &Bit1);
, ]$ d* k& n8 ? Print (L"File Buffersize is %x\n\n", BufferSize);( z0 o8 H d9 O) o$ @5 y+ T3 t! `
if (EFI_ERROR(Status)) {( ]: U0 I% r$ e& n$ T2 h9 N
Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);5 f& X4 }6 d% n
return EFI_SUCCESS;
+ T6 O3 U4 ?0 G; | P, Z3 s }
- Y* o1 t7 o( j/ s; N0 e , l1 J ~1 O* I. M
Status = FileHandle05->SetPosition(FileHandle05, 2);
: G! ]$ y" N2 O2 P; F if (EFI_ERROR(Status)) {
$ T3 \& k9 t" u% j2 ]* ?, j Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);3 q3 W4 T( {) _ x+ C2 ]
return EFI_SUCCESS;( ^5 ~) X6 l9 X1 c9 `/ h
}
$ j& ^% d, K) C% J' ?$ e7 q
6 O* Y1 U" [' p6 l# r' e; w+ G5 W Status = FileHandle05->Write(FileHandle05, &BufferSize, BufferA);
4 v6 Q6 p r: y( ]5 j Print (L"File Buffersize is %x\n\n", BufferSize);
6 K# D3 G) }6 u% ?5 \ if (EFI_ERROR(Status)) {
\' }! ~ [$ @$ ^ Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);6 Z7 u7 h' y+ P% |
return EFI_SUCCESS;
# q: [. u/ }' @% w" C: w } : w6 J+ E( p/ `9 d4 ^' J! d
. s. Q% P3 }' o" S" C
//--------------------------------------------------------------------------------------------------------------------------------------------------------------->>>
+ m" O; B& b+ B1 Y Print (L"Before Read FileHandle05 file Data of BufferB is %s\n\n",BufferB);
: \" w% q0 f5 D; ^1 i) e" }$ ` Status = FileHandle05->SetPosition(FileHandle05, 2); 6 u! q: o- H* [1 i& f( U/ w
if (EFI_ERROR(Status)) {" r( M |' l8 T3 x( J, m
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
* g9 D5 c+ x; |+ s9 C$ @6 T# ~ return EFI_SUCCESS;- l9 Z3 `! [ o6 X2 r0 J7 \
}+ G2 t; T& t `2 ~. ]
s1 X0 a5 B7 X; {2 E- {
Status = FileHandle05->Read(FileHandle05, &BufferSize, BufferB);' G# M( h: C9 M& Q+ `7 K
if (EFI_ERROR(Status)) {
% Q* K$ r) q& b: y P Print (L"Could not read file, FileHandle05 err code is %x\n",Status);
: Q9 s0 L& e# }+ t8 m: m return EFI_SUCCESS;/ E: q$ u; L) v0 `7 z4 s8 {
} i: m' ~" w: a" m3 X, J3 P
Print(L"1. After Read FileHandle05 file of Data of BufferSize is %d and Data of BufferB is %s\n\n", BufferSize, BufferB);7 f3 [" T" R4 I+ U s
//---------------------------------------------------------------------------------------------------------------------------------------------------------------<<<
+ _0 _/ l4 d$ {+ m; D8 R2 |, Y# z; t" ~% u
Status = FileHandle05->SetPosition(FileHandle05, 10);
0 H. E+ L5 c. I; l) J if (EFI_ERROR(Status)) { X/ P- H. g: W. [2 i; G6 o
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);+ n) @) c4 c" o9 ?
return EFI_SUCCESS;, R, q( S4 x( \; M, B
}- a: v: R/ J9 `6 K: [
, a: I7 E, {7 J; k( v
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
; I" L, L1 {) r( b( J if (EFI_ERROR(Status)) {
, V1 z$ s( b& ^( e: q; T0 v Print (L"Could not write file, FileHandle05 err code is %x\n",Status);6 `( V- {- y) P0 x6 d+ L
return EFI_SUCCESS;
# v6 |5 u( \# p }! i1 a8 P) X' f3 p; V ~
+ |2 G/ {7 @ A N5 U Status = FileHandle05->SetPosition(FileHandle05, 12); % A @6 K J. k" L0 }
if (EFI_ERROR(Status)) {- j, Q0 D2 r6 Q' [! t0 H9 I
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
. C# w( d6 A7 b. k# a+ m A" F' U return EFI_SUCCESS;) W; n# N. @/ {* i1 w
}# U, j5 A, W9 \* L
8 `" v4 U: n- |6 D Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);. C5 V9 I$ ?/ T2 ?7 u# @
if (EFI_ERROR(Status)) {$ w; b2 L8 c; i: o6 [. l
Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
$ _( K0 j( b2 }5 Y7 Y5 n m! N return EFI_SUCCESS;
' A$ w D% @2 }/ B* k5 C }- V; m9 x5 m, P* \& x1 ~$ O: F
; [' ]2 _) C! Y; ? Q" y
Status = FileHandle05->SetPosition(FileHandle05, 14);
7 G! n& e4 T5 B1 p& u r if (EFI_ERROR(Status)) {
0 {! w) T2 p4 E4 w Z( j. h3 q Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);1 T" y& q2 G7 U! b. @/ R. z0 _
return EFI_SUCCESS; k( w' z1 S( B" {
}
+ M# w) ^5 w$ d- T' f / N7 k! j* y* i& Y' E7 n
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);9 W2 E1 @% ]; @ o( \8 \3 L
if (EFI_ERROR(Status)) {
3 o! V! e* g& c0 b; i Print (L"Could not write file, FileHandle05 err code is %x\n",Status);+ P N3 v: V5 C( k4 C
return EFI_SUCCESS;
( T9 J, ~. S1 y0 M }
% t8 P0 d8 K- w, k/ q* t, D9 E# q4 j5 w: Y; |& Q* _
Status = FileHandle05->SetPosition(FileHandle05, 16); # u& W4 [' o2 }% a# u4 Y% S
if (EFI_ERROR(Status)) {
5 g( K" z7 V! `, N8 G8 X Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);2 N; A: O o& u# P$ K
return EFI_SUCCESS;$ P3 X, i e3 T! w- m' j
}
. k/ @ N" g4 g' F
0 I* F, l# X2 S Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);$ ^$ h! a/ O" G% S7 s$ V1 D
if (EFI_ERROR(Status)) {5 R$ N+ d/ B, L8 m( B
Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
6 {/ z5 E8 O$ W- R0 o return EFI_SUCCESS;4 h2 {! j& Q# C- \0 _
} : D5 ^ [/ J' p7 M4 L( N
( t m2 C! ?8 D4 L
//---------------------------------------------------------------------------------------------------------------------------------------------------------------" I0 [$ P/ N: y7 S5 @
. G! s; o( h, A1 W
Status = FileHandle05->SetPosition(FileHandle05, 18);
/ u% j: _& G- F3 ?' q$ J0 r+ V, \ if (EFI_ERROR(Status)) {8 C6 {( c! V& z# B- k
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
' O& O. {+ ]" O( v& P6 ^7 v% p return EFI_SUCCESS;
8 y u6 a* e$ }- f; F& y5 t1 n8 G6 f }
8 g( s( X* X' T7 Q
5 d2 B) u4 m0 a1 J" g# V2 @ Status = FileHandle05->Write(FileHandle05, &BufferSize, BufferC);8 k- C" S2 r {" e" H
if (EFI_ERROR(Status)) {
+ V: r% A; P. F8 ^# q Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
! W6 K H) O- u; A, a* M return EFI_SUCCESS;0 j& ?" u6 d3 e6 [0 Z3 `
}
! {# b; N1 H# a) s2 ]' e0 \ - X i2 C7 z4 I1 I; j9 K6 m! o
FreePool(DestAddr); ! ? S; h1 F7 B6 n, ]- }
; f" I6 y3 y2 X( {. X) _ Status = FileHandle05->Close(FileHandle05);% e q( ]- ~' H+ k& ~, ^
if (EFI_ERROR(Status)) {
1 g+ G) |8 z; P2 K% r: b0 D Print (L"Could not close file, FileHandle05 err code is %x\n",Status);
8 a. U, I* F$ B/ ]: w return EFI_SUCCESS;, g; ]2 k6 m! b
}
/ [) i( S" T; |9 [, |# I( {- r
2 A/ r4 R+ t, {) O Print(L"File Name = %s has already been created.\n", FileName);3 Y/ }9 U, `& I; X4 Y6 S y
. T* i0 p T1 V( j1 N5 {: k4 v Print(L"\nPress ESC to reboot or any other key to return control to the firmware.\n\n");
- c: T( I/ m" [ WaitForKeyOrReset();. v% A0 {- Y0 U, n
8 h: m+ ?. U) _% y X* \ return Status;
+ H: A C+ R4 W( l4 ?} |
|