| 208 | } |
| 209 | |
| 210 | EFI_STATUS |
| 211 | SetFileData ( |
| 212 | IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, |
| 213 | IN CONST CHAR16 *FileName, |
| 214 | IN CONST VOID *Buffer, |
| 215 | IN UINT32 Size |
| 216 | ) |
| 217 | { |
| 218 | EFI_STATUS Status; |
| 219 | EFI_FILE_PROTOCOL *Fs; |
| 220 | EFI_FILE_PROTOCOL *File; |
| 221 | UINTN WrittenSize; |
| 222 | |
| 223 | if (WritableFs == NULL) { |
| 224 | Status = FindWritableFileSystem (&Fs); |
| 225 | if (EFI_ERROR(Status)) { |
| 226 | DEBUG ((DEBUG_VERBOSE, "OCFS: WriteFileData can't find writable FS\n")); |
| 227 | return Status; |
| 228 | } |
| 229 | } else { |
| 230 | Fs = WritableFs; |
| 231 | } |
| 232 | |
| 233 | Status = SafeFileOpen ( |
| 234 | Fs, |
| 235 | &File, |
| 236 | (CHAR16 *) FileName, |
| 237 | EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, |
| 238 | 0 |
| 239 | ); |
| 240 | |
| 241 | if (!EFI_ERROR(Status)) { |
| 242 | WrittenSize = Size; |
| 243 | Status = File->Write (File, &WrittenSize, (VOID *) Buffer); |
| 244 | Fs->Close (File); |
| 245 | |
| 246 | if (EFI_ERROR(Status)) { |
| 247 | DEBUG ((DEBUG_VERBOSE, "OCFS: WriteFileData file->Write returned %r\n", Status)); |
| 248 | } else if (WrittenSize != Size) { |
| 249 | DEBUG (( |
| 250 | DEBUG_VERBOSE, |
| 251 | "WriteFileData: File->Write truncated %u to %u\n", |
| 252 | Status, |
| 253 | Size, |
| 254 | (UINT32) WrittenSize |
| 255 | )); |
| 256 | Status = EFI_BAD_BUFFER_SIZE; |
| 257 | } |
| 258 | } else { |
| 259 | DEBUG ((DEBUG_VERBOSE, "OCFS: WriteFileData Fs->Open of %s returned %r\n", FileName, Status)); |
| 260 | } |
| 261 | |
| 262 | if (WritableFs == NULL) { |
| 263 | Fs->Close (Fs); |
| 264 | } |
| 265 | |
| 266 | return Status; |
| 267 | } |
no test coverage detected