// // Close the current image and open the new image // void CommandLine() { ULONG target = '0'; PSTR file_name = NULL; VFD_DISKTYPE disk_type = VFD_DISKTYPE_FILE; VFD_MEDIA media_type = VFD_MEDIA_NONE; VFD_FLAGS image_flags = 0; VFD_FILETYPE file_type; BOOL five_inch = FALSE; CHAR protect = 0; BOOL open_folder = TRUE; BOOL close_only = FALSE; HANDLE hDevice; CHAR letter; DWORD driver_state; DWORD ret; // // process command line parameters // while (*(++__argv)) { // Open switch if (_stricmp(*__argv, VFD_OPEN_SWITCH) == 0) { close_only = FALSE; } // Close switch else if (_stricmp(*__argv, "/close") == 0) { close_only = TRUE; } // Quiet mode switch else if (stricmp(*__argv, "/q") == 0) { open_folder = FALSE; } // Disk type options else if (_stricmp(*__argv, "/ram") == 0) { disk_type = VFD_DISKTYPE_RAM; } // Protect options else if (_stricmp(*__argv, "/p") == 0 || _stricmp(*__argv, "/w") == 0) { protect = (CHAR)toupper(*(*__argv + 1)); } // media type options /*else if (strcmp(*__argv, "/160") == 0) { media_type = VFD_MEDIA_F5_160; } else if (strcmp(*__argv, "/180") == 0) { media_type = VFD_MEDIA_F5_180; } else if (strcmp(*__argv, "/320") == 0) { media_type = VFD_MEDIA_F5_320; } else if (strcmp(*__argv, "/360") == 0) { media_type = VFD_MEDIA_F5_360; } else if (strcmp(*__argv, "/640") == 0) { media_type = VFD_MEDIA_F3_640; }*/ else if (strcmp(*__argv, "/720") == 0) { media_type = VFD_MEDIA_F3_720; } /*else if (strcmp(*__argv, "/820") == 0) { media_type = VFD_MEDIA_F3_820; } else if (strcmp(*__argv, "/120") == 0 || strcmp(*__argv, "/1.20") == 0) { media_type = VFD_MEDIA_F3_1P2; }*/ else if (strcmp(*__argv, "/144") == 0 || strcmp(*__argv, "/1.44") == 0) { media_type = VFD_MEDIA_F3_1P4; } /*else if (strcmp(*__argv, "/168") == 0 || strcmp(*__argv, "/1.68") == 0) { media_type = VFD_MEDIA_F3_1P6; } else if (strcmp(*__argv, "/172") == 0 || strcmp(*__argv, "/1.72") == 0) { media_type = VFD_MEDIA_F3_1P7; } else if (strcmp(*__argv, "/288") == 0 || strcmp(*__argv, "/2.88") == 0) { media_type = VFD_MEDIA_F3_2P8; }*/ // 5.25 inch else if (strcmp(*__argv, "/5") == 0 || strcmp(*__argv, "/525") == 0 || strcmp(*__argv, "/5.25") == 0) { five_inch = TRUE; } // target drive else if (isalnum(**__argv) && *(*__argv + 1) == ':' && *(*__argv + 2) == '\0') { target = toupper(**__argv); } else if (**__argv == '*' && *(*__argv + 1) == ':' && *(*__argv + 2) == '\0') { target = (ULONG)-1; } // image filename else if (**__argv != '/') { file_name = *__argv; if (*file_name == '\"' && *(file_name + strlen(file_name) - 1) == '\"') { // remove quote characters if the path is quoted *(file_name + strlen(file_name) - 1) = '\0'; file_name++; } } // unknown options else { ShowErrorMessage(0, MSG_ERR_INVALID_PARAM, *__argv); return; } } // check parameter consistency if (target == (ULONG)-1 && !close_only) { ShowErrorMessage(0, MSG_ERR_INVALID_PARAM, "*:"); return; } // Get the current driver state ret = VfdGetDriverState(&driver_state); if (ret != ERROR_SUCCESS) { ShowErrorMessage(ret, MSG_ERR_APP_INTERNAL); return; } if (close_only && driver_state != SERVICE_RUNNING) { // nothing to do... return; } // ensure that the driver is running if (driver_state == VFD_NOT_INSTALLED) { ret = VfdInstallDriver(NULL, SERVICE_DEMAND_START); if (ret != ERROR_SUCCESS) { ShowErrorMessage(ret, MSG_ERR_DRIVER_INSTALL); return; } } // ensure that the driver is started if (driver_state != SERVICE_RUNNING) { ret = VfdStartDriver(&driver_state); if (ret != ERROR_SUCCESS || driver_state != SERVICE_RUNNING) { ShowErrorMessage(ret, MSG_ERR_DRIVER_START); return; } } // // close the current image (if any) // if (target == (ULONG)-1) { int i; for (i = 0; i < VFD_MAXIMUM_DEVICES; i++) { ret = VfdGuiClose(NULL, i); if (ret != ERROR_SUCCESS && ret != ERROR_NOT_READY) { ShowErrorMessage(ret, MSG_ERR_IMAGE_CLOSE, i + '0'); } } return; } ret = VfdGuiClose(NULL, target); if (ret != ERROR_SUCCESS && ret != ERROR_NOT_READY) { ShowErrorMessage(ret, MSG_ERR_IMAGE_CLOSE, target); return; } if (close_only) { return; } // // check target image file // if (file_name) { DWORD file_attr; ULONG image_size; ret = VfdCheckImageFile( file_name, &file_attr, &file_type, &image_size); if (ret == ERROR_FILE_NOT_FOUND) { // If file does not exist, create a new image file if (media_type == VFD_MEDIA_NONE) { media_type = VFD_MEDIA_F3_1P4; } ret = VfdCreateImageFile( file_name, media_type, VFD_FILETYPE_RAW, FALSE); if (ret != ERROR_SUCCESS) { ShowErrorMessage(ret, MSG_ERR_FILE_CREATE, file_name); return; } ret = VfdCheckImageFile( file_name, &file_attr, &file_type, &image_size); if (ret != ERROR_SUCCESS) { ShowErrorMessage(ret, MSG_ERR_FILE_OPEN, file_name); return; } } else if (ret == ERROR_SUCCESS) { // check file size / media size ULONG media_size; VFD_MEDIA def_media; media_size = VfdGetMediaSize(media_type); if (media_size > image_size) { ShowErrorMessage(0, MSG_ERR_IMAGE_TOO_SMALL); return; } def_media = VfdLookupMedia(image_size); if (def_media == VFD_MEDIA_NONE) { ShowErrorMessage(0, MSG_ERR_IMAGE_TOO_SMALL); return; } if (media_type == VFD_MEDIA_NONE) { media_type = def_media; } // check file type if (file_type == VFD_FILETYPE_ZIP || (file_attr & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_ENCRYPTED))) { disk_type = VFD_DISKTYPE_RAM; } } else { ShowErrorMessage(ret, MSG_ERR_FILE_OPEN, file_name); return; } if (disk_type != VFD_DISKTYPE_FILE) { if (protect != 'W') { protect = 'P'; } } } else { disk_type = VFD_DISKTYPE_RAM; if (media_type == VFD_MEDIA_NONE) { media_type = VFD_MEDIA_F3_1P4; } } if (protect == 'P') { image_flags |= VFD_FLAG_WRITE_PROTECTED; } if (five_inch && VfdGetMediaSize(media_type) == VfdGetMediaSize((VFD_MEDIA)(media_type + 1))) { media_type = (VFD_MEDIA)(media_type + 1); } // Open the target device hDevice = VfdOpenDevice(target); if (hDevice == INVALID_HANDLE_VALUE) { ShowErrorMessage(GetLastError(), MSG_ERR_DEVICE_OPEN, target); return; } // assign a drive letter if the drive has none VfdGetGlobalLink(hDevice, &letter); if (!isalpha(letter)) { VfdGetLocalLink(hDevice, &letter); } if (!isalpha(letter)) { letter = VfdChooseLetter(); VfdSetLocalLink(hDevice, letter); } // Open the image file ret = VfdOpenImage(hDevice, file_name, disk_type, media_type, image_flags); CloseHandle(hDevice); if (ret != ERROR_SUCCESS) { ShowErrorMessage(ret, MSG_ERR_FILE_OPEN, file_name ? file_name : "<RAM>"); return; } // // Unless otherwise specified, open the drive // if (open_folder && isalpha(letter)) { CHAR drive[] = "A:\\"; CHAR verb[20] = {0}; LONG size = sizeof(verb); drive[0] = (CHAR)toupper(letter); // get the default verb for folder object from the registry RegQueryValue(HKEY_CLASSES_ROOT, "Folder\\shell", verb, &size); ret = (DWORD)ShellExecute( NULL, verb[0] ? verb : NULL, drive, NULL, NULL, SW_SHOWNORMAL); if (ret <= 32) { VFDTRACE(0, ("OpenImage : ShellExecute - %s", GetSystemMessage(GetLastError()))); } } return; }
// // Refresh the Drive dialog // void OnRefreshDialog(HWND hDlg) { DWORD state; HANDLE hDevice; CHAR buf[MAX_PATH]; VFD_DISKTYPE disk_type; VFD_MEDIA media_type; VFD_FLAGS media_flags; VFD_FILETYPE file_type; ULONG image_size; CHAR letter; DWORD attrib; DWORD ret; // get the driver state ret = VfdGetDriverState(&state); if (ret != ERROR_SUCCESS) { return; } if (state != SERVICE_RUNNING) { // the driver is not running // clear all information and disable controls SetDlgItemText(hDlg, IDC_DRIVE_LETTER, NULL); SetDlgItemText(hDlg, IDC_IMAGEFILE, NULL); SetDlgItemText(hDlg, IDC_MEDIATYPE, NULL); EnableWindow(GetDlgItem(hDlg, IDC_CHANGE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_OPEN), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_SAVE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), FALSE); return; } // open the device hDevice = VfdOpenDevice(GetWindowLong(hDlg, GWL_USERDATA)); if (hDevice == INVALID_HANDLE_VALUE) { AppendLogMessage(GetLastError(), 0); return; } // get the current drive letter VfdGetGlobalLink(hDevice, &letter); buf[0] = '\0'; if (isalpha(letter)) { sprintf(buf, "%c (", letter); GetLocalMessage(MSG_PERSISTENT, &buf[3], sizeof(buf) - 3); strcat(buf, ")"); } else { VfdGetLocalLink(hDevice, &letter); if (isalpha(letter)) { sprintf(buf, "%c (", letter); GetLocalMessage(MSG_EPHEMERAL, &buf[3], sizeof(buf) - 3); strcat(buf, ")"); } } SetDlgItemText(hDlg, IDC_DRIVE_LETTER, buf); EnableWindow(GetDlgItem(hDlg, IDC_CHANGE), TRUE); // get the current image information ret = VfdGetImageInfo(hDevice, buf, &disk_type, &media_type, &media_flags, &file_type, &image_size); CloseHandle(hDevice); if (ret != ERROR_SUCCESS) { AppendLogMessage(ret, 0); return; } if (media_type == VFD_MEDIA_NONE) { // no media SetDlgItemText(hDlg, IDC_IMAGEFILE, NULL); SetDlgItemText(hDlg, IDC_DESCRIPTION, NULL); SetDlgItemText(hDlg, IDC_MEDIATYPE, NULL); EnableWindow(GetDlgItem(hDlg, IDC_OPEN), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_SAVE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), FALSE); SendMessage(GetDlgItem(hDlg, IDC_OPEN), BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE); return; } // set image file name if (buf[0]) { attrib = GetFileAttributes(buf); if (attrib == INVALID_FILE_ATTRIBUTES) { attrib = 0; } } else { if (disk_type != VFD_DISKTYPE_FILE) { strcpy(buf, "<RAM>"); } file_type = VFD_FILETYPE_NONE; attrib = 0; } SetDlgItemText(hDlg, IDC_IMAGEFILE, buf); // set description VfdMakeFileDesc(buf, sizeof(buf), file_type, image_size, attrib); SetDlgItemText(hDlg, IDC_DESCRIPTION, buf); // set disk type text // set media type text SetDlgItemText(hDlg, IDC_MEDIATYPE, VfdMediaTypeName(media_type)); // set write protected state // // enable / disable appropriate buttons // EnableWindow(GetDlgItem(hDlg, IDC_OPEN), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_SAVE), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), TRUE); SendMessage(GetDlgItem(hDlg, IDC_CLOSE), BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE); }