[registry] Change Registry_NoteOsLoadOptions function
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 10 May 2010 16:40:32 +0000 (12:40 -0400)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 10 May 2010 16:40:32 +0000 (12:40 -0400)
Renamed to registry__note_os_load_opts().  Now takes an
argument instead of storing directly to a global in the
driver module.

We also free this from the driver module at driver unload
time, as well.

src/bus/driver.c
src/bus/registry.c
src/include/driver.h
src/include/registry.h

index cf6e296..960e251 100644 (file)
@@ -62,7 +62,7 @@ static winvblock__bool Driver_Globals_Started = FALSE;
 PDRIVER_OBJECT driver__obj_ptr = NULL;
 
 /* Contains TXTSETUP.SIF/BOOT.INI-style OsLoadOptions parameters */
-LPWSTR driver__os_load_opts = NULL;
+LPWSTR os_load_opts = NULL;
 
 static LPWSTR STDCALL
 get_opt (
@@ -81,13 +81,13 @@ get_opt (
   size_t opt_name_len,
    opt_name_len_bytes;
 
-  if ( !driver__os_load_opts || !opt_name )
+  if ( !os_load_opts || !opt_name )
     return NULL;
 
   /*
    * Find /WINVBLOCK= options
    */
-  our_opts = driver__os_load_opts;
+  our_opts = os_load_opts;
   while ( *our_opts != L'\0' )
     {
       if ( RtlCompareMemory ( our_opts, our_sig, our_sig_len_bytes ) !=
@@ -162,6 +162,8 @@ DriverEntry (
   if ( Driver_Globals_Started )
     return STATUS_SUCCESS;
   Debug_Initialize (  );
+  if ( !NT_SUCCESS ( Status = registry__note_os_load_opts ( &os_load_opts ) ) )
+    return Error ( "registry__note_os_load_opts", Status );
   if ( !NT_SUCCESS ( Status = Registry_Check (  ) ) )
     return Error ( "Registry_Check", Status );
 
@@ -316,6 +318,7 @@ Driver_Unload (
   Protocol_Stop (  );
   AoE_Stop (  );
   Bus_Stop (  );
+  ExFreePool ( os_load_opts );
   Driver_Globals_Started = FALSE;
   DBG ( "Done\n" );
 }
index 518e06e..cbdd35f 100644 (file)
@@ -337,13 +337,14 @@ registry__store_dword (
 /**
  * Note BOOT.INI-style OsLoadOptions from registry
  *
+ * @v w_str_ptr         Pointer to pointer to wide-char string to hold options
  * @ret ntstatus       NT status
  *
- * Somewhere we must eventually free Registry_Globals_OsLoadOptions.
+ * The caller must eventually free the wide-char string.
  */
-static NTSTATUS
-Registry_NoteOsLoadOptions (
-  void
+NTSTATUS
+registry__note_os_load_opts (
+  LPWSTR * w_str_ptr
  )
 {
   NTSTATUS status;
@@ -363,16 +364,12 @@ Registry_NoteOsLoadOptions (
    * Put the SystemStartOptions value into a global 
    */
   status =
-    registry__fetch_sz ( control_key, L"SystemStartOptions",
-                        &driver__os_load_opts );
+    registry__fetch_sz ( control_key, L"SystemStartOptions", w_str_ptr );
   if ( !NT_SUCCESS ( status ) )
     goto err_fetchsz;
 
-  DBG ( "OsLoadOptions: %S\n", driver__os_load_opts );
+  DBG ( "OsLoadOptions: %S\n", *w_str_ptr );
 
-  /*
-   * We do not free this global 
-   */
 err_fetchsz:
 
   registry__close_key ( control_key );
@@ -855,6 +852,5 @@ Registry_Check (
     {
       DBG ( "Registry updated\n" );
     }
-  Registry_NoteOsLoadOptions (  );
   return STATUS_SUCCESS;
 }
index bd10c38..fbe282b 100644 (file)
@@ -54,7 +54,6 @@ winvblock__def_enum ( driver__state );
 
 extern irp__handling driver__handling_table[];
 extern size_t driver__handling_table_size;
-extern LPWSTR driver__os_load_opts;
 extern PDRIVER_OBJECT driver__obj_ptr;
 
 /* Forward declaration */
index 6c93c17..b3e526d 100644 (file)
@@ -32,6 +32,18 @@ extern NTSTATUS Registry_Check (
   void
  );
 
+/**
+ * Note BOOT.INI-style OsLoadOptions from registry
+ *
+ * @v w_str_ptr         Pointer to pointer to wide-char string to hold options
+ * @ret ntstatus       NT status
+ *
+ * The caller must eventually free the wide-char string.
+ */
+extern NTSTATUS registry__note_os_load_opts (
+  LPWSTR * w_str_ptr
+ );
+
 /**
  * Open registry key
  *