mirror of
https://github.com/reactos/reactos.git
synced 2024-11-19 13:33:42 +00:00
25c7e1a8d0
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
357 lines
6.3 KiB
C
357 lines
6.3 KiB
C
/*
|
|
vfddrv.h
|
|
|
|
Virtual Floppy Drive for Windows NT platform
|
|
Kernel mode driver: local header
|
|
|
|
Copyright(C) 2003-2005 Ken Kato
|
|
*/
|
|
|
|
#ifndef _VFDDRV_H_
|
|
#define _VFDDRV_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#pragma message("Compiled as C++ for testing purpose.")
|
|
#endif // __cplusplus
|
|
|
|
#include "vfdtypes.h"
|
|
#include "vfdio.h"
|
|
#include "vfdver.h"
|
|
|
|
//
|
|
// Tag used for ExAllocatePoolWithTag
|
|
//
|
|
#define VFD_POOL_TAG 'DFVx'
|
|
|
|
//
|
|
// PnP driver specific stuff
|
|
//
|
|
#ifdef VFD_PNP
|
|
|
|
#if (VER_PRODUCTBUILD < 2195)
|
|
#error Cannot build a PnP version with the Windows NT DDK
|
|
#endif // (VER_PRODUCTBUILD < 2195)
|
|
|
|
//
|
|
// device state enumeration
|
|
//
|
|
typedef enum _DEVICE_STATE
|
|
{
|
|
VFD_STOPPED, // Dvice stopped
|
|
VFD_WORKING, // Started and working
|
|
VFD_PENDINGSTOP, // Stop pending
|
|
VFD_PENDINGREMOVE, // Remove pending
|
|
VFD_SURPRISEREMOVED, // Surprise removed
|
|
VFD_REMOVED, // Removed
|
|
VFD_MAX_STATE // Unknown state -Some error
|
|
}
|
|
DEVICE_STATE, *PDEVICE_STATE;
|
|
|
|
//
|
|
// use the address of the DriverEntry functions as the
|
|
// driver extension identifier
|
|
//
|
|
#define VFD_DRIVER_EXTENSION_ID ((PVOID)DriverEntry)
|
|
|
|
#endif // VFD_PNP
|
|
|
|
//
|
|
// driver extension for the VFD driver
|
|
//
|
|
typedef struct _VFD_DRIVER_EXTENSION
|
|
{
|
|
UNICODE_STRING RegistryPath;
|
|
ULONG NumberOfDevices;
|
|
}
|
|
VFD_DRIVER_EXTENSION, *PVFD_DRIVER_EXTENSION;
|
|
|
|
//
|
|
// device extension for Virtual FD device
|
|
//
|
|
typedef struct _DEVICE_EXTENSION
|
|
{
|
|
// back pointer to the device object
|
|
PDEVICE_OBJECT DeviceObject;
|
|
|
|
// device information
|
|
UNICODE_STRING DeviceName; // \Device\Floppy<n>
|
|
ULONG DeviceNumber; // \??\VirtualFD<n>
|
|
CHAR DriveLetter; // \DosDevices\<x>:
|
|
|
|
// Security context to access files on network drive
|
|
PSECURITY_CLIENT_CONTEXT SecurityContext;
|
|
|
|
// IRP queue list
|
|
LIST_ENTRY ListHead;
|
|
KSPIN_LOCK ListLock;
|
|
|
|
// device thread
|
|
KEVENT RequestEvent;
|
|
PVOID ThreadPointer;
|
|
BOOLEAN TerminateThread;
|
|
|
|
// drive information
|
|
ULONG MediaChangeCount;
|
|
|
|
// media information
|
|
VFD_MEDIA MediaType;
|
|
VFD_FLAGS MediaFlags;
|
|
VFD_FILETYPE FileType;
|
|
ULONG ImageSize;
|
|
ANSI_STRING FileName;
|
|
|
|
const DISK_GEOMETRY *Geometry;
|
|
ULONG Sectors;
|
|
|
|
HANDLE FileHandle;
|
|
PUCHAR FileBuffer;
|
|
|
|
#ifdef VFD_PNP
|
|
DEVICE_STATE DeviceState; // Current device state
|
|
IO_REMOVE_LOCK RemoveLock; // avoid abnormal removal
|
|
PDEVICE_OBJECT PhysicalDevice;
|
|
PDEVICE_OBJECT TargetDevice;
|
|
UNICODE_STRING InterfaceName;
|
|
#else // VFD_PNP
|
|
PVFD_DRIVER_EXTENSION DriverExtension;
|
|
#endif // VFD_PNP
|
|
}
|
|
DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|
|
|
//
|
|
// Stanard driver routines
|
|
//
|
|
NTSTATUS
|
|
NTAPI
|
|
DriverEntry(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath);
|
|
|
|
VOID
|
|
NTAPI
|
|
VfdUnloadDriver(
|
|
IN PDRIVER_OBJECT DriverObject);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdCreateClose(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdReadWrite(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdDeviceControl(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
#ifdef VFD_PNP
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdPlugAndPlay(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdPowerControl(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdSystemControl(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
VfdAddDevice(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN OUT PDEVICE_OBJECT PhysicalDevice);
|
|
|
|
#endif // VFD_PNP
|
|
|
|
//
|
|
// Prototypes for private routines
|
|
//
|
|
|
|
//
|
|
// vfddrv.c
|
|
//
|
|
extern ULONG OsMajorVersion;
|
|
extern ULONG OsMinorVersion;
|
|
extern ULONG OsBuildNumber;
|
|
|
|
VOID
|
|
NTAPI
|
|
VfdDeviceThread(
|
|
IN PVOID ThreadContext);
|
|
|
|
PWSTR
|
|
VfdCopyUnicode(
|
|
OUT PUNICODE_STRING dst,
|
|
IN PUNICODE_STRING src);
|
|
|
|
VOID
|
|
VfdFreeUnicode(
|
|
IN OUT PUNICODE_STRING str);
|
|
|
|
//
|
|
// vfddev.c
|
|
//
|
|
NTSTATUS
|
|
VfdCreateDevice(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
OUT PVOID Parameter);
|
|
|
|
VOID
|
|
VfdDeleteDevice(
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
//
|
|
// vfdioctl.c
|
|
//
|
|
VOID
|
|
VfdIoCtlThread(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PIRP Irp,
|
|
IN ULONG ControlCode);
|
|
|
|
//
|
|
// vfdimg.c
|
|
//
|
|
NTSTATUS
|
|
VfdOpenCheck(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PVFD_IMAGE_INFO ImageInfo,
|
|
IN ULONG InputLength);
|
|
|
|
NTSTATUS
|
|
VfdOpenImage(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PVFD_IMAGE_INFO ImageInfo);
|
|
|
|
VOID
|
|
VfdCloseImage(
|
|
IN PDEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
VfdQueryImage(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
OUT PVFD_IMAGE_INFO ImageInfo,
|
|
IN ULONG BufferLength,
|
|
OUT PULONG ReturnLength);
|
|
|
|
//
|
|
// vfdrdwr.c
|
|
//
|
|
VOID
|
|
VfdReadData(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN OUT PIRP Irp,
|
|
IN ULONG Length,
|
|
IN PLARGE_INTEGER Offset);
|
|
|
|
VOID
|
|
VfdWriteData(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN OUT PIRP Irp,
|
|
IN ULONG Length,
|
|
IN PLARGE_INTEGER Offset);
|
|
|
|
//
|
|
// vfdlink.c
|
|
//
|
|
NTSTATUS
|
|
VfdSetLink(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN CHAR DriveLetter);
|
|
|
|
NTSTATUS
|
|
VfdStoreLink(
|
|
IN PDEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
VfdLoadLink(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PWSTR RegistryPath);
|
|
|
|
//
|
|
// vfdfmt.c
|
|
//
|
|
extern const DISK_GEOMETRY geom_tbl[VFD_MEDIA_MAX];
|
|
|
|
NTSTATUS
|
|
VfdFormatCheck(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PFORMAT_PARAMETERS FormatParams,
|
|
IN ULONG InputLength,
|
|
IN ULONG ControlCode);
|
|
|
|
NTSTATUS
|
|
VfdFormatTrack(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PFORMAT_PARAMETERS FormatParams);
|
|
|
|
//
|
|
// vfdmnt.c
|
|
//
|
|
#ifdef VFD_MOUNT_MANAGER
|
|
/*
|
|
NTSTATUS
|
|
VfdRegisterMountManager(
|
|
IN PDEVICE_EXTENSION DeviceExtension);
|
|
*/
|
|
|
|
NTSTATUS
|
|
VfdMountMgrNotifyVolume(
|
|
IN PDEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
VfdMountMgrMountPoint(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN CHAR DriveLetter);
|
|
|
|
NTSTATUS
|
|
VfdMountDevUniqueId(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
OUT PMOUNTDEV_UNIQUE_ID UniqueId,
|
|
IN ULONG OutputLength,
|
|
OUT PIO_STATUS_BLOCK IoStatus);
|
|
|
|
NTSTATUS
|
|
VfdMountDevDeviceName(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
OUT PMOUNTDEV_NAME DeviceName,
|
|
IN ULONG OutputLength,
|
|
OUT PIO_STATUS_BLOCK IoStatus);
|
|
|
|
NTSTATUS
|
|
VfdMountDevSuggestedLink(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
OUT PMOUNTDEV_SUGGESTED_LINK_NAME LinkName,
|
|
IN ULONG OutputLength,
|
|
OUT PIO_STATUS_BLOCK IoStatus);
|
|
|
|
NTSTATUS
|
|
VfdMountDevLinkModified(
|
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|
IN PMOUNTDEV_NAME LinkName,
|
|
IN ULONG InputLength,
|
|
IN ULONG ControlCode);
|
|
|
|
#endif // VFD_MOUNT_MANAGER
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif // __cplusplus
|
|
|
|
#endif // _VFDDRV_H_
|