Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.197
diff -u -p -r1.197 module.inc
--- includes/module.inc	28 Jul 2010 01:46:59 -0000	1.197
+++ includes/module.inc	20 Aug 2010 12:13:00 -0000
@@ -72,7 +72,8 @@ function module_list($refresh = FALSE, $
         $list = system_list('bootstrap');
       }
       else {
-        $list = system_list('module_enabled');
+        $list = array_keys(system_list('module_enabled'));
+        $list = (!empty($list) ? array_combine($list, $list) : array());
       }
     }
   }
@@ -91,14 +92,15 @@ function module_list($refresh = FALSE, $
  *
  * @param $type
  *   The type of list to return:
+ *   - module: All modules.
  *   - module_enabled: All enabled modules.
  *   - bootstrap: All enabled modules required for bootstrap.
  *   - theme: All themes.
  *
  * @return
  *   An associative array of modules or themes, keyed by name, and having the
- *   respective database row as value. For $type 'module_enabled' and
- *   'bootstrap', the array values equal the keys.
+ *   respective database row as value. For $type 'bootstrap', the array values
+ *   equal the keys.
  *
  * @see module_list()
  * @see list_themes()
@@ -134,6 +136,7 @@ function system_list($type) {
     }
     else {
       $lists = array(
+        'module' => array(),
         'module_enabled' => array(),
         'theme' => array(),
         'filepaths' => array(),
@@ -145,9 +148,13 @@ function system_list($type) {
       // consistent with the one used in module_implements().
       $result = db_query("SELECT * FROM {system} ORDER BY weight ASC, name ASC");
       foreach ($result as $record) {
-        if ($record->type == 'module' && $record->status) {
-          // Build a list of all enabled modules.
-          $lists['module_enabled'][$record->name] = $record->name;
+        // Build a list of modules.
+        if ($record->type == 'module') {
+          $lists['module'][$record->name] = $record;
+          // Build a list of enabled modules.
+          if ($record->status) {
+            $lists['module_enabled'][$record->name] = $record;
+          }
         }
         // Build a list of themes.
         if ($record->type == 'theme') {
Index: modules/field/field.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.module,v
retrieving revision 1.81
diff -u -p -r1.81 field.module
--- modules/field/field.module	14 Aug 2010 03:10:04 -0000	1.81
+++ modules/field/field.module	20 Aug 2010 12:08:45 -0000
@@ -130,7 +130,7 @@ function field_help($path, $arg) {
       // Make a list of all widget and field modules currently enabled, in
       // order by displayed module name (module names are not translated).
       $items = array();
-      $info = system_get_info('module');
+      $info = system_get_info('module_enabled');
       $modules = array_merge(module_implements('field_info'), module_implements('field_widget_info'));
       $modules = array_unique($modules);
       sort($modules);
Index: modules/system/system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.296
diff -u -p -r1.296 system.admin.inc
--- modules/system/system.admin.inc	18 Aug 2010 18:41:30 -0000	1.296
+++ modules/system/system.admin.inc	20 Aug 2010 12:09:03 -0000
@@ -145,7 +145,7 @@ function system_admin_menu_block_page() 
  * Menu callback; prints a listing of admin tasks for each installed module.
  */
 function system_admin_by_module() {
-  $module_info = system_get_info('module');
+  $module_info = system_get_info('module_enabled');
   foreach ($module_info as $module => $info) {
     $module_info[$module] = new stdClass();
     $module_info[$module]->info = $info;
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.955
diff -u -p -r1.955 system.module
--- modules/system/system.module	20 Aug 2010 01:42:52 -0000	1.955
+++ modules/system/system.module	20 Aug 2010 12:15:56 -0000
@@ -2217,25 +2217,36 @@ function system_update_files_database(&$
 }
 
 /**
- * Returns an array of information about active modules or themes.
+ * Returns information about modules or themes.
  *
  * This function returns the information from the {system} table corresponding
  * to the cached contents of the .info file for each active module or theme.
  *
  * @param $type
- *   Either 'module' or 'theme'.
+ *   The type of system list to retrieve:
+ *   - module: All modules, including disabled.
+ *   - module_enabled: Enabled modules.
+ *   - theme: All themes, including disabled.
+ * @param $name
+ *   (optional) The name of a module or theme whose information shall be
+ *   returned. If omitted, all records for the provided $type will be returned.
+ *   If $name does not exist in the provided $type, FALSE will be returned.
  *
  * @return
- *   An associative array of module or theme information keyed by name.
+ *   An associative array of module or theme information keyed by name, or only
+ *   information for $name, if given.
  *
  * @see system_rebuild_module_data()
  * @see system_rebuild_theme_data()
  */
-function system_get_info($type) {
+function system_get_info($type, $name = NULL) {
   $info = array();
-  $result = db_query('SELECT name, info FROM {system} WHERE type = :type AND status = 1', array(':type' => $type));
-  foreach ($result as $item) {
-    $info[$item->name] = unserialize($item->info);
+  $list = system_list($type);
+  foreach ($list as $shortname => $item) {
+    $info[$shortname] = unserialize($item->info);
+  }
+  if (isset($name)) {
+    return isset($info[$name]) ? $info[$name] : FALSE;
   }
   return $info;
 }
Index: modules/user/user.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v
retrieving revision 1.116
diff -u -p -r1.116 user.admin.inc
--- modules/user/user.admin.inc	29 Jul 2010 01:39:32 -0000	1.116
+++ modules/user/user.admin.inc	20 Aug 2010 12:09:16 -0000
@@ -662,7 +662,7 @@ function user_admin_permissions($form, $
   );
   // Render role/permission overview:
   $options = array();
-  $module_info = system_get_info('module');
+  $module_info = system_get_info('module_enabled');
   $hide_descriptions = system_admin_compact_mode();
 
   // Get a list of all the modules implementing a hook_permission() and sort by
