mirror of
https://github.com/reactos/reactos.git
synced 2024-09-06 10:52:52 +00:00
394 lines
8.8 KiB
C
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_
|