|
发表于 2009-11-11 16:21:18
|
显示全部楼层
我寫了一個 File io 的 EFI shell app
/*
# r& S4 o, q1 V/ [( d* {% i * myfileio.c( t! L$ T4 q, t" c
* Apps
5 r& U7 g9 ~; j( f */
. k. B& D8 o1 s
" F; q, a7 D! j. t! f$ M: W1 v#include "efi.h"
8 ^! p; @6 s. p, o#include "efilib.h"
! C7 }3 y. L( p5 N4 T: F
3 s1 L: \9 b C; q: ]#define FILE_ATTRIB_CREATENEW EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE5 l( m3 D) B2 K7 a. v9 v, I
2 I$ |. Z8 g+ d3 I% s% astatic EFI_STATUS WaitForKeyOrReset(VOID)
; L8 w& j; ]* g5 C% [9 V! a7 v& ?( H{; y2 M! `. v# j! X7 J% }, g
EFI_STATUS Status; B3 | k. K @, D1 T+ a w
EFI_INPUT_KEY key;$ M+ n7 w7 Q$ R' K; G3 e8 y& D
UINTN index;
; Q ^$ T8 M) \7 d 8 ]2 _* o( U z! f* n0 }+ Z5 K* W
for(;;) { L- p$ V `3 z
Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key);& E6 U$ X4 @4 z" B! R
if (Status == EFI_NOT_READY)% x4 ~/ O6 E! R& p% z3 }% `2 S
BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index);
8 M$ T* i" A, T( o. G2 n7 K7 b else
( ^$ u1 U6 _1 @$ f2 G break;
. b3 o5 S% ^$ Z; s }
1 \) }, |, ]: [1 A4 i" T. t if (!EFI_ERROR(Status)) {
- H. f6 L4 S0 j if (key.ScanCode == SCAN_ESC)4 }" G- O$ D6 T- p# V
RT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL);
$ j# r5 w1 m9 ~: N( ^' i }
! N' [+ s3 E- C
; z9 n% x$ v1 h+ T return Status;& t0 M4 M& Y+ e9 C" E
}
3 C- U3 }5 c; T1 r+ ?7 Q* N9 ]
EFI_STATUS
% S* w( w5 ^1 ?, V T) w @EFIAPI' s2 i6 b8 n+ ^5 O2 K6 ^2 Z
MyfileioMain (IN EFI_HANDLE ImageHandle,
( H# o% @+ h$ A: S) | IN EFI_SYSTEM_TABLE *SystemTable) [. Y& B4 g0 T- n& x
{4 i& W' U) H1 D \0 ?+ H" N$ W
EFI_STATUS Status;4 m4 {& E& Q ?( c2 u3 j. \
EFI_HANDLE *DestAddr;
; V5 n2 z7 d) w0 y7 p EFI_LOADED_IMAGE *FileHandle01;( p$ l4 o; M" | C" _
EFI_DEVICE_PATH *FileHandle02; ! H( S/ _# f/ Q! h @; u% l
EFI_FILE_IO_INTERFACE *FileHandle03;0 c1 Q/ \5 {1 E) e- M' v& T
EFI_FILE *FileHandle04;
# `2 q# z0 J, G) L9 e# u EFI_FILE *FileHandle05;* y/ U" o5 a3 c8 ^
CHAR16 *FileName;0 z* p0 R, E' Z( x2 _
CHAR16 *BufferA, *BufferB, *BufferC, *Space_Key;! Z* F& ^5 O, Z- ]" O
UINTN BufferSize = 8, BufferSizeKeySpace = 2;3 \. }* E2 f' ^% d4 |0 E$ o1 h$ Y
int Bit0, Bit1, Key_Space; 5 t, G# J: r; r r
5 u8 {3 J, X* [4 n' Z FileName = L"NewFile.txt";
( G O$ B8 O4 t; A1 U Space_Key = L" ";
8 U2 X0 V. y2 y: e! Y0 ]5 X1 @) k
1 Z6 e5 e/ @0 a& o, y/ R8 G" A9 g m BufferA = L"ABCD";
" E1 g' B- A) m! k* W0 {+ x' y' n BufferB = L"EFGH";/ {$ E, Y9 P) W5 Z
BufferC = L"IJKL";
; [: _& G3 N0 e, o. S
) z/ Y' O0 t/ J+ b6 P& x5 a" H" r, \ Bit0 = 0xff;
2 ^. u/ L6 Q! x7 k+ ` Bit1 = 0xfe;1 [& S+ E' @- H7 `- ?( c& [
$ E# O4 P3 k6 u
Key_Space = 0x0020;
1 p3 ^6 p3 e' O1 V* P, H% K
4 c* h( x" d! a InitializeLib (ImageHandle, SystemTable); - Y; m# F. S A+ B
/ B3 F+ k' i' ?6 A5 x DestAddr = AllocatePool (BufferSize);
& O- N- t( {0 h3 H. r% n5 k2 V$ F, s+ O- `8 h
Print (L"Value of Bit0 is %x\n", Bit0);
6 ]: q1 g. e1 q( T1 i Print (L"Value of Bit1 is %x\n", Bit1);
?" @4 _2 {0 j0 g! U* g+ t0 ]8 k) n+ w# P4 ^1 ?) n
' f& Q0 X {" {- G Status = BS->HandleProtocol(ImageHandle, &LoadedImageProtocol, (VOID*)&FileHandle01);
2 D# f8 f" v& n. F9 Z5 S if (EFI_ERROR(Status)) {8 p3 t* G$ R# g2 K
Print (L"Could not obtain Image, FileHandle01 err code is %x\n",Status);2 L% V& t" s3 ]% ?8 ~( W
return EFI_LOAD_ERROR;
4 g `' M& @: q }$ V' z8 n K& }( ^6 e$ O' U
& M1 c, h( \4 h7 _8 E Status = BS->HandleProtocol(FileHandle01->DeviceHandle,&DevicePathProtocol,(VOID*)&FileHandle02);
% U) D: Q" R( y: R if (EFI_ERROR(Status)) {9 @( k3 D$ \' E
Print (L"Could not obtain Device Path, FileHandle02 err code is %x\n",Status);
1 Z$ @6 R" I1 M& ~% t* G! R return EFI_LOAD_ERROR;
3 Z+ M+ S! Z- E3 L! H* h }
3 x5 U; \) k) ]' C6 s1 U 9 N2 R" f2 @) B+ t2 @! e2 @
Status = BS->HandleProtocol (FileHandle01->DeviceHandle,&FileSystemProtocol,(VOID*)&FileHandle03);* h3 Q3 b" R/ c5 H! H( ^. G8 {
if (EFI_ERROR(Status)) {* o1 S1 r+ z* `( S
Print (L"Could not obtain File System, FileHandle03 err code is %x\n",Status);# u) j, q0 R0 a* R
return EFI_LOAD_ERROR;
+ i. ]/ h+ E8 U2 A/ L8 c5 ] }2 j% k+ [* ]" {. P6 ]( d
8 f# S0 V2 X$ M/ M4 x4 c& Z$ {, E Status = FileHandle03->OpenVolume(FileHandle03, &FileHandle04);
1 m. z+ p B8 x& d8 s4 S if (EFI_ERROR(Status)) {4 H+ U( ]6 V( c; D* s0 D
Print (L"Could not open volume, FileHandle04 err code is %x\n",Status);# {& z9 X% b3 ^, X3 d7 j" @6 X1 D
return EFI_LOAD_ERROR;
9 I4 i) K% M; u }
9 {! Y0 V5 ?2 N/ j/ Y3 \7 A% k / U0 \& Q1 R, j; }8 a
Status = FileHandle04->Open(FileHandle04, &FileHandle05, FileName, FILE_ATTRIB_CREATENEW, 0x20);
0 B! U2 y3 Y! [* s. B if (EFI_ERROR(Status)) {
: }$ c- B4 F4 g6 Z+ U" S) _ Print (L"Could not open file, FileHandle05 err code is %x\n",Status);
3 }5 R2 ~' S( Z; a0 Y return EFI_LOAD_ERROR;
/ L- B: F9 `; t* a }2 d8 l: t- A2 g
: ^ M3 z( d, v8 ? Status = FileHandle05->SetPosition(FileHandle05, 0); / V4 ~' j# @5 _0 j. V( B* i
if (EFI_ERROR(Status)) {! j7 Q0 r `: E$ ~8 e
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);! G h" O' U& }3 T( k5 |& ?
return EFI_SUCCESS;# y+ I, H. Q* w. @2 Y
}1 a. v. Z! |; m9 J/ {% e8 Y' M
# |+ Z' N O7 e9 Q, E: M' P# b' Z8 S z: Q
Status = FileHandle05->Write(FileHandle05, &BufferSize, &Bit0);+ b3 g( W7 Y" W8 W2 K6 t
Print (L"File Buffersize is %x\n\n", BufferSize);
% z9 V/ J5 d+ g: M- L% ]4 I# n if (EFI_ERROR(Status)) {
+ Q9 ]3 ~6 P0 L, c' M Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);+ |) g# s1 X n1 [2 {' w
return EFI_SUCCESS;
3 S2 V: W5 S$ D6 v G } 3 I O% o: z( A, s$ [( K/ G
3 P% v+ @/ F7 R! `/ A! s! l Status = FileHandle05->SetPosition(FileHandle05, 1);
0 P% p' X+ B6 ^- X if (EFI_ERROR(Status)) {
/ T5 W7 ]% b: O4 e0 H2 |" x) { Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);& _. g# U6 S- X
return EFI_SUCCESS;5 w; n3 n9 o* |
}
2 H% Y2 k4 z) F o, @9 @ . Z9 x3 }6 b' B8 \" z
Status = FileHandle05->Write(FileHandle05, &BufferSize, &Bit1);! i( `/ l9 P+ e* x9 e
Print (L"File Buffersize is %x\n\n", BufferSize);2 m. ?8 d1 r0 z9 B
if (EFI_ERROR(Status)) {
) e6 k- g& ^* T8 ?: `- s. z Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);
5 w" G$ j5 \4 }2 j: w return EFI_SUCCESS;5 \% V! n- z/ a& d
}
, k. {! Q% J' Y' m% Z/ E
2 o6 e; l3 n, g0 n( I' i8 W% i: } Status = FileHandle05->SetPosition(FileHandle05, 2);
8 U% L$ r* ]2 F( S if (EFI_ERROR(Status)) {, R6 c( C* P* m1 ?5 y2 J
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);7 m7 J. X8 l8 A8 }$ Y8 x
return EFI_SUCCESS;
4 Z, _% M: O' u }
( @* i5 e8 d& G/ q! h; z! W a ) [) l4 G* W; n( K
Status = FileHandle05->Write(FileHandle05, &BufferSize, BufferA);; X2 z- T4 I/ R2 ]" A _, A
Print (L"File Buffersize is %x\n\n", BufferSize);+ y) f* X/ N i* s8 H: r: a3 i9 V
if (EFI_ERROR(Status)) {5 K! ~+ ]/ M+ X0 \
Print (L"Could not write file, FileHandle05 err code is %x\n\n",Status);) J1 `/ T+ m2 Z. u6 ?6 L
return EFI_SUCCESS;
/ n$ k4 y/ p; V+ Y- `1 ?- G% n, t: d }
; P( r; ?. ~. F+ j, o3 z2 {; c - j/ t9 ~' G1 `; T5 B/ d- T
//--------------------------------------------------------------------------------------------------------------------------------------------------------------->>>+ w9 v9 z% {" u* T6 D
Print (L"Before Read FileHandle05 file Data of BufferB is %s\n\n",BufferB);
6 c1 i. v9 D8 w0 f" X! z Status = FileHandle05->SetPosition(FileHandle05, 2);
. o+ G. F( n& `, ?7 U if (EFI_ERROR(Status)) {
/ r5 a8 S4 f$ J+ v Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
; A5 u6 |) Q% J5 z* k& u return EFI_SUCCESS;
) `- o2 u$ U+ N; o4 x }
5 q, k1 [ w g) b/ T4 K5 Y/ b1 _) _, x3 b
Status = FileHandle05->Read(FileHandle05, &BufferSize, BufferB);- K7 o7 m( L! `3 h, j* \
if (EFI_ERROR(Status)) {) @, ^# l: e$ |( G- s d
Print (L"Could not read file, FileHandle05 err code is %x\n",Status);
9 L2 M4 F7 i! _/ Z! b return EFI_SUCCESS;+ A% d$ Z) n, Q- F
} 6 ?( z" m) }; o# |0 L Q, K6 ^
Print(L"1. After Read FileHandle05 file of Data of BufferSize is %d and Data of BufferB is %s\n\n", BufferSize, BufferB);
, R: M5 `& j, [2 X9 w$ m0 Y$ h0 I//---------------------------------------------------------------------------------------------------------------------------------------------------------------<<<
. t" p# x+ g( u5 x
$ S, k* j8 u! U* T5 L7 W* c4 ~ Status = FileHandle05->SetPosition(FileHandle05, 10); 2 }; ~0 E- s% n+ ^% r( h
if (EFI_ERROR(Status)) {
" N( x! p$ v) }) {6 I8 z0 F Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
0 y: o. {8 t! X6 d7 I6 Z. A5 q/ z: ] return EFI_SUCCESS;
/ }3 T& L( Z9 C! v& ` }
( K. r" G. u$ `0 e$ @
' z, Y! H- f# k Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);6 l1 o; _: V3 b+ R+ j
if (EFI_ERROR(Status)) {
. g8 X* A3 F: v$ J R+ O& {% J$ h8 U Print (L"Could not write file, FileHandle05 err code is %x\n",Status);4 T, g) k2 R" h3 V: ]3 c
return EFI_SUCCESS;
$ S1 h- D3 K' t }6 M$ o. T' h/ ?0 M0 D5 J
. i+ z' z5 q" _1 @% v6 v/ z Status = FileHandle05->SetPosition(FileHandle05, 12);
+ v/ W1 R4 m3 M8 R% N5 I% L if (EFI_ERROR(Status)) {0 r. w# i# u6 D% x/ T
Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
" W$ d1 S% w; S% |9 S; [9 l& _ return EFI_SUCCESS;
8 L& I8 ?+ k$ `" ], r }- B! r$ `% _7 e# L
& L: F/ b$ b% x- O/ e
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
! X. t5 N, k) s y if (EFI_ERROR(Status)) {
3 U) x) C8 B: S6 z9 M% _4 X I6 J Print (L"Could not write file, FileHandle05 err code is %x\n",Status); J x% d; O! O0 \, {% X$ z1 s
return EFI_SUCCESS;
. p# V( S* ^' I. u }) p" t% w ], B7 d
; ]; _! ~7 O" s6 m% Z
Status = FileHandle05->SetPosition(FileHandle05, 14); 4 k% f" Z9 d: x6 K
if (EFI_ERROR(Status)) {
8 Q& u, n8 z+ I3 \# h Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);& f) J% P6 L/ x0 w
return EFI_SUCCESS;
L5 K7 C; j& m6 A }8 l/ t! e: t2 N8 R3 C6 a7 D
; f. Y& J3 v7 w/ F
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);; t5 f9 S! z' f$ v; Q
if (EFI_ERROR(Status)) {7 K1 c0 f Q7 f- l
Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
# y5 R9 r, F" d4 N8 t1 x9 I return EFI_SUCCESS;
: ^ H! B- L: _: v/ d* j }
! [. j" W- q! B" {# a4 W% ]% i+ D8 Y$ W1 @1 p, j
Status = FileHandle05->SetPosition(FileHandle05, 16); / C5 d# Q: {0 s6 ~0 |
if (EFI_ERROR(Status)) {
: P5 R6 O) V3 X% R$ p Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
: ~8 O) r' z, F4 F8 f return EFI_SUCCESS;9 d c6 L a9 Y) ^0 T+ J% j
}
# t1 G6 N7 ^! V" l. g ' p$ b! L' {8 i, l: k x4 ^, E( I
Status = FileHandle05->Write(FileHandle05, &BufferSizeKeySpace, Space_Key);
1 a4 r9 D- E# c, r6 |, Y if (EFI_ERROR(Status)) {
4 R1 J2 L% ?2 l# Z* R. r! g Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
" J1 p% i$ w3 n }9 i _4 F return EFI_SUCCESS;
& [; O2 J" [5 D! F: S3 ^8 i } - {- B! Y6 f) {2 m5 y7 j7 ?
" z9 T1 f1 F0 k0 k9 {8 u3 K//---------------------------------------------------------------------------------------------------------------------------------------------------------------+ f4 y0 q0 r- q# Q- r. x
% q* o( Y- f; O7 W$ F- h, l! G2 \
Status = FileHandle05->SetPosition(FileHandle05, 18);
; y$ b7 N6 x) w1 |, D0 G3 P if (EFI_ERROR(Status)) {
6 j9 |. }1 b8 d2 S4 @, O0 E' u Print (L"Could not do SetPositioon to the file, FileHandle05 err code is %x\n",Status);
6 k* H/ Q7 f! q& N) l return EFI_SUCCESS;0 R+ {) G. q0 R% N
}
) u, O! g9 ?8 T4 `4 A6 H/ J/ S; L# H
. u) ? }" f! ^% T5 u p Status = FileHandle05->Write(FileHandle05, &BufferSize, BufferC);
h3 K6 c" {2 @6 `- h* p7 o9 ]$ W if (EFI_ERROR(Status)) {
$ Q; B/ i% ~4 \* i+ s" f+ y& H Print (L"Could not write file, FileHandle05 err code is %x\n",Status);
& _* z# R) R% h0 O0 z7 a return EFI_SUCCESS;. U, o4 V7 O4 _" x+ L2 d
}
) @# }: |1 q9 p$ W( O9 f
3 v% c' }8 o* e; A F* h& U FreePool(DestAddr); 2 Y9 _. G9 [* F2 q4 _. X
' D9 v( m! S, w
Status = FileHandle05->Close(FileHandle05);
3 b; n( K* P' O& u7 L& m* }1 O if (EFI_ERROR(Status)) {+ Z0 O( Z1 P# F! }
Print (L"Could not close file, FileHandle05 err code is %x\n",Status);
. T: W8 [( Q, C" G return EFI_SUCCESS;3 s& B: c9 H3 g- a$ a
}' @9 L* m7 V$ ?$ }( W9 D* E+ f
9 Q: R5 W: l* V& m- R; Q Print(L"File Name = %s has already been created.\n", FileName);
n! A- Q/ j% ]8 ^+ ^5 i
& d1 D& N2 p8 J4 S+ `* }6 _, g6 U Print(L"\nPress ESC to reboot or any other key to return control to the firmware.\n\n");
& v" g7 F1 f$ P8 G WaitForKeyOrReset();
3 U1 s! Y0 f! o" {2 ^' K
* B3 q% ~. q8 B, y6 E return Status;
0 H6 X9 u5 j8 D# l/ O} |
|