Ignore:
Timestamp:
Jun 1, 2000, 1:28:48 PM (25 years ago)
Author:
sandervl
Message:

Rewrote file io apis

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/oslibdos.cpp

    r3593 r3642  
    1 /* $Id: oslibdos.cpp,v 1.28 2000-05-23 18:45:12 sandervl Exp $ */
     1/* $Id: oslibdos.cpp,v 1.29 2000-06-01 11:28:47 sandervl Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    3333#include "dbglocal.h"
    3434
     35static PROC_DosSetFileSizeL  DosSetFileSizeLProc = 0;
     36static PROC_DosSetFilePtrL   DosSetFilePtrLProc   = 0;
     37static PROC_DosSetFileLocksL DosSetFileLocksLProc = 0;
     38static BOOL f64BitIO = FALSE;
     39//******************************************************************************
     40//******************************************************************************
     41void 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//******************************************************************************
     61APIRET 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//******************************************************************************
     73APIRET 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//******************************************************************************
     85APIRET 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}
    3596//******************************************************************************
    3697// translate OS/2 error codes to Windows codes
     
    42103  {
    43104    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;
    45109
    46110    case ERROR_FILE_NOT_FOUND: //2
    47       return ERROR_FILE_NOT_FOUND_W;
     111        return ERROR_FILE_NOT_FOUND_W;
    48112
    49113    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;
    51118
    52119    case ERROR_ACCESS_DENIED: //5
    53       return ERROR_ACCESS_DENIED_W;
     120        return ERROR_ACCESS_DENIED_W;
    54121
    55122    case ERROR_INVALID_HANDLE: //6
    56       return ERROR_INVALID_HANDLE_W;
     123        return ERROR_INVALID_HANDLE_W;
    57124
    58125    case ERROR_NOT_ENOUGH_MEMORY: //8
    59       return ERROR_NOT_ENOUGH_MEMORY_W;
     126        return ERROR_NOT_ENOUGH_MEMORY_W;
    60127
    61128    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;
    63133
    64134    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;
    66139
    67140    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;
    69157
    70158    case ERROR_OUT_OF_STRUCTURES: //84
    71       return ERROR_OUT_OF_STRUCTURES_W;
     159        return ERROR_OUT_OF_STRUCTURES_W;
    72160
    73161    case ERROR_INVALID_PARAMETER: //87
    74       return ERROR_INVALID_PARAMETER_W;
     162        return ERROR_INVALID_PARAMETER_W;
    75163
    76164    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;
    78169
    79170    case ERROR_DRIVE_LOCKED: //108
    80       return ERROR_DRIVE_LOCKED_W;
     171        return ERROR_DRIVE_LOCKED_W;
    81172
    82173    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;
    84178
    85179    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;
    87184
    88185    case ERROR_NO_MORE_SEARCH_HANDLES: //113
    89       return ERROR_NO_MORE_SEARCH_HANDLES_W;
     186        return ERROR_NO_MORE_SEARCH_HANDLES_W;
    90187
    91188    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;
    93199
    94200    case ERROR_DISCARDED: //157
    95       return ERROR_DISCARDED_W;
     201        return ERROR_DISCARDED_W;
    96202
    97203    case ERROR_FILENAME_EXCED_RANGE: //206
    98       return ERROR_FILENAME_EXCED_RANGE_W;
     204        return ERROR_FILENAME_EXCED_RANGE_W;
    99205
    100206    case ERROR_META_EXPANSION_TOO_LONG: //208
    101       return ERROR_META_EXPANSION_TOO_LONG_W;
     207        return ERROR_META_EXPANSION_TOO_LONG_W;
    102208
    103209    case ERROR_BAD_PIPE: //230
    104       return ERROR_BAD_PIPE_W;
     210        return ERROR_BAD_PIPE_W;
    105211
    106212    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;
    108217
    109218    case ERROR_PIPE_NOT_CONNECTED: //233
    110       return ERROR_PIPE_NOT_CONNECTED_W;
     219        return ERROR_PIPE_NOT_CONNECTED_W;
    111220
    112221    case ERROR_MORE_DATA: //234
    113       return ERROR_MORE_DATA_W;
     222        return ERROR_MORE_DATA_W;
    114223
    115224    case ERROR_INVALID_EA_NAME: //254
    116       return ERROR_INVALID_EA_NAME_W;
     225        return ERROR_INVALID_EA_NAME_W;
    117226
    118227    case ERROR_EA_LIST_INCONSISTENT: //255
    119       return ERROR_EA_LIST_INCONSISTENT_W;
     228        return ERROR_EA_LIST_INCONSISTENT_W;
    120229
    121230    case ERROR_EAS_DIDNT_FIT: //275
    122       return ERROR_EAS_DIDNT_FIT;
     231        return ERROR_EAS_DIDNT_FIT;
    123232
    124233    default:
    125       return defaultCode;
     234        dprintf(("WARNING: error2WinError: error %d not included!!!!", rc));
     235        return defaultCode;
    126236  }
    127237}
     
    382492//******************************************************************************
    383493//******************************************************************************
    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);
     494BOOL 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//******************************************************************************
     504BOOL 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);
    393511}
    394512//******************************************************************************
     
    421539//******************************************************************************
    422540//******************************************************************************
    423 DWORD OSLibDosDelete(char *lpszFileName)
    424 {
    425   return DosDelete(lpszFileName);
     541BOOL 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;
    426551}
    427552//******************************************************************************
     
    552677//******************************************************************************
    553678//******************************************************************************
    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;
     679APIRET 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//******************************************************************************
     700DWORD 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//******************************************************************************
     813DWORD 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//******************************************************************************
     891BOOL 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//******************************************************************************
     933BOOL 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//******************************************************************************
     971BOOL OSLibDosFlushFileBuffers(DWORD hFile)
     972{
     973  APIRET   rc;
     974 
     975   rc = DosResetBuffer(hFile);
     976   SetLastError(error2WinError(rc));
     977   return (rc == NO_ERROR);
     978}
     979//******************************************************************************
     980//******************************************************************************
     981DWORD 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//******************************************************************************
     1017DWORD 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//******************************************************************************
     1056BOOL 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//******************************************************************************
     1084BOOL 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//******************************************************************************
     1181BOOL 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//******************************************************************************
     1218BOOL 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;
    6551244}
    6561245//******************************************************************************
     
    6621251
    6631252
    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;
    6771259}
    6781260//******************************************************************************
     
    6801262DWORD OSLibDosDupHandle(DWORD hFile, DWORD *hNew)
    6811263{
    682   *hNew = -1;
    683   return DosDupHandle(hFile, hNew);
     1264   *hNew = -1;
     1265   return DosDupHandle(hFile, hNew);
    6841266}
    6851267//******************************************************************************
     
    6871269void OSLibDosDisableHardError(BOOL fTurnOff)
    6881270{
    689   DosError((fTurnOff) ? FERR_DISABLEHARDERR : FERR_ENABLEHARDERR);
     1271   DosError((fTurnOff) ? FERR_DISABLEHARDERR : FERR_ENABLEHARDERR);
    6901272}
    6911273//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.