[filedisk] Initial file-backed disk support
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sat, 2 Jan 2010 22:52:12 +0000 (17:52 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sat, 2 Jan 2010 22:53:45 +0000 (17:53 -0500)
Fairly messy, this commit introduces file-backed disk support.

The aoe.exe user-mode program has been renamed to winvblk.exe.
It now accepts two new commands:

winvblk attach \??\<path> <type> <cyls> <heads> <sectors>
winvblk detach <disk num>

<path> is the file path to a disk image.  For now, you should prefix
"\??\" in front of the path.

<type> is one of 'f', 'c', 'h' for floppy, optical disc, hard disk,
respectively.

<cyls> is the cylinder count.  Common values might be:
65535: for an optical disc drive
   80: for a floppy disk

<heads> is the count of heads.  Common values might be:
255: for an optical disc drive
  2: for a floppy disk

<sectors> is the count of sectors per track, not to be confused
with the total sector count for the media.  Common values might be:
15: for an optical disc drive
18: for a 1.44 MB floppy disk
36: for a 2.88 MB floppy disk

These geometry parameters are not optional at this time.

<disk num> is the internal disk number.  Unfortunately the only
way to currently find this out is with 'winvblk show', which yields
some garbage since it is interpreting all disks as AoE SANs.  This
is obviously a FIXME item.

GRUB4DOS and MEMDISK modules also got a slight fix to initialize
disk parameters with all zeroes.

The file-backed disk logic currently leaks HANDLES, since it does
not close them upon a 'detach'.  This is obviously a FIXME item.

To prevent duplicate PDOs, every file-backed disk has a 32-bit
"hash" which is really just a very stupid attempt at a unique ID
based on LBADiskSize and the file path to the disk image.  Heh.

Some examples for attaching file-backed disks:

winvblk attach \??\d:\RamXP.HDD h 52 128 63
winvblk attach \??\d:\some.iso c 65535 255 15
winvblk attach \??\d:\floppy144.vfd f 80 2 18

15 files changed:
CHANGES.log
makeinf.bat
makeutils.bat
src/aoe.c
src/bus.c
src/bus_dev_ctl.c
src/filedisk.c
src/filedisk.h
src/grub4dos.c
src/loader.c
src/memdisk.c
src/mount.c
src/mount.h
src/probe.c
src/winvblock.rc

index 43b6435..b314b53 100644 (file)
@@ -1,4 +1,61 @@
 Author: Shao Miller <Shao.Miller@yrdsb.edu.on.ca>\r
+Date:   Sat Jan 2 17:52:12 2010 -0500\r
+\r
+    [filedisk] Initial file-backed disk support\r
+    \r
+    Fairly messy, this commit introduces file-backed disk support.\r
+    \r
+    The aoe.exe user-mode program has been renamed to winvblk.exe.\r
+    It now accepts two new commands:\r
+    \r
+    winvblk attach \??\<path> <type> <cyls> <heads> <sectors>\r
+    winvblk detach <disk num>\r
+    \r
+    <path> is the file path to a disk image.  For now, you should prefix\r
+    "\??\" in front of the path.\r
+    \r
+    <type> is one of 'f', 'c', 'h' for floppy, optical disc, hard disk,\r
+    respectively.\r
+    \r
+    <cyls> is the cylinder count.  Common values might be:\r
+    65535: for an optical disc drive\r
+       80: for a floppy disk\r
+    \r
+    <heads> is the count of heads.  Common values might be:\r
+    255: for an optical disc drive\r
+      2: for a floppy disk\r
+    \r
+    <sectors> is the count of sectors per track, not to be confused\r
+    with the total sector count for the media.  Common values might be:\r
+    15: for an optical disc drive\r
+    18: for a 1.44 MB floppy disk\r
+    36: for a 2.88 MB floppy disk\r
+    \r
+    These geometry parameters are not optional at this time.\r
+    \r
+    <disk num> is the internal disk number.  Unfortunately the only\r
+    way to currently find this out is with 'winvblk show', which yields\r
+    some garbage since it is interpreting all disks as AoE SANs.  This\r
+    is obviously a FIXME item.\r
+    \r
+    GRUB4DOS and MEMDISK modules also got a slight fix to initialize\r
+    disk parameters with all zeroes.\r
+    \r
+    The file-backed disk logic currently leaks HANDLES, since it does\r
+    not close them upon a 'detach'.  This is obviously a FIXME item.\r
+    \r
+    To prevent duplicate PDOs, every file-backed disk has a 32-bit\r
+    "hash" which is really just a very stupid attempt at a unique ID\r
+    based on LBADiskSize and the file path to the disk image.  Heh.\r
+    \r
+    Some examples for attaching file-backed disks:\r
+    \r
+    winvblk attach \??\d:\RamXP.HDD h 52 128 63\r
+    winvblk attach \??\d:\some.iso c 65535 255 15\r
+    winvblk attach \??\d:\floppy144.vfd f 80 2 18\r
+\r
+commit c9a4d42ff431d71cd339aaa58be5a2d4ba9e0588\r
+Author: Shao Miller <Shao.Miller@yrdsb.edu.on.ca>\r
 Date:   Tue Dec 29 02:07:49 2009 -0500\r
 \r
     [filedisk] Introduce skeleton for file-backed disk class\r
index c459957..500a23d 100644 (file)
@@ -22,7 +22,7 @@ echo [SourceDisksNames] >> bin/winvblk.inf
 echo 0="Install Disk" >> bin/winvblk.inf\r
 echo. >> bin/winvblk.inf\r
 echo [SourceDisksFiles] >> bin/winvblk.inf\r
-echo aoe.exe=0 >> bin/winvblk.inf\r
+echo winvblk.exe=0 >> bin/winvblk.inf\r
 echo wvblk32.sys=0 >> bin/winvblk.inf\r
 echo wvblk64.sys=0 >> bin/winvblk.inf\r
 echo. >> bin/winvblk.inf\r
@@ -38,7 +38,7 @@ echo [Files.Driver.NTamd64] >> bin/winvblk.inf
 echo wvblk64.sys >> bin/winvblk.inf\r
 echo. >> bin/winvblk.inf\r
 echo [Files.Tools] >> bin/winvblk.inf\r
-echo aoe.exe >> bin/winvblk.inf\r
+echo winvblk.exe >> bin/winvblk.inf\r
 echo. >> bin/winvblk.inf\r
 echo [WinVBlock] >> bin/winvblk.inf\r
 echo CopyFiles=Files.Driver,Files.Tools >> bin/winvblk.inf\r
index 3e6f0a3..541e86f 100644 (file)
@@ -5,7 +5,7 @@ cd src
 pushd .\r
 call %ddkdir%\bin\setenv.bat %ddkdir% w2k\r
 popd\r
-cl /I%CRT_INC_PATH% /DWIN32_LEAN_AND_MEAN mount.c /Fe..\bin\aoe.exe /link /LIBPATH:%DDK_LIB_DEST%\i386 /LIBPATH:%Lib%\crt\i386 bufferoverflowU.lib\r
+cl /I%CRT_INC_PATH% /DWIN32_LEAN_AND_MEAN mount.c /Fe..\bin\winvblk.exe /link /LIBPATH:%DDK_LIB_DEST%\i386 /LIBPATH:%Lib%\crt\i386 bufferoverflowU.lib\r
 del mount.obj\r
 cl /I%CRT_INC_PATH% /DWIN32_LEAN_AND_MEAN loader.c /Fe..\bin\loader32.exe /link /LIBPATH:%DDK_LIB_DEST%\i386 /LIBPATH:%Lib%\crt\i386 setupapi.lib bufferoverflowU.lib\r
 del loader.obj\r
index 590cebc..7afd888 100644 (file)
--- a/src/aoe.c
+++ b/src/aoe.c
@@ -1523,6 +1523,7 @@ aoe__process_abft (
       aoe_disk.Minor = AoEBootRecord.Minor;
       aoe_disk.MaxSectorsPerPacket = 1;
       aoe_disk.Timeout = 200000;       /* 20 ms. */
+      aoe_disk.disk.BootDrive = TRUE;
       aoe_disk.disk.io = aoe__disk_io;
       aoe_disk.disk.max_xfer_len = aoe__max_xfer_len;
       aoe_disk.disk.query_id = aoe__query_id;
index bd6046a..d4a1c03 100644 (file)
--- a/src/bus.c
+++ b/src/bus.c
@@ -76,7 +76,7 @@ Bus_Stop (
       Walker = Next;
     }
   KeReleaseSpinLock ( &Bus_Globals_TargetListSpinLock, Irql );
-  RtlInitUnicodeString ( &DosDeviceName, L"\\DosDevices\\AoE" );
+  RtlInitUnicodeString ( &DosDeviceName, L"\\DosDevices\\WinVBlock" );
   IoDeleteSymbolicLink ( &DosDeviceName );
   bus__fdo = NULL;
 }
@@ -250,7 +250,6 @@ Bus_AddChild (
   disk_ptr->next_sibling_ptr = NULL;
   KeInitializeEvent ( &disk_ptr->SearchEvent, SynchronizationEvent, FALSE );
   KeInitializeSpinLock ( &disk_ptr->SpinLock );
-  disk_ptr->BootDrive = Boot;
   disk_ptr->Unmount = FALSE;
   disk_ptr->DiskNumber = InterlockedIncrement ( &Bus_Globals_NextDisk ) - 1;
   /*
@@ -393,8 +392,8 @@ Bus_AddDevice (
   DBG ( "Entry\n" );
   if ( bus__fdo )
     return STATUS_SUCCESS;
-  RtlInitUnicodeString ( &DeviceName, L"\\Device\\AoE" );
-  RtlInitUnicodeString ( &DosDeviceName, L"\\DosDevices\\AoE" );
+  RtlInitUnicodeString ( &DeviceName, L"\\Device\\WinVBlock" );
+  RtlInitUnicodeString ( &DosDeviceName, L"\\DosDevices\\WinVBlock" );
   new_dev_ext_size =
     sizeof ( bus__type ) + driver__handling_table_size + handling_table_size;
   if ( !NT_SUCCESS
index 7a4dfdf..63c1b06 100644 (file)
@@ -37,6 +37,7 @@
 #include "bus.h"
 #include "debug.h"
 #include "aoe.h"
+#include "filedisk.h"
 
 static
 irp__handler_decl (
@@ -285,6 +286,16 @@ irp__handler_decl ( bus_dev_ctl__dispatch )
          aoe_umount ( DeviceObject, Irp, Stack, DeviceExtension,
                       completion_ptr );
        break;
+      case IOCTL_FILE_ATTACH:
+       status =
+         filedisk__attach ( DeviceObject, Irp, Stack, DeviceExtension,
+                            completion_ptr );
+       break;
+      case IOCTL_FILE_DETACH:
+       status =
+         aoe_umount ( DeviceObject, Irp, Stack, DeviceExtension,
+                      completion_ptr );
+       break;
       default:
        Irp->IoStatus.Information = 0;
        status = STATUS_INVALID_DEVICE_REQUEST;
index 2b75c46..50514a6 100644 (file)
@@ -41,6 +41,9 @@ disk__io_decl ( filedisk__io )
 {
   disk__type_ptr disk_ptr;
   filedisk__type_ptr filedisk_ptr;
+  LARGE_INTEGER offset;
+  NTSTATUS status;
+  IO_STATUS_BLOCK io_status;
 
   /*
    * Establish pointers into the disk device's extension space
@@ -60,14 +63,19 @@ disk__io_decl ( filedisk__io )
       return STATUS_CANCELLED;
     }
 
+  offset.QuadPart = start_sector * disk_ptr->SectorSize;
   if ( mode == disk__io_mode_write )
-    ( void )0;
+    status =
+      ZwWriteFile ( filedisk_ptr->file, NULL, NULL, NULL, &io_status, buffer,
+                   sector_count * disk_ptr->SectorSize, &offset, NULL );
   else
-    RtlZeroMemory ( buffer, sector_count * disk_ptr->SectorSize );
+    status =
+      ZwReadFile ( filedisk_ptr->file, NULL, NULL, NULL, &io_status, buffer,
+                  sector_count * disk_ptr->SectorSize, &offset, NULL );
   irp->IoStatus.Information = sector_count * disk_ptr->SectorSize;
-  irp->IoStatus.Status = STATUS_SUCCESS;
+  irp->IoStatus.Status = status;
   IoCompleteRequest ( irp, IO_NO_INCREMENT );
-  return STATUS_SUCCESS;
+  return status;
 }
 
 winvblock__uint32
@@ -90,14 +98,15 @@ filedisk__query_id (
   switch ( query_type )
     {
       case BusQueryDeviceID:
-       return swprintf ( buf_512, L"WinVBlock\\FileDisk%08x", 19 ) + 1;
+       return swprintf ( buf_512, L"WinVBlock\\FileDisk%08x",
+                         filedisk_ptr->hash ) + 1;
       case BusQueryInstanceID:
-       return swprintf ( buf_512, L"FileDisk%08x", 19 ) + 1;
+       return swprintf ( buf_512, L"FileDisk%08x", filedisk_ptr->hash ) + 1;
       case BusQueryHardwareIDs:
        {
          winvblock__uint32 tmp =
            swprintf ( buf_512, L"WinVBlock\\FileDisk%08x",
-                      19 ) + 1;
+                      filedisk_ptr->hash ) + 1;
          tmp +=
            swprintf ( &buf_512[tmp],
                       disk_ptr->DiskType ==
@@ -123,26 +132,81 @@ filedisk__no_init (
   return TRUE;
 }
 
-void
-filedisk__find (
-  void
- )
+irp__handler_decl ( filedisk__attach )
 {
-  filedisk__type filedisk;
   bus__type_ptr bus_ptr;
+  ANSI_STRING file_path1;
+  winvblock__uint8_ptr buf = Irp->AssociatedIrp.SystemBuffer;
+  mount__filedisk_ptr params = ( mount__filedisk_ptr ) buf;
+  UNICODE_STRING file_path2;
+  OBJECT_ATTRIBUTES obj_attrs;
+  NTSTATUS status;
+  HANDLE file = NULL;
+  IO_STATUS_BLOCK io_status;
+  filedisk__type filedisk = { 0 };
 
   /*
    * Establish a pointer into the bus device's extension space
    */
   bus_ptr = get_bus_ptr ( ( driver__dev_ext_ptr ) bus__fdo->DeviceExtension );
+
+  RtlInitAnsiString ( &file_path1,
+                     ( char * )&buf[sizeof ( mount__filedisk )] );
+  status = RtlAnsiStringToUnicodeString ( &file_path2, &file_path1, TRUE );
+  if ( !NT_SUCCESS ( status ) )
+    return status;
+  InitializeObjectAttributes ( &obj_attrs, &file_path2,
+                              OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL,
+                              NULL );
+  /*
+   * FIXME: We leak handles! 
+   */
+  status =
+    ZwCreateFile ( &file, GENERIC_READ | GENERIC_WRITE, &obj_attrs, &io_status,
+                  NULL, FILE_ATTRIBUTE_NORMAL,
+                  FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
+                  FILE_OPEN,
+                  FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS |
+                  FILE_NO_INTERMEDIATE_BUFFERING |
+                  FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 );
+  RtlFreeUnicodeString ( &file_path2 );
+  if ( !NT_SUCCESS ( status ) )
+    return status;
+
+  filedisk.file = file;
   filedisk.disk.Initialize = filedisk__no_init;
-  filedisk.disk.DiskType = HardDisk;
-  filedisk.disk.SectorSize = 512;
+  switch ( params->type )
+    {
+      case 'f':
+       filedisk.disk.DiskType = FloppyDisk;
+       filedisk.disk.SectorSize = 512;
+       break;
+      case 'c':
+       filedisk.disk.DiskType = OpticalDisc;
+       filedisk.disk.SectorSize = 2048;
+       break;
+      default:
+       filedisk.disk.DiskType = HardDisk;
+       filedisk.disk.SectorSize = 512;
+       break;
+    }
   DBG ( "File-backed disk is type: %d\n", filedisk.disk.DiskType );
-  filedisk.disk.LBADiskSize = 20480;
-  filedisk.disk.Heads = 64;
-  filedisk.disk.Sectors = 32;
-  filedisk.disk.Cylinders = 10;
+  filedisk.disk.Cylinders = params->cylinders;
+  filedisk.disk.Heads = params->heads;
+  filedisk.disk.Sectors = params->sectors;
+  filedisk.disk.LBADiskSize =
+    params->cylinders * params->heads * params->sectors;
+  /*
+   * A really stupid "hash".  RtlHashUnicodeString() would have been
+   * good, but is only available >= Windows XP
+   */
+  filedisk.hash = ( winvblock__uint32 ) filedisk.disk.LBADiskSize;
+  {
+    char *path_iterator = file_path1.Buffer;
+
+    while ( *path_iterator )
+      filedisk.hash += *path_iterator++;
+  }
   filedisk.disk.io = filedisk__io;
   filedisk.disk.max_xfer_len = filedisk__max_xfer_len;
   filedisk.disk.query_id = filedisk__query_id;
@@ -156,4 +220,5 @@ filedisk__find (
       IoInvalidateDeviceRelations ( bus_ptr->PhysicalDeviceObject,
                                    BusRelations );
     }
+  return STATUS_SUCCESS;
 }
index d0bc763..feec2cc 100644 (file)
@@ -29,6 +29,8 @@
 winvblock__def_struct ( filedisk__type )
 {
   disk__type disk;
+  HANDLE file;
+  winvblock__uint32 hash;
 };
 
 extern disk__io_decl (
@@ -62,8 +64,8 @@ filedisk__get_ptr (
 extern winvblock__bool STDCALL filedisk__no_init (
   IN driver__dev_ext_ptr dev_ext
  );
-extern void filedisk__find (
-  void
+extern irp__handler_decl (
+  filedisk__attach
  );
 
 #endif                         /* _filedisk_h */
index c55b5e6..10581f5 100644 (file)
@@ -71,7 +71,7 @@ grub4dos__find (
   grub4dos_drive_mapping_ptr Grub4DosDriveMapSlotPtr;
   winvblock__uint32 i = 8;
   winvblock__bool FoundGrub4DosMapping = FALSE;
-  ramdisk__type ramdisk;
+  ramdisk__type ramdisk = { 0 };
   bus__type_ptr bus_ptr;
 
   /*
@@ -161,6 +161,7 @@ grub4dos__find (
          ramdisk.disk.Cylinders =
            ramdisk.disk.LBADiskSize / ( ramdisk.disk.Heads *
                                         ramdisk.disk.Sectors );
+         ramdisk.disk.BootDrive = TRUE;
          ramdisk.disk.io = ramdisk__io;
          ramdisk.disk.max_xfer_len = ramdisk__max_xfer_len;
          ramdisk.disk.query_id = ramdisk__query_id;
index 7b281ef..8a95bcb 100644 (file)
  *
  */
 
-#include "portable.h"
 #include <stdio.h>
 #include <windows.h>
 #include <Setupapi.h>
 #include <newdev.h>
 
+#include "winvblock.h"
+#include "portable.h"
+
 #define MAX_CLASS_NAME_LEN 64
 
 /* typedef BOOL WINAPI (*PROC)(HWND, LPCTSTR, LPCTSTR, DWORD, PBOOL OPTIONAL);
index 157906d..df392b3 100644 (file)
@@ -49,7 +49,7 @@ check_mbft (
   winvblock__uint32 i;
   winvblock__uint8 Checksum = 0;
   safe_mbr_hook_ptr AssociatedHook;
-  ramdisk__type ramdisk;
+  ramdisk__type ramdisk = { 0 };
   bus__type_ptr bus_ptr;
 
   /*
@@ -110,6 +110,7 @@ check_mbft (
   ramdisk.disk.Cylinders = mBFT->mdi.cylinders;
   ramdisk.disk.Heads = mBFT->mdi.heads;
   ramdisk.disk.Sectors = mBFT->mdi.sectors;
+  ramdisk.disk.BootDrive = TRUE;
   ramdisk.disk.io = ramdisk__io;
   ramdisk.disk.max_xfer_len = ramdisk__max_xfer_len;
   ramdisk.disk.query_id = ramdisk__query_id;
index c5ebd05..fab5b7a 100644 (file)
  *
  */
 
-#include "portable.h"
 #include <windows.h>
 #include <winioctl.h>
 #include <stdio.h>
+
+#include "winvblock.h"
+#include "portable.h"
 #include "mount.h"
 
 typedef enum
-{ CommandScan, CommandShow, CommandMount, CommandUmount } COMMAND;
+{ CommandScan, CommandShow, CommandMount, CommandUmount, CommandAttach,
+  CommandDetach
+} COMMAND;
 
 static void
 Help (
   void
  )
 {
-  printf ( "aoe <scan|show|mount|umount>\n\n" );
+  printf ( "winvblk <scan|show|mount|umount|attach|detach>\n\n" );
   printf ( "  scan\n        Shows the reachable AoE targets.\n\n" );
   printf ( "  show\n        Shows the mounted AoE targets.\n\n" );
-  printf
-    ( "  mount <client mac address> <major> <minor>\n        Mounts an AoE target.\n\n" );
+  printf ( "  mount <client mac address> <major> <minor>\n"
+          "        Mounts an AoE target.\n\n" );
   printf ( "  umount <disk number>\n        Unmounts an AoE disk.\n\n" );
+  printf ( "  attach <filepath> <disk type> <cyls> <heads> <sectors>\n"
+          "        Attaches <filepath> disk image file.\n"
+          "        <disk type> is 'f' for floppy, 'c' for CD/DVD, "
+          "'h' for HDD\n\n" );
+  printf ( "  detach <disk number>\n"
+          "        Detaches file-backed disk.\n\n" );
 }
 
 int
@@ -57,7 +67,7 @@ main (
 {
   COMMAND Command;
   HANDLE DeviceHandle;
-  winvblock__uint8 InBuffer[1024];
+  winvblock__uint8 InBuffer[sizeof ( mount__filedisk ) + 1024];
   winvblock__uint8 String[256];
   PMOUNT_TARGETS Targets;
   PMOUNT_DISKS Disks;
@@ -90,6 +100,14 @@ main (
     {
       Command = CommandUmount;
     }
+  else if ( strcmp ( argv[1], "attach" ) == 0 )
+    {
+      Command = CommandAttach;
+    }
+  else if ( strcmp ( argv[1], "detach" ) == 0 )
+    {
+      Command = CommandDetach;
+    }
   else
     {
       Help (  );
@@ -99,7 +117,7 @@ main (
     }
 
   DeviceHandle =
-    CreateFile ( "\\\\.\\AoE", GENERIC_READ | GENERIC_WRITE,
+    CreateFile ( "\\\\.\\WinVBlock", GENERIC_READ | GENERIC_WRITE,
                 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0,
                 NULL );
   if ( DeviceHandle == INVALID_HANDLE_VALUE )
@@ -220,7 +238,8 @@ main (
                 ( int )Major, ( int )Minor, Mac[0], Mac[1], Mac[2], Mac[3],
                 Mac[4], Mac[5] );
        memcpy ( &InBuffer[0], Mac, 6 );
-       *( Pwinvblock__uint16 ) ( &InBuffer[6] ) = ( winvblock__uint16 ) Major;
+       *( winvblock__uint16_ptr ) ( &InBuffer[6] ) =
+         ( winvblock__uint16 ) Major;
        *( winvblock__uint8_ptr ) ( &InBuffer[8] ) =
          ( winvblock__uint8 ) Minor;
        if ( !DeviceIoControl
@@ -241,8 +260,45 @@ main (
            printf ( "DeviceIoControl (%d)\n", ( int )GetLastError (  ) );
          }
        break;
-    }
+      case CommandAttach:
+       {
+         mount__filedisk filedisk;
 
+         if ( argc < 6 )
+           {
+             printf ( "Too few parameters.\n" );
+             Help (  );
+             CloseHandle ( DeviceHandle );
+             return 1;
+           }
+         filedisk.type = *argv[3];
+         sscanf ( argv[4], "%d", ( int * )&filedisk.cylinders );
+         sscanf ( argv[5], "%d", ( int * )&filedisk.heads );
+         sscanf ( argv[6], "%d", ( int * )&filedisk.sectors );
+         memcpy ( &InBuffer, &filedisk, sizeof ( mount__filedisk ) );
+         memcpy ( &InBuffer[sizeof ( mount__filedisk )], argv[2],
+                  strlen ( argv[2] ) + 1 );
+         if ( !DeviceIoControl
+              ( DeviceHandle, IOCTL_FILE_ATTACH, InBuffer,
+                sizeof ( InBuffer ), NULL, 0, &BytesReturned,
+                ( LPOVERLAPPED ) NULL ) )
+           {
+             printf ( "DeviceIoControl (%d)\n", ( int )GetLastError (  ) );
+           }
+         break;
+       }
+      case CommandDetach:
+       sscanf ( argv[2], "%d", ( int * )&Disk );
+       printf ( "Detaching file-backed disk %d\n", ( int )Disk );
+       memcpy ( &InBuffer, &Disk, 4 );
+       if ( !DeviceIoControl
+            ( DeviceHandle, IOCTL_FILE_DETACH, InBuffer, sizeof ( InBuffer ),
+              NULL, 0, &BytesReturned, ( LPOVERLAPPED ) NULL ) )
+         {
+           printf ( "DeviceIoControl (%d)\n", ( int )GetLastError (  ) );
+         }
+       break;
+    }
   CloseHandle ( DeviceHandle );
 
 end:
index a8b7ef5..2337a89 100644 (file)
 #  define IOCTL_AOE_UMOUNT CTL_CODE(FILE_DEVICE_CONTROLLER, 0x803,\
                                   METHOD_BUFFERED,\
                                   FILE_READ_DATA | FILE_WRITE_DATA)
+#  define IOCTL_FILE_ATTACH CTL_CODE(FILE_DEVICE_CONTROLLER, 0x804,\
+                                  METHOD_BUFFERED,\
+                                  FILE_READ_DATA | FILE_WRITE_DATA)
+#  define IOCTL_FILE_DETACH CTL_CODE(FILE_DEVICE_CONTROLLER, 0x805,\
+                                  METHOD_BUFFERED,\
+                                  FILE_READ_DATA | FILE_WRITE_DATA)
 
 typedef struct _MOUNT_TARGET
 {
@@ -79,4 +85,12 @@ typedef struct _MOUNT_DISKS
 } MOUNT_DISKS,
 *PMOUNT_DISKS;
 
+winvblock__def_struct ( mount__filedisk )
+{
+  char type;
+  int cylinders;
+  int heads;
+  int sectors;
+};
+
 #endif                         /* _MOUNT_H */
index e618d1c..60e8ef1 100644 (file)
@@ -81,5 +81,4 @@ probe__disks (
   aoe__process_abft (  );
   memdisk__find (  );
   grub4dos__find (  );
-  filedisk__find (  );
 }
index c99e2db..1dcb24c 100644 (file)
@@ -1,6 +1,6 @@
 1 VERSIONINFO\r
-FILEVERSION 0,0,1,2\r
-PRODUCTVERSION 0,0,1,2\r
+FILEVERSION 0,0,1,3\r
+PRODUCTVERSION 0,0,1,3\r
 FILEOS 0x40004\r
 FILETYPE 0x3\r
 {\r
@@ -10,12 +10,12 @@ BLOCK "StringFileInfo"
        {\r
                VALUE "CompanyName", "Shao Miller"\r
                VALUE "FileDescription", "WinVBlock Virtual SCSI Driver"\r
-               VALUE "FileVersion", "0.0.1.2 (Dec-24-2009)"\r
+               VALUE "FileVersion", "0.0.1.3 (Jan-2-2010)"\r
                VALUE "InternalName", "WinVBlock Virtual SCSI Driver"\r
                VALUE "LegalCopyright", "© 2008 V., © 2009 Shao Miller, All rights reserved, Licensed under GPL."\r
                VALUE "OriginalFilename", "winvblock.sys"\r
                VALUE "ProductName", "WinVBlock Virtual SCSI Driver"\r
-               VALUE "ProductVersion", "0.0.1.2"\r
+               VALUE "ProductVersion", "0.0.1.3"\r
        }\r
 }\r
 \r