www.pudn.com > cab文件压缩、解压程序源代码.rar > drvtype.cpp
//--------------------------------------------------------------------------- // Copyright (C) 1998, Interscope Ltd. All rights reserved. // Reproduction or distribution of this program, or any portion of it, // is permitted only if this header is kept as it is. // For more information, contact: // // Interscope Ltd., 5 Culturii St., 5th Floor, 4800 Baia Mare, RO // Phone/Fax: +40-62-215023 // E-mail: office@interscope.ro // // $Author: Levente Farkas $ // $Date: 5/12/98 11:49p $ // $Modtime: 4/27/98 6:50a $ // $Revision: 14 $ // $Archive: /Interscope/Thebe/InstallMaster/DrvType.cpp $ // $Workfile: DrvType.cpp $ //----------------------------------------------------------------------- #ifdef __STDAFX__ #include "StdAfx.H" #endif #include#include "Portable.H" #include "DrvType.H" //--- Debugee -------------------------------------------------------------- #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #ifdef __MFC__ #define new DEBUG_NEW #endif // __MFC__ #endif // _DEBUG //--- Determines the type of a drive ------------------------------------ // See the "MS-DOS Programmer's Reference" for further information // about this structure. struct DEVICEPARAMS { BYTE bSpecFunc; // Special functions BYTE bDevType; // Device type WORD wDevAttr; // Device attributes WORD wCylinders; // Number of cylinders BYTE bMediaType; // Media type // Beginning of BIOS parameter block (BPB) WORD wBytesPerSec; // Bytes per sector BYTE bSecPerClust; // Sectors per cluster WORD wResSectors; // Number of reserved sectors BYTE bFATs; // Number of FATs WORD wRootDirEnts; // Number of root-directory entries WORD wSectors; // Total number of sectors BYTE bMedia; // Media descriptor WORD wFATsecs; // Number of sectors per FAT WORD wSecPerTrack; // Number of sectors per track WORD wHeads; // Number of heads DWORD dwHiddenSecs; // Number of hidden sectors DWORD dwHugeSectors; // Number of sectors if wSectors == 0 // End of BIOS parameter block (BPB) }; typedef DEVICEPARAMS FAR * LPDEVICEPARAMS; //--- Forwards ----------------------------------------------------------- BOOL GetDeviceParameters(int nDrive, LPDEVICEPARAMS dp); BOOL IsCDRomDrive(int nDrive); UINT GetDriveTypeEx(int nDrive); //------------------------------------------------------------- // Pre : nDrive Drive number 0 = A, 1 = B, 2 = C, and so on // dp Pointer to a structure that will contain the // drive's parameters // Post : Returns TRUE if it succeeded, FALSE if it failed // Globals : // I/O : // Task : Fills a DEVICEPARAMS struct with info about the given drive // Calls DOS IOCTL Get Device Parameters (440Dh, 60h) function //------------------------------------------------------------- BOOL GetDeviceParameters(WORD nDrive, LPDEVICEPARAMS dp) { BOOL bResult=TRUE; // Assume success __asm { push ds mov bx, nDrive inc bx // Convert 0-based #'s to 1-based #s mov ch, 08h // Device category--must be 08h mov cl, 60h // MS-DOS IOCTL Get Device Parameters lds dx, dp mov ax, 440Dh int 21h jnc gdp_done // CF SET if error mov bResult, FALSE } gdp_done: __asm { pop ds } return bResult; } //------------------------------------------------------------- // Pre : nDrive Drive number 0 = A, 1 = B, 2 = C, and so on // Post : Returns TRUE if nDrive is a CD-ROM drive, FALSE if it isn't // Globals : // I/O : // Task : Determines if a drive is a CD-ROM. Calls MSCDEX and checks // that MSCDEX is loaded, and that MSCDEX reports the drive is a // CD-ROM //------------------------------------------------------------- BOOL IsCDRomDrive(WORD nDrive) { BOOL bResult=FALSE; // Assume not a CD-ROM drive __asm { mov ax, 1500h // Check if MSCDEX exists xor bx, bx int 2Fh or bx, bx // BX unchanged if MSCDEX is not around jz not_cd_drive // No mov ax, 150Bh // MSCDEX CD-ROM Drive Check xor bx, bx mov cx, nDrive int 2Fh cmp bx, 0ADADh // Check MSCDEX signature jne not_cd_drive or ax, ax // Check the drive type jz not_cd_drive // 0 (zero) means not CD-ROM mov bResult,TRUE } not_cd_drive: return bResult; } //------------------------------------------------------------- // Pre : nDrive Drive number 0 = A, 1 = B, 2 = C, and so on // Post : Returns the type of drive // Globals : // I/O : // Task : Determines the type of a drive. Calls Windows's GetDriveType // to determine if a drive is valid, fixed, remote, or removeable, // then breaks down these categories further to specific device // types //------------------------------------------------------------- UINT GetDriveTypeEx(WORD nDrive) { DEVICEPARAMS dp; UINT uType; char root[4]; ZeroMemory(&dp,sizeof(dp)); // Init device params struct #if defined(__WIN32__) || defined(_WIN32) STRCPY(root,_T("C:\\")); root[0]=('A'+nDrive); uType=GetDriveType(root); #else uType=GetDriveType(nDrive); #endif switch(uType) { case DRIVE_REMOTE: // GetDriveType() reports CD-ROMs as Remote drives. Need // to see if the drive is a CD-ROM or a network drive if(IsCDRomDrive(nDrive)) return EX_DRIVE_CDROM; else return EX_DRIVE_REMOTE; case DRIVE_REMOVABLE: // Check for a floppy disk drive. If it isn't, then we // don't know what kind of removable media it is // For example, could be a Bernoulli box or something new... if(GetDeviceParameters(nDrive,&dp)) switch(dp.bDevType) { // Floppy disk drive types case 0x0: case 0x1: case 0x2: case 0x3: case 0x4: case 0x7: case 0x8: return EX_DRIVE_FLOPPY; } return EX_DRIVE_REMOVABLE; // Unknown removable media type case DRIVE_FIXED: // GetDeviceParameters returns a device type of 0x05 for // hard disks. Because hard disks and RAM disks are the two // types of fixed-media drives, we assume that any fixed- // media drive that isn't a hard disk is a RAM disk if(GetDeviceParameters(nDrive,&dp) && (dp.bDevType==0x05)) return EX_DRIVE_FIXED; else return EX_DRIVE_RAMDISK; } return EX_DRIVE_INVALID; // Drive is invalid if we get here }