reactos/modules/rosapps/include/vfd/vfdio.h
Pierre Schweitzer 25c7e1a8d0
[VFD] Import the VFD project (Virtual Floppy Drive) which allows creating virtual
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
2017-12-16 21:48:34 +01:00

394 lines
8.8 KiB
C

/*
vfdio.h
Virtual Floppy Drive for Windows
Kernel mode driver / user mode program interface header
Copyright (C) 2003-2005 Ken Kato
*/
#ifndef _VFDIO_H_
#define _VFDIO_H_
#ifndef __T
#ifdef _NTDDK_
#define __T(x) L ## x
#else
#define __T(x) x
#endif
#endif
#ifndef _T
#define _T(x) __T(x)
#endif
//
// Device/driver setting registry value names
//
#define VFD_REG_DEVICE_NUMBER _T("NumberOfDisks")
#define VFD_REG_TRACE_FLAGS _T("TraceFlags")
#define VFD_REG_DRIVE_LETTER _T("DriveLetter")
//
// Device object interface base name
//
#define VFD_DEVICE_BASENAME _T("VirtualFD")
//
// sector size constants and macros
//
#define VFD_BYTES_PER_SECTOR 512
#define VFD_SECTOR_ALIGN_MASK (VFD_BYTES_PER_SECTOR - 1)
#define VFD_BYTE_SHIFT_COUNT 9
#define VFD_BYTE_TO_SECTOR(b) ((b) >> VFD_BYTE_SHIFT_COUNT)
#define VFD_SECTOR_TO_BYTE(s) ((s) << VFD_BYTE_SHIFT_COUNT)
#define VFD_SECTOR_ALIGNED(b) (((b) & VFD_SECTOR_ALIGN_MASK) == 0)
//
// Fill character for formatting media
//
#define VFD_FORMAT_FILL_DATA (UCHAR)0xf6
//
// Image information structure
// Used for IOCTL_VFD_OPEN_IMAGE and IOCTL_VFD_QUERY_IMAGE
//
#pragma pack (push,2)
#ifdef _MSC_VER
#pragma warning (push)
#pragma warning (disable: 4200) // Zero sized struct member warning
#endif
typedef struct _VFD_IMAGE_INFO {
VFD_DISKTYPE DiskType; // VFD_DISKTYPE_xxx value in vfdtypes.h
VFD_MEDIA MediaType; // VFD_MEDIA_xxx value in vfdtypes.h
VFD_FLAGS MediaFlags; // VFD_FLAG_xxx value in vfdtypes.h
VFD_FILETYPE FileType; // VFD_FILETYE_xxx value in vfdtypes.h
ULONG ImageSize; // actual image size in bytes
USHORT NameLength; // length in bytes of the file name
CHAR FileName[0]; // variable length file name string
} VFD_IMAGE_INFO, *PVFD_IMAGE_INFO;
#ifdef _MSC_VER
#pragma warning (pop)
#endif
#pragma pack (pop)
//
// Device IO control codes
//
/*
IOCTL_VFD_OPEN_IMAGE
Open an existing floppy image file or create an empty RAM disk
Input:
buffer containing a VFD_IMAGE_INFO structure followed by
an image file name
InputLength:
sizeof(VFD_IMAGE_INFO) plus length of the image file name
Output:
Not used with this operation; set to NULL.
Output Length:
Not used with this operation; set to zero.
Return:
STATUS_INVALID_PARAMETER input buffer size < sizeof(VFD_IMAGE_INFO)
or any other parameter errors
STATUS_DEVICE_BUSY an image is already opened
STATUS_ACCESS_DENIED file access error. returned also when the
file is compressed / encrypted
*/
#define IOCTL_VFD_OPEN_IMAGE CTL_CODE( \
IOCTL_DISK_BASE, \
0x800, \
METHOD_BUFFERED, \
FILE_READ_ACCESS | FILE_WRITE_ACCESS)
/*
IOCTL_VFD_CLOSE_IMAGE
Close the current virtual floppy image
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
Not used with this operation; set to NULL.
Output Length:
Not used with this operation; set to zero.
Return:
STATUS_NO_MEDIA_IN_DEVICE image is not opened
*/
#define IOCTL_VFD_CLOSE_IMAGE CTL_CODE( \
IOCTL_DISK_BASE, \
0x801, \
METHOD_NEITHER, \
FILE_READ_ACCESS | FILE_WRITE_ACCESS)
/*
IOCTL_VFD_QUERY_IMAGE
Get the current image information
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
Buffer to receive a VFD_IMAGE_INFO data structure
Output Length:
must be long enough to hold a VFD_IMAGE_INFO with the image file name
Return:
STATUS_BUFFER_TOO_SMALL buffer length < sizeof(VFD_IMAGE_INFO)
STATUS_BUFFER_OVERFLOW buffer cannot hold the image file name.
NameLength member contains the file name
length (number of bytes). See this value
to decide necessary buffer length.
*/
#define IOCTL_VFD_QUERY_IMAGE CTL_CODE( \
IOCTL_DISK_BASE, \
0x802, \
METHOD_BUFFERED, \
FILE_READ_ACCESS)
/*
IOCTL_VFD_SET_LINK
Create or delete a persistent drive letter
On Windows NT, this command simply creates a symbolic link.
On Windows 2000/XP, the driver calls the Mount Manager to manipulate
a drive letter.
Input:
buffer containing a drive letter 'A' - 'Z' to create a drive letter,
or 0 to delete the current drive letter.
Input Length:
sizeof(CHAR) or larger
Output:
Not used with this operation; set to NULL.
Output Length:
Not used with this operation; set to zero.
Return:
STATUS_INVALID_PARAMETER input length == 0 or
any other parameter errors
*/
#define IOCTL_VFD_SET_LINK CTL_CODE( \
IOCTL_DISK_BASE, \
0x803, \
METHOD_BUFFERED, \
FILE_READ_ACCESS | FILE_WRITE_ACCESS)
/*
IOCTL_VFD_QUERY_LINK
Get the current persistent drive letter
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
buffer to receive the current drive letter.
0 is returned if there is none.
Output Length:
sizeof(CHAR) or larger
Return:
STATUS_BUFFER_TOO_SMALL buffer length < sizeof(CHAR)
*/
#define IOCTL_VFD_QUERY_LINK CTL_CODE( \
IOCTL_DISK_BASE, \
0x804, \
METHOD_BUFFERED, \
FILE_READ_ACCESS)
/*
IOCTL_VFD_SET_PROTECT
Enable the virtual media write protection
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
Not used with this operation; set to NULL.
Output Length:
Not used with this operation; set to zero.
Return:
STATUS_NO_MEDIA_IN_DEVICE image is not opened
*/
#define IOCTL_VFD_SET_PROTECT CTL_CODE( \
IOCTL_DISK_BASE, \
0x805, \
METHOD_NEITHER, \
FILE_READ_ACCESS | FILE_WRITE_ACCESS)
/*
IOCTL_VFD_CLEAR_PROTECT
Disable the virtual media write protection
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
Not used with this operation; set to NULL.
Output Length:
Not used with this operation; set to zero.
Return:
STATUS_NO_MEDIA_IN_DEVICE image is not opened
*/
#define IOCTL_VFD_CLEAR_PROTECT CTL_CODE( \
IOCTL_DISK_BASE, \
0x806, \
METHOD_NEITHER, \
FILE_READ_ACCESS | FILE_WRITE_ACCESS)
/*
IOCTL_VFD_RESET_MODIFY
Reset the data modify flag
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
Not used with this operation; set to NULL.
Output Length:
Not used with this operation; set to zero.
Return:
STATUS_NO_MEDIA_IN_DEVICE image is not opened
*/
#define IOCTL_VFD_RESET_MODIFY CTL_CODE( \
IOCTL_DISK_BASE, \
0x807, \
METHOD_NEITHER, \
FILE_READ_ACCESS | FILE_WRITE_ACCESS)
/*
IOCTL_VFD_QUERY_NUMBER
Get the current device's VFD device number (<n> in "\??\VirtualFD<n>")
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
buffer to receive the VFD device number
Output Length:
sizeof(ULONG) or larger
Return:
STATUS_BUFFER_TOO_SMALL buffer length < sizeof(ULONG)
*/
#define IOCTL_VFD_QUERY_NUMBER CTL_CODE( \
IOCTL_DISK_BASE, \
0x80d, \
METHOD_BUFFERED, \
FILE_READ_ACCESS)
/*
IOCTL_VFD_QUERY_NAME
Get the current device's name (\Device\Floppy<n>)
The name is returned in a counted UNICODE string (not NULL terminated)
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
buffer to receive the length (USHORT value, number of bytes) followed
by the UNICODE device name.
Output Length:
enough to receive the length and the name
Return:
STATUS_BUFFER_TOO_SMALL buffer length < sizeof(USHORT)
STATUS_BUFFER_OVERFLOW buffer cannot hold the device name.
The first sizeof(USHORT) bytes of the
buffer contains the device name length.
See this value to decide the necessary
buffer length.
*/
#define IOCTL_VFD_QUERY_NAME CTL_CODE( \
IOCTL_DISK_BASE, \
0x80e, \
METHOD_BUFFERED, \
FILE_READ_ACCESS)
/*
IOCTL_VFD_QUERY_VERSION
Get the running VFD driver version
Input:
Not used with this operation; set to NULL.
Input Length:
Not used with this operation; set to zero.
Output:
buffer to receive the VFD version (ULONG value)
High word: major version
Low word: minor version
MSB: debug version flag (1:debug 0:release)
Output Length:
sizeof(ULONG) or larger
Return:
STATUS_BUFFER_TOO_SMALL buffer length < sizeof(ULONG)
*/
#define IOCTL_VFD_QUERY_VERSION CTL_CODE( \
IOCTL_DISK_BASE, \
0x80f, \
METHOD_BUFFERED, \
FILE_READ_ACCESS)
#endif // _VFDIO_H_