[probe] Split MEMDISK out into its own module
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 29 Dec 2009 02:38:36 +0000 (21:38 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 29 Dec 2009 02:39:03 +0000 (21:39 -0500)
MEMDISK specifics are now in their own module.

GRUB4DOS RAM disks should undergo the same treatment.

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

index 8957de0..7adfe06 100644 (file)
@@ -1,4 +1,14 @@
 Author: Shao Miller <Shao.Miller@yrdsb.edu.on.ca>\r
+Date:   Mon Dec 28 21:38:36 2009 -0500\r
+\r
+    [probe] Split MEMDISK out into its own module\r
+    \r
+    MEMDISK specifics are now in their own module.\r
+    \r
+    GRUB4DOS RAM disks should undergo the same treatment.\r
+\r
+commit 043daf101d9baee2381bdac2375ec15929dd625f\r
+Author: Shao Miller <Shao.Miller@yrdsb.edu.on.ca>\r
 Date:   Mon Dec 28 18:38:08 2009 -0500\r
 \r
     [major] Turn disk structure inside out\r
index 62b3ed3..d2aebf8 100644 (file)
@@ -1,7 +1,7 @@
 [Project]\r
 FileName=WinVBlock.dev\r
 Name=WinVBlock\r
-UnitCount=36\r
+UnitCount=38\r
 PchHead=-1\r
 PchSource=-1\r
 Ver=3\r
@@ -443,3 +443,23 @@ Priority=1000
 OverrideBuildCmd=0\r
 BuildCmd=\r
 \r
+[Unit37]\r
+FileName=src\memdisk.h\r
+CompileCpp=1\r
+Folder=WinVBlock\r
+Compile=1\r
+Link=1\r
+Priority=1000\r
+OverrideBuildCmd=0\r
+BuildCmd=\r
+\r
+[Unit38]\r
+FileName=src\memdisk.c\r
+CompileCpp=1\r
+Folder=WinVBlock\r
+Compile=1\r
+Link=1\r
+Priority=1000\r
+OverrideBuildCmd=0\r
+BuildCmd=\r
+\r
index 01f0757..07b827a 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 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 memdisk.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
index b1a5b32..bd6046a 100644 (file)
--- a/src/bus.c
+++ b/src/bus.c
@@ -37,9 +37,7 @@
 #include "bus.h"
 #include "bus_pnp.h"
 #include "bus_dev_ctl.h"
-#include "aoe.h"
 #include "debug.h"
-#include "mdi.h"
 #include "protocol.h"
 #include "probe.h"
 
index 06a7d22..faac015 100644 (file)
--- a/src/mdi.h
+++ b/src/mdi.h
@@ -11,8 +11,8 @@
  *   Boston MA 02111-1307, USA; either version 2 of the License, or
  *   (at your option) any later version; incorporated herein by reference.
  */
-#ifndef _MDI_H
-#  define _MDI_H
+#ifndef _mdi_h
+#  define _mdi_h
 
 /**
  * @file
@@ -24,7 +24,7 @@
 #  ifdef _MSC_VER
 #    pragma pack(1)
 #  endif
-typedef struct _MDI_PATCHAREA
+winvblock__def_struct ( mdi__patch_area )
 {
   winvblock__uint16 mdi_bytes;
   winvblock__uint8 mdi_version_minor;
@@ -61,7 +61,9 @@ typedef struct _MDI_PATCHAREA
   /*
    * WinVBlock does not need anything more 
    */
-} __attribute__ ( ( __packed__ ) ) MDI_PATCHAREA, *PMDI_PATCHAREA;
+}
+
+__attribute__ ( ( __packed__ ) );
 #  ifdef _MSC_VER
 #    pragma pack()
 #  endif
@@ -69,7 +71,7 @@ typedef struct _MDI_PATCHAREA
 #  ifdef _MSC_VER
 #    pragma pack(1)
 #  endif
-typedef struct _MDI_MBFT
+winvblock__def_struct ( mdi__mbft )
 {
   winvblock__uint8 Signature[4];       /* ("mBFT") */
   winvblock__uint32 Length;
@@ -79,10 +81,12 @@ typedef struct _MDI_MBFT
   winvblock__uint8 OEMTableID[8];
   winvblock__uint8 Reserved1[12];
   winvblock__uint32 SafeHook;
-  MDI_PATCHAREA MDI;
-} __attribute__ ( ( __packed__ ) ) MDI_MBFT, *PMDI_MBFT;
+  mdi__patch_area mdi;
+}
+
+__attribute__ ( ( __packed__ ) );
 #  ifdef _MSC_VER
 #    pragma pack()
 #  endif
 
-#endif                         /* _MDI_H */
+#endif                         /* _mdi_h */
diff --git a/src/memdisk.c b/src/memdisk.c
new file mode 100644 (file)
index 0000000..157906d
--- /dev/null
@@ -0,0 +1,183 @@
+/**
+ * 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
+ *
+ * MEMDISK specifics
+ *
+ */
+
+#include <stdio.h>
+#include <ntddk.h>
+
+#include "winvblock.h"
+#include "portable.h"
+#include "irp.h"
+#include "driver.h"
+#include "mount.h"
+#include "disk.h"
+#include "bus.h"
+#include "ramdisk.h"
+#include "debug.h"
+#include "mdi.h"
+#include "probe.h"
+
+winvblock__bool STDCALL
+check_mbft (
+  winvblock__uint8_ptr PhysicalMemory,
+  winvblock__uint32 Offset
+ )
+{
+  mdi__mbft_ptr mBFT = ( mdi__mbft_ptr ) ( PhysicalMemory + Offset );
+  winvblock__uint32 i;
+  winvblock__uint8 Checksum = 0;
+  safe_mbr_hook_ptr AssociatedHook;
+  ramdisk__type ramdisk;
+  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 );
+
+  if ( Offset >= 0x100000 )
+    {
+      DBG ( "mBFT physical pointer too high!\n" );
+      return FALSE;
+    }
+  if ( !( RtlCompareMemory ( mBFT->Signature, "mBFT", 4 ) == 4 ) )
+    return FALSE;
+  if ( Offset + mBFT->Length >= 0x100000 )
+    {
+      DBG ( "mBFT length out-of-bounds\n" );
+      return FALSE;
+    }
+  for ( i = 0; i < mBFT->Length; i++ )
+    Checksum += ( ( winvblock__uint8 * ) mBFT )[i];
+  if ( Checksum )
+    {
+      DBG ( "Invalid mBFT checksum\n" );
+      return FALSE;
+    }
+  DBG ( "Found mBFT: 0x%08x\n", mBFT );
+  if ( mBFT->SafeHook >= 0x100000 )
+    {
+      DBG ( "mBFT safe hook physical pointer too high!\n" );
+      return FALSE;
+    }
+  AssociatedHook = ( safe_mbr_hook_ptr ) ( PhysicalMemory + mBFT->SafeHook );
+  if ( AssociatedHook->Flags )
+    {
+      DBG ( "This MEMDISK already processed\n" );
+      return TRUE;
+    }
+  DBG ( "MEMDISK DiskBuf: 0x%08x\n", mBFT->mdi.diskbuf );
+  DBG ( "MEMDISK DiskSize: %d sectors\n", mBFT->mdi.disksize );
+  ramdisk.disk.Initialize = ramdisk__no_init;
+  ramdisk.DiskBuf = mBFT->mdi.diskbuf;
+  ramdisk.disk.LBADiskSize = ramdisk.DiskSize = mBFT->mdi.disksize;
+  if ( mBFT->mdi.driveno == 0xE0 )
+    {
+      ramdisk.disk.DiskType = OpticalDisc;
+      ramdisk.disk.SectorSize = 2048;
+    }
+  else
+    {
+      if ( mBFT->mdi.driveno & 0x80 )
+       ramdisk.disk.DiskType = HardDisk;
+      else
+       ramdisk.disk.DiskType = FloppyDisk;
+      ramdisk.disk.SectorSize = 512;
+    }
+  DBG ( "RAM Drive is type: %d\n", ramdisk.disk.DiskType );
+  ramdisk.disk.Cylinders = mBFT->mdi.cylinders;
+  ramdisk.disk.Heads = mBFT->mdi.heads;
+  ramdisk.disk.Sectors = mBFT->mdi.sectors;
+  ramdisk.disk.io = ramdisk__io;
+  ramdisk.disk.max_xfer_len = ramdisk__max_xfer_len;
+  ramdisk.disk.query_id = ramdisk__query_id;
+  ramdisk.disk.dev_ext.size = sizeof ( ramdisk__type );
+  if ( !Bus_AddChild ( bus__fdo, &ramdisk.disk, TRUE ) )
+    {
+      DBG ( "Bus_AddChild() failed for MEMDISK\n" );
+    }
+  else if ( bus_ptr->PhysicalDeviceObject != NULL )
+    {
+      IoInvalidateDeviceRelations ( bus_ptr->PhysicalDeviceObject,
+                                   BusRelations );
+    }
+  AssociatedHook->Flags = 1;
+  return TRUE;
+}
+
+void
+memdisk__find (
+  void
+ )
+{
+  PHYSICAL_ADDRESS PhysicalAddress;
+  winvblock__uint8_ptr PhysicalMemory;
+  int_vector_ptr InterruptVector;
+  safe_mbr_hook_ptr SafeMbrHookPtr;
+  winvblock__uint32 Offset;
+  winvblock__bool FoundMemdisk = FALSE;
+
+  /*
+   * Find a MEMDISK.  We check the "safe hook" chain, then scan for mBFTs
+   */
+  PhysicalAddress.QuadPart = 0LL;
+  PhysicalMemory = MmMapIoSpace ( PhysicalAddress, 0x100000, MmNonCached );
+  if ( !PhysicalMemory )
+    {
+      DBG ( "Could not map low memory\n" );
+      return;
+    }
+  InterruptVector =
+    ( int_vector_ptr ) ( PhysicalMemory + 0x13 * sizeof ( int_vector ) );
+  /*
+   * Walk the "safe hook" chain of INT 13h hooks as far as possible
+   */
+  while ( SafeMbrHookPtr = get_safe_hook ( PhysicalMemory, InterruptVector ) )
+    {
+      if ( !
+          ( RtlCompareMemory ( SafeMbrHookPtr->VendorID, "MEMDISK ", 8 ) ==
+            8 ) )
+       {
+         DBG ( "Non-MEMDISK INT 0x13 Safe Hook\n" );
+       }
+      else
+       {
+         FoundMemdisk |= check_mbft ( PhysicalMemory, SafeMbrHookPtr->mBFT );
+       }
+      InterruptVector = &SafeMbrHookPtr->PrevHook;
+    }
+  /*
+   * Now search for "floating" mBFTs
+   */
+  for ( Offset = 0; Offset < 0xFFFF0; Offset += 0x10 )
+    {
+      FoundMemdisk |= check_mbft ( PhysicalMemory, Offset );
+    }
+  MmUnmapIoSpace ( PhysicalMemory, 0x100000 );
+  if ( !FoundMemdisk )
+    {
+      DBG ( "No MEMDISKs found\n" );
+    }
+}
diff --git a/src/memdisk.h b/src/memdisk.h
new file mode 100644 (file)
index 0000000..0f81420
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * 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 _memdisk_h
+#  define _memdisk_h
+
+/**
+ * @file
+ *
+ * MEMDISK specifics
+ *
+ */
+
+extern void memdisk__find (
+  void
+ );
+
+#endif                         /* _memdisk_h */
index 29c56e0..0ca4294 100644 (file)
 #include "mount.h"
 #include "bus.h"
 #include "debug.h"
-#include "mdi.h"
 #include "bus.h"
 #include "aoe.h"
 #include "ramdisk.h"
-
-winvblock__def_struct ( int_vector )
-{
-  winvblock__uint16 Offset;
-  winvblock__uint16 Segment;
-};
+#include "memdisk.h"
+#include "probe.h"
 
 #ifdef _MSC_VER
 #  pragma pack(1)
@@ -70,24 +65,6 @@ __attribute__ ( ( __packed__ ) );
 #  pragma pack()
 #endif
 
-#ifdef _MSC_VER
-#  pragma pack(1)
-#endif
-winvblock__def_struct ( safe_mbr_hook )
-{
-  winvblock__uint8 Jump[3];
-  winvblock__uint8 Signature[8];
-  winvblock__uint8 VendorID[8];
-  int_vector PrevHook;
-  winvblock__uint32 Flags;
-  winvblock__uint32 mBFT;      /* MEMDISK only */
-}
-
-__attribute__ ( ( __packed__ ) );
-#ifdef _MSC_VER
-#  pragma pack()
-#endif
-
 /* From GRUB4DOS 0.4.4's stage2/shared.h */
 winvblock__def_struct ( grub4dos_drive_mapping )
 {
@@ -108,14 +85,6 @@ winvblock__def_struct ( grub4dos_drive_mapping )
   winvblock__uint64 SectorCount;
 };
 
-static winvblock__bool STDCALL
-no_init (
-  IN driver__dev_ext_ptr dev_ext
- )
-{
-  return TRUE;
-}
-
 void
 find_aoe_disks (
   void
@@ -220,7 +189,7 @@ find_aoe_disks (
     }
 }
 
-static safe_mbr_hook_ptr STDCALL
+safe_mbr_hook_ptr STDCALL
 get_safe_hook (
   IN winvblock__uint8_ptr PhysicalMemory,
   IN int_vector_ptr InterruptVector
@@ -249,149 +218,6 @@ get_safe_hook (
   return SafeMbrHookPtr;
 }
 
-winvblock__bool STDCALL
-check_mbft (
-  winvblock__uint8_ptr PhysicalMemory,
-  winvblock__uint32 Offset
- )
-{
-  PMDI_MBFT mBFT = ( PMDI_MBFT ) ( PhysicalMemory + Offset );
-  winvblock__uint32 i;
-  winvblock__uint8 Checksum = 0;
-  safe_mbr_hook_ptr AssociatedHook;
-  ramdisk__type ramdisk;
-  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 );
-
-  if ( Offset >= 0x100000 )
-    {
-      DBG ( "mBFT physical pointer too high!\n" );
-      return FALSE;
-    }
-  if ( !( RtlCompareMemory ( mBFT->Signature, "mBFT", 4 ) == 4 ) )
-    return FALSE;
-  if ( Offset + mBFT->Length >= 0x100000 )
-    {
-      DBG ( "mBFT length out-of-bounds\n" );
-      return FALSE;
-    }
-  for ( i = 0; i < mBFT->Length; i++ )
-    Checksum += ( ( winvblock__uint8 * ) mBFT )[i];
-  if ( Checksum )
-    {
-      DBG ( "Invalid mBFT checksum\n" );
-      return FALSE;
-    }
-  DBG ( "Found mBFT: 0x%08x\n", mBFT );
-  if ( mBFT->SafeHook >= 0x100000 )
-    {
-      DBG ( "mBFT safe hook physical pointer too high!\n" );
-      return FALSE;
-    }
-  AssociatedHook = ( safe_mbr_hook_ptr ) ( PhysicalMemory + mBFT->SafeHook );
-  if ( AssociatedHook->Flags )
-    {
-      DBG ( "This MEMDISK already processed\n" );
-      return TRUE;
-    }
-  DBG ( "MEMDISK DiskBuf: 0x%08x\n", mBFT->MDI.diskbuf );
-  DBG ( "MEMDISK DiskSize: %d sectors\n", mBFT->MDI.disksize );
-  ramdisk.disk.Initialize = no_init;
-  ramdisk.DiskBuf = mBFT->MDI.diskbuf;
-  ramdisk.disk.LBADiskSize = ramdisk.DiskSize = mBFT->MDI.disksize;
-  if ( mBFT->MDI.driveno == 0xE0 )
-    {
-      ramdisk.disk.DiskType = OpticalDisc;
-      ramdisk.disk.SectorSize = 2048;
-    }
-  else
-    {
-      if ( mBFT->MDI.driveno & 0x80 )
-       ramdisk.disk.DiskType = HardDisk;
-      else
-       ramdisk.disk.DiskType = FloppyDisk;
-      ramdisk.disk.SectorSize = 512;
-    }
-  DBG ( "RAM Drive is type: %d\n", ramdisk.disk.DiskType );
-  ramdisk.disk.Cylinders = mBFT->MDI.cylinders;
-  ramdisk.disk.Heads = mBFT->MDI.heads;
-  ramdisk.disk.Sectors = mBFT->MDI.sectors;
-  ramdisk.disk.io = ramdisk__io;
-  ramdisk.disk.max_xfer_len = ramdisk__max_xfer_len;
-  ramdisk.disk.query_id = ramdisk__query_id;
-  ramdisk.disk.dev_ext.size = sizeof ( ramdisk__type );
-  if ( !Bus_AddChild ( bus__fdo, &ramdisk.disk, TRUE ) )
-    {
-      DBG ( "Bus_AddChild() failed for MEMDISK\n" );
-    }
-  else if ( bus_ptr->PhysicalDeviceObject != NULL )
-    {
-      IoInvalidateDeviceRelations ( bus_ptr->PhysicalDeviceObject,
-                                   BusRelations );
-    }
-  AssociatedHook->Flags = 1;
-  return TRUE;
-}
-
-void
-find_memdisks (
-  void
- )
-{
-  PHYSICAL_ADDRESS PhysicalAddress;
-  winvblock__uint8_ptr PhysicalMemory;
-  int_vector_ptr InterruptVector;
-  safe_mbr_hook_ptr SafeMbrHookPtr;
-  winvblock__uint32 Offset;
-  winvblock__bool FoundMemdisk = FALSE;
-
-  /*
-   * Find a MEMDISK.  We check the "safe hook" chain, then scan for mBFTs
-   */
-  PhysicalAddress.QuadPart = 0LL;
-  PhysicalMemory = MmMapIoSpace ( PhysicalAddress, 0x100000, MmNonCached );
-  if ( !PhysicalMemory )
-    {
-      DBG ( "Could not map low memory\n" );
-      return;
-    }
-  InterruptVector =
-    ( int_vector_ptr ) ( PhysicalMemory + 0x13 * sizeof ( int_vector ) );
-  /*
-   * Walk the "safe hook" chain of INT 13h hooks as far as possible
-   */
-  while ( SafeMbrHookPtr = get_safe_hook ( PhysicalMemory, InterruptVector ) )
-    {
-      if ( !
-          ( RtlCompareMemory ( SafeMbrHookPtr->VendorID, "MEMDISK ", 8 ) ==
-            8 ) )
-       {
-         DBG ( "Non-MEMDISK INT 0x13 Safe Hook\n" );
-       }
-      else
-       {
-         FoundMemdisk |= check_mbft ( PhysicalMemory, SafeMbrHookPtr->mBFT );
-       }
-      InterruptVector = &SafeMbrHookPtr->PrevHook;
-    }
-  /*
-   * Now search for "floating" mBFTs
-   */
-  for ( Offset = 0; Offset < 0xFFFF0; Offset += 0x10 )
-    {
-      FoundMemdisk |= check_mbft ( PhysicalMemory, Offset );
-    }
-  MmUnmapIoSpace ( PhysicalMemory, 0x100000 );
-  if ( !FoundMemdisk )
-    {
-      DBG ( "No MEMDISKs found\n" );
-    }
-}
-
 void
 find_grub4dos_disks (
   void
@@ -468,7 +294,7 @@ find_grub4dos_disks (
              DBG ( "Skipping non-RAM disk GRUB4DOS mapping\n" );
              continue;
            }
-         ramdisk.disk.Initialize = no_init;
+         ramdisk.disk.Initialize = ramdisk__no_init;
          /*
           * Possible precision loss
           */
@@ -526,6 +352,6 @@ probe__disks (
  )
 {
   find_aoe_disks (  );
-  find_memdisks (  );
+  memdisk__find (  );
   find_grub4dos_disks (  );
 }
index bb91f53..296cbf5 100644 (file)
@@ -18,8 +18,8 @@
  * You should have received a copy of the GNU General Public License
  * along with WinVBlock.  If not, see <http://www.gnu.org/licenses/>.
  */
-#ifndef _PROBE_H
-#  define _PROBE_H
+#ifndef _probe_h
+#  define _probe_h
 
 /**
  * @file
  *
  */
 
+winvblock__def_struct ( int_vector )
+{
+  winvblock__uint16 Offset;
+  winvblock__uint16 Segment;
+};
+
+#  ifdef _MSC_VER
+#    pragma pack(1)
+#  endif
+winvblock__def_struct ( safe_mbr_hook )
+{
+  winvblock__uint8 Jump[3];
+  winvblock__uint8 Signature[8];
+  winvblock__uint8 VendorID[8];
+  int_vector PrevHook;
+  winvblock__uint32 Flags;
+  winvblock__uint32 mBFT;      /* MEMDISK only */
+}
+
+__attribute__ ( ( __packed__ ) );
+#  ifdef _MSC_VER
+#    pragma pack()
+#  endif
+
+extern safe_mbr_hook_ptr STDCALL get_safe_hook (
+  IN winvblock__uint8_ptr PhysicalMemory,
+  IN int_vector_ptr InterruptVector
+ );
+
 extern void probe__disks (
   void
  );
 
-#endif                         /* _PROBE_H */
+#endif                         /* _probe_h */
index 146381e..b30a486 100644 (file)
@@ -143,3 +143,11 @@ ramdisk__query_id (
        return 0;
     }
 }
+
+winvblock__bool STDCALL
+ramdisk__no_init (
+  IN driver__dev_ext_ptr dev_ext
+ )
+{
+  return TRUE;
+}
index ff96df9..cf39a46 100644 (file)
@@ -61,4 +61,8 @@ ramdisk__get_ptr (
   return ( ramdisk__type_ptr ) dev_ext_ptr;
 }
 
+extern winvblock__bool STDCALL ramdisk__no_init (
+  IN driver__dev_ext_ptr dev_ext
+ );
+
 #endif                         /* _ramdisk_h */