| 529 | } |
| 530 | |
| 531 | BYTE *pfile_read(const char *pszName, DWORD *pdwLen) |
| 532 | { |
| 533 | DWORD save_num, nread; |
| 534 | char FileName[MAX_PATH]; |
| 535 | HANDLE archive, save; |
| 536 | BYTE *buf; |
| 537 | |
| 538 | pfile_strcpy(FileName, pszName); |
| 539 | save_num = pfile_get_save_num_from_name(plr[myplr]._pName); |
| 540 | archive = pfile_open_save_archive(NULL, save_num); |
| 541 | if (archive == NULL) |
| 542 | app_fatal("Unable to open save file archive"); |
| 543 | |
| 544 | if (!SFileOpenFileEx(archive, FileName, 0, &save)) |
| 545 | app_fatal("Unable to open save file"); |
| 546 | |
| 547 | *pdwLen = SFileGetFileSize(save, NULL); |
| 548 | if (*pdwLen == 0) |
| 549 | app_fatal("Invalid save file"); |
| 550 | |
| 551 | buf = (BYTE *)DiabloAllocPtr(*pdwLen); |
| 552 | if (!SFileReadFile(save, buf, *pdwLen, &nread, NULL)) |
| 553 | app_fatal("Unable to read save file"); |
| 554 | SFileCloseFile(save); |
| 555 | pfile_SFileCloseArchive(archive); |
| 556 | |
| 557 | { |
| 558 | char password[16] = PASSWORD_SINGLE; |
| 559 | DWORD nSize = 16; |
| 560 | |
| 561 | if (gbMaxPlayers > 1) |
| 562 | strcpy(password, PASSWORD_MULTI); |
| 563 | |
| 564 | *pdwLen = codec_decode(buf, *pdwLen, password); |
| 565 | if (*pdwLen == 0) { |
| 566 | app_fatal("Invalid save file"); |
| 567 | } |
| 568 | } |
| 569 | return buf; |
| 570 | } |
| 571 | |
| 572 | void pfile_update(BOOL force_save) |
| 573 | { |
no test coverage detected