[device] Introduce device creation routine
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 20 May 2010 05:44:59 +0000 (01:44 -0400)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 20 May 2010 05:44:59 +0000 (01:44 -0400)
Though currently unused, the idea is to eventually have the
different device type modules as providers of their device
types.  The new device-common module will produce a device
structure which has device-common properties.  A caller can
then override whichever properties they need to, such as the
device operations.

Also, device creation should track created devices for easy
tear-down later on.

WinVBlock.dev
src/include/device.h
src/include/irp.h
src/winvblock/device.c [new file with mode: 0644]
src/winvblock/driver.c
src/winvblock/makedriver.bat

index 66fd257..d0d1c55 100644 (file)
@@ -1,7 +1,7 @@
 [Project]\r
 FileName=WinVBlock.dev\r
 Name=WinVBlock\r
-UnitCount=54\r
+UnitCount=55\r
 PchHead=-1\r
 PchSource=-1\r
 Ver=3\r
@@ -620,3 +620,13 @@ Priority=1000
 OverrideBuildCmd=0\r
 BuildCmd=\r
 \r
+[Unit55]\r
+FileName=src\winvblock\device.c\r
+CompileCpp=1\r
+Folder=WinVBlock\r
+Compile=1\r
+Link=1\r
+Priority=1000\r
+OverrideBuildCmd=0\r
+BuildCmd=\r
+\r
index c1a0bf3..e5787bb 100644 (file)
@@ -102,6 +102,29 @@ typedef device__close_decl (
    ( *device__close_routine )
  );
 
+/**
+ * Initialize the global, device-common environment
+ *
+ * @ret ntstatus        STATUS_SUCCESS or the NTSTATUS for a failure
+ */
+extern STDCALL NTSTATUS device__init (
+  void
+ );
+
+/**
+ * Create a new device
+ *
+ * @ret dev_ptr         The address of a new device, or NULL for failure
+ *
+ * This function should not be confused with a PDO creation routine, which is
+ * actually implemented for each device type.  This routine will allocate a
+ * device__type, track it in a global list, as well as populate the device
+ * with default values.
+ */
+extern winvblock__lib_func STDCALL device__type_ptr device__create (
+  void
+ );
+
 winvblock__def_struct ( device__ops )
 {
   device__create_pdo_routine create_pdo;
@@ -122,6 +145,7 @@ struct _device__type
   irp__handler_chain irp_handler_chain;
   device__type_ptr next_sibling_ptr;
   device__ops_ptr ops;
+  LIST_ENTRY tracking;
 };
 
 #endif                         /* _device_h */
index a6f840c..64a8deb 100644 (file)
@@ -27,7 +27,7 @@
  *
  */
 
-/* An unfortunate forward declaration.  Definition resolved in driver.h */
+/* An unfortunate forward declaration.  Definition resolved in device.h */
 struct _device__type;
 
 /* We have lots of these, so offer a convenience macro for declarations */
diff --git a/src/winvblock/device.c b/src/winvblock/device.c
new file mode 100644 (file)
index 0000000..379d9f1
--- /dev/null
@@ -0,0 +1,100 @@
+/**
+ * Copyright (C) 2009-2010, Shao Miller <shao.miller@yrdsb.edu.on.ca>.
+ * Copyright 2006-2008, V.
+ * For WinAoE contact information, see http://winaoe.org/
+ *
+ * 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
+ *
+ * Device specifics
+ *
+ */
+
+#include <ntddk.h>
+
+#include "winvblock.h"
+#include "portable.h"
+#include "irp.h"
+#include "device.h"
+#include "driver.h"
+
+static LIST_ENTRY dev_list;
+static KSPIN_LOCK dev_list_lock;
+
+/**
+ * Initialize the global, device-common environment
+ *
+ * @ret ntstatus        STATUS_SUCCESS or the NTSTATUS for a failure
+ */
+STDCALL NTSTATUS
+device__init (
+  void
+ )
+{
+  /*
+   * Initialize the global list of devices
+   */
+  InitializeListHead ( &dev_list );
+  KeInitializeSpinLock ( &dev_list_lock );
+
+  return STATUS_SUCCESS;
+}
+
+/**
+ * Create a new device
+ *
+ * @ret dev_ptr         The address of a new device, or NULL for failure
+ *
+ * See the header file for additional details
+ */
+winvblock__lib_func STDCALL device__type_ptr
+device__create (
+  void
+ )
+{
+  device__type_ptr dev_ptr;
+
+  /*
+   * Devices might be used for booting and should
+   * not be allocated from a paged memory pool
+   */
+  dev_ptr = ExAllocatePool ( NonPagedPool, sizeof ( device__type ) );
+  if ( dev_ptr == NULL )
+    goto err_nomem;
+  RtlZeroMemory ( dev_ptr, sizeof ( device__type ) );
+  /*
+   * Track the new device in our global list
+   */
+  ExInterlockedInsertTailList ( &dev_list, &dev_ptr->tracking,
+                               &dev_list_lock );
+  /*
+   * Populate non-zero device defaults
+   */
+  dev_ptr->size = sizeof ( device__type );
+  dev_ptr->DriverObject = driver__obj_ptr;
+  /*
+   * Register the default driver IRP handling table
+   */
+  irp__reg_table_s ( &dev_ptr->irp_handler_chain, driver__handling_table,
+                    driver__handling_table_size );
+
+err_nomem:
+
+  return dev_ptr;
+}
index 8dfcfd4..a4ec74a 100644 (file)
@@ -171,7 +171,10 @@ DriverEntry (
     {
       DBG ( "Could not set system state to ES_CONTINUOUS!!\n" );
     }
-
+  /*
+   * Initialize various modules
+   */
+  device__init (  );           /* TODO: Check for error */
   /*
    * Set up IRP MajorFunction function table for devices
    * this driver handles
index 4188d42..d1b40b7 100644 (file)
@@ -10,7 +10,7 @@ for /d %%a in (%lib%) do (
   popd\r
   )\r
 \r
-set c=debug.c driver.c filedisk.c irp.c probe.c registry.c winvblock.rc\r
+set c=debug.c driver.c filedisk.c irp.c probe.c registry.c winvblock.rc device.c\r
 \r
 set name=WVBlk%bits%\r
 \r