Changeset 3269 for trunk/src/kernel32/oslibdos.cpp
- Timestamp:
- Mar 29, 2000, 5:17:29 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/oslibdos.cpp
r3074 r3269 1 /* $Id: oslibdos.cpp,v 1.2 2 2000-03-10 16:12:00 sandervlExp $ */1 /* $Id: oslibdos.cpp,v 1.23 2000-03-29 15:17:28 cbratschi Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 27 27 #include "dosqss.h" 28 28 29 #define DBG_LOCALLOG 29 #define DBG_LOCALLOG DBG_oslibdos 30 30 #include "dbglocal.h" 31 31 … … 45 45 rc = DosQueryMem(pb, &size, &attr); 46 46 if(rc) { 47 48 47 dprintf(("OSLibDosAliasMem: DosQueryMem %x %x return %d", pb, size, rc)); 48 return rc; 49 49 } 50 50 size = (size-1) & ~0xfff; 51 51 size+= PAGE_SIZE; 52 52 if(size != cb) { 53 54 55 53 dprintf(("ERROR: OSLibDosAliasMem: size != cb (%x!=%x)!!!!!!!!", size, cb)); 54 //ignore this and continue return 5; 55 attr = fl; //just use original protection flags (NOT CORRECT) 56 56 } 57 57 attr &= (PAG_READ|PAG_WRITE|PAG_EXECUTE|PAG_GUARD|PAG_DEFAULT); 58 58 if(attr != fl) { 59 60 61 62 63 64 65 59 rc = DosSetMem(pb, size, fl); 60 if(rc) { 61 dprintf(("OSLibDosAliasMem: DosSetMem %x %x return %d", pb, size, rc)); 62 attr = fl; 63 //just continue for now 64 //return rc; 65 } 66 66 } 67 67 rc = DosAliasMem(pb, cb, ppbAlias, 2); 68 68 if(rc) { 69 70 69 dprintf(("OSLibDosAliasMem: DosAliasMem %x %x returned %d", pb, cb, rc)); 70 return rc; 71 71 } 72 72 if(attr != fl) { 73 74 75 76 77 73 rc = DosSetMem(pb, size, attr); 74 if(rc) { 75 dprintf(("OSLibDosAliasMem: DosSetMem (2) %x %x return %d", pb, size, rc)); 76 return rc; 77 } 78 78 } 79 79 return 0; … … 90 90 rc = DosAllocMem(&memaddr, size, PAG_READ | flAllocMem); 91 91 if(rc) { 92 92 return rc; 93 93 } 94 94 DosEnterCritSec(); … … 96 96 offset = (DWORD)memaddr & 0xFFFF; 97 97 if(offset) { 98 98 DosAllocMem(&memaddr, 64*1024 - offset, PAG_READ | flAllocMem); 99 99 } 100 100 rc = DosAllocMem(lplpMemAddr, size, flags | flAllocMem); 101 101 DosExitCritSec(); 102 102 if((DWORD)*lplpMemAddr & 0xFFFF) {//still not at 64k boundary? 103 104 103 DosFreeMem(*lplpMemAddr); 104 rc = OSLibDosAllocMem(lplpMemAddr, size, flags); 105 105 } 106 106 if(offset) { 107 107 DosFreeMem(memaddr); 108 108 } 109 109 … … 123 123 APIRET rc; 124 124 char *sharedmemname = NULL; 125 125 126 126 if(name) { 127 128 129 130 } 131 else 132 127 sharedmemname = (char *)malloc(strlen(name) + 16); 128 strcpy(sharedmemname, "\\SHAREMEM\\"); 129 strcat(sharedmemname, name); 130 } 131 else flags |= OBJ_GETTABLE; 132 133 133 rc = DosAllocSharedMem(lplpMemAddr, sharedmemname, size, flags); 134 if(name) { 135 134 if(name) { 135 free(sharedmemname); 136 136 } 137 137 return rc; … … 144 144 APIRET rc; 145 145 char *sharedmemname = NULL; 146 146 147 147 if(name) { 148 149 150 151 152 if(name) { 153 154 155 } 156 else 148 sharedmemname = (char *)malloc(strlen(name) + 16); 149 strcpy(sharedmemname, "\\SHAREMEM\\"); 150 strcat(sharedmemname, name); 151 rc = DosGetNamedSharedMem(lplpMemAddr, sharedmemname, PAG_READ|PAG_WRITE); 152 if(name) { 153 free(sharedmemname); 154 } 155 } 156 else rc = DosGetSharedMem((LPVOID)*(DWORD *)lplpMemAddr, PAG_READ|PAG_WRITE); 157 157 158 158 return rc; … … 172 172 rc = DosSetMem(lpMemAddr, size, flags); 173 173 switch(rc) { 174 175 176 177 178 179 174 case ERROR_INVALID_ADDRESS: 175 return OSLIB_ERROR_INVALID_ADDRESS; 176 case ERROR_ACCESS_DENIED: 177 return OSLIB_ERROR_ACCESS_DENIED; 178 default: 179 return rc; 180 180 } 181 181 } … … 191 191 192 192 if(flags & OSLIB_ACCESS_READONLY) 193 193 os2flags |= OPEN_ACCESS_READONLY; 194 194 else 195 195 if(flags & OSLIB_ACCESS_READWRITE) 196 196 os2flags |= OPEN_ACCESS_READWRITE; 197 197 198 198 if(flags & OSLIB_ACCESS_SHAREDENYNONE) 199 199 os2flags |= OPEN_SHARE_DENYNONE; 200 200 else 201 201 if(flags & OSLIB_ACCESS_SHAREDENYREAD) 202 202 os2flags |= OPEN_SHARE_DENYREAD; 203 203 else 204 204 if(flags & OSLIB_ACCESS_SHAREDENYWRITE) 205 205 os2flags |= OPEN_SHARE_DENYWRITE; 206 206 207 207 tryopen: … … 217 217 218 218 if(rc) { 219 220 219 if(rc == ERROR_TOO_MANY_OPEN_FILES) { 220 ULONG CurMaxFH; 221 221 LONG ReqCount = 32; 222 222 223 224 225 226 227 228 229 230 231 232 } 233 else 223 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH); 224 if(rc) { 225 dprintf(("DosSetRelMaxFH returned %d", rc)); 226 return 0; 227 } 228 dprintf(("DosOpen failed -> increased nr open files to %d", CurMaxFH)); 229 goto tryopen; 230 } 231 return 0; 232 } 233 else return hFile; 234 234 } 235 235 //****************************************************************************** … … 247 247 APIRET rc; 248 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 249 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH); 250 if(rc) { 251 dprintf(("DosSetRelMaxFH returned %d", rc)); 252 return rc; 253 } 254 if(ReqCount + ODIN_INCREMENT_MAX_FILEHANDLES > CurMaxFH) { 255 ReqCount = CurMaxFH + ODIN_INCREMENT_MAX_FILEHANDLES; 256 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH); 257 if(rc) { 258 dprintf(("DosSetRelMaxFH returned %d", rc)); 259 return rc; 260 } 261 } 262 return 0; 263 263 } 264 264 //****************************************************************************** … … 270 270 APIRET rc; 271 271 272 273 274 275 276 277 278 279 280 281 282 283 284 272 rc = DosSetRelMaxFH(&ReqCount, &CurMaxFH); 273 if(rc) { 274 dprintf(("DosSetRelMaxFH returned %d", rc)); 275 return rc; 276 } 277 if(CurMaxFH < maxhandles) { 278 rc = DosSetMaxFH(maxhandles); 279 if(rc) { 280 dprintf(("DosSetMaxFH returned %d", rc)); 281 return rc; 282 } 283 } 284 return 0; 285 285 } 286 286 //****************************************************************************** … … 306 306 switch(method) { 307 307 case OSLIB_SETPTR_FILE_CURRENT: 308 309 308 os2method = FILE_CURRENT; 309 break; 310 310 case OSLIB_SETPTR_FILE_BEGIN: 311 os2method = FILE_BEGIN;312 311 os2method = FILE_BEGIN ; 312 break; 313 313 case OSLIB_SETPTR_FILE_END: 314 315 314 os2method = FILE_END; 315 break; 316 316 default: 317 317 return OSLIB_ERROR_INVALID_PARAMETER; 318 318 } 319 319 rc = DosSetFilePtr(hFile, offset, os2method, &newoffset); 320 320 if(rc) { 321 return -1; 322 } 323 else return newoffset; 324 } 325 //****************************************************************************** 326 //****************************************************************************** 327 //@@@PH Note: this routine is nothing but a QUICK'N'DIRTY HACK! 328 //@@@PH this function should be implemented accordingly to NTDLL's 329 // RtlSecondsSince1980ToTime 330 // RtlTimeToSecondsSince1980 331 static void iFDATEFTIME2FILETIME(FDATE fdOS2, FTIME ftOS2, LPFILETIME pftWin32) 332 { 333 float f; 334 #define facSECOND 2 // as encoded in OS/2 335 #define facMINUTE 60 336 #define facHOUR 3600 337 #define facDAY 86400 338 #define facMONTH facDAY * 30 // cough, cough :) 339 #define facYEAR facDAY * 365 340 341 /* pftWin32 is 100ns based from 01.01.1601 00:00:00 */ 342 f = (fdOS2.year + 379) * facYEAR // 1980 - 1601 343 + (fdOS2.month - 0 ) * facMONTH 344 + (fdOS2.day - 1 ) * facDAY 345 + (ftOS2.hours ) * facHOUR 346 + (ftOS2.minutes ) * facMINUTE 347 + (ftOS2.twosecs ) * facSECOND; 348 349 f *= 10000; // convert to 100ns base 350 pftWin32->dwHighDateTime = (f / (float)(0xffffffff) ); 351 pftWin32->dwLowDateTime = (f - (float)((float)pftWin32->dwHighDateTime * 352 (float)0xffffffff) ); 353 } 354 321 return -1; 322 } 323 else return newoffset; 324 } 325 //****************************************************************************** 326 //****************************************************************************** 327 BOOL pmDateTimeToFileTime(FDATE *pDate,FTIME *pTime,FILETIME *pFT) 328 { 329 USHORT dosTime, dosDate; 330 331 dosTime = *(USHORT*)pTime; 332 dosDate = *(USHORT*)pDate; 333 334 return DosDateTimeToFileTime(dosDate,dosTime,pFT); 335 } 336 //****************************************************************************** 337 //****************************************************************************** 355 338 BOOL OSLibDosGetFileAttributesEx(PSZ pszName, 356 339 ULONG ulDummy, … … 371 354 // convert structure 372 355 lpFad->dwFileAttributes = fs3.attrFile; // directly interchangeable 373 iFDATEFTIME2FILETIME(fs3.fdateCreation,fs3.ftimeCreation, &lpFad->ftCreationTime);374 iFDATEFTIME2FILETIME(fs3.fdateLastAccess,fs3.ftimeLastAccess, &lpFad->ftLastAccessTime);375 iFDATEFTIME2FILETIME(fs3.fdateLastWrite,fs3.ftimeLastWrite, &lpFad->ftLastWriteTime);356 pmDateTimeToFileTime(&fs3.fdateCreation, &fs3.ftimeCreation, &lpFad->ftCreationTime); 357 pmDateTimeToFileTime(&fs3.fdateLastAccess, &fs3.ftimeLastAccess, &lpFad->ftLastAccessTime); 358 pmDateTimeToFileTime(&fs3.fdateLastWrite, &fs3.ftimeLastWrite, &lpFad->ftLastWriteTime); 376 359 377 360 /* @@@PH we might add Aurora support ... … … 386 369 DWORD WIN32API GetEnvironmentVariableA(LPCSTR, LPSTR, DWORD ); 387 370 //****************************************************************************** 388 DWORD OSLibDosSearchPath(DWORD cmd, char *path, char *name, char *full_name, 371 DWORD OSLibDosSearchPath(DWORD cmd, char *path, char *name, char *full_name, 389 372 DWORD length_fullname) 390 373 { 391 374 switch(cmd) { 392 375 case OSLIB_SEARCHDIR: 393 376 if(DosSearchPath(SEARCH_IGNORENETERRS, path, 394 377 name, full_name, length_fullname) != 0) { 395 396 397 378 return 0; 379 } 380 return strlen(full_name); 398 381 399 382 400 383 case OSLIB_SEARCHCURDIR: 401 384 if(DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_CUR_DIRECTORY, path, 402 385 name, full_name, length_fullname) != 0) { 403 404 405 386 return 0; 387 } 388 return strlen(full_name); 406 389 407 390 case OSLIB_SEARCHFILE: … … 409 392 FILESTATUS3 fileinfo; 410 393 411 412 413 414 415 394 if(DosQueryPathInfo(name, FIL_STANDARD, &fileinfo, sizeof(fileinfo)) != 0) { 395 return 0; 396 } 397 strncpy(full_name, name, length_fullname); 398 return strlen(full_name); 416 399 } 417 400 … … 422 405 CHAR szResult[CCHMAXPATH]; 423 406 424 425 426 427 407 envsize = GetEnvironmentVariableA(path, NULL, 0); 408 envstring = (LPSTR)malloc(envsize+1); 409 GetEnvironmentVariableA(path, envstring, envsize); 410 if(DosSearchPath(SEARCH_IGNORENETERRS, envstring, 428 411 name, szResult, sizeof(szResult)) != 0) { 429 430 431 432 433 434 412 free(envstring); 413 return 0; 414 } 415 free(envstring); 416 strcpy(full_name, szResult); 417 return strlen(full_name); 435 418 } 436 419 } … … 554 537 return -1; 555 538 } 556 else 539 else return newoffset; 557 540 } 558 541 //****************************************************************************** … … 579 562 //Returns time spent in kernel & user mode in milliseconds 580 563 //****************************************************************************** 581 BOOL OSLibDosQueryProcTimes(DWORD procid, ULONG *kerneltime, ULONG *usertime) 564 BOOL OSLibDosQueryProcTimes(DWORD procid, ULONG *kerneltime, ULONG *usertime) 582 565 { 583 566 APIRET rc; … … 592 575 593 576 if(rc) { 594 595 596 597 598 599 577 free(buf); 578 if(rc == ERROR_BUFFER_OVERFLOW) { 579 nrthreads += 4; 580 goto tryagain; 581 } 582 return FALSE; 600 583 } 601 584 PQTOPLEVEL top = (PQTOPLEVEL)buf; … … 604 587 *usertime = 0; 605 588 for(int i=0;i<top->procdata->threadcnt;i++) { 606 607 589 *kerneltime += top->procdata->threads[i].systime; 590 *usertime += top->procdata->threads[i].usertime; 608 591 } 609 592 free(buf); … … 613 596 //****************************************************************************** 614 597 // TODO: implement SecurityAttributes parameter 615 DWORD OSLibDosCreateNamedPipe(LPCTSTR lpName, 616 DWORD dwOpenMode, 598 DWORD OSLibDosCreateNamedPipe(LPCTSTR lpName, 599 DWORD dwOpenMode, 617 600 DWORD dwPipeMode, 618 DWORD nMaxInstances, 601 DWORD nMaxInstances, 619 602 DWORD nOutBufferSize, 620 DWORD nInBufferSize, 603 DWORD nInBufferSize, 621 604 DWORD nDefaultTimeOut, 622 605 void* lpSecurityAttributes) 623 606 { DWORD dwOS2Mode = 0; 624 607 DWORD dwOS2PipeMode = 0; 625 LPSTR lpOS2Name; 608 LPSTR lpOS2Name; 626 609 DWORD hPipe; 627 610 DWORD rc; 628 611 629 612 if (dwOpenMode & PIPE_ACCESS_DUPLEX_W) 630 613 dwOS2Mode |= NP_ACCESS_DUPLEX; … … 679 662 dwOS2PipeMode, 680 663 nInBufferSize, 681 nInBufferSize, 664 nInBufferSize, 682 665 nDefaultTimeOut); // Timeouts must be tested! 683 666 … … 706 689 // TODO: implement lpOverlapped parameter! 707 690 BOOL OSLibDosConnectNamedPipe(DWORD hNamedPipe, LPOVERLAPPED lpOverlapped) 708 { 691 { 709 692 DWORD rc; 710 693 … … 714 697 if (!rc) return (TRUE); 715 698 else 716 if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W); 699 if (rc==ERROR_BROKEN_PIPE) SetLastError(ERROR_BROKEN_PIPE_W); 717 700 else 718 701 if (rc==ERROR_BAD_PIPE) SetLastError(ERROR_BAD_PIPE_W); … … 723 706 // if (rc==ERROR_INTERRUPT) 724 707 SetLastError(ERROR_PIPE_NOT_CONNECTED_W); 725 708 726 709 return (FALSE); 727 710 } … … 761 744 if (!rc) return (TRUE); 762 745 else 763 if ( rc==ERROR_FILE_NOT_FOUND ) SetLastError(ERROR_FILE_NOT_FOUND_W); 764 else 765 if ( rc==ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 766 else 767 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 768 else 769 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 770 else 771 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 772 else 773 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 774 else 775 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 746 if ( rc==ERROR_FILE_NOT_FOUND ) SetLastError(ERROR_FILE_NOT_FOUND_W); 747 else 748 if ( rc==ERROR_PATH_NOT_FOUND ) SetLastError(ERROR_PATH_NOT_FOUND_W); 749 else 750 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 751 else 752 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 753 else 754 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 755 else 756 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 757 else 758 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 776 759 else 777 760 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); … … 808 791 if (!rc) return (TRUE); 809 792 else 810 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 811 else 812 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 813 else 814 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 815 else 816 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 817 else 818 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 793 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 794 else 795 if ( rc==ERROR_MORE_DATA ) SetLastError(ERROR_MORE_DATA_W); 796 else 797 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 798 else 799 if ( rc==ERROR_BAD_FORMAT ) SetLastError(ERROR_BAD_FORMAT_W); 800 else 801 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 819 802 else 820 803 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); … … 830 813 //****************************************************************************** 831 814 //****************************************************************************** 832 BOOL OSLibDosPeekNamedPipe(DWORD hPipe, 833 LPVOID lpvBuffer, 815 BOOL OSLibDosPeekNamedPipe(DWORD hPipe, 816 LPVOID lpvBuffer, 834 817 DWORD cbBuffer, 835 LPDWORD lpcbRead, 836 LPDWORD lpcbAvail, 818 LPDWORD lpcbRead, 819 LPDWORD lpcbAvail, 837 820 LPDWORD lpcbMessage) 838 821 { … … 842 825 843 826 rc=DosPeekNPipe(hPipe,lpvBuffer,cbBuffer,lpcbRead,&availData,&ulDummy); 844 827 845 828 dprintf(("DosPeekNPipe returned rc=%d",rc)); 846 829 847 if (!rc) 830 if (!rc) 848 831 { 849 832 *lpcbAvail = availData.cbpipe; … … 852 835 } 853 836 else 854 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 855 else 856 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 837 if ( rc==ERROR_ACCESS_DENIED ) SetLastError(ERROR_ACCESS_DENIED_W); 838 else 839 if ( rc==ERROR_PIPE_BUSY ) SetLastError(ERROR_PIPE_BUSY_W); 857 840 else 858 841 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); … … 877 860 if (!rc) return TRUE; 878 861 else 879 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 862 if ( rc==ERROR_BROKEN_PIPE ) SetLastError(ERROR_BROKEN_PIPE_W); 880 863 else 881 864 if ( rc==ERROR_BAD_PIPE ) SetLastError(ERROR_BAD_PIPE_W); … … 924 907 return (FALSE); 925 908 } 909 //****************************************************************************** 910 //****************************************************************************** 911 #define NOT_NORMAL (FILE_ATTRIBUTE_READONLY_W | \ 912 FILE_ATTRIBUTE_HIDDEN_W | \ 913 FILE_ATTRIBUTE_SYSTEM_W | \ 914 FILE_ATTRIBUTE_ARCHIVE_W) 915 916 VOID translateFileResults(FILESTATUS3 *pResult,LPWIN32_FIND_DATAA pFind,CHAR* achName) 917 { 918 pFind->dwFileAttributes = 0; 919 if (!(pResult->attrFile & NOT_NORMAL)) 920 pFind->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL_W; 921 if (pResult->attrFile & FILE_READONLY) 922 pFind->dwFileAttributes |= FILE_ATTRIBUTE_READONLY_W; 923 if (pResult->attrFile & FILE_HIDDEN) 924 pFind->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN_W; 925 if (pResult->attrFile & FILE_SYSTEM) 926 pFind->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM_W; 927 if (pResult->attrFile & FILE_DIRECTORY) 928 pFind->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY_W; 929 if (pResult->attrFile & FILE_ARCHIVED) 930 pFind->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE_W; 931 932 pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime); 933 pmDateTimeToFileTime(&pResult->fdateLastAccess,&pResult->ftimeLastAccess,&pFind->ftLastAccessTime); 934 pmDateTimeToFileTime(&pResult->fdateLastWrite,&pResult->ftimeLastWrite,&pFind->ftLastWriteTime); 935 936 pFind->nFileSizeHigh = 0; //CB: fixme 937 pFind->nFileSizeLow = pResult->cbFile; 938 strcpy(pFind->cFileName,achName); 939 pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name 940 } 941 942 VOID translateFindResults(FILEFINDBUF3 *pResult,LPWIN32_FIND_DATAA pFind) 943 { 944 pFind->dwFileAttributes = 0; 945 if (!(pResult->attrFile & NOT_NORMAL)) 946 pFind->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL_W; 947 if (pResult->attrFile & FILE_READONLY) 948 pFind->dwFileAttributes |= FILE_ATTRIBUTE_READONLY_W; 949 if (pResult->attrFile & FILE_HIDDEN) 950 pFind->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN_W; 951 if (pResult->attrFile & FILE_SYSTEM) 952 pFind->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM_W; 953 if (pResult->attrFile & FILE_DIRECTORY) 954 pFind->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY_W; 955 if (pResult->attrFile & FILE_ARCHIVED) 956 pFind->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE_W; 957 958 pmDateTimeToFileTime(&pResult->fdateCreation,&pResult->ftimeCreation,&pFind->ftCreationTime); 959 pmDateTimeToFileTime(&pResult->fdateLastAccess,&pResult->ftimeLastAccess,&pFind->ftLastAccessTime); 960 pmDateTimeToFileTime(&pResult->fdateLastWrite,&pResult->ftimeLastWrite,&pFind->ftLastWriteTime); 961 962 pFind->nFileSizeHigh = 0; //CB: fixme 963 pFind->nFileSizeLow = pResult->cbFile; 964 strcpy(pFind->cFileName,pResult->achName); 965 pFind->cAlternateFileName[0] = 0; //CB: fixme: store 8.3 file name 966 } 967 //****************************************************************************** 968 //****************************************************************************** 969 DWORD OSLibDosFindFirst(LPCSTR lpFileName,WIN32_FIND_DATAA* lpFindFileData) 970 { 971 HDIR hDir = -1; 972 ULONG attrs; 973 FILEFINDBUF3 result; 974 ULONG searchCount = 1; 975 976 attrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED; 977 978 DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION); 979 APIRET rc = DosFindFirst((PSZ)lpFileName,&hDir,attrs,&result,sizeof(result),&searchCount,FIL_STANDARD); 980 DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION); 981 if (rc) 982 { 983 SetLastError(ERROR_PATH_NOT_FOUND_W); //CB: fixme: better error handling 984 985 return INVALID_HANDLE_VALUE_W; 986 } 987 988 translateFindResults(&result,lpFindFileData); 989 990 return hDir; 991 } 992 //****************************************************************************** 993 //****************************************************************************** 994 DWORD OSLibDosFindFirstMulti(LPCSTR lpFileName,WIN32_FIND_DATAA *lpFindFileData,DWORD *count) 995 { 996 HDIR hDir = -1; 997 ULONG attrs; 998 FILEFINDBUF3 *result,*data; 999 ULONG searchCount = *count; 1000 1001 attrs = FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY | FILE_ARCHIVED; 1002 result = (FILEFINDBUF3*)malloc(searchCount*sizeof(FILEFINDBUF3)); 1003 1004 DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION); 1005 APIRET rc = DosFindFirst((PSZ)lpFileName,&hDir,attrs,result,searchCount*sizeof(FILEFINDBUF3),&searchCount,FIL_STANDARD); 1006 DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION); 1007 if (rc) 1008 { 1009 free(result); 1010 *count = 0; 1011 SetLastError(ERROR_PATH_NOT_FOUND_W); //CB: fixme: better error handling 1012 1013 return INVALID_HANDLE_VALUE_W; 1014 } 1015 1016 data = result; 1017 for (int x = 0;x < searchCount;x++) 1018 { 1019 translateFindResults(data,&lpFindFileData[x]); 1020 data = (FILEFINDBUF3*)(((DWORD)data)+data->oNextEntryOffset); 1021 } 1022 free(result); 1023 *count = searchCount; 1024 1025 return hDir; 1026 } 1027 //****************************************************************************** 1028 //****************************************************************************** 1029 BOOL OSLibDosFindNext(DWORD hFindFile,WIN32_FIND_DATAA *lpFindFileData) 1030 { 1031 FILEFINDBUF3 result; 1032 ULONG searchCount = 1; 1033 1034 APIRET rc = DosFindNext((HDIR)hFindFile,&result,sizeof(result),&searchCount); 1035 if (rc) 1036 { 1037 SetLastError(ERROR_INVALID_HANDLE_W); //CB: fixme: better error code 1038 1039 return FALSE; 1040 } 1041 1042 translateFindResults(&result,lpFindFileData); 1043 1044 return TRUE; 1045 } 1046 //****************************************************************************** 1047 //****************************************************************************** 1048 BOOL OSLibDosFindNextMulti(DWORD hFindFile,WIN32_FIND_DATAA *lpFindFileData,DWORD *count) 1049 { 1050 FILEFINDBUF3 *result,*data; 1051 ULONG searchCount = *count; 1052 1053 result = (FILEFINDBUF3*)malloc(searchCount*sizeof(FILEFINDBUF3)); 1054 APIRET rc = DosFindNext((HDIR)hFindFile,result,searchCount*sizeof(FILEFINDBUF3),&searchCount); 1055 if (rc) 1056 { 1057 free(result); 1058 *count = 0; 1059 SetLastError(ERROR_INVALID_HANDLE_W); //CB: fixme: better error code 1060 1061 return FALSE; 1062 } 1063 1064 data = result; 1065 for (int x = 0;x < searchCount;x++) 1066 { 1067 translateFindResults(data,&lpFindFileData[x]); 1068 data = (FILEFINDBUF3*)(((DWORD)data)+data->oNextEntryOffset); 1069 } 1070 free(result); 1071 *count = searchCount; 1072 1073 return TRUE; 1074 } 1075 //****************************************************************************** 1076 //****************************************************************************** 1077 BOOL OSLibDosFindClose(DWORD hFindFile) 1078 { 1079 APIRET rc = DosFindClose((HDIR)hFindFile); 1080 if (rc) 1081 { 1082 SetLastError(ERROR_INVALID_HANDLE_W); 1083 1084 return FALSE; 1085 } 1086 1087 return TRUE; 1088 }
Note:
See TracChangeset
for help on using the changeset viewer.