Annotation of q_a/samples/drives/drives.c, revision 1.1

1.1     ! root        1: /****************************************************************************
        !             2: *
        !             3: *    PROGRAM: DRIVES.C
        !             4: *
        !             5: *    PURPOSE: Determines all drives in the system, both local and remote,
        !             6: *             and their file system type
        !             7: *
        !             8: *    FUNCTIONS:
        !             9: *
        !            10: *    CheckRM() - verifies that a removeable media drive contains a disk
        !            11: *    GVI() - gets the volume information for a drive and prints out the
        !            12: *            file system type
        !            13: *    UpdateBuffer() - updates string pointer to the next string in an array
        !            14: *            of strings
        !            15: *
        !            16: *    COMMENTS:
        !            17: *
        !            18: ****************************************************************************/
        !            19: 
        !            20: #include <windows.h>
        !            21: #include <stdio.h>
        !            22: #include <string.h>
        !            23: #include "drives.h"
        !            24: 
        !            25: #define BUFSIZE 2048
        !            26: 
        !            27: CHAR chBuffer[BUFSIZE];
        !            28: 
        !            29: /****************************************************************************
        !            30: *
        !            31: *    FUNCTION: CheckRM(LPTSTR)
        !            32: *
        !            33: *    PURPOSE: Verifies that a removeable media drive contains a disk
        !            34: *
        !            35: *    COMMENTS:
        !            36: *
        !            37: *        This function is called each time a drive type is determined to be
        !            38: *        removeable (DRIVE_REMOVEABLE).  An attempt is made to open a
        !            39: *        file in the root directory of the drive.  If the attempt succeeds,
        !            40: *        then media is present in the drive and subsequent calls to the
        !            41: *        drive can be safely made.  If the call fails, then there is no media
        !            42: *        present in the drive and no attempts should be made to access this
        !            43: *        drive.  The Error Mode is temporarily set to 1 to allow failures
        !            44: *        to immediately return to the calling program.  This eliminates
        !            45: *        unwanted dialog boxes that prompt for disks to be placed in the
        !            46: *        drive.
        !            47: *
        !            48: *    INPUT: lpszDriveName - removeable media drive name (ex - "a:")
        !            49: *
        !            50: *    OUTPUT: Returns TRUE if media present
        !            51: *                    FALSE if media is not present
        !            52: *
        !            53: ****************************************************************************/
        !            54: 
        !            55: BOOL CheckRM(LPTSTR lpszDriveName)
        !            56: {
        !            57:   int      iRC;
        !            58:   LPTSTR   lpszFileName="         ";
        !            59:   OFSTRUCT ofstruct;
        !            60:   WORD     wStyle=OF_EXIST;
        !            61: 
        !            62:   SetErrorMode(1);
        !            63:   strcpy(lpszFileName,lpszDriveName);
        !            64:   strcat(lpszFileName,".");
        !            65:   iRC=OpenFile(lpszFileName,&ofstruct,wStyle);
        !            66:   SetErrorMode(0);
        !            67:   if (iRC==-1)
        !            68:     return (FALSE);
        !            69:   _lclose(iRC);
        !            70:   return (TRUE);
        !            71: }
        !            72: 
        !            73: /****************************************************************************
        !            74: *
        !            75: *    FUNCTION: GVI(LPTSTR, LPTSTR, DWORD)
        !            76: *
        !            77: *    PURPOSE: gets the Volume Information for the specified drive and prints
        !            78: *             the file system type
        !            79: *
        !            80: *    COMMENTS:
        !            81: *        This function makes a call to GetVolumeInformation.  The file system
        !            82: *        type is returned in the szSystemName buffer.  The file system type
        !            83: *        is printed to the screen.
        !            84: *
        !            85: *    INPUT: lpszDriveName - pointer to the drive name (ex - "a:")
        !            86: *           lpszSystemName - pointer to the system name buffer.  This will
        !            87: *                            be filled in by the GetVolumeInformation call
        !            88: *                            (e.g. FAT, HPFS)
        !            89: *           nSystemNameSize - size of the lpszSystemName buffer
        !            90: *
        !            91: *    OUTPUT: None
        !            92: *
        !            93: ****************************************************************************/
        !            94: 
        !            95: VOID GVI(LPTSTR lpszDriveName,LPTSTR lpszSystemName, DWORD nSystemNameSize)
        !            96: {
        !            97:   BOOL     bRC;
        !            98: 
        !            99:   bRC=GetVolumeInformation(lpszDriveName,
        !           100:                            NULL,
        !           101:                            NULL,
        !           102:                            NULL,
        !           103:                            NULL,
        !           104:                            NULL,
        !           105:                            lpszSystemName,
        !           106:                            nSystemNameSize);
        !           107:   printf("File system = %s",lpszSystemName);
        !           108: }
        !           109: 
        !           110: /****************************************************************************
        !           111: *
        !           112: *    FUNCTION: UpdateBuffer(LPTSTR)
        !           113: *
        !           114: *    PURPOSE: updates string pointer to the next string in an array
        !           115: *             of strings
        !           116: *
        !           117: *    COMMENTS:
        !           118: *
        !           119: *    INPUT: lpszString - pointer to an array of zero terminated strings.
        !           120: *                        The final string is terminated with a double null.
        !           121: *
        !           122: *    OUTPUT: modified pointer that points to the next string in the array
        !           123: *
        !           124: ****************************************************************************/
        !           125: 
        !           126: LPTSTR UpdateBuffer(LPTSTR lpszString)
        !           127: {
        !           128:   return (lpszString+strlen(lpszString)+1);
        !           129: }
        !           130: 
        !           131: /****************************************************************************
        !           132: *
        !           133: *    FUNCTION: main()
        !           134: *
        !           135: *    PURPOSE: the main C routine
        !           136: *
        !           137: *    COMMENTS:
        !           138: *        The number of available drives is first determined by a call to
        !           139: *        GetLogicalDrives.  This provides a bit mask of all logical drives.
        !           140: *        Next, a call is made to GetLogicalDriveStrings to get the valid
        !           141: *        drive strings for the system.
        !           142: *
        !           143: *        For each logical drive, a call is made to GetDriveType to determine
        !           144: *        the drive type.  If the logical drive is not in the bit mask that
        !           145: *        was created with the GetLogicalDrives call, then this drive is
        !           146: *        bypassed.
        !           147: *
        !           148: *        GetVolumeInformation is used to determine the file system
        !           149: *        for the logical drive.  This information is returned in the
        !           150: *        lpszFileSystemNameBuffer variable.  If the drive type is
        !           151: *        remote, a check must be made to see if the drive contains a
        !           152: *        disk. This is accomplished by opening '.' in the root
        !           153: *        directory of the remote drive.  The error level is temporarily
        !           154: *        changed from 0 to 1, to allow any OpenFileErrors to immediately
        !           155: *        return to the calling function, thus eliminating any unwanted
        !           156: *        dialog boxes.  If the remote drive contains a disk, then it is
        !           157: *        safe to proceed with the GetVolumeInformation call.
        !           158: *
        !           159: *    INPUT: None
        !           160: *
        !           161: *    OUTPUT: None
        !           162: *
        !           163: ****************************************************************************/
        !           164: 
        !           165: VOID main(VOID)
        !           166: {
        !           167:   DWORD     dwDriveMask;
        !           168:   DWORD     dwRC;
        !           169:   DWORD     dwTemp;
        !           170:   DWORD     cbDriveStringBufferSize=BUFSIZE;
        !           171:   LPTSTR    lpszDriveStringBuffer=chBuffer;
        !           172:   LPTSTR    lpszRootPathName="?:\\";
        !           173:   LPTSTR    lpszFileSystemNameBuffer="                              ";
        !           174:   DWORD     nFileSystemNameSize=sizeof("                              ");
        !           175: 
        !           176:   dwDriveMask=GetLogicalDrives();
        !           177:   dwRC=GetLogicalDriveStrings(cbDriveStringBufferSize,lpszDriveStringBuffer);
        !           178:   for (*lpszRootPathName='a';*lpszRootPathName<='z';(*lpszRootPathName)++)
        !           179:     {
        !           180:     dwTemp=dwDriveMask & 1;
        !           181:     dwDriveMask >>= 1;
        !           182:     if (dwTemp)
        !           183:       {
        !           184:       dwRC=GetDriveType(lpszRootPathName);
        !           185:       printf("The drive type for %s is ",lpszDriveStringBuffer);
        !           186:       lpszDriveStringBuffer=UpdateBuffer(lpszDriveStringBuffer);
        !           187:       switch (dwRC)
        !           188:         {
        !           189:         case DRIVE_REMOVEABLE :
        !           190:             printf("removeable. ");
        !           191:             if (CheckRM(lpszRootPathName))
        !           192:               GVI(lpszRootPathName,lpszFileSystemNameBuffer,nFileSystemNameSize);
        !           193:             else
        !           194:               printf("File system = INDETERMINATE");
        !           195:             break;
        !           196:         case DRIVE_FIXED      :
        !           197:             printf("fixed.      ");
        !           198:             GVI(lpszRootPathName,lpszFileSystemNameBuffer,nFileSystemNameSize);
        !           199:             break;
        !           200:         case DRIVE_REMOTE     :
        !           201:             printf("remote.     ");
        !           202:             GVI(lpszRootPathName,lpszFileSystemNameBuffer,nFileSystemNameSize);
        !           203:             break;
        !           204:         case DRIVE_CDROM      :
        !           205:             printf("CD-ROM.     ");
        !           206:             GVI(lpszRootPathName,lpszFileSystemNameBuffer,nFileSystemNameSize);
        !           207:             break;
        !           208:         case DRIVE_RAMDISK    :
        !           209:             printf("RAM disk.   ");
        !           210:             GVI(lpszRootPathName,lpszFileSystemNameBuffer,nFileSystemNameSize);
        !           211:             break;
        !           212:         default               :
        !           213:             break;
        !           214:         }
        !           215:       printf("\n");
        !           216:       }
        !           217:     }
        !           218: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.