[filedisk] Introduce skeleton for file-backed disk class
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 29 Dec 2009 07:07:49 +0000 (02:07 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 29 Dec 2009 07:08:27 +0000 (02:08 -0500)
A rip-off of the RAM disk module, minus RAM disk functionality.
This skeleton will be developed into a file-backed disk class.
Currently implemented is a probing routine which will create a
single 10 MB dummy HDD which silently discards writes and reads
as all zeroes.

CHANGES.log
WinVBlock.dev
config.bat
src/filedisk.c [new file with mode: 0644]
src/filedisk.h [new file with mode: 0644]
src/probe.c

index 4651cf2..43b6435 100644 (file)
@@ -1,4 +1,16 @@
 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
+    \r
+    A rip-off of the RAM disk module, minus RAM disk functionality.\r
+    This skeleton will be developed into a file-backed disk class.\r
+    Currently implemented is a probing routine which will create a\r
+    single 10 MB dummy HDD which silently discards writes and reads\r
+    as all zeroes.\r
+\r
+commit 2669130893f1f61ae79a069bbd621bcbbf911808\r
+Author: Shao Miller <Shao.Miller@yrdsb.edu.on.ca>\r
 Date:   Mon Dec 28 22:28:35 2009 -0500\r
 \r
     [cosmetics] Run indent twice due to indent bug\r
index ac9288b..6054232 100644 (file)
@@ -1,7 +1,7 @@
 [Project]\r
 FileName=WinVBlock.dev\r
 Name=WinVBlock\r
-UnitCount=40\r
+UnitCount=42\r
 PchHead=-1\r
 PchSource=-1\r
 Ver=3\r
@@ -483,3 +483,23 @@ Priority=1000
 OverrideBuildCmd=0\r
 BuildCmd=\r
 \r
+[Unit41]\r
+FileName=src\filedisk.c\r
+CompileCpp=1\r
+Folder=WinVBlock\r
+Compile=1\r
+Link=1\r
+Priority=1000\r
+OverrideBuildCmd=0\r
+BuildCmd=\r
+\r
+[Unit42]\r
+FileName=src\filedisk.h\r
+CompileCpp=1\r
+Folder=WinVBlock\r
+Compile=1\r
+Link=1\r
+Priority=1000\r
+OverrideBuildCmd=0\r
+BuildCmd=\r
+\r
index 9fae289..4c48715 100644 (file)
@@ -2,5 +2,5 @@ rem This is the root directory of the ddk.
 set ddkdir=c:\winddk\6001.18001\r
 \r
 rem Next two lines are duplicated in Makefile, edit both when adding files or changing pxe style.\r
-set c=driver.c registry.c bus.c bus_pnp.c bus_dev_ctl.c disk.c ramdisk.c memdisk.c grub4dos.c disk_pnp.c disk_dev_ctl.c disk_scsi.c aoe.c protocol.c debug.c probe.c winvblock.rc\r
+set c=driver.c registry.c bus.c bus_pnp.c bus_dev_ctl.c disk.c ramdisk.c filedisk.c memdisk.c grub4dos.c disk_pnp.c disk_dev_ctl.c disk_scsi.c aoe.c protocol.c debug.c probe.c winvblock.rc\r
 set pxestyle=asm\r
diff --git a/src/filedisk.c b/src/filedisk.c
new file mode 100644 (file)
index 0000000..2b75c46
--- /dev/null
@@ -0,0 +1,159 @@
+/**
+ * Copyright (C) 2009, Shao Miller <shao.miller@yrdsb.edu.on.ca>.
+ *
+ * This file is part of WinVBlock, derived from WinAoE.
+ *
+ * WinVBlock is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * WinVBlock is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with WinVBlock.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @file
+ *
+ * File-backed disk specifics
+ *
+ */
+
+#include <stdio.h>
+#include <ntddk.h>
+
+#include "winvblock.h"
+#include "portable.h"
+#include "irp.h"
+#include "driver.h"
+#include "disk.h"
+#include "mount.h"
+#include "bus.h"
+#include "filedisk.h"
+#include "debug.h"
+
+disk__io_decl ( filedisk__io )
+{
+  disk__type_ptr disk_ptr;
+  filedisk__type_ptr filedisk_ptr;
+
+  /*
+   * Establish pointers into the disk device's extension space
+   */
+  disk_ptr = get_disk_ptr ( dev_ext_ptr );
+  filedisk_ptr = filedisk__get_ptr ( dev_ext_ptr );
+
+  if ( sector_count < 1 )
+    {
+      /*
+       * A silly request 
+       */
+      DBG ( "sector_count < 1; cancelling\n" );
+      irp->IoStatus.Information = 0;
+      irp->IoStatus.Status = STATUS_CANCELLED;
+      IoCompleteRequest ( irp, IO_NO_INCREMENT );
+      return STATUS_CANCELLED;
+    }
+
+  if ( mode == disk__io_mode_write )
+    ( void )0;
+  else
+    RtlZeroMemory ( buffer, sector_count * disk_ptr->SectorSize );
+  irp->IoStatus.Information = sector_count * disk_ptr->SectorSize;
+  irp->IoStatus.Status = STATUS_SUCCESS;
+  IoCompleteRequest ( irp, IO_NO_INCREMENT );
+  return STATUS_SUCCESS;
+}
+
+winvblock__uint32
+filedisk__max_xfer_len (
+  disk__type_ptr disk_ptr
+ )
+{
+  return 1024 * 1024;
+}
+
+winvblock__uint32
+filedisk__query_id (
+  disk__type_ptr disk_ptr,
+  BUS_QUERY_ID_TYPE query_type,
+  PWCHAR buf_512
+ )
+{
+  filedisk__type_ptr filedisk_ptr = filedisk__get_ptr ( &disk_ptr->dev_ext );
+
+  switch ( query_type )
+    {
+      case BusQueryDeviceID:
+       return swprintf ( buf_512, L"WinVBlock\\FileDisk%08x", 19 ) + 1;
+      case BusQueryInstanceID:
+       return swprintf ( buf_512, L"FileDisk%08x", 19 ) + 1;
+      case BusQueryHardwareIDs:
+       {
+         winvblock__uint32 tmp =
+           swprintf ( buf_512, L"WinVBlock\\FileDisk%08x",
+                      19 ) + 1;
+         tmp +=
+           swprintf ( &buf_512[tmp],
+                      disk_ptr->DiskType ==
+                      OpticalDisc ? L"GenCdRom" : disk_ptr->DiskType ==
+                      FloppyDisk ? L"GenSFloppy" : L"GenDisk" ) + 4;
+         return tmp;
+       }
+      case BusQueryCompatibleIDs:
+       return swprintf ( buf_512,
+                         disk_ptr->DiskType ==
+                         OpticalDisc ? L"GenCdRom" : disk_ptr->DiskType ==
+                         FloppyDisk ? L"GenSFloppy" : L"GenDisk" ) + 4;
+      default:
+       return 0;
+    }
+}
+
+winvblock__bool STDCALL
+filedisk__no_init (
+  IN driver__dev_ext_ptr dev_ext
+ )
+{
+  return TRUE;
+}
+
+void
+filedisk__find (
+  void
+ )
+{
+  filedisk__type filedisk;
+  bus__type_ptr bus_ptr;
+
+  /*
+   * Establish a pointer into the bus device's extension space
+   */
+  bus_ptr = get_bus_ptr ( ( driver__dev_ext_ptr ) bus__fdo->DeviceExtension );
+  filedisk.disk.Initialize = filedisk__no_init;
+  filedisk.disk.DiskType = HardDisk;
+  filedisk.disk.SectorSize = 512;
+  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.io = filedisk__io;
+  filedisk.disk.max_xfer_len = filedisk__max_xfer_len;
+  filedisk.disk.query_id = filedisk__query_id;
+  filedisk.disk.dev_ext.size = sizeof ( filedisk__type );
+  if ( !Bus_AddChild ( bus__fdo, &filedisk.disk, TRUE ) )
+    {
+      DBG ( "Bus_AddChild() failed for file-backed disk\n" );
+    }
+  else if ( bus_ptr->PhysicalDeviceObject != NULL )
+    {
+      IoInvalidateDeviceRelations ( bus_ptr->PhysicalDeviceObject,
+                                   BusRelations );
+    }
+}
diff --git a/src/filedisk.h b/src/filedisk.h
new file mode 100644 (file)
index 0000000..d0bc763
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * Copyright (C) 2009, Shao Miller <shao.miller@yrdsb.edu.on.ca>.
+ *
+ * This file is part of WinVBlock, derived from WinAoE.
+ *
+ * WinVBlock is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * WinVBlock is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with WinVBlock.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef _filedisk_h
+#  define _filedisk_h
+
+/**
+ * @file
+ *
+ * File-backed disk specifics
+ *
+ */
+
+winvblock__def_struct ( filedisk__type )
+{
+  disk__type disk;
+};
+
+extern disk__io_decl (
+  filedisk__io
+ );
+extern winvblock__uint32 filedisk__max_xfer_len (
+  disk__type_ptr disk_ptr
+ );
+extern winvblock__uint32 filedisk__query_id (
+  disk__type_ptr disk_ptr,
+  BUS_QUERY_ID_TYPE query_type,
+  PWCHAR buf_512
+ );
+
+/*
+ * Establish a pointer into the file-backed disk device's extension space
+ */
+__inline filedisk__type_ptr STDCALL
+filedisk__get_ptr (
+  driver__dev_ext_ptr dev_ext_ptr
+ )
+{
+  /*
+   * Since the device extension is the first member of the disk
+   * member of a file-backed disk, and the disk structure is itself the
+   * first member of a file-backed disk structure, a simple cast will suffice
+   */
+  return ( filedisk__type_ptr ) dev_ext_ptr;
+}
+
+extern winvblock__bool STDCALL filedisk__no_init (
+  IN driver__dev_ext_ptr dev_ext
+ );
+extern void filedisk__find (
+  void
+ );
+
+#endif                         /* _filedisk_h */
index fdfbf16..e618d1c 100644 (file)
@@ -41,6 +41,7 @@
 #include "ramdisk.h"
 #include "memdisk.h"
 #include "grub4dos.h"
+#include "filedisk.h"
 #include "probe.h"
 
 safe_mbr_hook_ptr STDCALL
@@ -80,4 +81,5 @@ probe__disks (
   aoe__process_abft (  );
   memdisk__find (  );
   grub4dos__find (  );
+  filedisk__find (  );
 }