- Timestamp:
- Jun 16, 2001, 6:10:13 PM (24 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r5786 r6029 1 /* $Id: hmdisk.cpp,v 1. 7 2001-05-23 17:00:44sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.8 2001-06-16 16:10:12 sandervl Exp $ */ 2 2 3 3 /* … … 15 15 #include <misc.h> 16 16 #include "hmdisk.h" 17 #include "mmap.h" 17 18 #include "oslibdos.h" 18 19 #include <win\winioctl.h> … … 111 112 } 112 113 else pHMHandleData->hHMHandle = hFile; 113 114 pHMHandleData->dwUserData = GetDriveTypeA(lpFileName); 114 115 pHMHandleData->dwUserData = *lpFileName; //save drive letter 116 if(pHMHandleData->dwUserData >= 'a') { 117 pHMHandleData->dwUserData = pHMHandleData->dwUserData - ((int)'a' - (int)'A'); 118 } 115 119 return (NO_ERROR); 116 120 } … … 288 292 case IOCTL_DISK_EJECT_MEDIA: 289 293 case IOCTL_DISK_FORMAT_TRACKS: 294 case IOCTL_DISK_GET_DRIVE_LAYOUT: 295 break; 296 290 297 case IOCTL_DISK_GET_DRIVE_GEOMETRY: 291 case IOCTL_DISK_GET_DRIVE_LAYOUT:292 298 case IOCTL_DISK_GET_MEDIA_TYPES: 299 { 300 PDISK_GEOMETRY pGeom = (PDISK_GEOMETRY)lpOutBuffer; 301 if(nOutBufferSize < sizeof(DISK_GEOMETRY)) { 302 SetLastError(ERROR_INSUFFICIENT_BUFFER); 303 return FALSE; 304 } 305 if(lpBytesReturned) { 306 *lpBytesReturned = 0; 307 } 308 if(OSLibDosGetDiskGeometry(pHMHandleData->dwUserData, pGeom) == FALSE) { 309 return FALSE; 310 } 311 if(lpBytesReturned) { 312 *lpBytesReturned = sizeof(DISK_GEOMETRY); 313 } 314 return TRUE; 315 } 316 293 317 case IOCTL_DISK_GET_PARTITION_INFO: 294 318 case IOCTL_DISK_LOAD_MEDIA: … … 356 380 srb.common.SRB_Cmd = SC_HA_INQUIRY; 357 381 rc = SendASPI32Command(&srb); 382 383 char drivename[3]; 384 drivename[0] = (char)pHMHandleData->dwUserData; 385 drivename[1] = ':'; 386 drivename[2] = 0; 358 387 359 388 for(i=0;i<LOBYTE(numAdapters);i++) { … … 368 397 if(rc == SS_COMP) { 369 398 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM && 370 pHMHandleData->dwUserData== DRIVE_CDROM)399 GetDriveTypeA(drivename) == DRIVE_CDROM) 371 400 { 372 401 goto done; … … 402 431 return FALSE; 403 432 } 404 //****************************************************************************** 405 //****************************************************************************** 433 /***************************************************************************** 434 * Name : BOOL HMDeviceDiskClass::ReadFile 435 * Purpose : read data from handle / device 436 * Parameters: PHMHANDLEDATA pHMHandleData, 437 * LPCVOID lpBuffer, 438 * DWORD nNumberOfBytesToRead, 439 * LPDWORD lpNumberOfBytesRead, 440 * LPOVERLAPPED lpOverlapped 441 * Variables : 442 * Result : Boolean 443 * Remark : 444 * Status : 445 * 446 * Author : Patrick Haller [Wed, 1998/02/11 20:44] 447 *****************************************************************************/ 448 449 BOOL HMDeviceDiskClass::ReadFile(PHMHANDLEDATA pHMHandleData, 450 LPCVOID lpBuffer, 451 DWORD nNumberOfBytesToRead, 452 LPDWORD lpNumberOfBytesRead, 453 LPOVERLAPPED lpOverlapped) 454 { 455 LPVOID lpRealBuf; 456 Win32MemMap *map; 457 DWORD offset, bytesread; 458 BOOL bRC; 459 460 dprintf2(("KERNEL32: HMDeviceDiskClass::ReadFile %s(%08x,%08x,%08x,%08x,%08x) - stub?\n", 461 lpHMDeviceName, 462 pHMHandleData, 463 lpBuffer, 464 nNumberOfBytesToRead, 465 lpNumberOfBytesRead, 466 lpOverlapped)); 467 468 //SvL: It's legal for this pointer to be NULL 469 if(lpNumberOfBytesRead) 470 *lpNumberOfBytesRead = 0; 471 else 472 lpNumberOfBytesRead = &bytesread; 473 474 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) { 475 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!")); 476 SetLastError(ERROR_INVALID_PARAMETER); 477 return FALSE; 478 } 479 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && lpOverlapped) { 480 dprintf(("Warning: lpOverlapped != NULL & !FILE_FLAG_OVERLAPPED; sync operation")); 481 } 482 483 //SvL: DosRead doesn't like writing to memory addresses returned by 484 // DosAliasMem -> search for original memory mapped pointer and use 485 // that one + commit pages if not already present 486 map = Win32MemMapView::findMapByView((ULONG)lpBuffer, &offset, MEMMAP_ACCESS_WRITE); 487 if(map) { 488 lpRealBuf = (LPVOID)((ULONG)map->getMappingAddr() + offset); 489 DWORD nrpages = nNumberOfBytesToRead/4096; 490 if(offset & 0xfff) 491 nrpages++; 492 if(nNumberOfBytesToRead & 0xfff) 493 nrpages++; 494 495 map->commitPage(offset & ~0xfff, TRUE, nrpages); 496 } 497 else lpRealBuf = (LPVOID)lpBuffer; 498 499 if(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) { 500 dprintf(("ERROR: Overlapped IO not yet implememented!!")); 501 } 502 // else { 503 bRC = OSLibDosRead(pHMHandleData->hHMHandle, 504 (PVOID)lpRealBuf, 505 nNumberOfBytesToRead, 506 lpNumberOfBytesRead); 507 // } 508 509 if(bRC == 0) { 510 dprintf(("KERNEL32: HMDeviceDiskClass::ReadFile returned %08xh %x", bRC, GetLastError())); 511 dprintf(("%x -> %d", lpBuffer, IsBadWritePtr((LPVOID)lpBuffer, nNumberOfBytesToRead))); 512 } 513 514 return bRC; 515 } 516 /***************************************************************************** 517 * Name : DWORD HMDeviceDiskClass::SetFilePointer 518 * Purpose : set file pointer 519 * Parameters: PHMHANDLEDATA pHMHandleData 520 * LONG lDistanceToMove 521 * PLONG lpDistanceToMoveHigh 522 * DWORD dwMoveMethod 523 * Variables : 524 * Result : API returncode 525 * Remark : 526 * Status : 527 * 528 * Author : Patrick Haller [Wed, 1999/06/17 20:44] 529 *****************************************************************************/ 530 531 DWORD HMDeviceDiskClass::SetFilePointer(PHMHANDLEDATA pHMHandleData, 532 LONG lDistanceToMove, 533 PLONG lpDistanceToMoveHigh, 534 DWORD dwMoveMethod) 535 { 536 DWORD ret; 537 538 dprintf2(("KERNEL32: HMDeviceDiskClass::SetFilePointer %s(%08xh,%08xh,%08xh,%08xh)\n", 539 lpHMDeviceName, 540 pHMHandleData, 541 lDistanceToMove, 542 lpDistanceToMoveHigh, 543 dwMoveMethod)); 544 545 ret = OSLibDosSetFilePointer(pHMHandleData->hHMHandle, 546 lDistanceToMove, 547 (DWORD *)lpDistanceToMoveHigh, 548 dwMoveMethod); 549 550 if(ret == -1) { 551 dprintf(("SetFilePointer failed (error = %d)", GetLastError())); 552 } 553 return ret; 554 } 555 //****************************************************************************** 556 //****************************************************************************** -
trunk/src/kernel32/hmdisk.h
r5587 r6029 1 /* $Id: hmdisk.h,v 1. 3 2001-04-26 13:22:45sandervl Exp $ */1 /* $Id: hmdisk.h,v 1.4 2001-06-16 16:10:12 sandervl Exp $ */ 2 2 3 3 #ifndef __HMDISK_H__ … … 32 32 virtual BOOL CloseHandle(PHMHANDLEDATA pHMHandleData); 33 33 34 /* this is a handler method for calls to ReadFile() */ 35 virtual BOOL ReadFile (PHMHANDLEDATA pHMHandleData, 36 LPCVOID lpBuffer, 37 DWORD nNumberOfBytesToRead, 38 LPDWORD lpNumberOfBytesRead, 39 LPOVERLAPPED lpOverlapped); 40 41 /* this is a handler method for calls to SetFilePointer() */ 42 virtual DWORD SetFilePointer(PHMHANDLEDATA pHMHandleData, 43 LONG lDistanceToMove, 44 PLONG lpDistanceToMoveHigh, 45 DWORD dwMoveMethod); 46 34 47 /* this is a handler method for calls to DeviceIoControl() */ 35 48 virtual BOOL DeviceIoControl (PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode, -
trunk/src/kernel32/oslibdos.cpp
r5974 r6029 1 /* $Id: oslibdos.cpp,v 1.6 4 2001-06-12 17:03:33sandervl Exp $ */1 /* $Id: oslibdos.cpp,v 1.65 2001-06-16 16:10:12 sandervl Exp $ */ 2 2 /* 3 3 * Wrappers for OS/2 Dos* API … … 27 27 #include <win32api.h> 28 28 #include <winconst.h> 29 #include <win\winioctl.h> 29 30 #include <misc.h> 30 31 #include "initterm.h" … … 2339 2340 } 2340 2341 //****************************************************************************** 2342 //****************************************************************************** 2343 BOOL OSLibDosGetDiskGeometry(DWORD cDisk, PVOID pdiskgeom) 2344 { 2345 PDISK_GEOMETRY pGeom = (PDISK_GEOMETRY)pdiskgeom; 2346 BYTE param[2] = {0, 0}; 2347 ULONG parsize = 2; 2348 BIOSPARAMETERBLOCK bpb; 2349 ULONG datasize = sizeof(bpb); 2350 APIRET rc; 2351 2352 param[1] = cDisk - 'A'; 2353 rc = DosDevIOCtl(-1, IOCTL_DISK, DSK_GETDEVICEPARAMS, param, 2, &parsize, &bpb, sizeof(bpb), &datasize); 2354 if(rc == 0) 2355 { 2356 pGeom->SectorsPerTrack = bpb.usSectorsPerTrack; 2357 pGeom->BytesPerSector = bpb.usBytesPerSector; 2358 pGeom->TracksPerCylinder = 80; //TODO:!!!!! 2359 pGeom->Cylinders.u.LowPart = bpb.cCylinders; 2360 pGeom->Cylinders.u.HighPart = 0; 2361 switch(bpb.bDeviceType) { 2362 case DEVTYPE_48TPI: 2363 pGeom->MediaType = F5_360_512; //????? 2364 break; 2365 case DEVTYPE_96TPI: 2366 pGeom->MediaType = F5_1Pt2_512; //????? 2367 break; 2368 case DEVTYPE_35: 2369 pGeom->MediaType = F3_720_512; 2370 break; 2371 case DEVTYPE_8SD: 2372 case DEVTYPE_8DD: 2373 pGeom->MediaType = RemovableMedia; 2374 break; 2375 case DEVTYPE_FIXED: 2376 pGeom->MediaType = FixedMedia; 2377 break; 2378 case DEVTYPE_TAPE: 2379 pGeom->MediaType = RemovableMedia; 2380 break; 2381 case DEVTYPE_UNKNOWN: //others, include 1.44 3.5 inch disk drive 2382 pGeom->MediaType = F3_1Pt44_512; 2383 break; 2384 case 8: //RW optical disk 2385 pGeom->MediaType = RemovableMedia; 2386 break; 2387 case 9: //2.88 3.5 inch disk 2388 pGeom->MediaType = F3_2Pt88_512; 2389 break; 2390 } 2391 SetLastError(ERROR_SUCCESS_W); 2392 return TRUE; 2393 } 2394 SetLastError(error2WinError(rc)); 2395 return FALSE; 2396 } 2397 //****************************************************************************** 2341 2398 //Returns bit map where with the mapping of the logical drives 2342 2399 //****************************************************************************** -
trunk/src/kernel32/oslibdos.h
r5974 r6029 1 /* $Id: oslibdos.h,v 1. 29 2001-06-12 17:03:34sandervl Exp $ */1 /* $Id: oslibdos.h,v 1.30 2001-06-16 16:10:13 sandervl Exp $ */ 2 2 3 3 /* … … 216 216 ULONG OSLibGetLogicalDrives(); 217 217 ULONG OSLibDosQueryCurrentDisk(); 218 219 BOOL OSLibDosGetDiskGeometry(DWORD cDisk, void *pGeom); 218 220 219 221 #ifdef OS2DEF_INCLUDED
Note:
See TracChangeset
for help on using the changeset viewer.