Changeset 3642 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Jun 1, 2000, 1:28:48 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r3593 r3642 1 /* $Id: oslibdos.cpp,v 1.2 8 2000-05-23 18:45:12sandervl Exp $ */1 /* $Id: oslibdos.cpp,v 1.29 2000-06-01 11:28:47 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 33 33 #include "dbglocal.h" 34 34 35 static PROC_DosSetFileSizeL DosSetFileSizeLProc = 0; 36 static PROC_DosSetFilePtrL DosSetFilePtrLProc = 0; 37 static PROC_DosSetFileLocksL DosSetFileLocksLProc = 0; 38 static BOOL f64BitIO = FALSE; 39 //****************************************************************************** 40 //****************************************************************************** 41 void OSLibInitWSeBFileIO() 42 { 43 HMODULE hDoscalls; 44 45 if(DosQueryModuleHandle("DOSCALLS", &hDoscalls) != NO_ERROR) { 46 return; 47 } 48 if(DosQueryProcAddr(hDoscalls, 989, NULL, (PFN *)&DosSetFileSizeLProc) != NO_ERROR) { 49 return; 50 } 51 if(DosQueryProcAddr(hDoscalls, 988, NULL, (PFN *)&DosSetFilePtrLProc) != NO_ERROR) { 52 return; 53 } 54 if(DosQueryProcAddr(hDoscalls, 986, NULL, (PFN *)&DosSetFileLocksLProc) != NO_ERROR) { 55 return; 56 } 57 f64BitIO = TRUE; 58 } 59 //****************************************************************************** 60 //****************************************************************************** 61 APIRET OdinDosSetFileSizeL(HFILE hFile, LONGLONG cbSize) 62 { 63 APIRET yyrc; 64 USHORT sel = RestoreOS2FS(); 65 66 yyrc = DosSetFileSizeLProc(hFile, cbSize); 67 SetFS(sel); 68 69 return yyrc; 70 } 71 //****************************************************************************** 72 //****************************************************************************** 73 APIRET OdinDosSetFilePtrL(HFILE hFile, LONGLONG ib, ULONG method, PLONGLONG ibActual) 74 { 75 APIRET yyrc; 76 USHORT sel = RestoreOS2FS(); 77 78 yyrc = DosSetFilePtrLProc(hFile, ib, method, ibActual); 79 SetFS(sel); 80 81 return yyrc; 82 } 83 //****************************************************************************** 84 //****************************************************************************** 85 APIRET OdinDosSetFileLocksL(HFILE hFile, PFILELOCKL pflUnlock, PFILELOCKL pflLock, 86 ULONG timeout, ULONG flags) 87 { 88 APIRET yyrc; 89 USHORT sel = RestoreOS2FS(); 90 91 yyrc = DosSetFileLocksLProc(hFile, pflUnlock, pflLock, timeout, flags); 92 SetFS(sel); 93 94 return yyrc; 95 } 35 96 //****************************************************************************** 36 97 // translate OS/2 error codes to Windows codes … … 42 103 { 43 104 case NO_ERROR: //0 44 return ERROR_SUCCESS_W; 105 return ERROR_SUCCESS_W; 106 107 case ERROR_INVALID_FUNCTION: //1 108 return ERROR_INVALID_FUNCTION_W; 45 109 46 110 case ERROR_FILE_NOT_FOUND: //2 47 return ERROR_FILE_NOT_FOUND_W;111 return ERROR_FILE_NOT_FOUND_W; 48 112 49 113 case ERROR_PATH_NOT_FOUND: //3 50 return ERROR_PATH_NOT_FOUND_W; 114 return ERROR_PATH_NOT_FOUND_W; 115 116 case ERROR_TOO_MANY_OPEN_FILES: //4 117 return ERROR_TOO_MANY_OPEN_FILES_W; 51 118 52 119 case ERROR_ACCESS_DENIED: //5 53 return ERROR_ACCESS_DENIED_W;120 return ERROR_ACCESS_DENIED_W; 54 121 55 122 case ERROR_INVALID_HANDLE: //6 56 return ERROR_INVALID_HANDLE_W;123 return ERROR_INVALID_HANDLE_W; 57 124 58 125 case ERROR_NOT_ENOUGH_MEMORY: //8 59 return ERROR_NOT_ENOUGH_MEMORY_W;126 return ERROR_NOT_ENOUGH_MEMORY_W; 60 127 61 128 case ERROR_BAD_FORMAT: //11 62 return ERROR_BAD_FORMAT_W; 129 return ERROR_BAD_FORMAT_W; 130 131 case ERROR_INVALID_ACCESS: //12 132 return ERROR_INVALID_ACCESS_W; 63 133 64 134 case ERROR_NO_MORE_FILES: //18 65 return ERROR_NO_MORE_FILES_W; 135 return ERROR_NO_MORE_FILES_W; 136 137 case ERROR_WRITE_PROTECT: //19 138 return ERROR_WRITE_PROTECT_W; 66 139 67 140 case ERROR_NOT_DOS_DISK: //26 68 return ERROR_NOT_DOS_DISK_W; 141 return ERROR_NOT_DOS_DISK_W; 142 143 case ERROR_WRITE_FAULT: //29 144 return ERROR_WRITE_FAULT_W; 145 146 case ERROR_SHARING_VIOLATION: //32 147 return ERROR_SHARING_VIOLATION_W; 148 149 case ERROR_LOCK_VIOLATION: //32 150 return ERROR_LOCK_VIOLATION_W; 151 152 case ERROR_SHARING_BUFFER_EXCEEDED: //36 153 return ERROR_SHARING_BUFFER_EXCEEDED_W; 154 155 case ERROR_CANNOT_MAKE: //82 156 return ERROR_CANNOT_MAKE_W; 69 157 70 158 case ERROR_OUT_OF_STRUCTURES: //84 71 return ERROR_OUT_OF_STRUCTURES_W;159 return ERROR_OUT_OF_STRUCTURES_W; 72 160 73 161 case ERROR_INVALID_PARAMETER: //87 74 return ERROR_INVALID_PARAMETER_W;162 return ERROR_INVALID_PARAMETER_W; 75 163 76 164 case ERROR_INTERRUPT: //95 77 return ERROR_INVALID_AT_INTERRUPT_TIME_W; //CB: right??? 165 return ERROR_INVALID_AT_INTERRUPT_TIME_W; //CB: right??? 166 167 case ERROR_DEVICE_IN_USE: //99 168 return ERROR_DEVICE_IN_USE_W; 78 169 79 170 case ERROR_DRIVE_LOCKED: //108 80 return ERROR_DRIVE_LOCKED_W;171 return ERROR_DRIVE_LOCKED_W; 81 172 82 173 case ERROR_BROKEN_PIPE: //109 83 return ERROR_BROKEN_PIPE_W; 174 return ERROR_BROKEN_PIPE_W; 175 176 case ERROR_OPEN_FAILED: //110 177 return ERROR_OPEN_FAILED_W; 84 178 85 179 case ERROR_BUFFER_OVERFLOW: //111 86 return ERROR_BUFFER_OVERFLOW_W; 180 return ERROR_BUFFER_OVERFLOW_W; 181 182 case ERROR_DISK_FULL: //112 183 return ERROR_DISK_FULL_W; 87 184 88 185 case ERROR_NO_MORE_SEARCH_HANDLES: //113 89 return ERROR_NO_MORE_SEARCH_HANDLES_W;186 return ERROR_NO_MORE_SEARCH_HANDLES_W; 90 187 91 188 case ERROR_SEM_TIMEOUT: //121 92 return ERROR_SEM_TIMEOUT_W; 189 return ERROR_SEM_TIMEOUT_W; 190 191 case ERROR_DIRECT_ACCESS_HANDLE: //130 192 return ERROR_DIRECT_ACCESS_HANDLE_W; 193 194 case ERROR_NEGATIVE_SEEK: //131 195 return ERROR_NEGATIVE_SEEK; 196 197 case ERROR_SEEK_ON_DEVICE: //132 198 return ERROR_SEEK_ON_DEVICE_W; 93 199 94 200 case ERROR_DISCARDED: //157 95 return ERROR_DISCARDED_W;201 return ERROR_DISCARDED_W; 96 202 97 203 case ERROR_FILENAME_EXCED_RANGE: //206 98 return ERROR_FILENAME_EXCED_RANGE_W;204 return ERROR_FILENAME_EXCED_RANGE_W; 99 205 100 206 case ERROR_META_EXPANSION_TOO_LONG: //208 101 return ERROR_META_EXPANSION_TOO_LONG_W;207 return ERROR_META_EXPANSION_TOO_LONG_W; 102 208 103 209 case ERROR_BAD_PIPE: //230 104 return ERROR_BAD_PIPE_W;210 return ERROR_BAD_PIPE_W; 105 211 106 212 case ERROR_PIPE_BUSY: //231 107 return ERROR_PIPE_BUSY_W; 213 return ERROR_PIPE_BUSY_W; 214 215 case ERROR_NO_DATA: //232 216 return ERROR_NO_DATA_W; 108 217 109 218 case ERROR_PIPE_NOT_CONNECTED: //233 110 return ERROR_PIPE_NOT_CONNECTED_W;219 return ERROR_PIPE_NOT_CONNECTED_W; 111 220 112 221 case ERROR_MORE_DATA: //234 113 return ERROR_MORE_DATA_W;222 return ERROR_MORE_DATA_W; 114 223 115 224 case ERROR_INVALID_EA_NAME: //254 116 return ERROR_INVALID_EA_NAME_W;225 return ERROR_INVALID_EA_NAME_W; 117 226 118 227 case ERROR_EA_LIST_INCONSISTENT: //255 119 return ERROR_EA_LIST_INCONSISTENT_W;228 return ERROR_EA_LIST_INCONSISTENT_W; 120 229 121 230 case ERROR_EAS_DIDNT_FIT: //275 122 return ERROR_EAS_DIDNT_FIT;231 return ERROR_EAS_DIDNT_FIT; 123 232 124 233 default: 125 return defaultCode; 234 dprintf(("WARNING: error2WinError: error %d not included!!!!", rc)); 235 return defaultCode; 126 236 } 127 237 } … … 382 492 //****************************************************************************** 383 493 //****************************************************************************** 384 DWORD OSLibDosRead(DWORD hFile, LPVOID lpBuffer, DWORD size, DWORD *nrBytesRead) 385 { 386 return DosRead(hFile, lpBuffer, size, nrBytesRead); 387 } 388 //****************************************************************************** 389 //****************************************************************************** 390 DWORD OSLibDosWrite(DWORD hFile, LPVOID lpBuffer, DWORD size, DWORD *nrBytesWritten) 391 { 392 return DosWrite(hFile, lpBuffer, size, nrBytesWritten); 494 BOOL OSLibDosRead(DWORD hFile, LPVOID lpBuffer, DWORD size, DWORD *nrBytesRead) 495 { 496 APIRET rc; 497 498 rc = DosRead(hFile, lpBuffer, size, nrBytesRead); 499 SetLastError(error2WinError(rc)); 500 return (rc == NO_ERROR); 501 } 502 //****************************************************************************** 503 //****************************************************************************** 504 BOOL OSLibDosWrite(DWORD hFile, LPVOID lpBuffer, DWORD size, DWORD *nrBytesWritten) 505 { 506 APIRET rc; 507 508 rc = DosWrite(hFile, lpBuffer, size, nrBytesWritten); 509 SetLastError(error2WinError(rc)); 510 return (rc == NO_ERROR); 393 511 } 394 512 //****************************************************************************** … … 421 539 //****************************************************************************** 422 540 //****************************************************************************** 423 DWORD OSLibDosDelete(char *lpszFileName) 424 { 425 return DosDelete(lpszFileName); 541 BOOL OSLibDosDelete(char *lpszFileName) 542 { 543 APIRET rc; 544 545 rc = DosDelete(lpszFileName); 546 if(rc) { 547 SetLastError(error2WinError(rc)); 548 return FALSE; 549 } 550 return TRUE; 426 551 } 427 552 //****************************************************************************** … … 552 677 //****************************************************************************** 553 678 //****************************************************************************** 554 DWORD OSLibDosCreate(CHAR *lpFileName, 555 DWORD dwAccess, 556 DWORD dwShare, 557 LPSECURITY_ATTRIBUTES lpSecurityAttributes, 558 DWORD dwCreation, 559 DWORD dwFlags, 560 HANDLE hTemplate, 561 DWORD *dwFile) 562 { 563 APIRET rc; 564 HFILE hFile; 565 ULONG ulAction=0; 566 DWORD os2Attrib=0; 567 DWORD os2Flags = 0; //OPEN_FLAGS_NOINHERIT; 568 DWORD os2Open=0; 569 570 if(dwAccess == (GENERIC_READ_W | GENERIC_WRITE_W)) 571 os2Flags |= OPEN_ACCESS_READWRITE; 572 else if(dwAccess & GENERIC_WRITE_W) 573 os2Flags |= OPEN_ACCESS_WRITEONLY; 574 else if(dwAccess & GENERIC_READ_W) 575 os2Flags |= OPEN_ACCESS_READONLY; 576 577 if(dwShare == 0) 578 os2Flags |= OPEN_SHARE_DENYREADWRITE; 579 else if(dwShare == (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W)) 580 os2Flags |= OPEN_SHARE_DENYNONE; 581 else if(dwShare & FILE_SHARE_READ_W) 582 os2Flags |= OPEN_SHARE_DENYWRITE; 583 else if(dwShare & FILE_SHARE_WRITE_W) 584 os2Flags |= OPEN_SHARE_DENYREAD; 585 586 if(dwCreation == CREATE_NEW_W) 587 os2Open = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; 588 else if(dwCreation == CREATE_ALWAYS_W) 589 os2Open = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; 590 else if(dwCreation == OPEN_EXISTING_W) 591 os2Open = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW; 592 else if(dwCreation == OPEN_ALWAYS_W) 593 os2Open = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; 594 else if(dwCreation == TRUNCATE_EXISTING_W) 595 os2Open = OPEN_ACTION_REPLACE_IF_EXISTS;// |OPEN_ACTION_FAIL_IF_NEW; 596 597 if(dwFlags & FILE_ATTRIBUTE_READONLY_W) 598 os2Attrib |= FILE_READONLY; 599 if(dwFlags & FILE_ATTRIBUTE_HIDDEN_W) 600 os2Attrib |= FILE_HIDDEN; 601 if(dwFlags & FILE_ATTRIBUTE_SYSTEM_W) 602 os2Attrib |= FILE_SYSTEM; 603 if(dwFlags & FILE_ATTRIBUTE_DIRECTORY_W) 604 os2Attrib |= FILE_DIRECTORY; 605 if(dwFlags & FILE_ATTRIBUTE_ARCHIVE_W) 606 os2Attrib |= FILE_ARCHIVED; 607 if(dwFlags & FILE_ATTRIBUTE_NORMAL_W) 608 os2Attrib |= FILE_NORMAL; 609 610 if(dwFlags & FILE_FLAG_WRITE_THROUGH_W) 611 os2Flags |= OPEN_FLAGS_WRITE_THROUGH; 612 if(dwFlags & FILE_FLAG_NO_BUFFERING_W) 613 os2Flags |= OPEN_FLAGS_NO_CACHE; 614 if(dwFlags & FILE_FLAG_RANDOM_ACCESS_W) 615 os2Flags |= OPEN_FLAGS_RANDOM; 616 if(dwFlags & FILE_FLAG_SEQUENTIAL_SCAN_W) 617 os2Flags |= OPEN_FLAGS_SEQUENTIAL; 618 619 // TODO: 620 // if(dwFlags & FILE_FLAG_OVERLAPPED_W) 621 // if(dwFlags & FILE_FLAG_DELETE_ON_CLOSE_W 622 623 rc = DosOpen(lpFileName, &hFile, &ulAction, 0, 624 os2Attrib, os2Open, os2Flags, 0); 625 626 if(rc) 627 { 628 // TODO: TEST TEST 629 dprintf(("DosOpen Error rc:%d, try without GENERIC_WRITE_W", rc)); 630 if(dwAccess & GENERIC_WRITE_W) 631 os2Flags &= ~(OPEN_ACCESS_READWRITE | OPEN_ACCESS_WRITEONLY); 632 rc = DosOpen(lpFileName, &hFile, &ulAction, 0, 633 os2Attrib, os2Open, os2Flags, 0); 634 if(rc) 635 { 636 dprintf(("DosOpen Error rc:%d os2Attrib:%X os2Open:%X os2Flags:%X", 637 rc, os2Attrib, os2Open, os2Flags)); 638 hFile = -1; 639 } 640 } 641 642 *dwFile = hFile; 643 return rc; 644 } 645 //****************************************************************************** 646 //(without changing file pointer) 647 //****************************************************************************** 648 DWORD OSLibDosGetFileSize(DWORD hFile) 649 { 650 FILESTATUS3 fsts3ConfigInfo = {{0}}; 651 ULONG ulBufSize = sizeof(FILESTATUS3); 652 653 DosQueryFileInfo(hFile, FIL_STANDARD, &fsts3ConfigInfo, ulBufSize); 654 return fsts3ConfigInfo.cbFile; 679 APIRET OSLibDosQueryPathInfo(PSZ pszPathName, 680 ULONG ulInfoLevel, 681 PVOID pInfoBuf, 682 ULONG cbInfoBuf) 683 { 684 APIRET rc = DosQueryPathInfo( pszPathName, ulInfoLevel, 685 pInfoBuf, cbInfoBuf ); 686 687 if(rc == ERROR_TOO_MANY_OPEN_FILES) 688 { 689 LONG reqCount = 2; 690 ULONG maxFiles; 691 692 if(DosSetRelMaxFH(&reqCount, &maxFiles) == NO_ERROR) 693 rc = DosQueryPathInfo(pszPathName, ulInfoLevel, 694 pInfoBuf, cbInfoBuf ); 695 } 696 return rc; 697 } 698 //****************************************************************************** 699 //****************************************************************************** 700 DWORD OSLibDosCreateFile(CHAR *lpszFile, 701 DWORD fuAccess, 702 DWORD fuShare, 703 LPSECURITY_ATTRIBUTES lpSecurityAttributes, 704 DWORD fuCreate, 705 DWORD fuAttrFlags, 706 HANDLE hTemplateFile) 707 { 708 HFILE hFile; 709 ULONG actionTaken = 0; 710 ULONG fileSize = 0; 711 ULONG fileAttr = FILE_NORMAL; 712 ULONG openFlag = 0; 713 ULONG openMode = 0; 714 APIRET rc = ERROR_NOT_ENOUGH_MEMORY;; 715 716 //TODO: lpSecurityAttributes (inheritance) 717 718 if(fuAttrFlags & FILE_ATTRIBUTE_ARCHIVE_W) 719 fileAttr |= FILE_ARCHIVED; 720 if(fuAttrFlags & FILE_ATTRIBUTE_HIDDEN_W) 721 fileAttr |= FILE_HIDDEN; 722 if(fuAttrFlags & FILE_ATTRIBUTE_SYSTEM_W) 723 fileAttr |= FILE_SYSTEM; 724 if(fuAttrFlags & FILE_ATTRIBUTE_READONLY_W) 725 fileAttr |= FILE_READONLY; 726 // TODO: FILE_ATTRIBUTE_TEMPORARY_W 727 728 switch(fuCreate) 729 { 730 case CREATE_NEW_W: 731 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_FAIL_IF_EXISTS; 732 break; 733 case CREATE_ALWAYS_W: 734 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; 735 break; 736 case OPEN_EXISTING_W: 737 openFlag |= OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; 738 break; 739 case OPEN_ALWAYS_W: 740 openFlag |= OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; 741 break; 742 case TRUNCATE_EXISTING_W: 743 openFlag |= OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; 744 break; 745 } 746 747 if(fuAttrFlags & FILE_FLAG_WRITE_THROUGH_W) openMode |= OPEN_FLAGS_WRITE_THROUGH; 748 if(fuAttrFlags & FILE_FLAG_NO_BUFFERING_W) openMode |= OPEN_FLAGS_NO_CACHE; 749 if(fuAttrFlags & FILE_FLAG_RANDOM_ACCESS_W) openMode |= OPEN_FLAGS_RANDOM; 750 if(fuAttrFlags & FILE_FLAG_SEQUENTIAL_SCAN_W) openMode |= OPEN_FLAGS_SEQUENTIAL; 751 // TODO: FILE_FLAG_BACKUP_SEMANTICS_W 752 // FILE_FLAG_POSIX_SEMANTICS_W are not supported 753 754 if(fuShare == 0) 755 openMode |= OPEN_SHARE_DENYREADWRITE; 756 else 757 if(fuShare == (FILE_SHARE_READ_W | FILE_SHARE_WRITE_W)) 758 openMode |= OPEN_SHARE_DENYNONE; 759 else 760 if(fuShare & FILE_SHARE_READ_W) 761 openMode |= OPEN_SHARE_DENYWRITE; 762 else 763 if(fuShare & FILE_SHARE_WRITE_W) 764 openMode |= OPEN_SHARE_DENYREAD; 765 766 if(fuAccess == (GENERIC_READ_W | GENERIC_WRITE_W)) 767 openMode |= OPEN_ACCESS_READWRITE; 768 else 769 if(fuAccess & GENERIC_READ_W) 770 openMode |= OPEN_ACCESS_READONLY; 771 else 772 if(fuAccess & GENERIC_WRITE_W) 773 openMode |= OPEN_ACCESS_WRITEONLY; 774 775 int retry = 0; 776 while(retry < 2) 777 { 778 rc = DosOpen((PSZ)lpszFile, 779 &hFile, 780 &actionTaken, 781 fileSize, 782 fileAttr, 783 openFlag, 784 openMode, 785 NULL); 786 if(rc == ERROR_TOO_MANY_OPEN_FILES) 787 { 788 ULONG CurMaxFH; 789 LONG ReqCount = 32; 790 791 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH); 792 if(rc) { 793 dprintf(("DosSetRelMaxFH returned %d", rc)); 794 SetLastError(ERROR_TOO_MANY_OPEN_FILES_W); 795 return INVALID_HANDLE_VALUE_W; 796 } 797 dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH)); 798 } 799 else break; 800 retry++; 801 } 802 803 if(rc) 804 { 805 SetLastError(error2WinError(rc)); 806 return INVALID_HANDLE_VALUE_W; 807 } 808 SetLastError(ERROR_SUCCESS_W); 809 return hFile; 810 } 811 //****************************************************************************** 812 //****************************************************************************** 813 DWORD OSLibDosOpenFile(CHAR *lpszFile, UINT fuMode) 814 { 815 ULONG actionTaken = 0; 816 ULONG fileSize = 0; 817 ULONG fileAttr = FILE_NORMAL; 818 ULONG openFlag = 0; 819 ULONG openMode = 0; 820 APIRET rc = ERROR_NOT_ENOUGH_MEMORY; 821 HFILE hFile; 822 823 if(!(fuMode & (OF_CREATE_W | OF_READWRITE_W | OF_WRITE_W))) 824 { 825 openMode |= OPEN_ACCESS_READONLY; 826 openFlag |= OPEN_ACTION_OPEN_IF_EXISTS; 827 } 828 else 829 { 830 if(fuMode & OF_CREATE_W) { 831 openFlag |= OPEN_ACTION_CREATE_IF_NEW | 832 OPEN_ACTION_REPLACE_IF_EXISTS; 833 } 834 else openFlag |= OPEN_ACTION_OPEN_IF_EXISTS; //180575 835 836 if(fuMode & OF_READWRITE_W) 837 openMode |= OPEN_ACCESS_READWRITE; 838 else 839 if(fuMode & OF_WRITE_W) 840 openMode |= OPEN_ACCESS_WRITEONLY; 841 else 842 if(fuMode & OF_CREATE_W) 843 openMode |= OPEN_ACCESS_READWRITE; 844 } 845 846 if((fuMode & OF_SHARE_DENY_WRITE_W) || 847 !(fuMode & (OF_SHARE_DENY_READ_W | OF_SHARE_DENY_NONE_W | OF_SHARE_EXCLUSIVE_W))) 848 openMode |= OPEN_SHARE_DENYWRITE; 849 else 850 if (fuMode & OF_SHARE_DENY_NONE_W) 851 openMode |= OPEN_SHARE_DENYNONE; 852 else 853 if (fuMode & OF_SHARE_DENY_READ_W) 854 openMode |= OPEN_SHARE_DENYREAD; 855 else 856 if (fuMode & OF_SHARE_EXCLUSIVE_W) 857 openMode |= OPEN_SHARE_DENYREADWRITE; 858 859 rc = DosOpen((PSZ)lpszFile, 860 &hFile, 861 &actionTaken, 862 fileSize, 863 fileAttr, 864 openFlag, 865 openMode, 866 NULL); 867 868 if(rc != NO_ERROR) 869 { 870 if(fuMode & OF_EXIST_W) 871 { 872 if(rc == ERROR_OPEN_FAILED || rc == ERROR_FILE_NOT_FOUND) 873 { 874 SetLastError(ERROR_FILE_NOT_FOUND_W); 875 return HFILE_ERROR_W; 876 } 877 } 878 if((rc == ERROR_OPEN_FAILED) && (openFlag & OPEN_ACTION_OPEN_IF_EXISTS)) 879 { 880 SetLastError(ERROR_FILE_NOT_FOUND_W); 881 } 882 else SetLastError(error2WinError(rc)); 883 884 return HFILE_ERROR_W; 885 } 886 SetLastError(ERROR_SUCCESS_W); 887 return hFile; 888 } 889 //****************************************************************************** 890 //****************************************************************************** 891 BOOL OSLibDosLockFile(DWORD hFile, DWORD dwFlags, 892 DWORD OffsetLow, DWORD OffsetHigh, 893 DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, 894 LPOVERLAPPED lpOverlapped) 895 { 896 APIRET rc; 897 898 // Set 5 secs timeout for locking file and no other can access this 899 // file region 900 901 if(lpOverlapped) {//TODO: 902 dprintf(("OSLibDosLockFile: overlapped lock not yet implemented!!")); 903 } 904 //TODO: Locking region crossing end of file is permitted. Works in OS/2?? 905 if(f64BitIO) 906 { 907 FILELOCKL lockRangeL; 908 909 lockRangeL.lOffset.ulLo = OffsetLow; 910 lockRangeL.lOffset.ulHi = OffsetHigh; 911 lockRangeL.lRange.ulLo = nNumberOfBytesToLockLow; 912 lockRangeL.lRange.ulHi = nNumberOfBytesToLockHigh; 913 914 rc = OdinDosSetFileLocksL(hFile, NULL, &lockRangeL, 915 (dwFlags & LOCKFILE_FAIL_IMMEDIATELY_W) ? 0 : 5000, 0); 916 } 917 else 918 { 919 FILELOCK lockRange = { OffsetLow, nNumberOfBytesToLockLow }; 920 921 rc = DosSetFileLocks(hFile, NULL, &lockRange, 922 (dwFlags & LOCKFILE_FAIL_IMMEDIATELY_W) ? 0 : 5000, 0); 923 } 924 if(rc) { 925 SetLastError(error2WinError(rc)); 926 return FALSE; 927 } 928 SetLastError(ERROR_SUCCESS_W); 929 return TRUE; 930 } 931 //****************************************************************************** 932 //****************************************************************************** 933 BOOL OSLibDosUnlockFile(DWORD hFile, DWORD OffsetLow, DWORD OffsetHigh, 934 DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, 935 LPOVERLAPPED lpOverlapped) 936 { 937 APIRET rc; 938 939 // Set 5 secs timeout for unlocking file and no other can access this 940 // file region 941 942 if(lpOverlapped) {//TODO: 943 dprintf(("OSLibDosUnlockFile: overlapped unlock not yet implemented!!")); 944 } 945 if(f64BitIO) 946 { 947 FILELOCKL unlockRangeL; 948 949 unlockRangeL.lOffset.ulLo = OffsetLow; 950 unlockRangeL.lOffset.ulHi = OffsetHigh; 951 unlockRangeL.lRange.ulLo = nNumberOfBytesToLockLow; 952 unlockRangeL.lRange.ulHi = nNumberOfBytesToLockHigh; 953 954 rc = OdinDosSetFileLocksL(hFile, &unlockRangeL, NULL, 5000, 0); 955 } 956 else 957 { 958 FILELOCK unlockRange = { OffsetLow, nNumberOfBytesToLockLow }; 959 960 rc = DosSetFileLocks(hFile, &unlockRange, NULL, 5000, 0); 961 } 962 if(rc) { 963 SetLastError(error2WinError(rc)); 964 return FALSE; 965 } 966 SetLastError(ERROR_SUCCESS_W); 967 return TRUE; 968 } 969 //****************************************************************************** 970 //****************************************************************************** 971 BOOL OSLibDosFlushFileBuffers(DWORD hFile) 972 { 973 APIRET rc; 974 975 rc = DosResetBuffer(hFile); 976 SetLastError(error2WinError(rc)); 977 return (rc == NO_ERROR); 978 } 979 //****************************************************************************** 980 //****************************************************************************** 981 DWORD OSLibDosGetFileSize(DWORD hFile, LPDWORD lpdwFileSizeHigh) 982 { 983 APIRET rc; 984 ULONG sizeLow; 985 986 if(f64BitIO) 987 { 988 FILESTATUS3L fsts3ConfigInfoL = {{0}}; 989 ULONG ulBufSize = sizeof(FILESTATUS3L); 990 991 rc = DosQueryFileInfo(hFile, FIL_STANDARDL, &fsts3ConfigInfoL, ulBufSize); 992 if(lpdwFileSizeHigh) { 993 *lpdwFileSizeHigh = fsts3ConfigInfoL.cbFile.ulHi; 994 } 995 sizeLow = fsts3ConfigInfoL.cbFile.ulLo; 996 } 997 else 998 { 999 FILESTATUS3 fsts3ConfigInfo = {{0}}; 1000 ULONG ulBufSize = sizeof(FILESTATUS3); 1001 1002 if(lpdwFileSizeHigh) { 1003 *lpdwFileSizeHigh = 0; 1004 } 1005 rc = DosQueryFileInfo(hFile, FIL_STANDARD, &fsts3ConfigInfo, ulBufSize); 1006 sizeLow = fsts3ConfigInfo.cbFile; 1007 } 1008 if(rc) { 1009 SetLastError(error2WinError(rc)); 1010 return -1; 1011 } 1012 SetLastError(ERROR_SUCCESS_W); 1013 return sizeLow; 1014 } 1015 //****************************************************************************** 1016 //****************************************************************************** 1017 DWORD OSLibDosSetFilePointer(DWORD hFile, DWORD OffsetLow, DWORD *OffsetHigh, DWORD method) 1018 { 1019 LONGLONG offsetL; 1020 LONGLONG newoffsetL; 1021 APIRET rc; 1022 DWORD newoffset; 1023 1024 switch(method) { 1025 case FILE_BEGIN_W: 1026 method = FILE_BEGIN; 1027 break; 1028 1029 case FILE_CURRENT_W: 1030 method = FILE_CURRENT; 1031 break; 1032 1033 case FILE_END_W: 1034 method = FILE_END; 1035 break; 1036 } 1037 if(f64BitIO) { 1038 offsetL.ulLo = OffsetLow; 1039 offsetL.ulHi = (OffsetHigh) ? *OffsetHigh : 0; 1040 rc = OdinDosSetFilePtrL(hFile, offsetL, method, &newoffsetL); 1041 if(OffsetHigh) { 1042 *OffsetHigh = newoffsetL.ulHi; 1043 } 1044 newoffset = newoffsetL.ulLo; 1045 } 1046 else rc = DosSetFilePtr(hFile, OffsetLow, method, &newoffset); 1047 if(rc) { 1048 SetLastError(error2WinError(rc)); 1049 return -1; 1050 } 1051 SetLastError(ERROR_SUCCESS_W); 1052 return newoffset; 1053 } 1054 //****************************************************************************** 1055 //****************************************************************************** 1056 BOOL OSLibDosSetEndOfFile(DWORD hFile) 1057 { 1058 ULONG newFilePos; 1059 LONGLONG FilePosL = {0,0}; 1060 LONGLONG newFilePosL; 1061 APIRET rc; 1062 1063 if(f64BitIO) { 1064 rc = OdinDosSetFilePtrL(hFile, FilePosL, FILE_CURRENT, &newFilePosL); 1065 if(rc == 0) { 1066 rc = OdinDosSetFileSizeL(hFile, newFilePosL); 1067 } 1068 } 1069 else { 1070 rc = DosSetFilePtr(hFile, 0, FILE_CURRENT, &newFilePos); 1071 if(rc == 0) { 1072 rc = DosSetFileSize(hFile, newFilePos); 1073 } 1074 } 1075 if(rc) { 1076 SetLastError(error2WinError(rc)); 1077 return FALSE; 1078 } 1079 SetLastError(ERROR_SUCCESS_W); 1080 return TRUE; 1081 } 1082 //****************************************************************************** 1083 //****************************************************************************** 1084 BOOL OSLibDosGetFileInformationByHandle(DWORD hFile, BY_HANDLE_FILE_INFORMATION* pInfo) 1085 { 1086 APIRET rc; 1087 1088 if(f64BitIO) 1089 { 1090 FILESTATUS4L statusL = { 0 }; 1091 1092 rc = DosQueryFileInfo(hFile, 1093 FIL_QUERYEASIZEL, 1094 &statusL, 1095 sizeof(statusL)); 1096 if(rc == NO_ERROR) 1097 { 1098 pInfo->dwFileAttributes = 0; 1099 if(!(statusL.attrFile & NOT_NORMAL)) 1100 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL_W; 1101 if(statusL.attrFile & FILE_READONLY) 1102 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_READONLY_W; 1103 if(statusL.attrFile & FILE_HIDDEN) 1104 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN_W; 1105 if(statusL.attrFile & FILE_SYSTEM) 1106 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM_W; 1107 if(statusL.attrFile & FILE_DIRECTORY) 1108 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY_W; 1109 if(statusL.attrFile & FILE_ARCHIVED) 1110 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE_W; 1111 1112 pmDateTimeToFileTime(&statusL.fdateCreation, 1113 &statusL.ftimeCreation, 1114 &pInfo->ftCreationTime); 1115 pmDateTimeToFileTime(&statusL.fdateLastAccess, 1116 &statusL.ftimeLastAccess, 1117 &pInfo->ftLastAccessTime); 1118 pmDateTimeToFileTime(&statusL.fdateLastWrite, 1119 &statusL.ftimeLastWrite, 1120 &pInfo->ftLastWriteTime); 1121 1122 pInfo->nFileSizeHigh = statusL.cbFile.ulHi; 1123 pInfo->nFileSizeLow = statusL.cbFile.ulLo; 1124 pInfo->dwVolumeSerialNumber = 0; //todo 1125 pInfo->nNumberOfLinks = 1; 1126 pInfo->nFileIndexHigh = 0; 1127 pInfo->nFileIndexLow = 0; 1128 } 1129 } 1130 else 1131 { 1132 FILESTATUS4 status = { 0 }; 1133 1134 rc = DosQueryFileInfo(hFile, 1135 FIL_QUERYEASIZE, 1136 &status, 1137 sizeof(status)); 1138 if(rc == NO_ERROR) 1139 { 1140 pInfo->dwFileAttributes = 0; 1141 if(!(status.attrFile & NOT_NORMAL)) 1142 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL_W; 1143 if(status.attrFile & FILE_READONLY) 1144 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_READONLY_W; 1145 if(status.attrFile & FILE_HIDDEN) 1146 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN_W; 1147 if(status.attrFile & FILE_SYSTEM) 1148 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM_W; 1149 if(status.attrFile & FILE_DIRECTORY) 1150 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY_W; 1151 if(status.attrFile & FILE_ARCHIVED) 1152 pInfo->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE_W; 1153 1154 pmDateTimeToFileTime(&status.fdateCreation, 1155 &status.ftimeCreation, 1156 &pInfo->ftCreationTime); 1157 pmDateTimeToFileTime(&status.fdateLastAccess, 1158 &status.ftimeLastAccess, 1159 &pInfo->ftLastAccessTime); 1160 pmDateTimeToFileTime(&status.fdateLastWrite, 1161 &status.ftimeLastWrite, 1162 &pInfo->ftLastWriteTime); 1163 1164 pInfo->nFileSizeHigh = 0; 1165 pInfo->nFileSizeLow = status.cbFile; 1166 pInfo->dwVolumeSerialNumber = 0; //todo 1167 pInfo->nNumberOfLinks = 1; 1168 pInfo->nFileIndexHigh = 0; 1169 pInfo->nFileIndexLow = 0; 1170 } 1171 } 1172 if(rc) { 1173 SetLastError(error2WinError(rc)); 1174 return FALSE; 1175 } 1176 SetLastError(ERROR_SUCCESS_W); 1177 return TRUE; 1178 } 1179 //****************************************************************************** 1180 //****************************************************************************** 1181 BOOL OSLibDosSetFileTime(DWORD hFile, WORD creationdate, WORD creationtime, 1182 WORD lastaccessdate, WORD lastaccesstime, 1183 WORD lastwritedate, WORD lastwritetime) 1184 { 1185 FILESTATUS3 fileInfo; 1186 APIRET rc; 1187 1188 rc = DosQueryFileInfo(hFile, FIL_STANDARD, &fileInfo, sizeof(fileInfo)); 1189 1190 if(rc == NO_ERROR) 1191 { 1192 if(creationdate && creationtime) { 1193 fileInfo.fdateCreation = *(FDATE *)&creationdate; 1194 fileInfo.ftimeCreation = *(FTIME *)&creationtime; 1195 } 1196 if(lastaccessdate && lastaccesstime) { 1197 fileInfo.fdateLastAccess = *(FDATE *)&lastaccessdate; 1198 fileInfo.ftimeLastAccess = *(FTIME *)&lastaccesstime; 1199 } 1200 if(lastwritedate && lastwritetime) { 1201 fileInfo.fdateLastWrite = *(FDATE *)&lastwritedate; 1202 fileInfo.ftimeLastWrite = *(FTIME *)&lastwritetime; 1203 } 1204 1205 rc = DosSetFileInfo(hFile, FIL_STANDARD, &fileInfo, sizeof(fileInfo)); 1206 } 1207 1208 if(rc) 1209 { 1210 SetLastError(error2WinError(rc)); 1211 return FALSE; 1212 } 1213 SetLastError(ERROR_SUCCESS_W); 1214 return TRUE; 1215 } 1216 //****************************************************************************** 1217 //****************************************************************************** 1218 BOOL OSLibDosGetFileTime(DWORD hFile, WORD *creationdate, WORD *creationtime, 1219 WORD *lastaccessdate, WORD *lastaccesstime, 1220 WORD *lastwritedate, WORD *lastwritetime) 1221 { 1222 FILESTATUS3 fileInfo; 1223 APIRET rc; 1224 1225 rc = DosQueryFileInfo(hFile, FIL_STANDARD, &fileInfo, sizeof(fileInfo)); 1226 1227 if(rc == NO_ERROR) 1228 { 1229 *creationdate = *(WORD *)&fileInfo.fdateCreation; 1230 *creationtime = *(WORD *)&fileInfo.ftimeCreation; 1231 *lastaccessdate = *(WORD *)&fileInfo.fdateLastAccess; 1232 *lastaccesstime = *(WORD *)&fileInfo.ftimeLastAccess; 1233 *lastwritedate = *(WORD *)&fileInfo.fdateLastWrite; 1234 *lastwritetime = *(WORD *)&fileInfo.ftimeLastWrite; 1235 } 1236 1237 if(rc) 1238 { 1239 SetLastError(error2WinError(rc)); 1240 return FALSE; 1241 } 1242 SetLastError(ERROR_SUCCESS_W); 1243 return TRUE; 655 1244 } 656 1245 //****************************************************************************** … … 662 1251 663 1252 664 rc = DosSetFilePtr(hFile, offset, method, &newoffset); 665 if(rc) { 666 dprintf(("DosSetFilePtr Error rc:%d", rc)); 667 return -1; 668 } 669 else return newoffset; 670 } 671 //****************************************************************************** 672 //(FlushBuffer) 673 //****************************************************************************** 674 DWORD OSLibDosResetBuffer(DWORD hFile) 675 { 676 return DosResetBuffer(hFile); 1253 rc = DosSetFilePtr(hFile, offset, method, &newoffset); 1254 if(rc) { 1255 dprintf(("DosSetFilePtr Error rc:%d", rc)); 1256 return -1; 1257 } 1258 else return newoffset; 677 1259 } 678 1260 //****************************************************************************** … … 680 1262 DWORD OSLibDosDupHandle(DWORD hFile, DWORD *hNew) 681 1263 { 682 *hNew = -1;683 return DosDupHandle(hFile, hNew);1264 *hNew = -1; 1265 return DosDupHandle(hFile, hNew); 684 1266 } 685 1267 //****************************************************************************** … … 687 1269 void OSLibDosDisableHardError(BOOL fTurnOff) 688 1270 { 689 DosError((fTurnOff) ? FERR_DISABLEHARDERR : FERR_ENABLEHARDERR);1271 DosError((fTurnOff) ? FERR_DISABLEHARDERR : FERR_ENABLEHARDERR); 690 1272 } 691 1273 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.