Ignore:
Timestamp:
Sep 26, 2002, 6:06:07 PM (23 years ago)
Author:
sandervl
Message:

lots of fixes/changes for physical disk & volume access

File:
1 edited

Legend:

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

    r8401 r9298  
    1 /* $Id: osliblvm.cpp,v 1.2 2002-05-10 14:55:13 sandervl Exp $ */
     1/* $Id: osliblvm.cpp,v 1.3 2002-09-26 16:06:07 sandervl Exp $ */
    22
    33/*
     
    319319        return FALSE;   //no more volumes
    320320    }
    321     volinfo = Get_Volume_Information(volctrl->Volume_Control_Data[volindex].Volume_Handle, &lasterror);
    322     if(lasterror != LVM_ENGINE_NO_ERROR) {
    323         DebugInt3();
    324         return FALSE;
     321    while(volindex < volctrl->Count) {
     322        volinfo = Get_Volume_Information(volctrl->Volume_Control_Data[volindex].Volume_Handle, &lasterror);
     323        if(lasterror != LVM_ENGINE_NO_ERROR) {
     324            DebugInt3();
     325            return FALSE;
     326        }
     327        //Don't report anything about LVM volumes until we support all those
     328        //fancy features (like spanned volumes)
     329        if(volinfo.Compatibility_Volume == TRUE) break;
     330        dprintf(("Ignoring LVM volume %s", volinfo.Volume_Name));
     331        volindex++;
     332    }
     333    if(volindex >= volctrl->Count) {
     334        return FALSE;   //no more volumes
    325335    }
    326336    strncpy(lpszVolumeName, volinfo.Volume_Name, min(sizeof(volinfo.Volume_Name), cchBufferLength)-1);
     
    428438    pPartition->StartingOffset.u.HighPart = partctrl.Partition_Array[0].Partition_Start >> 23;
    429439    pPartition->StartingOffset.u.LowPart  = partctrl.Partition_Array[0].Partition_Start << 9;
     440//    pPartition->PartitionLength.u.HighPart= partctrl.Partition_Array[0].True_Partition_Size >> 23;
     441//    pPartition->PartitionLength.u.LowPart = partctrl.Partition_Array[0].True_Partition_Size << 9;
     442//    pPartition->HiddenSectors             = 0;
    430443    pPartition->PartitionLength.u.HighPart= partctrl.Partition_Array[0].Usable_Partition_Size >> 23;
    431444    pPartition->PartitionLength.u.LowPart = partctrl.Partition_Array[0].Usable_Partition_Size << 9;
     
    466479    }
    467480
     481    //TODO: spanned volumes
    468482    pVolExtent->NumberOfDiskExtents = 1;
    469483    pVolExtent->Extents[0].DiskNumber  = 0;
    470484    pVolExtent->Extents[0].StartingOffset.u.HighPart = partctrl.Partition_Array[0].Partition_Start >> 23;;
    471485    pVolExtent->Extents[0].StartingOffset.u.LowPart  = partctrl.Partition_Array[0].Partition_Start << 9;
     486//    pVolExtent->Extents[0].ExtentLength.u.HighPart   = partctrl.Partition_Array[0].True_Partition_Size >> 23;
     487//    pVolExtent->Extents[0].ExtentLength.u.LowPart    = partctrl.Partition_Array[0].True_Partition_Size << 9;
    472488    pVolExtent->Extents[0].ExtentLength.u.HighPart   = partctrl.Partition_Array[0].Usable_Partition_Size >> 23;
    473489    pVolExtent->Extents[0].ExtentLength.u.LowPart    = partctrl.Partition_Array[0].Usable_Partition_Size << 9;
    474490
     491    //find number of disk on which this volume is located
     492    diskinfo = Get_Drive_Control_Data(&lasterror);
     493    if(lasterror != LVM_ENGINE_NO_ERROR) {
     494        return FALSE;
     495    }
     496    for(int i=0;i<diskinfo.Count;i++) {
     497        if(diskinfo.Drive_Control_Data[i].Drive_Handle == partctrl.Partition_Array[0].Drive_Handle) {
     498            //win32 base = 0, os2 base = 1
     499            pVolExtent->Extents[0].DiskNumber = diskinfo.Drive_Control_Data[i].Drive_Number - 1;
     500#ifdef DEBUG
     501            if(diskinfo.Drive_Control_Data[i].Drive_Number == 0) DebugInt3();
     502#endif
     503            break;
     504        }
     505    }
     506    if(i == diskinfo.Count) {
     507        ret = FALSE;
     508    }
    475509    dprintf(("pVolExtent->NumberOfDiskExtents       %d", pVolExtent->NumberOfDiskExtents));
    476510    dprintf(("pVolExtent->Extents[0].DiskNumber     %d",  pVolExtent->Extents[0].DiskNumber));
     
    478512    dprintf(("pVolExtent->Extents[0].ExtentLength   %08x%08x", pVolExtent->Extents[0].ExtentLength.u.HighPart, pVolExtent->Extents[0].ExtentLength.u.LowPart));
    479513
    480     //find number of disk on which this volume is located
    481     diskinfo = Get_Drive_Control_Data(&lasterror);
    482     if(lasterror != LVM_ENGINE_NO_ERROR) {
    483         return FALSE;
    484     }
    485     for(int i=0;i<diskinfo.Count;i++) {
    486         if(diskinfo.Drive_Control_Data[i].Drive_Handle == partctrl.Partition_Array[0].Drive_Handle) {
    487             pVolExtent->Extents[0].DiskNumber = diskinfo.Drive_Control_Data[i].Drive_Number;
    488             break;
    489         }
    490     }
    491     if(i == diskinfo.Count) {
    492         ret = FALSE;
    493     }
    494514    if(pfLVMVolume) {
    495515        *pfLVMVolume = (volinfo.Compatibility_Volume == FALSE);
     
    655675//******************************************************************************
    656676//******************************************************************************
    657 
     677BOOL OSLibLVMGetDiskGeometry(DWORD dwDiskNr, PDISK_GEOMETRY pGeom)
     678{
     679    Drive_Control_Array   driveinfo;
     680    Drive_Control_Record *pDriveRec;
     681    CARDINAL32            lasterror;
     682    BOOL                  ret = FALSE;
     683    int                   i;
     684
     685    driveinfo = Get_Drive_Control_Data(&lasterror);
     686    if(lasterror != LVM_ENGINE_NO_ERROR) {
     687        DebugInt3();
     688        return FALSE;
     689    }
     690    pDriveRec = driveinfo.Drive_Control_Data;
     691    if(pDriveRec == NULL) {
     692        DebugInt3();
     693        return FALSE;
     694    }
     695    if(dwDiskNr > driveinfo.Count) {
     696        DebugInt3();
     697        ret = FALSE;
     698        goto endfunc;
     699    }
     700    for(i=0;i<driveinfo.Count;i++) {
     701        if(pDriveRec->Drive_Number == dwDiskNr) {
     702            pGeom->Cylinders.u.LowPart  = pDriveRec->Cylinder_Count;
     703            pGeom->Cylinders.u.HighPart = 0;
     704            pGeom->TracksPerCylinder    = pDriveRec->Heads_Per_Cylinder;
     705            pGeom->SectorsPerTrack      = pDriveRec->Sectors_Per_Track;
     706            pGeom->BytesPerSector       = 512;
     707            pGeom->MediaType            = FixedMedia;
     708
     709            ret = TRUE;
     710            break;
     711        }
     712    }
     713endfunc:
     714    Free_Engine_Memory((ULONG)driveinfo.Drive_Control_Data);
     715    return ret;
     716}
     717//******************************************************************************
     718//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.