Changeset 4682 for trunk/src/kernel32/hmfile.cpp
- Timestamp:
- Nov 23, 2000, 8:23:51 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmfile.cpp
r4496 r4682 1 /* $Id: hmfile.cpp,v 1.2 3 2000-10-18 17:09:32sandervl Exp $ */1 /* $Id: hmfile.cpp,v 1.24 2000-11-23 19:23:50 sandervl Exp $ */ 2 2 3 3 /* … … 36 36 #include "oslibdos.h" 37 37 38 #define DBG_LOCALLOG 38 #define DBG_LOCALLOG DBG_hmfile 39 39 #include "dbglocal.h" 40 40 … … 77 77 // check the named pipes 78 78 if (strnicmp("\\\\.\\PIPE",lpFileName,8)==0) 79 79 lpFileName+=3; 80 80 else 81 81 lpFileName+=4; 82 82 } 83 83 … … 100 100 if (hFile != INVALID_HANDLE_ERROR) 101 101 { 102 103 104 102 pHMHandleData->dwUserData = (DWORD) new HMFileInfo((LPSTR)lpFileName, lpSecurityAttributes); 103 pHMHandleData->hHMHandle = hFile; 104 return (NO_ERROR); 105 105 } 106 106 else { 107 dprintf(("CreateFile failed; error %d", GetLastError())); 108 return(GetLastError()); 109 } 107 dprintf(("CreateFile failed; error %d", GetLastError())); 108 return(GetLastError()); 109 } 110 } 111 112 //***************************************************************************** 113 //Parses and copies path 114 //OpenFile in NT4, SP6 accepts double (or more) backslashes as separators for directories! 115 //(OS/2 doesn't) 116 //Girotel 2.0 (Dutch banking app) seems to depend on this behaviour 117 //***************************************************************************** 118 void HMDeviceFileClass::ParsePath(LPCSTR lpszFileName, LPSTR lpszParsedFileName, DWORD length) 119 { 120 121 while(*lpszFileName != 0) { 122 *lpszParsedFileName++ = *lpszFileName; 123 if(*lpszFileName == '\\') { 124 while(*lpszFileName == '\\') { 125 lpszFileName++; 126 } 127 } 128 else { 129 lpszFileName++; 130 } 131 } 132 *lpszParsedFileName = 0; 110 133 } 111 134 … … 148 171 149 172 //Re-open using name in OFSTRUCT 150 if(fuMode & OF_REOPEN) 151 173 if(fuMode & OF_REOPEN) 174 lpFileName = (LPSTR)pOFStruct->szPathName; 152 175 else memset(pOFStruct, 0, sizeof(OFSTRUCT)); 153 176 … … 155 178 "\\\\.\\") == 0) 156 179 { 157 158 } 159 else 160 if(!strchr(lpFileName, ':') && !strchr(lpFileName, '\\')) 180 lpFileName+=4; 181 } 182 else 183 if(!strchr(lpFileName, ':') && !strchr(lpFileName, '\\')) 161 184 { 162 163 164 165 166 167 168 169 170 171 172 && !(fuMode & OF_CREATE) ) 185 //filename only; search for file in following order 186 //1: dir from which the app loaded 187 //2: current dir 188 //3: windows system dir 189 //4: windows dir 190 //5: dirs in path path environment variable 191 //SearchPath does exactly that 192 LPSTR filenameinpath; 193 194 if(SearchPathA(NULL, lpFileName, NULL, sizeof(filepath), filepath, &filenameinpath) == 0 195 && !(fuMode & OF_CREATE) ) 173 196 { 174 pOFStruct->nErrCode = ERROR_FILE_NOT_FOUND; 175 SetLastError(ERROR_FILE_NOT_FOUND); 176 return HFILE_ERROR; 177 } 178 lpFileName = filepath; 179 } 197 pOFStruct->nErrCode = ERROR_FILE_NOT_FOUND; 198 SetLastError(ERROR_FILE_NOT_FOUND); 199 return HFILE_ERROR; 200 } 201 lpFileName = filepath; 202 } 203 else { 204 ParsePath(lpFileName, filepath, sizeof(filepath)); 205 lpFileName = filepath; 206 } 207 180 208 // filling OFSTRUCT 181 209 pOFStruct->cBytes = sizeof(OFSTRUCT); … … 188 216 if(hFile != INVALID_HANDLE_ERROR) 189 217 { 190 191 192 218 //Needed for GetFileTime 219 pHMHandleData->hHMHandle = hFile; 220 GetFileTime(pHMHandleData, 193 221 NULL, 194 222 NULL, 195 223 &filetime ); 196 224 197 225 FileTimeToDosDateTime(&filetime, 198 226 &filedatetime[0], 199 227 &filedatetime[1] ); 200 201 202 203 204 205 206 207 else208 209 210 211 212 213 if(fuMode & OF_PARSE)214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 228 memcpy(pOFStruct->reserved, filedatetime, sizeof(pOFStruct->reserved)); 229 230 if(fuMode & OF_DELETE) 231 { 232 OSLibDosClose(hFile); 233 OSLibDosDelete((LPSTR)lpFileName); 234 } 235 else 236 if(fuMode & OF_EXIST) 237 { 238 OSLibDosClose(hFile); 239 hFile = HFILE_ERROR; 240 } 241 if(fuMode & OF_PARSE) 242 { 243 CHAR drive[4]; 244 245 drive[0] = pOFStruct->szPathName[0]; 246 drive[1] = pOFStruct->szPathName[1]; 247 drive[2] = pOFStruct->szPathName[2]; 248 drive[3] = 0; 249 250 pOFStruct->fFixedDisk = (GetDriveTypeA(drive) != DRIVE_REMOVABLE); 251 252 OSLibDosClose(hFile); 253 hFile = HFILE_ERROR; 254 } 255 256 if((fuMode & OF_VERIFY)) 257 { 258 if(memcmp(pOFStruct->reserved, filedatetime, sizeof(pOFStruct->reserved))) 259 { 260 OSLibDosClose(hFile); 261 SetLastError(ERROR_FILE_NOT_FOUND); 262 } 263 hFile = HFILE_ERROR; 264 } 265 266 pOFStruct->nErrCode = GetLastError(); 267 pHMHandleData->hHMHandle = hFile; 240 268 241 269 if(hFile != HFILE_ERROR) { 242 243 244 270 pHMHandleData->dwUserData = (DWORD) new HMFileInfo((LPSTR)lpFileName, NULL); 271 } 272 return (NO_ERROR); 245 273 } 246 274 else { 247 248 249 250 251 252 253 254 255 275 DWORD rc = GetLastError(); 276 277 if(fuMode & OF_EXIST) 278 { 279 if(rc == ERROR_OPEN_FAILED) { 280 SetLastError(ERROR_FILE_NOT_FOUND); 281 } 282 } 283 //todo: OF_PROMPT handling (pop up message box) 256 284 } 257 285 // error branch … … 266 294 /***************************************************************************** 267 295 * Name : HMDeviceFileClass::DuplicateHandle 268 * Purpose : 269 * Parameters: 296 * Purpose : 297 * Parameters: 270 298 * various parameters as required 271 299 * Variables : 272 300 * Result : 273 301 * Remark : DUPLICATE_CLOSE_SOURCE flag handled in HMDuplicateHandle 274 * 302 * 275 303 * Status : partially implemented 276 304 * 277 305 * Author : SvL 278 306 *****************************************************************************/ 279 BOOL HMDeviceFileClass::DuplicateHandle(PHMHANDLEDATA pHMHandleData, 307 BOOL HMDeviceFileClass::DuplicateHandle(PHMHANDLEDATA pHMHandleData, 280 308 HANDLE srcprocess, 281 309 PHMHANDLEDATA pHMSrcHandle, … … 292 320 dprintf(("KERNEL32:HMDeviceFileClass::DuplicateHandle (%08x,%08x,%08x,%08x,%08x)", 293 321 pHMHandleData, 294 srcprocess, 295 pHMSrcHandle->hHMHandle, 296 destprocess, 322 srcprocess, 323 pHMSrcHandle->hHMHandle, 324 destprocess, 297 325 desthandle)); 298 326 299 327 //TODO: Inheritance of file handles won't work! 300 328 301 if(destprocess != srcprocess) 329 if(destprocess != srcprocess) 302 330 { 303 331 //TODO:!!!! … … 312 340 // Can't use DosDupHandle or else there can be a sharing violation 313 341 // when an app tries to access the same file again 314 if(fdwOdinOptions) 342 if(fdwOdinOptions) 315 343 { 316 344 HMHANDLEDATA duphdata; 317 345 318 319 320 321 322 srcfileinfo->lpSecurityAttributes, NULL) == NO_ERROR) 346 memcpy(&duphdata, pHMHandleData, sizeof(duphdata)); 347 duphdata.dwCreation = OPEN_EXISTING; 348 349 if(CreateFile(srcfileinfo->lpszFileName, &duphdata, 350 srcfileinfo->lpSecurityAttributes, NULL) == NO_ERROR) 323 351 { 324 325 326 352 memcpy(pHMHandleData, &duphdata, sizeof(duphdata)); 353 SetLastError(ERROR_SUCCESS); 354 return TRUE; 327 355 } 328 dprintf(("ERROR: DuplicateHandle; CreateFile %s failed -> trying DosDupHandle instead!",356 dprintf(("ERROR: DuplicateHandle; CreateFile %s failed -> trying DosDupHandle instead!", 329 357 srcfileinfo->lpszFileName)); 330 358 //SvL: IE5 setup opens file with DENYREADWRITE, so CreateFile can't 331 359 // be used for duplicating the handle; try DosDupHandle instead 332 360 } 333 361 334 362 if(!(fdwOptions & DUPLICATE_SAME_ACCESS) && fdwAccess != pHMSrcHandle->dwAccess) { 335 363 dprintf(("WARNING: DuplicateHandle; app wants different access permission; Not supported!! (%x, %x)", fdwAccess, pHMSrcHandle->dwAccess)); 336 364 } 337 365 … … 383 411 384 412 if(pHMHandleData->dwFlags & FILE_FLAG_DELETE_ON_CLOSE) { 385 386 387 388 } 413 //TODO: should only do this after all handles have been closed 414 if(fileInfo) { 415 DeleteFileA(fileInfo->lpszFileName); 416 } 389 417 } 390 418 if(fileInfo) { 391 419 delete fileInfo; 392 420 } 393 421 dprintf(("KERNEL32: HMDeviceFileClass::CloseHandle returned %08xh\n", … … 436 464 if(lpNumberOfBytesRead) 437 465 *lpNumberOfBytesRead = 0; 438 else 466 else 439 467 lpNumberOfBytesRead = &bytesread; 440 468 441 469 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) { 442 443 444 470 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!")); 471 SetLastError(ERROR_INVALID_PARAMETER); 472 return FALSE; 445 473 } 446 474 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) { 447 448 } 449 450 //SvL: DosRead doesn't like writing to memory addresses returned by 451 // DosAliasMem -> search for original memory mapped pointer and use 475 dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation")); 476 } 477 478 //SvL: DosRead doesn't like writing to memory addresses returned by 479 // DosAliasMem -> search for original memory mapped pointer and use 452 480 // that one + commit pages if not already present 453 481 map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_WRITE); 454 482 if(map) { 455 456 457 if(offset & 0xfff) 458 459 if(nNumberOfBytesToRead & 0xfff) 460 461 462 483 lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset); 484 DWORD nrpages = nNumberOfBytesToRead/4096; 485 if(offset & 0xfff) 486 nrpages++; 487 if(nNumberOfBytesToRead & 0xfff) 488 nrpages++; 489 490 map->commitPage(offset & ~0xfff, TRUE, nrpages); 463 491 } 464 492 else lpRealBuf = (LPVOID)lpBuffer; 465 493 466 494 if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) { 467 495 dprintf(("ERROR: Overlapped IO not yet implememented!!")); 468 496 } 469 497 // else { 470 498 bRC = OSLibDosRead(pHMHandleData->hHMHandle, 471 499 (PVOID)lpRealBuf, 472 500 nNumberOfBytesToRead, … … 475 503 476 504 if(bRC == 0) { 477 505 dprintf(("KERNEL32: HMDeviceFileClass::ReadFile returned %08xh %x\n", 478 506 bRC, GetLastError())); 479 507 dprintf(("%x -> %d", lpBuffer, IsBadWritePtr((LPVOID)lpBuffer, nNumberOfBytesToRead))); 480 508 } 481 509 … … 559 587 if(lpNumberOfBytesWritten) 560 588 *lpNumberOfBytesWritten = 0; 561 else 589 else 562 590 lpNumberOfBytesWritten = &byteswritten; 563 591 564 592 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) { 565 566 567 593 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!")); 594 SetLastError(ERROR_INVALID_PARAMETER); 595 return FALSE; 568 596 } 569 597 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) { 570 571 } 572 573 //SvL: DosWrite doesn't like reading from memory addresses returned by 574 // DosAliasMem -> search for original memory mapped pointer and use 598 dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation")); 599 } 600 601 //SvL: DosWrite doesn't like reading from memory addresses returned by 602 // DosAliasMem -> search for original memory mapped pointer and use 575 603 // that one + commit pages if not already present 576 604 map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_READ); 577 605 if(map) { 578 579 580 if(offset & 0xfff) 581 582 if(nNumberOfBytesToWrite & 0xfff) 583 584 585 606 lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset); 607 DWORD nrpages = nNumberOfBytesToWrite/4096; 608 if(offset & 0xfff) 609 nrpages++; 610 if(nNumberOfBytesToWrite & 0xfff) 611 nrpages++; 612 613 map->commitPage(offset & ~0xfff, TRUE, nrpages); 586 614 } 587 615 else lpRealBuf = (LPVOID)lpBuffer; 588 616 589 617 if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) { 590 618 dprintf(("ERROR: Overlapped IO not yet implememented!!")); 591 619 } 592 620 // else { 593 621 bRC = OSLibDosWrite(pHMHandleData->hHMHandle, 594 622 (PVOID)lpRealBuf, 595 623 nNumberOfBytesToWrite, … … 677 705 BY_HANDLE_FILE_INFORMATION* pHFI) 678 706 { 679 dprintfl(("KERNEL32: HMDeviceFileClass::GetFileInformationByHandle %s(%08xh,%08xh)\n", 680 lpHMDeviceName, 681 pHMHandleData, 682 pHFI)); 683 684 if(OSLibDosGetFileInformationByHandle(pHMHandleData->hHMHandle, 685 pHFI)) 686 { 687 return TRUE; 688 } 689 dprintf(("GetFileInformationByHandle failed with error %d", GetLastError())); 690 return FALSE; 707 dprintfl(("KERNEL32: HMDeviceFileClass::GetFileInformationByHandle %s(%08xh,%08xh)\n", 708 lpHMDeviceName, pHMHandleData, pHFI)); 709 710 if(OSLibDosGetFileInformationByHandle(pHMHandleData->hHMHandle, 711 pHFI)) 712 { 713 return TRUE; 714 } 715 dprintf(("GetFileInformationByHandle failed with error %d", GetLastError())); 716 return FALSE; 691 717 692 718 } … … 707 733 BOOL HMDeviceFileClass::SetEndOfFile(PHMHANDLEDATA pHMHandleData) 708 734 { 709 dprintfl(("KERNEL32: HMDeviceFileClass::SetEndOfFile %s(%08xh)\n",710 lpHMDeviceName,711 pHMHandleData));712 713 if(OSLibDosSetEndOfFile(pHMHandleData->hHMHandle)) {714 715 }716 dprintf(("SetEndOfFile failed with error %d", GetLastError()));717 return FALSE;735 dprintfl(("KERNEL32: HMDeviceFileClass::SetEndOfFile %s(%08xh)\n", 736 lpHMDeviceName, 737 pHMHandleData)); 738 739 if(OSLibDosSetEndOfFile(pHMHandleData->hHMHandle)) { 740 return TRUE; 741 } 742 dprintf(("SetEndOfFile failed with error %d", GetLastError())); 743 return FALSE; 718 744 } 719 745 … … 743 769 WORD lastwritedate = 0, lastwritetime = 0; 744 770 745 dprintfl(("KERNEL32: HMDeviceFileClass::SetFileTime %s(%08xh,%08xh,%08xh,%08xh)\n", 746 lpHMDeviceName, 747 pHMHandleData, 748 pFT1, 749 pFT2, 750 pFT3)); 751 752 if(pFT1 && pFT1->dwLowDateTime && pFT1->dwHighDateTime) { 753 FileTimeToDosDateTime(pFT1, &creationdate, &creationtime); 754 } 755 756 if(pFT2 && pFT2->dwLowDateTime && pFT2->dwHighDateTime) { 757 FileTimeToDosDateTime(pFT2, &lastaccessdate, &lastaccesstime); 758 } 759 760 if(pFT3 && pFT3->dwLowDateTime && pFT3->dwHighDateTime) { 761 FileTimeToDosDateTime(pFT3, &lastwritedate, &lastwritetime); 762 } 763 764 if(OSLibDosSetFileTime(pHMHandleData->hHMHandle, 765 creationdate, creationtime, 766 lastaccessdate, lastaccesstime, 767 lastwritedate, lastwritetime)) 768 { 769 return TRUE; 770 } 771 dprintf(("SetFileTime failed with error %d", GetLastError())); 772 return FALSE; 771 dprintfl(("KERNEL32: HMDeviceFileClass::SetFileTime %s(%08xh,%08xh,%08xh,%08xh)\n", 772 lpHMDeviceName, pHMHandleData, pFT1, pFT2, pFT3)); 773 774 if(pFT1 && pFT1->dwLowDateTime && pFT1->dwHighDateTime) { 775 FileTimeToDosDateTime(pFT1, &creationdate, &creationtime); 776 } 777 778 if(pFT2 && pFT2->dwLowDateTime && pFT2->dwHighDateTime) { 779 FileTimeToDosDateTime(pFT2, &lastaccessdate, &lastaccesstime); 780 } 781 782 if(pFT3 && pFT3->dwLowDateTime && pFT3->dwHighDateTime) { 783 FileTimeToDosDateTime(pFT3, &lastwritedate, &lastwritetime); 784 } 785 786 if(OSLibDosSetFileTime(pHMHandleData->hHMHandle, 787 creationdate, creationtime, 788 lastaccessdate, lastaccesstime, 789 lastwritedate, lastwritetime)) 790 { 791 return TRUE; 792 } 793 dprintf(("SetFileTime failed with error %d", GetLastError())); 794 return FALSE; 773 795 } 774 796 … … 799 821 800 822 if(!pFT1 && !pFT2 && !pFT3) {//TODO: does NT do this? 801 802 803 823 dprintf(("ERROR: GetFileTime: invalid parameter!")); 824 SetLastError(ERROR_INVALID_PARAMETER); 825 return FALSE; 804 826 } 805 827 806 828 if(OSLibDosGetFileTime(pHMHandleData->hHMHandle, 807 &creationdate, &creationtime, 808 &lastaccessdate, &lastaccesstime, 829 &creationdate, &creationtime, 830 &lastaccessdate, &lastaccesstime, 809 831 &lastwritedate, &lastwritetime)) 810 832 { 811 812 813 814 815 816 817 818 819 820 833 if(pFT1) { 834 DosDateTimeToFileTime(creationdate, creationtime, pFT1); 835 } 836 if(pFT2) { 837 DosDateTimeToFileTime(lastaccessdate, lastaccesstime, pFT2); 838 } 839 if(pFT3) { 840 DosDateTimeToFileTime(lastwritedate, lastwritetime, pFT3); 841 } 842 return TRUE; 821 843 } 822 844 dprintf(("GetFileTime failed with error %d", GetLastError())); … … 886 908 887 909 if(ret == -1) { 888 910 dprintf(("SetFilePointer failed (error = %d)", GetLastError())); 889 911 } 890 912 return ret; … … 1117 1139 this->lpszFileName = (LPSTR)malloc(strlen(lpszFileName)+1); 1118 1140 if(!this->lpszFileName) { 1119 1141 DebugInt3(); 1120 1142 } 1121 1143 strcpy(this->lpszFileName, lpszFileName); … … 1127 1149 { 1128 1150 if(lpszFileName) { 1129 1130 1151 free(lpszFileName); 1152 lpszFileName = NULL; 1131 1153 } 1132 1154 }
Note:
See TracChangeset
for help on using the changeset viewer.