Changeset 6029 for trunk/src


Ignore:
Timestamp:
Jun 16, 2001, 6:10:13 PM (24 years ago)
Author:
sandervl
Message:

disk updates

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:44 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.8 2001-06-16 16:10:12 sandervl Exp $ */
    22
    33/*
     
    1515#include <misc.h>
    1616#include "hmdisk.h"
     17#include "mmap.h"
    1718#include "oslibdos.h"
    1819#include <win\winioctl.h>
     
    111112        }
    112113        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        }
    115119        return (NO_ERROR);
    116120    }
     
    288292    case IOCTL_DISK_EJECT_MEDIA:
    289293    case IOCTL_DISK_FORMAT_TRACKS:
     294    case IOCTL_DISK_GET_DRIVE_LAYOUT:
     295        break;
     296
    290297    case IOCTL_DISK_GET_DRIVE_GEOMETRY:
    291     case IOCTL_DISK_GET_DRIVE_LAYOUT:
    292298    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
    293317    case IOCTL_DISK_GET_PARTITION_INFO:
    294318    case IOCTL_DISK_LOAD_MEDIA:
     
    356380        srb.common.SRB_Cmd = SC_HA_INQUIRY;
    357381        rc = SendASPI32Command(&srb);
     382
     383        char drivename[3];
     384        drivename[0] = (char)pHMHandleData->dwUserData;
     385        drivename[1] = ':';
     386        drivename[2] = 0;
    358387
    359388        for(i=0;i<LOBYTE(numAdapters);i++) {
     
    368397                    if(rc == SS_COMP) {
    369398                        if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
    370                                                    pHMHandleData->dwUserData == DRIVE_CDROM)
     399                           GetDriveTypeA(drivename) == DRIVE_CDROM)
    371400                        {
    372401                            goto done;
     
    402431    return FALSE;
    403432}
    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
     449BOOL 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
     531DWORD 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:45 sandervl Exp $ */
     1/* $Id: hmdisk.h,v 1.4 2001-06-16 16:10:12 sandervl Exp $ */
    22
    33#ifndef __HMDISK_H__
     
    3232  virtual BOOL   CloseHandle(PHMHANDLEDATA pHMHandleData);
    3333
     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
    3447  /* this is a handler method for calls to DeviceIoControl() */
    3548  virtual BOOL   DeviceIoControl    (PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode,
  • trunk/src/kernel32/oslibdos.cpp

    r5974 r6029  
    1 /* $Id: oslibdos.cpp,v 1.64 2001-06-12 17:03:33 sandervl Exp $ */
     1/* $Id: oslibdos.cpp,v 1.65 2001-06-16 16:10:12 sandervl Exp $ */
    22/*
    33 * Wrappers for OS/2 Dos* API
     
    2727#include <win32api.h>
    2828#include <winconst.h>
     29#include <win\winioctl.h>
    2930#include <misc.h>
    3031#include "initterm.h"
     
    23392340}
    23402341//******************************************************************************
     2342//******************************************************************************
     2343BOOL  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//******************************************************************************
    23412398//Returns bit map where with the mapping of the logical drives
    23422399//******************************************************************************
  • trunk/src/kernel32/oslibdos.h

    r5974 r6029  
    1 /* $Id: oslibdos.h,v 1.29 2001-06-12 17:03:34 sandervl Exp $ */
     1/* $Id: oslibdos.h,v 1.30 2001-06-16 16:10:13 sandervl Exp $ */
    22
    33/*
     
    216216ULONG OSLibGetLogicalDrives();
    217217ULONG OSLibDosQueryCurrentDisk();
     218
     219BOOL  OSLibDosGetDiskGeometry(DWORD cDisk, void *pGeom);
    218220
    219221#ifdef OS2DEF_INCLUDED
Note: See TracChangeset for help on using the changeset viewer.