// UNMOUNT - Unmounts a drive, so that it can be removed // Version 1.00 // Copyright (c) 1995, Christoph H. Hochstätter #include #include #include #include #include #include #include #include "mnt.h" HANDLE filenum; UINT DriveType; char quiet = FALSE; char rootname[MaxRootName]; char keyin[MaxKeyIn]; char filename[MaxDeviceName]; char RealDeviceName[MaxDeviceItem]; char ValidDevice = FALSE; import char __fastcall ValidDrive(char *); import void __fastcall index(char *, char *[], register unsigned short *); import int __fastcall sort(char *[],const unsigned short); __inline void __fastcall chmalloc(void **chpointer, int bytes) { if (!(*chpointer=malloc(bytes))) { fputs("Not enough memory.\n",stderr); ExitProcess(94); } } void __fastcall MyQueryDosDevice(const LPCTSTR s1,const LPTSTR s2,const DWORD i) { if (!QueryDosDevice(s1,s2,i)) { fputs("QueryDosDevice failed.\n",stderr); ExitProcess(95); } } void __fastcall qputs(const char *string) { if (!quiet) puts(string); } __inline void __fastcall qfputs(const char *string, FILE *file) { if (!quiet) fputs(string,file); } void __fastcall qprintf(const char *string, ...) { va_list marker; va_start(marker,string); if (!quiet) vprintf(string,marker); } void __fastcall Exception(void) { unsigned int rc; rc=GetLastError(); if (!rc) return; fprintf(stderr,"\n\n"); switch (rc) { case 2: fprintf(stderr,"The device %s does not exist.\n",keyin); break; case 5: fprintf(stderr,"Another process has opened %s exclusively or %s is no root.\n",keyin,keyin); break; default: fprintf(stderr,"An error has occured. Errornumber %d\n",rc); } ExitProcess(rc); } void __fastcall Usage(void) { fputs("Usage: unmount [-abdelq] to unmount a volume.\n\n",stderr); fputs("-a: Always delete drive letter. (Default: For non-removable disks only)\n",stderr); fputs("-b: Delete drive letter before locking.\n",stderr); fputs("-d: Never delete drive letter.\n",stderr); fputs("-e: Don't eject media after unmounting.\n",stderr); fputs("-l: Try locking the disk continously.\n",stderr); fputs("-q: Quiet operation.\n",stderr); ExitProcess(87); } void __fastcall DeleteDefinition(void) { qprintf("Deleting \\DosDevices\\%s (Ensures no new files can be opened)\n",keyin); if (!DefineDosDevice(DDD_REMOVE_DEFINITION,keyin,NULL)) Exception(); } __inline void __fastcall PhysicalCheck(const char drive[]) { char *DeviceBuffer; unsigned short MaxDevicelist; char *Devicelist[MaxDosDevices]; char CurrentDevice[MaxDeviceItem]; char *part1; char *part2; unsigned short i; if (QueryDosDevice(drive,RealDeviceName,MaxDeviceItem)) { if ((part1=strrchr(RealDeviceName,'\\')) == NULL) return; ValidDevice=TRUE; chmalloc(&DeviceBuffer,MaxDeviceBuffer); MyQueryDosDevice(NULL,DeviceBuffer,MaxDeviceBuffer); index(DeviceBuffer,Devicelist,&MaxDevicelist); MaxDevicelist=sort(Devicelist,MaxDevicelist); for (i=0;i<=MaxDevicelist;i++) { MyQueryDosDevice(Devicelist[i],CurrentDevice,MaxDeviceItem); part2=strrchr(CurrentDevice,'\\'); if (stricmp(Devicelist[i],drive)\ &&(!stricmp(CurrentDevice,RealDeviceName)\ ||((part2 != NULL )\ &&!memicmp("\\partition",part2,10)\ &&!memicmp(CurrentDevice,RealDeviceName,max(part2-CurrentDevice,part1-RealDeviceName))))) { printf("%s same physical disk as %s.\n",Devicelist[i],drive); } } free(DeviceBuffer); } } int main(int argc, char *argv[], char *envp[]) { DWORD dummy = 0; DISK_GEOMETRY Info; BOOL DontRetryLock = TRUE; BOOL DontEject = FALSE; BOOL DontDeleteDefinition = FALSE; BOOL DeleteAlways = FALSE; BOOL DeleteBeforeLock = FALSE; int i,j; if ((argc < 2) || (!ValidDrive(argv[--argc]))) Usage(); for (i=1;i