1 /* 2 vfdio.h 3 4 Virtual Floppy Drive for Windows 5 Kernel mode driver / user mode program interface header 6 7 Copyright (C) 2003-2005 Ken Kato 8 */ 9 10 #ifndef _VFDIO_H_ 11 #define _VFDIO_H_ 12 13 #ifndef __T 14 #ifdef _NTDDK_ 15 #define __T(x) L ## x 16 #else 17 #define __T(x) x 18 #endif 19 #endif 20 21 #ifndef _T 22 #define _T(x) __T(x) 23 #endif 24 25 // 26 // Device/driver setting registry value names 27 // 28 #define VFD_REG_DEVICE_NUMBER _T("NumberOfDisks") 29 #define VFD_REG_TRACE_FLAGS _T("TraceFlags") 30 #define VFD_REG_DRIVE_LETTER _T("DriveLetter") 31 32 // 33 // Device object interface base name 34 // 35 #define VFD_DEVICE_BASENAME _T("VirtualFD") 36 37 // 38 // sector size constants and macros 39 // 40 #define VFD_BYTES_PER_SECTOR 512 41 #define VFD_SECTOR_ALIGN_MASK (VFD_BYTES_PER_SECTOR - 1) 42 #define VFD_BYTE_SHIFT_COUNT 9 43 44 #define VFD_BYTE_TO_SECTOR(b) ((b) >> VFD_BYTE_SHIFT_COUNT) 45 #define VFD_SECTOR_TO_BYTE(s) ((s) << VFD_BYTE_SHIFT_COUNT) 46 #define VFD_SECTOR_ALIGNED(b) (((b) & VFD_SECTOR_ALIGN_MASK) == 0) 47 48 // 49 // Fill character for formatting media 50 // 51 #define VFD_FORMAT_FILL_DATA (UCHAR)0xf6 52 53 // 54 // Image information structure 55 // Used for IOCTL_VFD_OPEN_IMAGE and IOCTL_VFD_QUERY_IMAGE 56 // 57 #pragma pack (push,2) 58 #if !defined(__REACTOS__) || defined(_MSC_VER) 59 #pragma warning (push) 60 #pragma warning (disable: 4200) // Zero sized struct member warning 61 #endif 62 63 typedef struct _VFD_IMAGE_INFO { 64 VFD_DISKTYPE DiskType; // VFD_DISKTYPE_xxx value in vfdtypes.h 65 VFD_MEDIA MediaType; // VFD_MEDIA_xxx value in vfdtypes.h 66 VFD_FLAGS MediaFlags; // VFD_FLAG_xxx value in vfdtypes.h 67 VFD_FILETYPE FileType; // VFD_FILETYE_xxx value in vfdtypes.h 68 ULONG ImageSize; // actual image size in bytes 69 USHORT NameLength; // length in bytes of the file name 70 CHAR FileName[0]; // variable length file name string 71 } VFD_IMAGE_INFO, *PVFD_IMAGE_INFO; 72 73 #if !defined(__REACTOS__) || defined(_MSC_VER) 74 #pragma warning (pop) 75 #endif 76 #pragma pack (pop) 77 78 // 79 // Device IO control codes 80 // 81 82 /* 83 IOCTL_VFD_OPEN_IMAGE 84 85 Open an existing floppy image file or create an empty RAM disk 86 87 Input: 88 buffer containing a VFD_IMAGE_INFO structure followed by 89 an image file name 90 91 InputLength: 92 sizeof(VFD_IMAGE_INFO) plus length of the image file name 93 94 Output: 95 Not used with this operation; set to NULL. 96 97 Output Length: 98 Not used with this operation; set to zero. 99 100 Return: 101 STATUS_INVALID_PARAMETER input buffer size < sizeof(VFD_IMAGE_INFO) 102 or any other parameter errors 103 STATUS_DEVICE_BUSY an image is already opened 104 STATUS_ACCESS_DENIED file access error. returned also when the 105 file is compressed / encrypted 106 */ 107 #define IOCTL_VFD_OPEN_IMAGE CTL_CODE( \ 108 IOCTL_DISK_BASE, \ 109 0x800, \ 110 METHOD_BUFFERED, \ 111 FILE_READ_ACCESS | FILE_WRITE_ACCESS) 112 113 /* 114 IOCTL_VFD_CLOSE_IMAGE 115 116 Close the current virtual floppy image 117 118 Input: 119 Not used with this operation; set to NULL. 120 121 Input Length: 122 Not used with this operation; set to zero. 123 124 Output: 125 Not used with this operation; set to NULL. 126 127 Output Length: 128 Not used with this operation; set to zero. 129 130 Return: 131 STATUS_NO_MEDIA_IN_DEVICE image is not opened 132 */ 133 #define IOCTL_VFD_CLOSE_IMAGE CTL_CODE( \ 134 IOCTL_DISK_BASE, \ 135 0x801, \ 136 METHOD_NEITHER, \ 137 FILE_READ_ACCESS | FILE_WRITE_ACCESS) 138 139 /* 140 IOCTL_VFD_QUERY_IMAGE 141 142 Get the current image information 143 144 Input: 145 Not used with this operation; set to NULL. 146 147 Input Length: 148 Not used with this operation; set to zero. 149 150 Output: 151 Buffer to receive a VFD_IMAGE_INFO data structure 152 153 Output Length: 154 must be long enough to hold a VFD_IMAGE_INFO with the image file name 155 156 Return: 157 STATUS_BUFFER_TOO_SMALL buffer length < sizeof(VFD_IMAGE_INFO) 158 STATUS_BUFFER_OVERFLOW buffer cannot hold the image file name. 159 NameLength member contains the file name 160 length (number of bytes). See this value 161 to decide necessary buffer length. 162 */ 163 #define IOCTL_VFD_QUERY_IMAGE CTL_CODE( \ 164 IOCTL_DISK_BASE, \ 165 0x802, \ 166 METHOD_BUFFERED, \ 167 FILE_READ_ACCESS) 168 169 /* 170 IOCTL_VFD_SET_LINK 171 172 Create or delete a persistent drive letter 173 On Windows NT, this command simply creates a symbolic link. 174 On Windows 2000/XP, the driver calls the Mount Manager to manipulate 175 a drive letter. 176 177 Input: 178 buffer containing a drive letter 'A' - 'Z' to create a drive letter, 179 or 0 to delete the current drive letter. 180 181 Input Length: 182 sizeof(CHAR) or larger 183 184 Output: 185 Not used with this operation; set to NULL. 186 187 Output Length: 188 Not used with this operation; set to zero. 189 190 Return: 191 STATUS_INVALID_PARAMETER input length == 0 or 192 any other parameter errors 193 */ 194 #define IOCTL_VFD_SET_LINK CTL_CODE( \ 195 IOCTL_DISK_BASE, \ 196 0x803, \ 197 METHOD_BUFFERED, \ 198 FILE_READ_ACCESS | FILE_WRITE_ACCESS) 199 200 /* 201 IOCTL_VFD_QUERY_LINK 202 203 Get the current persistent drive letter 204 205 Input: 206 Not used with this operation; set to NULL. 207 208 Input Length: 209 Not used with this operation; set to zero. 210 211 Output: 212 buffer to receive the current drive letter. 213 0 is returned if there is none. 214 215 Output Length: 216 sizeof(CHAR) or larger 217 218 Return: 219 STATUS_BUFFER_TOO_SMALL buffer length < sizeof(CHAR) 220 */ 221 #define IOCTL_VFD_QUERY_LINK CTL_CODE( \ 222 IOCTL_DISK_BASE, \ 223 0x804, \ 224 METHOD_BUFFERED, \ 225 FILE_READ_ACCESS) 226 227 /* 228 IOCTL_VFD_SET_PROTECT 229 230 Enable the virtual media write protection 231 232 Input: 233 Not used with this operation; set to NULL. 234 235 Input Length: 236 Not used with this operation; set to zero. 237 238 Output: 239 Not used with this operation; set to NULL. 240 241 Output Length: 242 Not used with this operation; set to zero. 243 244 Return: 245 STATUS_NO_MEDIA_IN_DEVICE image is not opened 246 */ 247 #define IOCTL_VFD_SET_PROTECT CTL_CODE( \ 248 IOCTL_DISK_BASE, \ 249 0x805, \ 250 METHOD_NEITHER, \ 251 FILE_READ_ACCESS | FILE_WRITE_ACCESS) 252 253 /* 254 IOCTL_VFD_CLEAR_PROTECT 255 256 Disable the virtual media write protection 257 258 Input: 259 Not used with this operation; set to NULL. 260 261 Input Length: 262 Not used with this operation; set to zero. 263 264 Output: 265 Not used with this operation; set to NULL. 266 267 Output Length: 268 Not used with this operation; set to zero. 269 270 Return: 271 STATUS_NO_MEDIA_IN_DEVICE image is not opened 272 */ 273 #define IOCTL_VFD_CLEAR_PROTECT CTL_CODE( \ 274 IOCTL_DISK_BASE, \ 275 0x806, \ 276 METHOD_NEITHER, \ 277 FILE_READ_ACCESS | FILE_WRITE_ACCESS) 278 279 /* 280 IOCTL_VFD_RESET_MODIFY 281 282 Reset the data modify flag 283 284 Input: 285 Not used with this operation; set to NULL. 286 287 Input Length: 288 Not used with this operation; set to zero. 289 290 Output: 291 Not used with this operation; set to NULL. 292 293 Output Length: 294 Not used with this operation; set to zero. 295 296 Return: 297 STATUS_NO_MEDIA_IN_DEVICE image is not opened 298 */ 299 #define IOCTL_VFD_RESET_MODIFY CTL_CODE( \ 300 IOCTL_DISK_BASE, \ 301 0x807, \ 302 METHOD_NEITHER, \ 303 FILE_READ_ACCESS | FILE_WRITE_ACCESS) 304 305 /* 306 IOCTL_VFD_QUERY_NUMBER 307 308 Get the current device's VFD device number (<n> in "\??\VirtualFD<n>") 309 310 Input: 311 Not used with this operation; set to NULL. 312 313 Input Length: 314 Not used with this operation; set to zero. 315 316 Output: 317 buffer to receive the VFD device number 318 319 Output Length: 320 sizeof(ULONG) or larger 321 322 Return: 323 STATUS_BUFFER_TOO_SMALL buffer length < sizeof(ULONG) 324 */ 325 #define IOCTL_VFD_QUERY_NUMBER CTL_CODE( \ 326 IOCTL_DISK_BASE, \ 327 0x80d, \ 328 METHOD_BUFFERED, \ 329 FILE_READ_ACCESS) 330 331 /* 332 IOCTL_VFD_QUERY_NAME 333 334 Get the current device's name (\Device\Floppy<n>) 335 The name is returned in a counted UNICODE string (not NULL terminated) 336 337 Input: 338 Not used with this operation; set to NULL. 339 340 Input Length: 341 Not used with this operation; set to zero. 342 343 Output: 344 buffer to receive the length (USHORT value, number of bytes) followed 345 by the UNICODE device name. 346 347 Output Length: 348 enough to receive the length and the name 349 350 Return: 351 STATUS_BUFFER_TOO_SMALL buffer length < sizeof(USHORT) 352 STATUS_BUFFER_OVERFLOW buffer cannot hold the device name. 353 The first sizeof(USHORT) bytes of the 354 buffer contains the device name length. 355 See this value to decide the necessary 356 buffer length. 357 */ 358 #define IOCTL_VFD_QUERY_NAME CTL_CODE( \ 359 IOCTL_DISK_BASE, \ 360 0x80e, \ 361 METHOD_BUFFERED, \ 362 FILE_READ_ACCESS) 363 364 /* 365 IOCTL_VFD_QUERY_VERSION 366 367 Get the running VFD driver version 368 369 Input: 370 Not used with this operation; set to NULL. 371 372 Input Length: 373 Not used with this operation; set to zero. 374 375 Output: 376 buffer to receive the VFD version (ULONG value) 377 High word: major version 378 Low word: minor version 379 MSB: debug version flag (1:debug 0:release) 380 381 Output Length: 382 sizeof(ULONG) or larger 383 384 Return: 385 STATUS_BUFFER_TOO_SMALL buffer length < sizeof(ULONG) 386 */ 387 #define IOCTL_VFD_QUERY_VERSION CTL_CODE( \ 388 IOCTL_DISK_BASE, \ 389 0x80f, \ 390 METHOD_BUFFERED, \ 391 FILE_READ_ACCESS) 392 393 #endif // _VFDIO_H_ 394