mirror of
https://github.com/reactos/reactos.git
synced 2024-09-11 05:12:43 +00:00
![Pierre Schweitzer](/assets/img/avatar_default.png)
floppy drives in ReactOS and mount images on them. Only the cmd got imported. The GUI interface may come later on. Note that, as for vcdrom, the driver is left disabled and you need to explicitely start it through vfd command line interface. CORE-14090
435 lines
8.5 KiB
C++
435 lines
8.5 KiB
C++
/*
|
|
vfdshprop.cpp
|
|
|
|
Virtual Floppy Drive for Windows
|
|
Driver control library
|
|
COM shell extension class property sheet functions
|
|
|
|
Copyright (c) 2003-2005 Ken Kato
|
|
*/
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <shellapi.h>
|
|
#include <shlobj.h>
|
|
#include <stdio.h>
|
|
|
|
#include "vfdtypes.h"
|
|
#include "vfdapi.h"
|
|
#include "vfdlib.h"
|
|
#include "vfdver.h"
|
|
#ifndef __REACTOS__
|
|
#include "vfdmsg.h"
|
|
#else
|
|
#include "vfdmsg_lib.h"
|
|
#endif
|
|
#include "vfdguirc.h"
|
|
|
|
// class header
|
|
#include "vfdshext.h"
|
|
|
|
// property sheet property ID
|
|
|
|
#define VFD_PROPERTY_ID "VFD"
|
|
|
|
//
|
|
// local functions
|
|
//
|
|
static BOOL CALLBACK VfdPageDlgProc(
|
|
HWND hDlg,
|
|
UINT uMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
static UINT CALLBACK VfdPageCallback(
|
|
HWND hWnd,
|
|
UINT uMessage,
|
|
LPPROPSHEETPAGE ppsp);
|
|
|
|
static void OnPropInit(HWND hDlg);
|
|
static void OnControl(HWND hDlg);
|
|
static void UpdateImageInfo(HWND hDlg, ULONG nDevice);
|
|
|
|
//
|
|
// property sheet callback function
|
|
//
|
|
UINT CALLBACK VfdPageCallback(
|
|
HWND hWnd,
|
|
UINT uMessage,
|
|
LPPROPSHEETPAGE ppsp)
|
|
{
|
|
UNREFERENCED_PARAMETER(hWnd);
|
|
|
|
switch(uMessage) {
|
|
case PSPCB_CREATE:
|
|
return TRUE;
|
|
|
|
case PSPCB_RELEASE:
|
|
if (ppsp->lParam) {
|
|
((LPCVFDSHEXT)(ppsp->lParam))->Release();
|
|
}
|
|
return TRUE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// property page dialog procedure
|
|
//
|
|
BOOL CALLBACK VfdPageDlgProc(
|
|
HWND hDlg,
|
|
UINT uMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
LPPROPSHEETPAGE psp;
|
|
LPCVFDSHEXT lpcs;
|
|
|
|
switch (uMessage) {
|
|
case WM_INITDIALOG:
|
|
SetWindowLong(hDlg, DWL_USER, lParam);
|
|
|
|
if (lParam) {
|
|
lpcs = (LPCVFDSHEXT)((LPPROPSHEETPAGE)lParam)->lParam;
|
|
|
|
OnPropInit(hDlg);
|
|
UpdateImageInfo(hDlg, lpcs->GetDevice());
|
|
}
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
psp = (LPPROPSHEETPAGE)GetWindowLong(hDlg, DWL_USER);
|
|
|
|
if (!psp) {
|
|
break;
|
|
}
|
|
|
|
lpcs = (LPCVFDSHEXT)psp->lParam;
|
|
|
|
if (!lpcs) {
|
|
break;
|
|
}
|
|
|
|
switch (wParam) {
|
|
case IDC_OPEN:
|
|
if (lpcs->DoVfdOpen(hDlg) == ERROR_SUCCESS) {
|
|
SendMessage((HWND)lParam,
|
|
BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
|
|
}
|
|
UpdateImageInfo(hDlg, lpcs->GetDevice());
|
|
break;
|
|
|
|
case IDC_SAVE:
|
|
if (lpcs->DoVfdSave(hDlg) == ERROR_SUCCESS) {
|
|
SendMessage((HWND)lParam,
|
|
BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
|
|
}
|
|
UpdateImageInfo(hDlg, lpcs->GetDevice());
|
|
break;
|
|
|
|
case IDC_CLOSE:
|
|
if (lpcs->DoVfdClose(hDlg) == ERROR_SUCCESS) {
|
|
SendMessage((HWND)lParam,
|
|
BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
|
|
}
|
|
UpdateImageInfo(hDlg, lpcs->GetDevice());
|
|
break;
|
|
|
|
case IDC_WRITE_PROTECTED:
|
|
lpcs->DoVfdProtect(hDlg);
|
|
break;
|
|
|
|
case IDC_FORMAT:
|
|
VfdGuiFormat(hDlg, lpcs->GetDevice());
|
|
break;
|
|
|
|
case IDC_CONTROL:
|
|
OnControl(hDlg);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
ShowContextMenu(hDlg, (HWND)wParam, lParam);
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
LPHELPINFO info = (LPHELPINFO)lParam;
|
|
|
|
if (info->iContextType == HELPINFO_WINDOW) {
|
|
ShowHelpWindow(hDlg, info->iCtrlId);
|
|
}
|
|
}
|
|
return TRUE;
|
|
|
|
default:
|
|
if (uMessage == g_nNotifyMsg) {
|
|
psp = (LPPROPSHEETPAGE)GetWindowLong(hDlg, DWL_USER);
|
|
|
|
if (!psp) {
|
|
break;
|
|
}
|
|
|
|
lpcs = (LPCVFDSHEXT)psp->lParam;
|
|
|
|
if (!lpcs) {
|
|
break;
|
|
}
|
|
|
|
UpdateImageInfo(hDlg, lpcs->GetDevice());
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// initialize the property page
|
|
//
|
|
void OnPropInit(
|
|
HWND hDlg)
|
|
{
|
|
// set up control text
|
|
|
|
SetDlgItemText(hDlg, IDC_PROPERTY_TITLE, VFD_PRODUCT_DESC);
|
|
SetDlgItemText(hDlg, IDC_COPYRIGHT_STR, VFD_COPYRIGHT_STR);
|
|
|
|
SetControlText(hDlg, IDC_IMAGEFILE_LABEL, MSG_IMAGEFILE_LABEL);
|
|
SetControlText(hDlg, IDC_IMAGEDESC_LABEL, MSG_DESCRIPTION_LABEL);
|
|
SetControlText(hDlg, IDC_DISKTYPE_LABEL, MSG_DISKTYPE_LABEL);
|
|
SetControlText(hDlg, IDC_MEDIATYPE_LABEL, MSG_MEDIATYPE_LABEL);
|
|
SetControlText(hDlg, IDC_WRITE_PROTECTED, MSG_MENU_PROTECT);
|
|
SetControlText(hDlg, IDC_OPEN, MSG_OPEN_BUTTON);
|
|
SetControlText(hDlg, IDC_SAVE, MSG_SAVE_BUTTON);
|
|
SetControlText(hDlg, IDC_CLOSE, MSG_CLOSE_BUTTON);
|
|
SetControlText(hDlg, IDC_FORMAT, MSG_FORMAT_BUTTON);
|
|
SetControlText(hDlg, IDC_CONTROL, MSG_CONTROL_BUTTON);
|
|
}
|
|
|
|
//
|
|
// Control Panel button is clicked
|
|
//
|
|
void OnControl(
|
|
HWND hDlg)
|
|
{
|
|
CHAR module_path[MAX_PATH];
|
|
CHAR full_path[MAX_PATH];
|
|
PSTR file_name;
|
|
DWORD ret;
|
|
|
|
ret = GetModuleFileName(
|
|
g_hDllModule, module_path, sizeof(module_path));
|
|
|
|
if (ret == 0 || ret >= sizeof(module_path)) {
|
|
file_name = full_path;
|
|
}
|
|
else {
|
|
ret = GetFullPathName(
|
|
module_path, sizeof(full_path), full_path, &file_name);
|
|
|
|
if (ret == 0 || ret >= sizeof(full_path)) {
|
|
file_name = full_path;
|
|
}
|
|
}
|
|
|
|
strcpy(file_name, "vfdwin.exe");
|
|
|
|
VFDTRACE(0, ("Starting %s\n", full_path));
|
|
|
|
ret = (DWORD)ShellExecute(
|
|
hDlg, NULL, full_path, NULL, NULL, SW_SHOW);
|
|
|
|
if (ret > 32) {
|
|
PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL);
|
|
}
|
|
else {
|
|
MessageBox(hDlg, SystemMessage(ret),
|
|
VFD_MSGBOX_TITLE, MB_ICONSTOP);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Update image information on the property page
|
|
//
|
|
void UpdateImageInfo(
|
|
HWND hDlg,
|
|
ULONG nDevice)
|
|
{
|
|
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;
|
|
DWORD attrib;
|
|
ULONG ret;
|
|
|
|
hDevice = VfdOpenDevice(nDevice);
|
|
|
|
if (hDevice == INVALID_HANDLE_VALUE) {
|
|
MessageBox(hDlg,
|
|
SystemMessage(GetLastError()),
|
|
VFD_MSGBOX_TITLE, MB_ICONSTOP);
|
|
return;
|
|
}
|
|
|
|
// get current image information
|
|
|
|
ret = VfdGetImageInfo(
|
|
hDevice,
|
|
buf,
|
|
&disk_type,
|
|
&media_type,
|
|
&media_flags,
|
|
&file_type,
|
|
&image_size);
|
|
|
|
CloseHandle(hDevice);
|
|
|
|
if (ret != ERROR_SUCCESS) {
|
|
MessageBox(hDlg,
|
|
SystemMessage(ret),
|
|
VFD_MSGBOX_TITLE, MB_ICONSTOP);
|
|
return;
|
|
}
|
|
|
|
if (media_type == VFD_MEDIA_NONE) {
|
|
|
|
// drive is empty
|
|
|
|
SetDlgItemText(hDlg, IDC_IMAGEFILE, NULL);
|
|
SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, NULL);
|
|
SetDlgItemText(hDlg, IDC_DISKTYPE, NULL);
|
|
SetDlgItemText(hDlg, IDC_MEDIATYPE, NULL);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_WRITE_PROTECTED), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_OPEN), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SAVE), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_FORMAT), FALSE);
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_OPEN),
|
|
BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_OPEN));
|
|
|
|
return;
|
|
}
|
|
|
|
// display 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>");
|
|
}
|
|
attrib = 0;
|
|
}
|
|
|
|
SetDlgItemText(hDlg, IDC_IMAGEFILE, buf);
|
|
|
|
// display image description
|
|
|
|
VfdMakeFileDesc(buf, sizeof(buf),
|
|
file_type, image_size, attrib);
|
|
|
|
SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, buf);
|
|
|
|
// display disk type
|
|
|
|
if (disk_type == VFD_DISKTYPE_FILE) {
|
|
SetDlgItemText(hDlg, IDC_DISKTYPE, "FILE");
|
|
}
|
|
else {
|
|
SetDlgItemText(hDlg, IDC_DISKTYPE, "RAM");
|
|
}
|
|
|
|
// display media type
|
|
|
|
SetDlgItemText(hDlg, IDC_MEDIATYPE,
|
|
VfdMediaTypeName(media_type));
|
|
|
|
// set write protect check box
|
|
|
|
if (media_flags & VFD_FLAG_WRITE_PROTECTED) {
|
|
CheckDlgButton(hDlg, IDC_WRITE_PROTECTED, BST_CHECKED);
|
|
}
|
|
else {
|
|
CheckDlgButton(hDlg, IDC_WRITE_PROTECTED, BST_UNCHECKED);
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_WRITE_PROTECTED), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_OPEN), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SAVE), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_FORMAT), TRUE);
|
|
|
|
SendMessage(GetDlgItem(hDlg, IDC_CLOSE),
|
|
BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
|
|
|
|
SetFocus(GetDlgItem(hDlg, IDC_CLOSE));
|
|
}
|
|
|
|
//
|
|
// CVfdShExt class members inherited from IShellPropSheetExt
|
|
//
|
|
|
|
// Add property page
|
|
STDMETHODIMP CVfdShExt::AddPages(
|
|
LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam)
|
|
{
|
|
PROPSHEETPAGE psp;
|
|
HPROPSHEETPAGE hpage;
|
|
|
|
if (!m_pDataObj || m_nDevice == (ULONG)-1) {
|
|
// not a VFD drive
|
|
VFDTRACE(0, ("PropPage: Not a VFD drive\n"));
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
psp.dwSize = sizeof(psp); // no extra data.
|
|
psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE | PSP_USECALLBACK;
|
|
psp.hInstance = g_hDllModule;
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPDIALOG);
|
|
psp.hIcon = 0;
|
|
psp.pszTitle = "VFD";
|
|
psp.pfnDlgProc = VfdPageDlgProc;
|
|
psp.pcRefParent = &g_cDllRefCnt;
|
|
psp.pfnCallback = VfdPageCallback;
|
|
psp.lParam = (LPARAM)this;
|
|
|
|
AddRef();
|
|
hpage = CreatePropertySheetPage(&psp);
|
|
|
|
if (hpage) {
|
|
if (!lpfnAddPage(hpage, lParam)) {
|
|
DestroyPropertySheetPage(hpage);
|
|
Release();
|
|
}
|
|
}
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CVfdShExt::ReplacePage(
|
|
UINT uPageID,
|
|
LPFNADDPROPSHEETPAGE lpfnReplaceWith,
|
|
LPARAM lParam)
|
|
{
|
|
UNREFERENCED_PARAMETER(uPageID);
|
|
UNREFERENCED_PARAMETER(lpfnReplaceWith);
|
|
UNREFERENCED_PARAMETER(lParam);
|
|
return E_FAIL;
|
|
}
|