|
|
发表于 2009-11-11 16:21:18
|
显示全部楼层
我寫了一個 File io 的 EFI shell app
/*& B+ _/ m( Z' e! ~8 W
* myfileio.c' ?6 z+ D+ \( q
* Apps( _2 O, f4 w2 B8 F; _6 V8 \; v
*/
$ E7 @/ R# ^ z! ~" Y9 I/ h' ~$ S: I, I* s3 J, V4 t' g( C
#include "efi.h"
2 [2 c9 U) V( h7 n8 ?' n- r1 Z#include "efilib.h"$ U" b' U5 ~, B- R7 x
# N7 k( u, F+ x8 }. T `/ |#define FILE_ATTRIB_CREATENEW EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE8 \, `7 L- M! o; [: l. K& ]1 Z9 S
8 s: ?, E1 E2 o3 A' astatic EFI_STATUS WaitForKeyOrReset(VOID)
, w1 v' V8 l3 Q- P5 B" W) \{" u( J2 ]& e z" O" p: p* \
EFI_STATUS Status;
# P" U" O2 P6 A5 D0 K; q EFI_INPUT_KEY key;
- q0 G/ n* V* O& E# W( Y( ~, h UINTN index;7 y( l) v; | p
" E$ r; M n' u
for(;;) {1 f, f: @4 w) u9 G8 e7 C% s
Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key);& u; k, y5 d* K# R4 R
if (Status == EFI_NOT_READY)8 w2 d( z' r$ {: g: U1 c
BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index);
3 |2 H e# X1 a8 M/ M4 k else
) s' o$ M2 K7 g. t; }$ k: h break;
6 \8 Q: d; L8 r y; ?5 W# I! y }
* R0 N& ?, J _& P+ T2 O& S if (!EFI_ERROR(Status)) {& {1 G7 @, R$ b: _
if (key.ScanCode == SCAN_ESC)
) \+ e: m1 k: T RT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);. {4 b! u, R/ B. V
}
) I9 ]0 ?# w$ v |- ^! Y) N0 ]) n' a : X+ L4 ?( R9 L2 c
return Status;* @, S" \! d# ^* O' j
}
9 J! ]0 h% q8 v% ^% t& Z8 Z, V& y7 v( _* b2 Y1 @9 O' o
EFI_STATUS
0 d) `5 J" r" q" F3 \EFIAPI
" z$ {! c% L3 k A, p3 I: iMyfileioMain (IN EFI_HANDLE ImageHandle,& K5 P, O, T \' }8 ]
IN EFI_SYSTEM_TABLE *SystemTable)5 K# }8 G8 L9 |* y2 U1 e: A( X
{
" ~3 m0 P% Y# M3 j* Z. Q$ u7 S EFI_STATUS Status;
# N9 Z& N) Q- b! q/ r EFI_HANDLE *DestAddr;
# H: d+ E0 c4 @ EFI_LOADED_IMAGE *FileHandle01;0 \& D. ~4 y& |1 J$ v. U
EFI_DEVICE_PATH *FileHandle02;
. q" Y l" m8 i( _0 N z8 _ EFI_FILE_IO_INTERFACE *FileHandle03;
- \8 j) d# J+ k, v* x7 x% Y( U EFI_FILE *FileHandle04;4 h- F9 f- g& F5 N6 ]7 Q
EFI_FILE *FileHandle05;* u/ @! {& F4 S# F' p) D; i; I
CHAR16 *FileName;
* K& V6 J; Z* d; p. U* |1 s CHAR16 *BufferA, *BufferB, *BufferC, *Space_Key;' V4 K; @% r% Z, [% A6 ?
UINTN BufferSize = 8, BufferSizeKeySpace = 2;% ?2 F- y5 y8 _' O8 G
int Bit0, Bit1, Key_Space;
, x7 n, ]8 k: p' U* m9 e* H# V9 K; Z( ^( t5 ]" |
FileName = L"NewFile.txt";
4 y3 g& M2 X6 ^, L# W. O& | Space_Key = L" ";
I0 l+ z* n% x) X
; t) s( o: T, G% ]8 w BufferA = L"ABCD";
( X- w; |- g( s% [9 Y' U$ ~ BufferB = L"EFGH";" l5 U. i- l$ n% e
BufferC = L"IJKL";
; N3 G0 H5 ^& {. V( \* w2 }- S
+ P5 k8 _6 ^% E Bit0 = 0xff;! D2 z h' k) v t
Bit1 = 0xfe;) M% N* A4 |' M9 ?$ q. n' H- H) M* o) I' F
: p5 E) T1 F9 w- r. `( B
Key_Space = 0x0020;
; i# J' [- b4 v9 g& ]1 j$ p' p( p% s , D+ v( Y: X3 B# S; I; O
InitializeLib (ImageHandle, SystemTable);
8 e5 z. ~! R2 i5 x# g3 l/ S
3 o* M! O5 z( R8 } DestAddr = AllocatePool (BufferSize);
- c' L2 H1 Q8 u& f! x+ D5 e& s8 E" X' K+ O V+ |0 Y
Print (L"Value of Bit0 is %x\n", Bit0);3 g1 {' `1 N( {+ i- I) T* z
Print (L"Value of Bit1 is %x\n", Bit1); " x9 w3 d6 e( b; Z
4 k1 i- I) h: h& V
( J1 |. U% o: I! _1 @4 K- E Status = BS->HandleProtocol(ImageHandle, &LoadedImageProtocol, (VOID*)&FileHandle01);
' Y, M* P9 p' e' y) }: { if (EFI_ERROR(Status)) {
4 g$ [3 {1 h7 B, ~ Print (L"Could not obtain Image, FileHandle01 err code is %x\n",Status);
$ I X! J; ?$ f, w- B" M! E return EFI_LOAD_ERROR;
: K" B2 Q. H7 g) p/ O+ ?0 a$ j }
# [. p6 R5 |3 t8 O/ R
: y6 q& J1 d- {2 ^+ m Status = BS->HandleProtocol(FileHandle01->DeviceHandle,&DevicePathProtocol,(VOID*)&FileHandle02); N/ `+ `. A4 X* d2 D+ ?
if (EFI_ERROR(Status)) {
$ W5 Z, h! U$ ]' C) i& T1 a$ f! N Print (L"Could not obtain Device Path, FileHandle02 err code is %x\n",Status);7 V+ z3 O3 R7 u# N
return EFI_LOAD_ERROR;
1 J7 M' l) ~- ^* m0 K" [ }
* m. n7 Y7 I8 \3 H5 P
# ?4 L5 U. h7 C! K. ?& Y* z Status = BS->HandleProtocol (FileHandle01->DeviceHandle,&FileSystemProtocol,(VOID*)&FileHandle03);
, W7 k: c+ I' H; ^4 v if (EFI_ERROR(Status)) {
h) v. s' w: b# ?, P' C Print (L"Could not obtain File System, FileHandle03 err code is %x\n",Status);6 |" m3 Y; }5 _$ y; t" |$ n4 d) G6 r T
return EFI_LOAD_ERROR;
" A& B w+ P/ K* q( l }; h- Y( p" W4 G5 a8 j( j" v" U! p% v
* [2 T6 y: S9 d& Z' U( K; l( _8 o
Status = FileHandle03->OpenVolume(FileHandle03, &FileHandle04);
! t0 d0 j* z& m. l if (EFI_ERROR(Status)) {; F) J% k3 G$ g. |0 x5 \; N
Print (L"Could not open volume, FileHandle04 err code is %x\n",Status);- i I5 M: D' M' o8 y' i8 w
return EFI_LOAD_ERROR;
! e# a, J% T0 M- H# } } 6 S, a8 G1 S5 C0 e$ g* h
2 G u6 w' g8 a1 g Status = FileHandle04->Open(FileHandle04, &FileHandle05, FileName, FILE_ATTRIB_CREATENEW, 0x20);9 c1 e. Y3 ], S/ F5 J
if (EFI_ERROR(Status)) {8 a( e6 R2 s1 s8 x! u, S
Print (L"Could not open file, FileHandle05 err code is %x\n",Status);/ g! x/ \- I3 C; ^
return EFI_LOAD_ERROR;$ g7 h8 n6 [& q
}
: |5 U& ]1 M4 `) S" E% B& d
( J# v8 \4 I- Q [+ h8 w Status = FileHandle05->SetPosition(FileHandle05, 0);
. I+ f9 f7 n# G. X6 P K if (EFI_ERROR(Status)) {
+ e! ?6 Y( e' j) u% _0 x( |5 Y! e Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
2 y1 p) ]+ \2 |( v6 l* i5 b return EFI_SUCCESS;- ]0 Y( {! E$ F1 d: R# r
}. c8 w8 v7 d( {9 T" q
( Q5 t* m# T5 B# F7 l( k
Status = FileHandle05->Write(FileHandle05, &BufferSize, &Bit0);
) ]4 V' v9 g+ e+ Q# {5 R Print (L"File Buffersize is %x\n\n", BufferSize);
; `( y) N" p2 V$ u- Z% k2 w1 b if (EFI_ERROR(Status)) {
* {9 S6 z4 Z5 y! D1 @2 |$ O5 k0 Y Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);
. @! }" }* r+ W! V. m: s return EFI_SUCCESS;. b1 V4 }- ?' B# O7 b
} & X) v' s6 ?7 F
; i* C7 ^! N/ w. \5 k: j
Status = FileHandle05->SetPosition(FileHandle05, 1); 6 x; d- _8 s6 r( X. ?6 b* x& H
if (EFI_ERROR(Status)) {( N1 L9 L5 S5 L. Q2 ?) V2 n" a
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
+ I0 n) \, D" D r+ B1 ^0 c4 h return EFI_SUCCESS;4 p2 `( Z) G0 C% P, M+ I- o& i
}. q* x! U8 V/ R' s5 I( T( z# V
7 l0 s/ H1 n0 S" B7 [6 T Status = FileHandle05->Write(FileHandle05, &BufferSize, &Bit1);: M: R8 N. ]2 N8 }7 ^; G* X$ L
Print (L"File Buffersize is %x\n\n", BufferSize);
7 y7 t0 m" y, _. W' s if (EFI_ERROR(Status)) {2 w! Z( X. K' v( c: c3 L( @
Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);
y' A% } j6 r1 b6 y return EFI_SUCCESS;
0 U1 t7 }' y& w: b }
8 q$ c) y& k* Z' |# s1 @
/ q$ U! F& Y2 e' g$ V- W# X Status = FileHandle05->SetPosition(FileHandle05, 2); " }5 _( ^! r& \0 P
if (EFI_ERROR(Status)) {
2 K+ ]. p$ K' s Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);0 b2 W* S' w( t! r/ a7 q9 F, F
return EFI_SUCCESS;
: }0 K6 i- s8 a) x1 P( k" A$ f1 U }5 u2 }% s# N7 ?; k
/ b# w; u8 h4 c' B9 p2 h; d3 n Status = FileHandle05->Write(FileHandle05, &BufferSize, BufferA);
7 I) z& i" Q6 C3 F# _* Q# Q Print (L"File Buffersize is %x\n\n", BufferSize);
4 V; p. y# S/ d5 v/ N9 y/ _ if (EFI_ERROR(Status)) {& _2 e+ U( z' ~2 N3 J6 k1 _6 l
Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);8 C' _6 t2 Q/ @+ \
return EFI_SUCCESS;
4 W6 A4 L7 \0 i' e8 N- t }
& n8 y& x1 W* I; ~$ J* C5 C3 m 2 T) }) z5 A: h8 C) G+ q; b- |1 J1 ?
//--------------------------------------------------------------------------------------------------------------------------------------------------------------->>>
2 [$ t% q. I" X3 Q Print (L"Before Read FileHandle05 file Data of BufferB is %s\n\n",BufferB);
" _9 m+ |( C& _: M& F Status = FileHandle05->SetPosition(FileHandle05, 2);
( T- n: U, w1 H$ h' t- a$ o; B if (EFI_ERROR(Status)) {
4 p6 v# U& n( N4 p+ H Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
9 ~/ y; n8 p7 j8 `! n- K" u7 M return EFI_SUCCESS;' ~2 c* k' B C
}& P8 d7 j5 h8 F9 k
. _( [( j( |2 z1 L/ J* P$ E Status = FileHandle05->Read(FileHandle05, &BufferSize, BufferB);+ b+ Y) a" ?1 B; s! d/ Z
if (EFI_ERROR(Status)) {
$ U0 l" U6 l: o# g) H9 ~. Q Print (L"Could not read file, FileHandle05 err code is %x\n",Status);1 x; A( X; s- S" d6 @9 R
return EFI_SUCCESS;8 ~$ A* s% [1 S
}
8 P6 `* } u a) g( Y4 U3 w# B Print(L"1. After Read FileHandle05 file of Data of BufferSize is %d and Data of BufferB is %s\n\n", BufferSize, BufferB);
( {! l" X Q( G, v* i- v//---------------------------------------------------------------------------------------------------------------------------------------------------------------<<<' ~0 [) U+ t3 N0 z. ^3 ~. \- r
1 C3 {, z' n( K- h5 S* K$ X
Status = FileHandle05->SetPosition(FileHandle05, 10); 4 f* q( w k% o/ D" B6 ]
if (EFI_ERROR(Status)) {
8 Q; z/ F% ]! w0 { Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
" z6 ^* r. c! i, o return EFI_SUCCESS;. o6 {+ S0 d+ S% a: A# ` E
}
% p4 b( A7 ^- |- y& y- i: s# A
1 } |1 z, X$ @# v Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
$ M" k+ {7 E! O, [* M if (EFI_ERROR(Status)) {
9 R3 i3 b. [! m. u }' f- P Print (L"Could not write file, FileHandle05 err code is %x\n",Status);- |; y# B+ g, ]
return EFI_SUCCESS;
! q9 w( F( U! R. v0 b" M }. p8 ?9 r# G' `: R7 R
9 c9 |7 p5 y# T- j1 z% `
Status = FileHandle05->SetPosition(FileHandle05, 12); 7 U/ T" }; g6 K E
if (EFI_ERROR(Status)) {
5 o# g. Q' U$ k; L- H Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
% D- Q( O6 L% S7 o return EFI_SUCCESS;- m' }0 t; F' w
}
: ^& x m, K' Z, H0 S* T: i9 T* [ 6 _ j5 `/ M" u6 H& [
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
" n8 Q# @, x# I9 S if (EFI_ERROR(Status)) {
/ T: b" p* f( r) ] Print (L"Could not write file, FileHandle05 err code is %x\n",Status);5 S* o" t7 }6 G
return EFI_SUCCESS;
7 e5 T/ M" C6 m, o2 q }! a8 t0 {. U& J1 O7 d* j* ?+ f: u
" O% R) W) P1 ^' }
Status = FileHandle05->SetPosition(FileHandle05, 14);
+ q0 V O( V' J8 D" ~% J6 N if (EFI_ERROR(Status)) {
, D b+ y1 l5 r+ u$ u" u Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);" c" K; @' m& {/ \( H8 y* ~9 E' V
return EFI_SUCCESS;- w. j2 V. x& V1 Q% j! Z" _0 o, q4 A
}
8 j+ I. z I) [6 U8 x; _ * r0 O/ }5 S' w# I: v
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
' K+ Z# |5 ?$ T4 G! ~; v7 z. j if (EFI_ERROR(Status)) {
7 M8 n7 k3 y1 V! d1 t- a0 n Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
/ k% L% b! L' ]) H* x' V8 [% a return EFI_SUCCESS;. \, E9 V7 P f8 p; a
}. f: G/ K$ p1 |1 X) F
( c4 j* w9 t) S Status = FileHandle05->SetPosition(FileHandle05, 16); * l' U: `9 G ?6 T- |
if (EFI_ERROR(Status)) {
y5 K+ s# c @) M$ A' y Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);/ n. o" _; ^. l. t
return EFI_SUCCESS;
* M9 s9 i5 y+ ]# V$ G) C# S6 e }
, m- I. G t0 M: [( W, b) K8 ^ 4 r( _; i3 a4 o. ]6 B- @- z" _
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
4 q' G; y' c( q; ?7 f+ n( M if (EFI_ERROR(Status)) { }/ r) C+ Z- e9 h% b# l
Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
: l2 o9 b) W3 U1 A6 e return EFI_SUCCESS;$ n V3 _9 D' ?8 `6 S, k
}
; a9 L. o6 g. l5 Q" O. \2 E) u2 ]
//---------------------------------------------------------------------------------------------------------------------------------------------------------------/ l- x. v' d6 B- S0 \
2 I2 Y+ t( w1 ^7 v, D ^ Status = FileHandle05->SetPosition(FileHandle05, 18);
% J# G B P% M) N }0 L if (EFI_ERROR(Status)) {" D1 n9 H' \- w, s4 G! ?
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);% V0 Y) p' v+ d1 M
return EFI_SUCCESS;
; r$ F, I+ x [4 J; T/ x' h- u }2 [5 ~( ?( o+ h: F% B
( B( W+ e3 h# O' E$ ?. \; f& T3 J Status = FileHandle05->Write(FileHandle05, &BufferSize, BufferC);
/ [0 Z2 X$ R$ U3 E if (EFI_ERROR(Status)) {
! c) d7 J, X8 H; j Print (L"Could not write file, FileHandle05 err code is %x\n",Status);% B/ C5 O! j5 g L
return EFI_SUCCESS;
6 h6 ]* H$ E) m% x' p4 f } 6 q9 B- g1 t8 m; w% Y/ i" W- H9 G- Q
) S+ a: i, \7 [/ H: _
FreePool(DestAddr); 6 a( X% e p* g; k) _
' |' R% x3 ?/ {, C6 A Status = FileHandle05->Close(FileHandle05); `3 } b& r4 _/ Y( C+ f+ _
if (EFI_ERROR(Status)) {7 U% f( m6 B3 `% x1 d+ p1 S- ^- D
Print (L"Could not close file, FileHandle05 err code is %x\n",Status);5 ?& {$ u$ {; ~5 ^# p
return EFI_SUCCESS;
2 R' ?4 @ a3 J5 \4 p3 g0 s$ g }
# Q" ^7 X# |& x/ u3 v' B
/ p8 x7 Q) w0 f' T }9 V4 _7 H/ R Print(L"File Name = %s has already been created.\n", FileName);
' a. B: h4 \3 q9 Y2 d. d& } m* N. [9 w# b) {
Print(L"\nPress ESC to reboot or any other key to return control to the firmware.\n\n");0 i8 D! _3 p- d" R
WaitForKeyOrReset();
6 J( Y1 [4 O/ ]0 T8 G( ?
' w# s% Y# m1 x+ w Y" Y3 u1 f return Status;2 G! N" `! k0 `0 o! e
} |
|