Author: akhaldi
Date: Thu Oct 23 19:52:45 2014
New Revision: 64941

URL: http://svn.reactos.org/svn/reactos?rev=64941&view=rev
Log:
* Sync up to trunk head (r64939).

Added:
    branches/shell-experiments/base/applications/network/net/cmdUser.c
      - copied unchanged from r64939, 
trunk/reactos/base/applications/network/net/cmdUser.c
    branches/shell-experiments/dll/win32/advapi32/wine/
      - copied from r64939, trunk/reactos/dll/win32/advapi32/wine/
Removed:
    branches/shell-experiments/dll/win32/advapi32/crypt/
Modified:
    branches/shell-experiments/   (props changed)
    branches/shell-experiments/base/applications/network/net/CMakeLists.txt
    branches/shell-experiments/base/applications/network/net/lang/en-US.rc
    branches/shell-experiments/base/applications/network/net/lang/ro-RO.rc
    branches/shell-experiments/base/applications/network/net/lang/ru-RU.rc
    branches/shell-experiments/base/applications/network/net/main.c
    branches/shell-experiments/base/applications/network/net/net.h
    branches/shell-experiments/dll/directx/wine/dsound/sound3d.c
    branches/shell-experiments/dll/win32/advapi32/CMakeLists.txt
    branches/shell-experiments/dll/win32/advapi32/advapi32.h
    branches/shell-experiments/dll/win32/winspool/info.c
    branches/shell-experiments/drivers/bus/acpi/compbatt/comppnp.c
    branches/shell-experiments/drivers/bus/pcix/pci/id.c
    branches/shell-experiments/media/doc/README.WINE
    branches/shell-experiments/ntoskrnl/include/internal/io.h
    branches/shell-experiments/ntoskrnl/io/iomgr/driver.c
    branches/shell-experiments/subsystems/ntvdm/io.c
    branches/shell-experiments/subsystems/ntvdm/io.h
    branches/shell-experiments/win32ss/user/ntuser/class.c
    branches/shell-experiments/win32ss/user/ntuser/cursoricon_new.c
    branches/shell-experiments/win32ss/user/ntuser/window.c
    branches/shell-experiments/win32ss/user/user32/windows/cursoricon_new.c

Propchange: branches/shell-experiments/
------------------------------------------------------------------------------
--- svn:mergeinfo       (original)
+++ svn:mergeinfo       Thu Oct 23 19:52:45 2014
@@ -18,4 +18,4 @@
 
/branches/usb-bringup:51335,51337,51341-51343,51348,51350,51353,51355,51365-51369,51372,51384-54388,54396-54398,54736-54737,54752-54754,54756-54760,54762,54764-54765,54767-54768,54772,54774-54777,54781,54787,54790-54792,54797-54798,54806,54808,54834-54838,54843,54850,54852,54856,54858-54859
 /branches/usb-bringup-trunk:55019-55543,55548-55554,55556-55567
 /branches/wlan-bringup:54809-54998
-/trunk/reactos:61927-64921
+/trunk/reactos:61927-64939

Modified: 
branches/shell-experiments/base/applications/network/net/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/applications/network/net/CMakeLists.txt?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/base/applications/network/net/CMakeLists.txt     
[iso-8859-1] (original)
+++ branches/shell-experiments/base/applications/network/net/CMakeLists.txt     
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -10,6 +10,7 @@
     cmdPause.c
     cmdStart.c
     cmdStop.c
+    cmdUser.c
     help.c
     net.h)
 

Modified: branches/shell-experiments/base/applications/network/net/lang/en-US.rc
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/applications/network/net/lang/en-US.rc?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/base/applications/network/net/lang/en-US.rc      
[iso-8859-1] (original)
+++ branches/shell-experiments/base/applications/network/net/lang/en-US.rc      
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -44,7 +44,9 @@
     IDS_TIME_HELP "TIME\n..."
     IDS_USE_SYNTAX "Usage:\nNET USE ..."
     IDS_USE_HELP "USE\n..."
-    IDS_USER_SYNTAX "Usage:\nNET USER ..."
+    IDS_USER_SYNTAX "Usage:\nNET USER [username [password | *] [options]] 
[/DOMAIN]\n\
+         username {password | *} /ADD [options] [/DOMAIN]\n\
+         username [/DELETE] [/DOMAIN]"
     IDS_USER_HELP "USER\n..."
     IDS_VIEW_SYNTAX "Usage:\nNET VIEW ..."
     IDS_VIEW_HELP "VIEW\n..."

Modified: branches/shell-experiments/base/applications/network/net/lang/ro-RO.rc
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/applications/network/net/lang/ro-RO.rc?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/base/applications/network/net/lang/ro-RO.rc      
[iso-8859-1] (original)
+++ branches/shell-experiments/base/applications/network/net/lang/ro-RO.rc      
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -50,7 +50,9 @@
     IDS_TIME_HELP "TIME\n..."
     IDS_USE_SYNTAX "Utilizare:\nNET USE ..."
     IDS_USE_HELP "USE\n..."
-    IDS_USER_SYNTAX "Utilizare:\nNET USER ..."
+    IDS_USER_SYNTAX "Utilizare:\nNET USER [username [password | *] [options]] 
[/DOMAIN]\n\
+         username {password | *} /ADD [options] [/DOMAIN]\n\
+         username [/DELETE] [/DOMAIN]"
     IDS_USER_HELP "USER\n..."
     IDS_VIEW_SYNTAX "Utilizare:\nNET VIEW ..."
     IDS_VIEW_HELP "VIEW\n..."

Modified: branches/shell-experiments/base/applications/network/net/lang/ru-RU.rc
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/applications/network/net/lang/ru-RU.rc?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/base/applications/network/net/lang/ru-RU.rc      
[iso-8859-1] (original)
+++ branches/shell-experiments/base/applications/network/net/lang/ru-RU.rc      
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -45,7 +45,9 @@
     IDS_TIME_HELP "TIME\n..."
     IDS_USE_SYNTAX "Использование:\nNET USE ..."
     IDS_USE_HELP "USE\n..."
-    IDS_USER_SYNTAX "Использование:\nNET USER ..."
+    IDS_USER_SYNTAX "Использование:\nNET USER [username [password 
| *] [options]] [/DOMAIN]\n\
+         username {password | *} /ADD [options] [/DOMAIN]\n\
+         username [/DELETE] [/DOMAIN]"
     IDS_USER_HELP "USER\n..."
     IDS_VIEW_SYNTAX "Использование:\nNET VIEW ..."
     IDS_VIEW_HELP "VIEW\n..."

Modified: branches/shell-experiments/base/applications/network/net/main.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/applications/network/net/main.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/base/applications/network/net/main.c     
[iso-8859-1] (original)
+++ branches/shell-experiments/base/applications/network/net/main.c     
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -40,7 +40,7 @@
     {L"stop",       cmdStop},
     {L"time",       unimplemented},
     {L"use",        unimplemented},
-    {L"user",       unimplemented},
+    {L"user",       cmdUser},
     {L"view",       unimplemented},
     {NULL,          NULL}
 };

Modified: branches/shell-experiments/base/applications/network/net/net.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/applications/network/net/net.h?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/base/applications/network/net/net.h      
[iso-8859-1] (original)
+++ branches/shell-experiments/base/applications/network/net/net.h      
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -13,6 +13,7 @@
 
 #include <windef.h>
 #include <winbase.h>
+#include <winnls.h>
 #include <winuser.h>
 #include <winsvc.h>
 #include <stdio.h>
@@ -39,5 +40,6 @@
 INT cmdPause(INT argc, WCHAR **argv);
 INT cmdStart(INT argc, WCHAR **argv);
 INT cmdStop(INT argc, WCHAR **argv);
+INT cmdUser(INT argc, WCHAR **argv);
 
 #endif /* _NET_PCH_ */

Modified: branches/shell-experiments/dll/directx/wine/dsound/sound3d.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/directx/wine/dsound/sound3d.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/dll/directx/wine/dsound/sound3d.c        
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/directx/wine/dsound/sound3d.c        
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -121,6 +121,7 @@
        return c;
 }
 
+#ifndef __REACTOS__
 /* calculates the length of vector's projection on another vector */
 static inline D3DVALUE ProjectVector (const D3DVECTOR *a, const D3DVECTOR *p)
 {
@@ -131,6 +132,7 @@
               p->y, p->z, result);
        return result;
 }
+#endif
 
 
/*******************************************************************************
  *              3D Buffer and Listener mixing

Modified: branches/shell-experiments/dll/win32/advapi32/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/advapi32/CMakeLists.txt?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/advapi32/CMakeLists.txt        
[iso-8859-1] (original)
+++ branches/shell-experiments/dll/win32/advapi32/CMakeLists.txt        
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -17,9 +17,6 @@
     ${REACTOS_SOURCE_DIR}/include/reactos/idl/svcctl.idl)
 
 list(APPEND SOURCE
-    crypt/crypt.c
-    crypt/crypt_des.c
-    crypt/crypt_lmhash.c
     misc/dllmain.c
     misc/efs.c
     misc/hwprofiles.c
@@ -44,6 +41,9 @@
     service/sctrl.c
     token/privilege.c
     token/token.c
+    wine/crypt.c
+    wine/crypt_des.c
+    wine/crypt_lmhash.c
     advapi32.h)
 
 add_library(advapi32 SHARED

Modified: branches/shell-experiments/dll/win32/advapi32/advapi32.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/advapi32/advapi32.h?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/advapi32/advapi32.h    [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/advapi32/advapi32.h    [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -39,7 +39,7 @@
 #include <wine/debug.h>
 #include <wine/unicode.h>
 
-#include "crypt/crypt.h"
+#include "wine/crypt.h"
 
 #ifndef HAS_FN_PROGRESSW
 #define FN_PROGRESSW FN_PROGRESS

Modified: branches/shell-experiments/dll/win32/winspool/info.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/winspool/info.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/dll/win32/winspool/info.c        [iso-8859-1] 
(original)
+++ branches/shell-experiments/dll/win32/winspool/info.c        [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -28,10 +28,6 @@
 #include <winnls.h>
 #include <shlwapi.h>
 
-#include <wine/debug.h>
-
-WINE_DEFAULT_DEBUG_CHANNEL(winspool);
-
 /******************************************************************************
  *             GetDefaultPrinterA   (WINSPOOL.@)
  */

Modified: branches/shell-experiments/drivers/bus/acpi/compbatt/comppnp.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/drivers/bus/acpi/compbatt/comppnp.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/drivers/bus/acpi/compbatt/comppnp.c      
[iso-8859-1] (original)
+++ branches/shell-experiments/drivers/bus/acpi/compbatt/comppnp.c      
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -69,7 +69,7 @@
     /* Done */
     ExReleaseFastMutex(&DeviceExtension->Lock);
     if (CompBattDebug & 1) DbgPrint("CompBatt: EXITING 
RemoveBatteryFromList\n");
-    return STATUS_SUCCESS;
+    return NULL;
 }
 
 BOOLEAN

Modified: branches/shell-experiments/drivers/bus/pcix/pci/id.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/drivers/bus/pcix/pci/id.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/drivers/bus/pcix/pci/id.c        [iso-8859-1] 
(original)
+++ branches/shell-experiments/drivers/bus/pcix/pci/id.c        [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -118,7 +118,7 @@
 }
 
 ULONG
-NTAPI
+__cdecl
 PciIdPrintf(IN PPCI_ID_BUFFER IdBuffer,
             IN PCCH Format,
             ...)
@@ -153,7 +153,7 @@
 }
 
 ULONG
-NTAPI
+__cdecl
 PciIdPrintfAppend(IN PPCI_ID_BUFFER IdBuffer,
                   IN PCCH Format,
                   ...)

Modified: branches/shell-experiments/media/doc/README.WINE
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/media/doc/README.WINE?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/media/doc/README.WINE    [iso-8859-1] (original)
+++ branches/shell-experiments/media/doc/README.WINE    [iso-8859-1] Thu Oct 23 
19:52:45 2014
@@ -256,9 +256,11 @@
 reactos/lib/3rdparty/strmbase               # Synced to Wine-1.7.27
 
 advapi32 -
-  reactos/dll/win32/advapi32/crypt/*.c          # Synced to Wine-1.7.27
-  reactos/dll/win32/advapi32/sec/cred.c         # Synced to Wine-1.7.27
-  reactos/dll/win32/advapi32/sec/sid.c          # Out of Sync
+  reactos/dll/win32/advapi32/wine/crypt.c        # Synced to Wine-1.7.27
+  reactos/dll/win32/advapi32/wine/crypt_des.c    # Synced to Wine-1.7.27
+  reactos/dll/win32/advapi32/wine/crypt_lmhash.c # Synced to Wine-1.7.27
+  reactos/dll/win32/advapi32/sec/cred.c          # Synced to Wine-1.7.27
+  reactos/dll/win32/advapi32/sec/sid.c           # Out of Sync
 
 gdi32 -
   reactos/dll/win32/gdi32/objects/linedda.c     # Synced at 20090410

Modified: branches/shell-experiments/ntoskrnl/include/internal/io.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/ntoskrnl/include/internal/io.h?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/ntoskrnl/include/internal/io.h   [iso-8859-1] 
(original)
+++ branches/shell-experiments/ntoskrnl/include/internal/io.h   [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -385,7 +385,7 @@
 typedef struct _LOAD_UNLOAD_PARAMS
 {
     NTSTATUS Status;
-    PUNICODE_STRING ServiceName;
+    PCUNICODE_STRING RegistryPath;
     WORK_QUEUE_ITEM WorkItem;
     KEVENT Event;
     PDRIVER_OBJECT DriverObject;
@@ -1083,10 +1083,11 @@
     OUT PLDR_DATA_TABLE_ENTRY *ModuleObject
 );
 
-VOID
+NTSTATUS
 NTAPI
 IopLoadUnloadDriver(
-    IN OUT PLOAD_UNLOAD_PARAMS LoadParams
+    _In_opt_ PCUNICODE_STRING RegistryPath,
+    _Inout_ PDRIVER_OBJECT *DriverObject
 );
 
 NTSTATUS

Modified: branches/shell-experiments/ntoskrnl/io/iomgr/driver.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/ntoskrnl/io/iomgr/driver.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/ntoskrnl/io/iomgr/driver.c       [iso-8859-1] 
(original)
+++ branches/shell-experiments/ntoskrnl/io/iomgr/driver.c       [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -39,15 +39,16 @@
 
 /* PRIVATE FUNCTIONS 
**********************************************************/
 
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 IopInvalidDeviceRequest(
-   PDEVICE_OBJECT DeviceObject,
-   PIRP Irp)
-{
-   Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
-   Irp->IoStatus.Information = 0;
-   IoCompleteRequest(Irp, IO_NO_INCREMENT);
-   return STATUS_INVALID_DEVICE_REQUEST;
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp)
+{
+    Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_INVALID_DEVICE_REQUEST;
 }
 
 VOID
@@ -64,8 +65,7 @@
     ASSERT(!DriverObject->DeviceObject);
 
     /* Get the extension and loop them */
-    DriverExtension = IoGetDrvObjExtension(DriverObject)->
-                      ClientDriverExtension;
+    DriverExtension = 
IoGetDrvObjExtension(DriverObject)->ClientDriverExtension;
     while (DriverExtension)
     {
         /* Get the next one */
@@ -98,61 +98,60 @@
     }
 }
 
-NTSTATUS FASTCALL
+NTSTATUS
+FASTCALL
 IopGetDriverObject(
-   PDRIVER_OBJECT *DriverObject,
-   PUNICODE_STRING ServiceName,
-   BOOLEAN FileSystem)
-{
-   PDRIVER_OBJECT Object;
-   WCHAR NameBuffer[MAX_PATH];
-   UNICODE_STRING DriverName;
-   NTSTATUS Status;
-
-   DPRINT("IopGetDriverObject(%p '%wZ' %x)\n",
-      DriverObject, ServiceName, FileSystem);
-
-   *DriverObject = NULL;
-
-   /* Create ModuleName string */
-   if (ServiceName == NULL || ServiceName->Buffer == NULL)
-      /* We don't know which DriverObject we have to open */
-      return STATUS_INVALID_PARAMETER_2;
-
-   DriverName.Buffer = NameBuffer;
-   DriverName.Length = 0;
-   DriverName.MaximumLength = sizeof(NameBuffer);
-
-   if (FileSystem == TRUE)
-      RtlAppendUnicodeToString(&DriverName, FILESYSTEM_ROOT_NAME);
-   else
-      RtlAppendUnicodeToString(&DriverName, DRIVER_ROOT_NAME);
-   RtlAppendUnicodeStringToString(&DriverName, ServiceName);
-
-   DPRINT("Driver name: '%wZ'\n", &DriverName);
-
-   /* Open driver object */
-   Status = ObReferenceObjectByName(
-      &DriverName,
-      OBJ_OPENIF | OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, /* Attributes */
-      NULL, /* PassedAccessState */
-      0, /* DesiredAccess */
-      IoDriverObjectType,
-      KernelMode,
-      NULL, /* ParseContext */
-      (PVOID*)&Object);
-
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT("Failed to reference driver object, status=0x%08x\n", Status);
-      return Status;
-   }
-
-   *DriverObject = Object;
-
-   DPRINT("Driver Object: %p\n", Object);
-
-   return STATUS_SUCCESS;
+    PDRIVER_OBJECT *DriverObject,
+    PUNICODE_STRING ServiceName,
+    BOOLEAN FileSystem)
+{
+    PDRIVER_OBJECT Object;
+    WCHAR NameBuffer[MAX_PATH];
+    UNICODE_STRING DriverName;
+    NTSTATUS Status;
+
+    DPRINT("IopGetDriverObject(%p '%wZ' %x)\n",
+           DriverObject, ServiceName, FileSystem);
+
+    *DriverObject = NULL;
+
+    /* Create ModuleName string */
+    if (ServiceName == NULL || ServiceName->Buffer == NULL)
+        /* We don't know which DriverObject we have to open */
+        return STATUS_INVALID_PARAMETER_2;
+
+    DriverName.Buffer = NameBuffer;
+    DriverName.Length = 0;
+    DriverName.MaximumLength = sizeof(NameBuffer);
+
+    if (FileSystem == TRUE)
+        RtlAppendUnicodeToString(&DriverName, FILESYSTEM_ROOT_NAME);
+    else
+        RtlAppendUnicodeToString(&DriverName, DRIVER_ROOT_NAME);
+    RtlAppendUnicodeStringToString(&DriverName, ServiceName);
+
+    DPRINT("Driver name: '%wZ'\n", &DriverName);
+
+    /* Open driver object */
+    Status = ObReferenceObjectByName(&DriverName,
+                                     OBJ_OPENIF | OBJ_KERNEL_HANDLE | 
OBJ_CASE_INSENSITIVE, /* Attributes */
+                                     NULL, /* PassedAccessState */
+                                     0, /* DesiredAccess */
+                                     IoDriverObjectType,
+                                     KernelMode,
+                                     NULL, /* ParseContext */
+                                     (PVOID*)&Object);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("Failed to reference driver object, status=0x%08x\n", Status);
+        return Status;
+    }
+
+    *DriverObject = Object;
+
+    DPRINT("Driver Object: %p\n", Object);
+
+    return STATUS_SUCCESS;
 }
 
 /*
@@ -193,7 +192,6 @@
  *
  * Display 'Loading XXX...' message.
  */
-
 VOID
 FASTCALL
 INIT_FUNCTION
@@ -234,55 +232,55 @@
  * Remarks
  *    The input image path isn't freed on error.
  */
-
 NTSTATUS
 FASTCALL
 IopNormalizeImagePath(
-   _Inout_ _When_(return>=0, _At_(ImagePath->Buffer, _Post_notnull_ 
__drv_allocatesMem(Mem)))
-        PUNICODE_STRING ImagePath,
-   _In_ PUNICODE_STRING ServiceName)
-{
-   UNICODE_STRING InputImagePath;
-
-   DPRINT("Normalizing image path '%wZ' for service '%wZ'\n", ImagePath, 
ServiceName);
-
-   RtlCopyMemory(
-      &InputImagePath,
-      ImagePath,
-      sizeof(UNICODE_STRING));
-
-   if (InputImagePath.Length == 0)
-   {
-      ImagePath->Length = 0;
-      ImagePath->MaximumLength =
-          (33 * sizeof(WCHAR)) + ServiceName->Length + sizeof(UNICODE_NULL);
-      ImagePath->Buffer = ExAllocatePool(NonPagedPool, 
ImagePath->MaximumLength);
-      if (ImagePath->Buffer == NULL)
-         return STATUS_NO_MEMORY;
-
-      RtlAppendUnicodeToString(ImagePath, 
L"\\SystemRoot\\system32\\drivers\\");
-      RtlAppendUnicodeStringToString(ImagePath, ServiceName);
-      RtlAppendUnicodeToString(ImagePath, L".sys");
-   } else
-   if (InputImagePath.Buffer[0] != L'\\')
-   {
-      ImagePath->Length = 0;
-      ImagePath->MaximumLength =
-          12 * sizeof(WCHAR) + InputImagePath.Length + sizeof(UNICODE_NULL);
-      ImagePath->Buffer = ExAllocatePool(NonPagedPool, 
ImagePath->MaximumLength);
-      if (ImagePath->Buffer == NULL)
-         return STATUS_NO_MEMORY;
-
-      RtlAppendUnicodeToString(ImagePath, L"\\SystemRoot\\");
-      RtlAppendUnicodeStringToString(ImagePath, &InputImagePath);
-
-      /* Free caller's string */
-      ExFreePoolWithTag(InputImagePath.Buffer, TAG_RTLREGISTRY);
-   }
-
-   DPRINT("Normalized image path is '%wZ' for service '%wZ'\n", ImagePath, 
ServiceName);
-
-   return STATUS_SUCCESS;
+    _Inout_ _When_(return>=0, _At_(ImagePath->Buffer, _Post_notnull_ 
__drv_allocatesMem(Mem)))
+         PUNICODE_STRING ImagePath,
+    _In_ PUNICODE_STRING ServiceName)
+{
+    UNICODE_STRING InputImagePath;
+
+    DPRINT("Normalizing image path '%wZ' for service '%wZ'\n", ImagePath, 
ServiceName);
+
+    RtlCopyMemory(&InputImagePath,
+                  ImagePath,
+                  sizeof(UNICODE_STRING));
+
+    if (InputImagePath.Length == 0)
+    {
+        ImagePath->Length = 0;
+        ImagePath->MaximumLength =
+            (33 * sizeof(WCHAR)) + ServiceName->Length + sizeof(UNICODE_NULL);
+        ImagePath->Buffer = ExAllocatePool(NonPagedPool,
+                                           ImagePath->MaximumLength);
+        if (ImagePath->Buffer == NULL)
+            return STATUS_NO_MEMORY;
+
+        RtlAppendUnicodeToString(ImagePath, 
L"\\SystemRoot\\system32\\drivers\\");
+        RtlAppendUnicodeStringToString(ImagePath, ServiceName);
+        RtlAppendUnicodeToString(ImagePath, L".sys");
+    }
+    else if (InputImagePath.Buffer[0] != L'\\')
+    {
+        ImagePath->Length = 0;
+        ImagePath->MaximumLength =
+            12 * sizeof(WCHAR) + InputImagePath.Length + sizeof(UNICODE_NULL);
+        ImagePath->Buffer = ExAllocatePool(NonPagedPool,
+                                           ImagePath->MaximumLength);
+        if (ImagePath->Buffer == NULL)
+            return STATUS_NO_MEMORY;
+
+        RtlAppendUnicodeToString(ImagePath, L"\\SystemRoot\\");
+        RtlAppendUnicodeStringToString(ImagePath, &InputImagePath);
+
+        /* Free caller's string */
+        ExFreePoolWithTag(InputImagePath.Buffer, TAG_RTLREGISTRY);
+    }
+
+    DPRINT("Normalized image path is '%wZ' for service '%wZ'\n", ImagePath, 
ServiceName);
+
+    return STATUS_SUCCESS;
 }
 
 /*
@@ -297,130 +295,129 @@
  * Return Value
  *    Status
  */
-
-NTSTATUS FASTCALL
+NTSTATUS
+FASTCALL
 IopLoadServiceModule(
-   IN PUNICODE_STRING ServiceName,
-   OUT PLDR_DATA_TABLE_ENTRY *ModuleObject)
-{
-   RTL_QUERY_REGISTRY_TABLE QueryTable[3];
-   ULONG ServiceStart;
-   UNICODE_STRING ServiceImagePath, CCSName;
-   NTSTATUS Status;
-   HANDLE CCSKey, ServiceKey;
-   PVOID BaseAddress;
+    IN PUNICODE_STRING ServiceName,
+    OUT PLDR_DATA_TABLE_ENTRY *ModuleObject)
+{
+    RTL_QUERY_REGISTRY_TABLE QueryTable[3];
+    ULONG ServiceStart;
+    UNICODE_STRING ServiceImagePath, CCSName;
+    NTSTATUS Status;
+    HANDLE CCSKey, ServiceKey;
+    PVOID BaseAddress;
 
     ASSERT(ServiceName->Length);
     DPRINT("IopLoadServiceModule(%wZ, 0x%p)\n", ServiceName, ModuleObject);
 
-   if (ExpInTextModeSetup)
-   {
-       /* We have no registry, but luckily we know where all the drivers are */
-
-       /* ServiceStart < 4 is all that matters */
-       ServiceStart = 0;
-
-       /* IopNormalizeImagePath will do all of the work for us if we give it 
an empty string */
-       ServiceImagePath.Length = ServiceImagePath.MaximumLength = 0;
-       ServiceImagePath.Buffer = NULL;
-   }
-   else
-   {
-       /* Open CurrentControlSet */
-       RtlInitUnicodeString(&CCSName,
-                            
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services");
-       Status = IopOpenRegistryKeyEx(&CCSKey, NULL, &CCSName, KEY_READ);
-       if (!NT_SUCCESS(Status))
-       {
-           DPRINT1("IopOpenRegistryKeyEx() failed for '%wZ' with Status 
%08X\n",
-                   &CCSName, Status);
-           return Status;
-       }
-
-       /* Open service key */
-       Status = IopOpenRegistryKeyEx(&ServiceKey, CCSKey, ServiceName, 
KEY_READ);
-       if (!NT_SUCCESS(Status))
-       {
-           DPRINT1("IopOpenRegistryKeyEx() failed for '%wZ' with Status 
%08X\n",
-                   ServiceName, Status);
-           ZwClose(CCSKey);
-           return Status;
-       }
-
-       /*
-        * Get information about the service.
-        */
-
-       RtlZeroMemory(QueryTable, sizeof(QueryTable));
-
-       RtlInitUnicodeString(&ServiceImagePath, NULL);
-
-       QueryTable[0].Name = L"Start";
-       QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
-       QueryTable[0].EntryContext = &ServiceStart;
-
-       QueryTable[1].Name = L"ImagePath";
-       QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
-       QueryTable[1].EntryContext = &ServiceImagePath;
-
-       Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
-          (PWSTR)ServiceKey, QueryTable, NULL, NULL);
-
-       ZwClose(ServiceKey);
-       ZwClose(CCSKey);
-
-       if (!NT_SUCCESS(Status))
-       {
-          DPRINT1("RtlQueryRegistryValues() failed (Status %x)\n", Status);
-          return Status;
-       }
-   }
-
-   /*
-    * Normalize the image path for all later processing.
-    */
-
-   Status = IopNormalizeImagePath(&ServiceImagePath, ServiceName);
-
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status);
-      return Status;
-   }
-
-   /*
-    * Case for disabled drivers
-    */
-
-   if (ServiceStart >= 4)
-   {
-      /* We can't load this */
-      Status = STATUS_DRIVER_UNABLE_TO_LOAD;
-   }
-   else
-   {
-      DPRINT("Loading module from %wZ\n", &ServiceImagePath);
-      Status = MmLoadSystemImage(&ServiceImagePath, NULL, NULL, 0, 
(PVOID)ModuleObject, &BaseAddress);
-      if (NT_SUCCESS(Status))
-      {
-          IopDisplayLoadingMessage(ServiceName);
-      }
-   }
-
-   ExFreePool(ServiceImagePath.Buffer);
-
-   /*
-    * Now check if the module was loaded successfully.
-    */
-
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT("Module loading failed (Status %x)\n", Status);
-   }
-
-   DPRINT("Module loading (Status %x)\n", Status);
-
-   return Status;
+    if (ExpInTextModeSetup)
+    {
+        /* We have no registry, but luckily we know where all the drivers are 
*/
+
+        /* ServiceStart < 4 is all that matters */
+        ServiceStart = 0;
+
+        /* IopNormalizeImagePath will do all of the work for us if we give it 
an empty string */
+        ServiceImagePath.Length = ServiceImagePath.MaximumLength = 0;
+        ServiceImagePath.Buffer = NULL;
+    }
+    else
+    {
+        /* Open CurrentControlSet */
+        RtlInitUnicodeString(&CCSName,
+                             
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services");
+        Status = IopOpenRegistryKeyEx(&CCSKey, NULL, &CCSName, KEY_READ);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("IopOpenRegistryKeyEx() failed for '%wZ' with Status 
%08X\n",
+                    &CCSName, Status);
+            return Status;
+        }
+
+        /* Open service key */
+        Status = IopOpenRegistryKeyEx(&ServiceKey, CCSKey, ServiceName, 
KEY_READ);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("IopOpenRegistryKeyEx() failed for '%wZ' with Status 
%08X\n",
+                    ServiceName, Status);
+            ZwClose(CCSKey);
+            return Status;
+        }
+
+        /*
+         * Get information about the service.
+         */
+        RtlZeroMemory(QueryTable, sizeof(QueryTable));
+
+        RtlInitUnicodeString(&ServiceImagePath, NULL);
+
+        QueryTable[0].Name = L"Start";
+        QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
+        QueryTable[0].EntryContext = &ServiceStart;
+
+        QueryTable[1].Name = L"ImagePath";
+        QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
+        QueryTable[1].EntryContext = &ServiceImagePath;
+
+        Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
+                                        (PWSTR)ServiceKey,
+                                        QueryTable,
+                                        NULL,
+                                        NULL);
+
+        ZwClose(ServiceKey);
+        ZwClose(CCSKey);
+
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("RtlQueryRegistryValues() failed (Status %x)\n", Status);
+            return Status;
+        }
+    }
+
+    /*
+     * Normalize the image path for all later processing.
+     */
+    Status = IopNormalizeImagePath(&ServiceImagePath, ServiceName);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status);
+        return Status;
+    }
+
+    /*
+     * Case for disabled drivers
+     */
+    if (ServiceStart >= 4)
+    {
+        /* We can't load this */
+        Status = STATUS_DRIVER_UNABLE_TO_LOAD;
+    }
+    else
+    {
+        DPRINT("Loading module from %wZ\n", &ServiceImagePath);
+        Status = MmLoadSystemImage(&ServiceImagePath, NULL, NULL, 0, 
(PVOID)ModuleObject, &BaseAddress);
+        if (NT_SUCCESS(Status))
+        {
+            IopDisplayLoadingMessage(ServiceName);
+        }
+    }
+
+    ExFreePool(ServiceImagePath.Buffer);
+
+    /*
+     * Now check if the module was loaded successfully.
+     */
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("Module loading failed (Status %x)\n", Status);
+    }
+
+    DPRINT("Module loading (Status %x)\n", Status);
+
+    return Status;
 }
 
 VOID
@@ -450,84 +447,83 @@
  *       On successful return this contains the driver object representing
  *       the loaded driver.
  */
-
-NTSTATUS FASTCALL
+NTSTATUS
+FASTCALL
 IopInitializeDriverModule(
-   IN PDEVICE_NODE DeviceNode,
-   IN PLDR_DATA_TABLE_ENTRY ModuleObject,
-   IN PUNICODE_STRING ServiceName,
-   IN BOOLEAN FileSystemDriver,
-   OUT PDRIVER_OBJECT *DriverObject)
-{
-   const WCHAR ServicesKeyName[] = 
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
-   WCHAR NameBuffer[MAX_PATH];
-   UNICODE_STRING DriverName;
-   UNICODE_STRING RegistryKey;
-   PDRIVER_INITIALIZE DriverEntry;
-   PDRIVER_OBJECT Driver;
-   NTSTATUS Status;
-
-   DriverEntry = ModuleObject->EntryPoint;
-
-   if (ServiceName != NULL && ServiceName->Length != 0)
-   {
-      RegistryKey.Length = 0;
-      RegistryKey.MaximumLength = sizeof(ServicesKeyName) + 
ServiceName->Length;
-      RegistryKey.Buffer = ExAllocatePool(PagedPool, 
RegistryKey.MaximumLength);
-      if (RegistryKey.Buffer == NULL)
-      {
-         return STATUS_INSUFFICIENT_RESOURCES;
-      }
-      RtlAppendUnicodeToString(&RegistryKey, ServicesKeyName);
-      RtlAppendUnicodeStringToString(&RegistryKey, ServiceName);
-   }
-   else
-   {
-      RtlInitUnicodeString(&RegistryKey, NULL);
-   }
-
-   /* Create ModuleName string */
-   if (ServiceName && ServiceName->Length > 0)
-   {
-      if (FileSystemDriver == TRUE)
-         wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME);
-      else
-         wcscpy(NameBuffer, DRIVER_ROOT_NAME);
-
-      RtlInitUnicodeString(&DriverName, NameBuffer);
-      DriverName.MaximumLength = sizeof(NameBuffer);
-
-      RtlAppendUnicodeStringToString(&DriverName, ServiceName);
-
-      DPRINT("Driver name: '%wZ'\n", &DriverName);
-   }
-   else
-      DriverName.Length = 0;
-
-   Status = IopCreateDriver(
-       DriverName.Length > 0 ? &DriverName : NULL,
-       DriverEntry,
-       &RegistryKey,
-       ServiceName,
-       ModuleObject,
-       &Driver);
-   RtlFreeUnicodeString(&RegistryKey);
-
-   *DriverObject = Driver;
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT("IopCreateDriver() failed (Status 0x%08lx)\n", Status);
-      return Status;
-   }
-
-   MmFreeDriverInitialization((PLDR_DATA_TABLE_ENTRY)Driver->DriverSection);
-
-   /* Set the driver as initialized */
-   IopReadyDeviceObjects(Driver);
-
-   if (PnpSystemInit) IopReinitializeDrivers();
-
-   return STATUS_SUCCESS;
+    IN PDEVICE_NODE DeviceNode,
+    IN PLDR_DATA_TABLE_ENTRY ModuleObject,
+    IN PUNICODE_STRING ServiceName,
+    IN BOOLEAN FileSystemDriver,
+    OUT PDRIVER_OBJECT *DriverObject)
+{
+    const WCHAR ServicesKeyName[] = 
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
+    WCHAR NameBuffer[MAX_PATH];
+    UNICODE_STRING DriverName;
+    UNICODE_STRING RegistryKey;
+    PDRIVER_INITIALIZE DriverEntry;
+    PDRIVER_OBJECT Driver;
+    NTSTATUS Status;
+
+    DriverEntry = ModuleObject->EntryPoint;
+
+    if (ServiceName != NULL && ServiceName->Length != 0)
+    {
+        RegistryKey.Length = 0;
+        RegistryKey.MaximumLength = sizeof(ServicesKeyName) + 
ServiceName->Length;
+        RegistryKey.Buffer = ExAllocatePool(PagedPool, 
RegistryKey.MaximumLength);
+        if (RegistryKey.Buffer == NULL)
+        {
+            return STATUS_INSUFFICIENT_RESOURCES;
+        }
+        RtlAppendUnicodeToString(&RegistryKey, ServicesKeyName);
+        RtlAppendUnicodeStringToString(&RegistryKey, ServiceName);
+    }
+    else
+    {
+        RtlInitUnicodeString(&RegistryKey, NULL);
+    }
+
+    /* Create ModuleName string */
+    if (ServiceName && ServiceName->Length > 0)
+    {
+        if (FileSystemDriver == TRUE)
+            wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME);
+        else
+            wcscpy(NameBuffer, DRIVER_ROOT_NAME);
+
+        RtlInitUnicodeString(&DriverName, NameBuffer);
+        DriverName.MaximumLength = sizeof(NameBuffer);
+
+        RtlAppendUnicodeStringToString(&DriverName, ServiceName);
+
+        DPRINT("Driver name: '%wZ'\n", &DriverName);
+    }
+    else
+        DriverName.Length = 0;
+
+    Status = IopCreateDriver(DriverName.Length > 0 ? &DriverName : NULL,
+                             DriverEntry,
+                             &RegistryKey,
+                             ServiceName,
+                             ModuleObject,
+                             &Driver);
+    RtlFreeUnicodeString(&RegistryKey);
+
+    *DriverObject = Driver;
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("IopCreateDriver() failed (Status 0x%08lx)\n", Status);
+        return Status;
+    }
+
+    MmFreeDriverInitialization((PLDR_DATA_TABLE_ENTRY)Driver->DriverSection);
+
+    /* Set the driver as initialized */
+    IopReadyDeviceObjects(Driver);
+
+    if (PnpSystemInit) IopReinitializeDrivers();
+
+    return STATUS_SUCCESS;
 }
 
 /*
@@ -535,64 +531,67 @@
  *
  * Internal routine used by IopAttachFilterDrivers.
  */
-
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 IopAttachFilterDriversCallback(
-   PWSTR ValueName,
-   ULONG ValueType,
-   PVOID ValueData,
-   ULONG ValueLength,
-   PVOID Context,
-   PVOID EntryContext)
-{
-   PDEVICE_NODE DeviceNode = Context;
-   UNICODE_STRING ServiceName;
-   PWCHAR Filters;
-   PLDR_DATA_TABLE_ENTRY ModuleObject;
-   PDRIVER_OBJECT DriverObject;
-   NTSTATUS Status;
-
-   /* No filter value present */
-   if (ValueType == REG_NONE)
-       return STATUS_SUCCESS;
-
-   for (Filters = ValueData;
-        ((ULONG_PTR)Filters - (ULONG_PTR)ValueData) < ValueLength &&
-        *Filters != 0;
-        Filters += (ServiceName.Length / sizeof(WCHAR)) + 1)
-   {
-      DPRINT("Filter Driver: %S (%wZ)\n", Filters, &DeviceNode->InstancePath);
-
-      ServiceName.Buffer = Filters;
-      ServiceName.MaximumLength =
-      ServiceName.Length = (USHORT)wcslen(Filters) * sizeof(WCHAR);
-
-       Status = IopGetDriverObject(&DriverObject,
-                                   &ServiceName,
-                                   FALSE);
-       if (!NT_SUCCESS(Status))
-       {
-           /* Load and initialize the filter driver */
-           Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
-           if (!NT_SUCCESS(Status))
-               return Status;
-
-           Status = IopInitializeDriverModule(DeviceNode, ModuleObject, 
&ServiceName,
-                                              FALSE, &DriverObject);
-           if (!NT_SUCCESS(Status))
-               return Status;
-       }
-
-       Status = IopInitializeDevice(DeviceNode, DriverObject);
-
-       /* Remove extra reference */
-       ObDereferenceObject(DriverObject);
-
-       if (!NT_SUCCESS(Status))
-           return Status;
-   }
-
-   return STATUS_SUCCESS;
+    PWSTR ValueName,
+    ULONG ValueType,
+    PVOID ValueData,
+    ULONG ValueLength,
+    PVOID Context,
+    PVOID EntryContext)
+{
+    PDEVICE_NODE DeviceNode = Context;
+    UNICODE_STRING ServiceName;
+    PWCHAR Filters;
+    PLDR_DATA_TABLE_ENTRY ModuleObject;
+    PDRIVER_OBJECT DriverObject;
+    NTSTATUS Status;
+
+    /* No filter value present */
+    if (ValueType == REG_NONE)
+        return STATUS_SUCCESS;
+
+    for (Filters = ValueData;
+         ((ULONG_PTR)Filters - (ULONG_PTR)ValueData) < ValueLength &&
+         *Filters != 0;
+         Filters += (ServiceName.Length / sizeof(WCHAR)) + 1)
+    {
+        DPRINT("Filter Driver: %S (%wZ)\n", Filters, 
&DeviceNode->InstancePath);
+
+        ServiceName.Buffer = Filters;
+        ServiceName.MaximumLength =
+        ServiceName.Length = (USHORT)wcslen(Filters) * sizeof(WCHAR);
+
+        Status = IopGetDriverObject(&DriverObject,
+                                    &ServiceName,
+                                    FALSE);
+        if (!NT_SUCCESS(Status))
+        {
+            /* Load and initialize the filter driver */
+            Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
+            if (!NT_SUCCESS(Status))
+                return Status;
+
+            Status = IopInitializeDriverModule(DeviceNode,
+                                               ModuleObject,
+                                               &ServiceName,
+                                               FALSE,
+                                               &DriverObject);
+            if (!NT_SUCCESS(Status))
+                return Status;
+        }
+
+        Status = IopInitializeDevice(DeviceNode, DriverObject);
+
+        /* Remove extra reference */
+        ObDereferenceObject(DriverObject);
+
+        if (!NT_SUCCESS(Status))
+            return Status;
+    }
+
+    return STATUS_SUCCESS;
 }
 
 /*
@@ -605,143 +604,148 @@
  *       Set to TRUE for loading lower level filters or FALSE for upper
  *       level filters.
  */
-
-NTSTATUS FASTCALL
+NTSTATUS
+FASTCALL
 IopAttachFilterDrivers(
-   PDEVICE_NODE DeviceNode,
-   BOOLEAN Lower)
-{
-   RTL_QUERY_REGISTRY_TABLE QueryTable[2] = { { NULL, 0, NULL, NULL, 0, NULL, 
0 }, };
-   UNICODE_STRING Class;
-   WCHAR ClassBuffer[40];
-   UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT);
-   HANDLE EnumRootKey, SubKey;
-   NTSTATUS Status;
-
-   /* Open enumeration root key */
-   Status = IopOpenRegistryKeyEx(&EnumRootKey, NULL,
-       &EnumRoot, KEY_READ);
-   if (!NT_SUCCESS(Status))
-   {
-       DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
-       return Status;
-   }
-
-   /* Open subkey */
-   Status = IopOpenRegistryKeyEx(&SubKey, EnumRootKey,
-       &DeviceNode->InstancePath, KEY_READ);
-   if (!NT_SUCCESS(Status))
-   {
-       DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
-       ZwClose(EnumRootKey);
-       return Status;
-   }
-
-   /*
-    * First load the device filters
-    */
-   QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback;
-   if (Lower)
-     QueryTable[0].Name = L"LowerFilters";
-   else
-     QueryTable[0].Name = L"UpperFilters";
-   QueryTable[0].Flags = 0;
-   QueryTable[0].DefaultType = REG_NONE;
-
-   Status = RtlQueryRegistryValues(
-      RTL_REGISTRY_HANDLE,
-      (PWSTR)SubKey,
-      QueryTable,
-      DeviceNode,
-      NULL);
-   if (!NT_SUCCESS(Status))
-   {
-       DPRINT1("Failed to load device %s filters: %08X\n",
-         Lower ? "lower" : "upper", Status);
-       ZwClose(SubKey);
-       ZwClose(EnumRootKey);
-       return Status;
-   }
-
-   /*
-    * Now get the class GUID
-    */
-   Class.Length = 0;
-   Class.MaximumLength = 40 * sizeof(WCHAR);
-   Class.Buffer = ClassBuffer;
-   QueryTable[0].QueryRoutine = NULL;
-   QueryTable[0].Name = L"ClassGUID";
-   QueryTable[0].EntryContext = &Class;
-   QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | 
RTL_QUERY_REGISTRY_DIRECT;
-
-   Status = RtlQueryRegistryValues(
-      RTL_REGISTRY_HANDLE,
-      (PWSTR)SubKey,
-      QueryTable,
-      DeviceNode,
-      NULL);
-
-   /* Close handles */
-   ZwClose(SubKey);
-   ZwClose(EnumRootKey);
-
-   /*
-    * Load the class filter driver
-    */
-   if (NT_SUCCESS(Status))
-   {
-       UNICODE_STRING ControlClass = 
RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class");
-
-       Status = IopOpenRegistryKeyEx(&EnumRootKey, NULL,
-           &ControlClass, KEY_READ);
-       if (!NT_SUCCESS(Status))
-       {
-           DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
-           return Status;
-       }
-
-       /* Open subkey */
-       Status = IopOpenRegistryKeyEx(&SubKey, EnumRootKey,
-           &Class, KEY_READ);
-       if (!NT_SUCCESS(Status))
-       {
-           /* It's okay if there's no class key */
-           DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
-           ZwClose(EnumRootKey);
-           return STATUS_SUCCESS;
-       }
-
-      QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback;
-      if (Lower)
-         QueryTable[0].Name = L"LowerFilters";
-      else
-         QueryTable[0].Name = L"UpperFilters";
-      QueryTable[0].EntryContext = NULL;
-      QueryTable[0].Flags = 0;
-      QueryTable[0].DefaultType = REG_NONE;
-
-      Status = RtlQueryRegistryValues(
-         RTL_REGISTRY_HANDLE,
-         (PWSTR)SubKey,
-         QueryTable,
-         DeviceNode,
-         NULL);
-
-      /* Clean up */
-      ZwClose(SubKey);
-      ZwClose(EnumRootKey);
-
-      if (!NT_SUCCESS(Status))
-      {
-         DPRINT1("Failed to load class %s filters: %08X\n",
-            Lower ? "lower" : "upper", Status);
-         ZwClose(SubKey);
-         ZwClose(EnumRootKey);
-         return Status;
-      }
-   }
-
-   return STATUS_SUCCESS;
+    PDEVICE_NODE DeviceNode,
+    BOOLEAN Lower)
+{
+    RTL_QUERY_REGISTRY_TABLE QueryTable[2] = { { NULL, 0, NULL, NULL, 0, NULL, 
0 }, };
+    UNICODE_STRING Class;
+    WCHAR ClassBuffer[40];
+    UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT);
+    HANDLE EnumRootKey, SubKey;
+    NTSTATUS Status;
+
+    /* Open enumeration root key */
+    Status = IopOpenRegistryKeyEx(&EnumRootKey,
+                                  NULL,
+                                  &EnumRoot,
+                                  KEY_READ);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
+        return Status;
+    }
+
+    /* Open subkey */
+    Status = IopOpenRegistryKeyEx(&SubKey,
+                                  EnumRootKey,
+                                  &DeviceNode->InstancePath,
+                                  KEY_READ);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
+        ZwClose(EnumRootKey);
+        return Status;
+    }
+
+    /*
+     * First load the device filters
+     */
+    QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback;
+    if (Lower)
+        QueryTable[0].Name = L"LowerFilters";
+    else
+        QueryTable[0].Name = L"UpperFilters";
+    QueryTable[0].Flags = 0;
+    QueryTable[0].DefaultType = REG_NONE;
+
+    Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
+                                    (PWSTR)SubKey,
+                                    QueryTable,
+                                    DeviceNode,
+                                    NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed to load device %s filters: %08X\n",
+                Lower ? "lower" : "upper", Status);
+        ZwClose(SubKey);
+        ZwClose(EnumRootKey);
+        return Status;
+    }
+
+    /*
+     * Now get the class GUID
+     */
+    Class.Length = 0;
+    Class.MaximumLength = 40 * sizeof(WCHAR);
+    Class.Buffer = ClassBuffer;
+    QueryTable[0].QueryRoutine = NULL;
+    QueryTable[0].Name = L"ClassGUID";
+    QueryTable[0].EntryContext = &Class;
+    QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | 
RTL_QUERY_REGISTRY_DIRECT;
+
+    Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
+                                    (PWSTR)SubKey,
+                                    QueryTable,
+                                    DeviceNode,
+                                    NULL);
+
+    /* Close handles */
+    ZwClose(SubKey);
+    ZwClose(EnumRootKey);
+
+    /*
+     * Load the class filter driver
+     */
+    if (NT_SUCCESS(Status))
+    {
+        UNICODE_STRING ControlClass = 
RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class");
+
+        Status = IopOpenRegistryKeyEx(&EnumRootKey,
+                                      NULL,
+                                      &ControlClass,
+                                      KEY_READ);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
+            return Status;
+        }
+
+        /* Open subkey */
+        Status = IopOpenRegistryKeyEx(&SubKey,
+                                      EnumRootKey,
+                                      &Class,
+                                      KEY_READ);
+        if (!NT_SUCCESS(Status))
+        {
+            /* It's okay if there's no class key */
+            DPRINT1("ZwOpenKey() failed with Status %08X\n", Status);
+            ZwClose(EnumRootKey);
+            return STATUS_SUCCESS;
+        }
+
+        QueryTable[0].QueryRoutine = IopAttachFilterDriversCallback;
+        if (Lower)
+            QueryTable[0].Name = L"LowerFilters";
+        else
+            QueryTable[0].Name = L"UpperFilters";
+        QueryTable[0].EntryContext = NULL;
+        QueryTable[0].Flags = 0;
+        QueryTable[0].DefaultType = REG_NONE;
+
+        Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
+                                        (PWSTR)SubKey,
+                                        QueryTable,
+                                        DeviceNode,
+                                        NULL);
+
+        /* Clean up */
+        ZwClose(SubKey);
+        ZwClose(EnumRootKey);
+
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("Failed to load class %s filters: %08X\n",
+                    Lower ? "lower" : "upper", Status);
+            ZwClose(SubKey);
+            ZwClose(EnumRootKey);
+            return Status;
+        }
+    }
+
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
@@ -836,7 +840,6 @@
  *
  * Initialize a driver that is already loaded in memory.
  */
-
 NTSTATUS
 NTAPI
 INIT_FUNCTION
@@ -852,85 +855,91 @@
     PLIST_ENTRY NextEntry;
     UNICODE_STRING ServiceName;
 
-   /*
-    * Display 'Loading XXX...' message
-    */
-   IopDisplayLoadingMessage(ModuleName);
-   InbvIndicateProgress();
-
-   /*
-    * Generate filename without path (not needed by freeldr)
-    */
-   FileNameWithoutPath = wcsrchr(ModuleName->Buffer, L'\\');
-   if (FileNameWithoutPath == NULL)
-   {
-      FileNameWithoutPath = ModuleName->Buffer;
-   }
-   else
-   {
-      FileNameWithoutPath++;
-   }
-
-   /*
-    * Strip the file extension from ServiceName
-    */
-   RtlCreateUnicodeString(&ServiceName, FileNameWithoutPath);
-   FileExtension = wcsrchr(ServiceName.Buffer, '.');
-   if (FileExtension != NULL)
-   {
-      ServiceName.Length -= (USHORT)wcslen(FileExtension) * sizeof(WCHAR);
-      FileExtension[0] = 0;
-   }
-
-   /*
-    * Determine the right device object
-    */
-   /* Use IopRootDeviceNode for now */
-   Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &ServiceName, 
&DeviceNode);
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT1("Driver '%wZ' load failed, status (%x)\n", ModuleName, Status);
-      return(Status);
-   }
-
-   /* Lookup the new Ldr entry in PsLoadedModuleList */
-   NextEntry = PsLoadedModuleList.Flink;
-   while (NextEntry != &PsLoadedModuleList)
-   {
-      LdrEntry = CONTAINING_RECORD(NextEntry,
-                                   LDR_DATA_TABLE_ENTRY,
-                                   InLoadOrderLinks);
-      if (RtlEqualUnicodeString(ModuleName, &LdrEntry->BaseDllName, TRUE))
-      {
-            break;
-      }
-
-      NextEntry = NextEntry->Flink;
-   }
-   NT_ASSERT(NextEntry != &PsLoadedModuleList);
-
-   /*
-    * Initialize the driver
-    */
-   Status = IopInitializeDriverModule(DeviceNode, LdrEntry,
-      &DeviceNode->ServiceName, FALSE, &DriverObject);
-
-   if (!NT_SUCCESS(Status))
-   {
-      IopFreeDeviceNode(DeviceNode);
-      return Status;
-   }
-
-   Status = IopInitializeDevice(DeviceNode, DriverObject);
-   if (NT_SUCCESS(Status))
-   {
-      Status = IopStartDevice(DeviceNode);
-   }
-
-   /* Remove extra reference from IopInitializeDriverModule */
-   ObDereferenceObject(DriverObject);
-
-   return Status;
+    /*
+     * Display 'Loading XXX...' message
+     */
+    IopDisplayLoadingMessage(ModuleName);
+    InbvIndicateProgress();
+
+    /*
+     * Generate filename without path (not needed by freeldr)
+     */
+    FileNameWithoutPath = wcsrchr(ModuleName->Buffer, L'\\');
+    if (FileNameWithoutPath == NULL)
+    {
+        FileNameWithoutPath = ModuleName->Buffer;
+    }
+    else
+    {
+        FileNameWithoutPath++;
+    }
+
+    /*
+     * Strip the file extension from ServiceName
+     */
+    RtlCreateUnicodeString(&ServiceName, FileNameWithoutPath);
+    FileExtension = wcsrchr(ServiceName.Buffer, '.');
+    if (FileExtension != NULL)
+    {
+        ServiceName.Length -= (USHORT)wcslen(FileExtension) * sizeof(WCHAR);
+        FileExtension[0] = 0;
+    }
+
+    /*
+     * Determine the right device object
+     */
+    /* Use IopRootDeviceNode for now */
+    Status = IopCreateDeviceNode(IopRootDeviceNode,
+                                 NULL,
+                                 &ServiceName,
+                                 &DeviceNode);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Driver '%wZ' load failed, status (%x)\n", ModuleName, Status);
+        return(Status);
+    }
+
+    /* Lookup the new Ldr entry in PsLoadedModuleList */
+    NextEntry = PsLoadedModuleList.Flink;
+    while (NextEntry != &PsLoadedModuleList)
+    {
+        LdrEntry = CONTAINING_RECORD(NextEntry,
+                                     LDR_DATA_TABLE_ENTRY,
+                                     InLoadOrderLinks);
+        if (RtlEqualUnicodeString(ModuleName, &LdrEntry->BaseDllName, TRUE))
+        {
+                break;
+        }
+
+        NextEntry = NextEntry->Flink;
+    }
+    NT_ASSERT(NextEntry != &PsLoadedModuleList);
+
+    /*
+     * Initialize the driver
+     */
+    Status = IopInitializeDriverModule(DeviceNode,
+                                       LdrEntry,
+                                       &DeviceNode->ServiceName,
+                                       FALSE,
+                                       &DriverObject);
+
+    if (!NT_SUCCESS(Status))
+    {
+        IopFreeDeviceNode(DeviceNode);
+        return Status;
+    }
+
+    Status = IopInitializeDevice(DeviceNode, DriverObject);
+    if (NT_SUCCESS(Status))
+    {
+        Status = IopStartDevice(DeviceNode);
+    }
+
+    /* Remove extra reference from IopInitializeDriverModule */
+    ObDereferenceObject(DriverObject);
+
+    return Status;
 }
 
 /*
@@ -1195,204 +1204,180 @@
 NTSTATUS NTAPI
 IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers)
 {
-   RTL_QUERY_REGISTRY_TABLE QueryTable[2];
-   UNICODE_STRING ImagePath;
-   UNICODE_STRING ServiceName;
-   UNICODE_STRING ObjectName;
-   PDRIVER_OBJECT DriverObject;
-   PDEVICE_OBJECT DeviceObject;
-   PEXTENDED_DEVOBJ_EXTENSION DeviceExtension;
-   LOAD_UNLOAD_PARAMS LoadParams;
-   NTSTATUS Status;
-   LPWSTR Start;
-   BOOLEAN SafeToUnload = TRUE;
-
-   DPRINT("IopUnloadDriver('%wZ', %u)\n", DriverServiceName, UnloadPnpDrivers);
-
-   PAGED_CODE();
-
-   /*
-    * Get the service name from the registry key name
-    */
-
-   Start = wcsrchr(DriverServiceName->Buffer, L'\\');
-   if (Start == NULL)
-      Start = DriverServiceName->Buffer;
-   else
-      Start++;
-
-   RtlInitUnicodeString(&ServiceName, Start);
-
-   /*
-    * Construct the driver object name
-    */
-
-   ObjectName.Length = ((USHORT)wcslen(Start) + 8) * sizeof(WCHAR);
-   ObjectName.MaximumLength = ObjectName.Length + sizeof(WCHAR);
-   ObjectName.Buffer = ExAllocatePool(PagedPool, ObjectName.MaximumLength);
-   if (!ObjectName.Buffer) return STATUS_INSUFFICIENT_RESOURCES;
-   wcscpy(ObjectName.Buffer, DRIVER_ROOT_NAME);
-   memcpy(ObjectName.Buffer + 8, Start, ObjectName.Length - 8 * sizeof(WCHAR));
-   ObjectName.Buffer[ObjectName.Length/sizeof(WCHAR)] = 0;
-
-   /*
-    * Find the driver object
-    */
-   Status = ObReferenceObjectByName(&ObjectName,
-                                    0,
-                                    0,
-                                    0,
-                                    IoDriverObjectType,
-                                    KernelMode,
-                                    0,
-                                    (PVOID*)&DriverObject);
-
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT1("Can't locate driver object for %wZ\n", &ObjectName);
-      ExFreePool(ObjectName.Buffer);
-      return Status;
-   }
-
-   /*
-    * Free the buffer for driver object name
-    */
-   ExFreePool(ObjectName.Buffer);
-
-   /* Check that driver is not already unloading */
-   if (DriverObject->Flags & DRVO_UNLOAD_INVOKED)
-   {
-       DPRINT1("Driver deletion pending\n");
-       ObDereferenceObject(DriverObject);
-       return STATUS_DELETE_PENDING;
-   }
-
-   /*
-    * Get path of service...
-    */
-
-   RtlZeroMemory(QueryTable, sizeof(QueryTable));
-
-   RtlInitUnicodeString(&ImagePath, NULL);
-
-   QueryTable[0].Name = L"ImagePath";
-   QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
-   QueryTable[0].EntryContext = &ImagePath;
-
-   Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
-       DriverServiceName->Buffer, QueryTable, NULL, NULL);
-
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT1("RtlQueryRegistryValues() failed (Status %x)\n", Status);
-      ObDereferenceObject(DriverObject);
-      return Status;
-   }
-
-   /*
-    * Normalize the image path for all later processing.
-    */
-
-   Status = IopNormalizeImagePath(&ImagePath, &ServiceName);
-
-   if (!NT_SUCCESS(Status))
-   {
-      DPRINT1("IopNormalizeImagePath() failed (Status %x)\n", Status);
-      ObDereferenceObject(DriverObject);
-      return Status;
-   }
-
-   /*
-    * Free the service path
-    */
-
-   ExFreePool(ImagePath.Buffer);
-
-   /*
-    * Unload the module and release the references to the device object
-    */
+    RTL_QUERY_REGISTRY_TABLE QueryTable[2];
+    UNICODE_STRING ImagePath;
+    UNICODE_STRING ServiceName;
+    UNICODE_STRING ObjectName;
+    PDRIVER_OBJECT DriverObject;
+    PDEVICE_OBJECT DeviceObject;
+    PEXTENDED_DEVOBJ_EXTENSION DeviceExtension;
+    NTSTATUS Status;
+    LPWSTR Start;
+    BOOLEAN SafeToUnload = TRUE;
+
+    DPRINT("IopUnloadDriver('%wZ', %u)\n", DriverServiceName, 
UnloadPnpDrivers);
+
+    PAGED_CODE();
+
+    /*
+     * Get the service name from the registry key name
+     */
+
+    Start = wcsrchr(DriverServiceName->Buffer, L'\\');
+    if (Start == NULL)
+        Start = DriverServiceName->Buffer;
+    else
+        Start++;
+
+    RtlInitUnicodeString(&ServiceName, Start);
+
+    /*
+     * Construct the driver object name
+     */
+
+    ObjectName.Length = ((USHORT)wcslen(Start) + 8) * sizeof(WCHAR);
+    ObjectName.MaximumLength = ObjectName.Length + sizeof(WCHAR);
+    ObjectName.Buffer = ExAllocatePool(PagedPool, ObjectName.MaximumLength);
+    if (!ObjectName.Buffer) return STATUS_INSUFFICIENT_RESOURCES;
+    wcscpy(ObjectName.Buffer, DRIVER_ROOT_NAME);
+    memcpy(ObjectName.Buffer + 8, Start, ObjectName.Length - 8 * 
sizeof(WCHAR));
+    ObjectName.Buffer[ObjectName.Length/sizeof(WCHAR)] = 0;
+
+    /*
+     * Find the driver object
+     */
+    Status = ObReferenceObjectByName(&ObjectName,
+                                     0,
+                                     0,
+                                     0,
+                                     IoDriverObjectType,
+                                     KernelMode,
+                                     0,
+                                     (PVOID*)&DriverObject);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Can't locate driver object for %wZ\n", &ObjectName);
+        ExFreePool(ObjectName.Buffer);
+        return Status;
+    }
+
+    /*
+     * Free the buffer for driver object name
+     */
+    ExFreePool(ObjectName.Buffer);
+
+    /* Check that driver is not already unloading */
+    if (DriverObject->Flags & DRVO_UNLOAD_INVOKED)
+    {
+        DPRINT1("Driver deletion pending\n");
+        ObDereferenceObject(DriverObject);
+        return STATUS_DELETE_PENDING;
+    }
+
+    /*
+     * Get path of service...
+     */
+    RtlZeroMemory(QueryTable, sizeof(QueryTable));
+
+    RtlInitUnicodeString(&ImagePath, NULL);
+
+    QueryTable[0].Name = L"ImagePath";
+    QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
+    QueryTable[0].EntryContext = &ImagePath;
+
+    Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
+                                    DriverServiceName->Buffer,
+                                    QueryTable,
+                                    NULL,
+                                    NULL);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("RtlQueryRegistryValues() failed (Status %x)\n", Status);
+        ObDereferenceObject(DriverObject);
+        return Status;
+    }
+
+    /*
+     * Normalize the image path for all later processing.
+     */
+    Status = IopNormalizeImagePath(&ImagePath, &ServiceName);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("IopNormalizeImagePath() failed (Status %x)\n", Status);
+        ObDereferenceObject(DriverObject);
+        return Status;
+    }
+
+    /*
+     * Free the service path
+     */
+    ExFreePool(ImagePath.Buffer);
+
+    /*
+     * Unload the module and release the references to the device object
+     */
 
     /* Call the load/unload routine, depending on current process */
-   if (DriverObject->DriverUnload && DriverObject->DriverSection &&
-       (UnloadPnpDrivers || (DriverObject->Flags & DRVO_LEGACY_DRIVER)))
-   {
-      /* Loop through each device object of the driver
-         and set DOE_UNLOAD_PENDING flag */
-      DeviceObject = DriverObject->DeviceObject;
-      while (DeviceObject)
-      {
-         /* Set the unload pending flag for the device */
-         DeviceExtension = IoGetDevObjExtension(DeviceObject);
-         DeviceExtension->ExtensionFlags |= DOE_UNLOAD_PENDING;
-
-         /* Make sure there are no attached devices or no reference counts */
-         if ((DeviceObject->ReferenceCount) || (DeviceObject->AttachedDevice))
-         {
-            /* Not safe to unload */
-            DPRINT1("Drivers device object is referenced or has attached 
devices\n");
-
-            SafeToUnload = FALSE;
-         }
-
-         DeviceObject = DeviceObject->NextDevice;
-      }
-
-      /* If not safe to unload, then return success */
-      if (!SafeToUnload)
-      {
-         ObDereferenceObject(DriverObject);
-         return STATUS_SUCCESS;
-      }
-
-      DPRINT1("Unloading driver '%wZ' (manual)\n", &DriverObject->DriverName);
-
-      /* Set the unload invoked flag */
-      DriverObject->Flags |= DRVO_UNLOAD_INVOKED;
-
-      if (PsGetCurrentProcess() == PsInitialSystemProcess)
-      {
-         /* Just call right away */
-         (*DriverObject->DriverUnload)(DriverObject);
-      }
-      else
-      {
-         /* Load/Unload must be called from system process */
-
-         /* Prepare parameters block */
-         LoadParams.DriverObject = DriverObject;
-         KeInitializeEvent(&LoadParams.Event, NotificationEvent, FALSE);
-
-         ExInitializeWorkItem(&LoadParams.WorkItem,
-             (PWORKER_THREAD_ROUTINE)IopLoadUnloadDriver,
-             (PVOID)&LoadParams);
-
-         /* Queue it */
-         ExQueueWorkItem(&LoadParams.WorkItem, DelayedWorkQueue);
-
-         /* And wait when it completes */
-         KeWaitForSingleObject(&LoadParams.Event, UserRequest, KernelMode,
-             FALSE, NULL);
-      }
-
-      /* Mark the driver object temporary, so it could be deleted later */
-      ObMakeTemporaryObject(DriverObject);
-
-      /* Dereference it 2 times */
-      ObDereferenceObject(DriverObject);
-      ObDereferenceObject(DriverObject);
-
-      return STATUS_SUCCESS;
-   }
-   else
-   {
-      DPRINT1("No DriverUnload function! '%wZ' will not be unloaded!\n", 
&DriverObject->DriverName);
-
-      /* Dereference one time (refd inside this function) */
-      ObDereferenceObject(DriverObject);
-
-      /* Return unloading failure */
-      return STATUS_INVALID_DEVICE_REQUEST;
-   }
+    if (DriverObject->DriverUnload && DriverObject->DriverSection &&
+        (UnloadPnpDrivers || (DriverObject->Flags & DRVO_LEGACY_DRIVER)))
+    {
+        /* Loop through each device object of the driver
+           and set DOE_UNLOAD_PENDING flag */
+        DeviceObject = DriverObject->DeviceObject;
+        while (DeviceObject)
+        {
+            /* Set the unload pending flag for the device */
+            DeviceExtension = IoGetDevObjExtension(DeviceObject);
+            DeviceExtension->ExtensionFlags |= DOE_UNLOAD_PENDING;
+
+            /* Make sure there are no attached devices or no reference counts 
*/
+            if ((DeviceObject->ReferenceCount) || 
(DeviceObject->AttachedDevice))
+            {
+                /* Not safe to unload */
+                DPRINT1("Drivers device object is referenced or has attached 
devices\n");
+
+                SafeToUnload = FALSE;
+            }
+
+            DeviceObject = DeviceObject->NextDevice;
+        }
+
+        /* If not safe to unload, then return success */
+        if (!SafeToUnload)
+        {
+            ObDereferenceObject(DriverObject);
+            return STATUS_SUCCESS;
+        }
+
+        DPRINT1("Unloading driver '%wZ' (manual)\n", 
&DriverObject->DriverName);
+
+        /* Set the unload invoked flag and call the unload routine */
+        DriverObject->Flags |= DRVO_UNLOAD_INVOKED;
+        Status = IopLoadUnloadDriver(NULL, &DriverObject);
+        NT_ASSERT(Status == STATUS_SUCCESS);
+
+        /* Mark the driver object temporary, so it could be deleted later */
+        ObMakeTemporaryObject(DriverObject);
+
+        /* Dereference it 2 times */
+        ObDereferenceObject(DriverObject);
+        ObDereferenceObject(DriverObject);
+
+        return Status;
+    }
+    else
+    {
+        DPRINT1("No DriverUnload function! '%wZ' will not be unloaded!\n", 
&DriverObject->DriverName);
+
+        /* Dereference one time (refd inside this function) */
+        ObDereferenceObject(DriverObject);
+
+        /* Return unloading failure */
+        return STATUS_INVALID_DEVICE_REQUEST;
+    }
 }
 
 VOID
@@ -1676,8 +1661,8 @@
 IoCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL,
                IN PDRIVER_INITIALIZE InitializationFunction)
 {
-   PDRIVER_OBJECT DriverObject;
-   return IopCreateDriver(DriverName, InitializationFunction, NULL, 
DriverName, NULL, &DriverObject);
+    PDRIVER_OBJECT DriverObject;
+    return IopCreateDriver(DriverName, InitializationFunction, NULL, 
DriverName, NULL, &DriverObject);
 }
 
 /*
@@ -1865,8 +1850,24 @@
     return DriverExtensions + 1;
 }
 
-VOID NTAPI
-IopLoadUnloadDriver(PLOAD_UNLOAD_PARAMS LoadParams)
+VOID
+NTAPI
+IopLoadUnloadDriverWorker(
+    _Inout_ PVOID Parameter)
+{
+    PLOAD_UNLOAD_PARAMS LoadParams = Parameter;
+
+    NT_ASSERT(PsGetCurrentProcess() == PsInitialSystemProcess);
+    LoadParams->Status = IopLoadUnloadDriver(LoadParams->RegistryPath,
+                                             &LoadParams->DriverObject);
+    KeSetEvent(&LoadParams->Event, 0, FALSE);
+}
+
+NTSTATUS
+NTAPI
+IopLoadUnloadDriver(
+    _In_opt_ PCUNICODE_STRING RegistryPath,
+    _Inout_ PDRIVER_OBJECT *DriverObject)
 {
     RTL_QUERY_REGISTRY_TABLE QueryTable[3];
     UNICODE_STRING ImagePath;
@@ -1874,20 +1875,40 @@
     NTSTATUS Status;
     ULONG Type;
     PDEVICE_NODE DeviceNode;
-    PDRIVER_OBJECT DriverObject;
     PLDR_DATA_TABLE_ENTRY ModuleObject;
     PVOID BaseAddress;
     WCHAR *cur;
 
+    /* Load/Unload must be called from system process */
+    if (PsGetCurrentProcess() != PsInitialSystemProcess)
+    {
+        LOAD_UNLOAD_PARAMS LoadParams;
+
+        /* Prepare parameters block */
+        LoadParams.RegistryPath = RegistryPath;
+        LoadParams.DriverObject = *DriverObject;
+        KeInitializeEvent(&LoadParams.Event, NotificationEvent, FALSE);
+
+        /* Initialize and queue a work item */
+        ExInitializeWorkItem(&LoadParams.WorkItem,
+                             IopLoadUnloadDriverWorker,
+                             &LoadParams);
+        ExQueueWorkItem(&LoadParams.WorkItem, DelayedWorkQueue);
+
+        /* And wait till it completes */
+        KeWaitForSingleObject(&LoadParams.Event,
+                              UserRequest,
+                              KernelMode,
+                              FALSE,
+                              NULL);
+        return LoadParams.Status;
+    }
+
     /* Check if it's an unload request */
-    if (LoadParams->DriverObject)
-    {
-        (*LoadParams->DriverObject->DriverUnload)(LoadParams->DriverObject);
-
-        /* Return success and signal the event */
-        LoadParams->Status = STATUS_SUCCESS;
-        KeSetEvent(&LoadParams->Event, 0, FALSE);
-        return;
+    if (*DriverObject)
+    {
+        (*DriverObject)->DriverUnload(*DriverObject);
+        return STATUS_SUCCESS;
     }
 
     RtlInitUnicodeString(&ImagePath, NULL);
@@ -1895,28 +1916,26 @@
     /*
      * Get the service name from the registry key name.
      */
-    ASSERT(LoadParams->ServiceName->Length >= sizeof(WCHAR));
-
-    ServiceName = *LoadParams->ServiceName;
-    cur = LoadParams->ServiceName->Buffer +
-         (LoadParams->ServiceName->Length / sizeof(WCHAR)) - 1;
-    while (LoadParams->ServiceName->Buffer != cur)
+    ASSERT(RegistryPath->Length >= sizeof(WCHAR));
+
+    ServiceName = *RegistryPath;
+    cur = RegistryPath->Buffer + RegistryPath->Length / sizeof(WCHAR) - 1;
+    while (RegistryPath->Buffer != cur)
     {
         if (*cur == L'\\')
         {
             ServiceName.Buffer = cur + 1;
-            ServiceName.Length = LoadParams->ServiceName->Length -
+            ServiceName.Length = RegistryPath->Length -
                                  (USHORT)((ULONG_PTR)ServiceName.Buffer -
-                                          
(ULONG_PTR)LoadParams->ServiceName->Buffer);
+                                          (ULONG_PTR)RegistryPath->Buffer);
             break;
         }
         cur--;
     }
 
     /*
-    * Get service type.
-    */
-
+     * Get service type.
+     */
     RtlZeroMemory(&QueryTable, sizeof(QueryTable));
 
     RtlInitUnicodeString(&ImagePath, NULL);
@@ -1930,28 +1949,23 @@
     QueryTable[1].EntryContext = &ImagePath;
 
     Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
-                                    LoadParams->ServiceName->Buffer,
+                                    RegistryPath->Buffer,
                                     QueryTable, NULL, NULL);
     if (!NT_SUCCESS(Status))
     {
         DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
         if (ImagePath.Buffer) ExFreePool(ImagePath.Buffer);
-        LoadParams->Status = Status;
-        KeSetEvent(&LoadParams->Event, 0, FALSE);
-        return;
-    }
-
-    /*
-    * Normalize the image path for all later processing.
-    */
-
+        return Status;
+    }
+
+    /*
+     * Normalize the image path for all later processing.
+     */
     Status = IopNormalizeImagePath(&ImagePath, &ServiceName);
     if (!NT_SUCCESS(Status))
     {
         DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status);
-        LoadParams->Status = Status;
-        KeSetEvent(&LoadParams->Event, 0, FALSE);
-        return;
+        return Status;
     }
 
     DPRINT("FullImagePath: '%wZ'\n", &ImagePath);
@@ -1961,7 +1975,7 @@
      * Get existing DriverObject pointer (in case the driver
      * has already been loaded and initialized).
      */
-    Status = IopGetDriverObject(&DriverObject,
+    Status = IopGetDriverObject(DriverObject,
                                 &ServiceName,
                                 (Type == 2 /* SERVICE_FILE_SYSTEM_DRIVER */ ||
                                  Type == 8 /* SERVICE_RECOGNIZER_DRIVER */));
@@ -1971,15 +1985,12 @@
         /*
          * Load the driver module
          */
-
         DPRINT("Loading module from %wZ\n", &ImagePath);
         Status = MmLoadSystemImage(&ImagePath, NULL, NULL, 0, 
(PVOID)&ModuleObject, &BaseAddress);
         if (!NT_SUCCESS(Status))
         {
             DPRINT("MmLoadSystemImage() failed (Status %lx)\n", Status);
-            LoadParams->Status = Status;
-            KeSetEvent(&LoadParams->Event, 0, FALSE);
-            return;
+            return Status;
         }
 
         /*
@@ -1990,9 +2001,7 @@
         {
             DPRINT1("IopCreateDeviceNode() failed (Status %lx)\n", Status);
             MmUnloadSystemImage(ModuleObject);
-            LoadParams->Status = Status;
-            KeSetEvent(&LoadParams->Event, 0, FALSE);
-            return;
+            return Status;
         }
 
         IopDisplayLoadingMessage(&DeviceNode->ServiceName);
@@ -2002,19 +2011,17 @@
                                            &DeviceNode->ServiceName,
                                            (Type == 2 /* 
SERVICE_FILE_SYSTEM_DRIVER */ ||
                                             Type == 8 /* 
SERVICE_RECOGNIZER_DRIVER */),
-                                           &DriverObject);
+                                           DriverObject);
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("IopInitializeDriverModule() failed (Status %lx)\n", 
Status);
             MmUnloadSystemImage(ModuleObject);
             IopFreeDeviceNode(DeviceNode);
-            LoadParams->Status = Status;
-            KeSetEvent(&LoadParams->Event, 0, FALSE);
-            return;
+            return Status;
         }
 
         /* Initialize and start device */
-        IopInitializeDevice(DeviceNode, DriverObject);
+        IopInitializeDevice(DeviceNode, *DriverObject);
         Status = IopStartDevice(DeviceNode);
     }
     else
@@ -2023,12 +2030,10 @@
         Status = STATUS_IMAGE_ALREADY_LOADED;
 
         /* IopGetDriverObject references the DriverObject, so dereference it */
-        ObDereferenceObject(DriverObject);
-    }
-
-    /* Pass status to the caller and signal the event */
-    LoadParams->Status = Status;
-    KeSetEvent(&LoadParams->Event, 0, FALSE);
+        ObDereferenceObject(*DriverObject);
+    }
+
+    return Status;
 }
 
 /*
@@ -2051,7 +2056,7 @@
 {
     UNICODE_STRING CapturedDriverServiceName = { 0, 0, NULL };
     KPROCESSOR_MODE PreviousMode;
-    LOAD_UNLOAD_PARAMS LoadParams;
+    PDRIVER_OBJECT DriverObject;
     NTSTATUS Status;
 
     PAGED_CODE();
@@ -2081,35 +2086,14 @@
 
     DPRINT("NtLoadDriver('%wZ')\n", &CapturedDriverServiceName);
 
-    LoadParams.ServiceName = &CapturedDriverServiceName;
-    LoadParams.DriverObject = NULL;
-    KeInitializeEvent(&LoadParams.Event, NotificationEvent, FALSE);
-
-    /* Call the load/unload routine, depending on current process */
-    if (PsGetCurrentProcess() == PsInitialSystemProcess)
-    {
-        /* Just call right away */
-        IopLoadUnloadDriver(&LoadParams);
-    }
-    else
-    {
-        /* Load/Unload must be called from system process */
-        ExInitializeWorkItem(&LoadParams.WorkItem,
-                             (PWORKER_THREAD_ROUTINE)IopLoadUnloadDriver,
-                             (PVOID)&LoadParams);
-
-        /* Queue it */
-        ExQueueWorkItem(&LoadParams.WorkItem, DelayedWorkQueue);
-
-        /* And wait when it completes */
-        KeWaitForSingleObject(&LoadParams.Event, UserRequest, KernelMode,
-            FALSE, NULL);
-    }
+    /* Load driver and call its entry point */
+    DriverObject = NULL;
+    Status = IopLoadUnloadDriver(&CapturedDriverServiceName, &DriverObject);
 
     ReleaseCapturedUnicodeString(&CapturedDriverServiceName,
                                  PreviousMode);
 
-    return LoadParams.Status;
+    return Status;
 }
 
 /*
@@ -2131,7 +2115,7 @@
 NTSTATUS NTAPI
 NtUnloadDriver(IN PUNICODE_STRING DriverServiceName)
 {
-   return IopUnloadDriver(DriverServiceName, FALSE);
+    return IopUnloadDriver(DriverServiceName, FALSE);
 }
 
 /* EOF */

Modified: branches/shell-experiments/subsystems/ntvdm/io.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/subsystems/ntvdm/io.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/subsystems/ntvdm/io.c    [iso-8859-1] (original)
+++ branches/shell-experiments/subsystems/ntvdm/io.c    [iso-8859-1] Thu Oct 23 
19:52:45 2014
@@ -70,7 +70,7 @@
     {
         UCHAR Data;
         ASSERT(Port <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.inb_handler((WORD)Port, &Data);
+        IoPortProc[Port].VddIoHandlers.inb_handler(Port, &Data);
         return Data;
     }
     else
@@ -82,7 +82,7 @@
 }
 
 VOID
-IOReadStrB(USHORT  Port,
+IOReadStrB(USHORT Port,
            PUCHAR Buffer,
            ULONG  Count)
 {
@@ -96,7 +96,7 @@
     {
         ASSERT(Port  <= MAXWORD);
         ASSERT(Count <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.insb_handler((WORD)Port, Buffer, 
(WORD)Count);
+        IoPortProc[Port].VddIoHandlers.insb_handler(Port, Buffer, (WORD)Count);
     }
     else
     {
@@ -106,7 +106,7 @@
 
 VOID
 IOWriteB(USHORT Port,
-         UCHAR Buffer)
+         UCHAR  Buffer)
 {
     if (IoPortProc[Port].hVdd == INVALID_HANDLE_VALUE &&
         IoPortProc[Port].IoHandlers.OutB)
@@ -117,7 +117,7 @@
              IoPortProc[Port].VddIoHandlers.outb_handler)
     {
         ASSERT(Port <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.outb_handler((WORD)Port, Buffer);
+        IoPortProc[Port].VddIoHandlers.outb_handler(Port, Buffer);
     }
     else
     {
@@ -127,7 +127,7 @@
 }
 
 VOID
-IOWriteStrB(USHORT  Port,
+IOWriteStrB(USHORT Port,
             PUCHAR Buffer,
             ULONG  Count)
 {
@@ -141,7 +141,7 @@
     {
         ASSERT(Port  <= MAXWORD);
         ASSERT(Count <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.outsb_handler((WORD)Port, Buffer, 
(WORD)Count);
+        IoPortProc[Port].VddIoHandlers.outsb_handler(Port, Buffer, 
(WORD)Count);
     }
     else
     {
@@ -162,7 +162,7 @@
     {
         USHORT Data;
         ASSERT(Port <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.inw_handler((WORD)Port, &Data);
+        IoPortProc[Port].VddIoHandlers.inw_handler(Port, &Data);
         return Data;
     }
     else
@@ -177,7 +177,7 @@
 }
 
 VOID
-IOReadStrW(USHORT   Port,
+IOReadStrW(USHORT  Port,
            PUSHORT Buffer,
            ULONG   Count)
 {
@@ -191,7 +191,7 @@
     {
         ASSERT(Port  <= MAXWORD);
         ASSERT(Count <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.insw_handler((WORD)Port, Buffer, 
(WORD)Count);
+        IoPortProc[Port].VddIoHandlers.insw_handler(Port, Buffer, (WORD)Count);
     }
     else
     {
@@ -200,7 +200,7 @@
 }
 
 VOID
-IOWriteW(USHORT  Port,
+IOWriteW(USHORT Port,
          USHORT Buffer)
 {
     if (IoPortProc[Port].hVdd == INVALID_HANDLE_VALUE &&
@@ -212,7 +212,7 @@
              IoPortProc[Port].VddIoHandlers.outw_handler)
     {
         ASSERT(Port <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.outw_handler((WORD)Port, Buffer);
+        IoPortProc[Port].VddIoHandlers.outw_handler(Port, Buffer);
     }
     else
     {
@@ -223,7 +223,7 @@
 }
 
 VOID
-IOWriteStrW(USHORT   Port,
+IOWriteStrW(USHORT  Port,
             PUSHORT Buffer,
             ULONG   Count)
 {
@@ -237,7 +237,7 @@
     {
         ASSERT(Port  <= MAXWORD);
         ASSERT(Count <= MAXWORD);
-        IoPortProc[Port].VddIoHandlers.outsw_handler((WORD)Port, Buffer, 
(WORD)Count);
+        IoPortProc[Port].VddIoHandlers.outsw_handler(Port, Buffer, 
(WORD)Count);
     }
     else
     {
@@ -265,7 +265,7 @@
 }
 
 VOID
-IOReadStrD(USHORT  Port,
+IOReadStrD(USHORT Port,
            PULONG Buffer,
            ULONG  Count)
 {
@@ -282,7 +282,7 @@
 
 VOID
 IOWriteD(USHORT Port,
-         ULONG Buffer)
+         ULONG  Buffer)
 {
     if (IoPortProc[Port].hVdd == INVALID_HANDLE_VALUE &&
         IoPortProc[Port].IoHandlers.OutD)
@@ -298,7 +298,7 @@
 }
 
 VOID
-IOWriteStrD(USHORT  Port,
+IOWriteStrD(USHORT Port,
             PULONG Buffer,
             ULONG  Count)
 {

Modified: branches/shell-experiments/subsystems/ntvdm/io.h
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/subsystems/ntvdm/io.h?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/subsystems/ntvdm/io.h    [iso-8859-1] (original)
+++ branches/shell-experiments/subsystems/ntvdm/io.h    [iso-8859-1] Thu Oct 23 
19:52:45 2014
@@ -36,45 +36,45 @@
 UCHAR
 IOReadB(USHORT Port);
 VOID
-IOReadStrB(USHORT  Port,
+IOReadStrB(USHORT Port,
            PUCHAR Buffer,
            ULONG  Count);
 
 VOID
 IOWriteB(USHORT Port,
-         UCHAR Buffer);
+         UCHAR  Buffer);
 VOID
-IOWriteStrB(USHORT  Port,
+IOWriteStrB(USHORT Port,
             PUCHAR Buffer,
             ULONG  Count);
 
 USHORT
 IOReadW(USHORT Port);
 VOID
-IOReadStrW(USHORT   Port,
+IOReadStrW(USHORT  Port,
            PUSHORT Buffer,
            ULONG   Count);
 
 VOID
-IOWriteW(USHORT  Port,
+IOWriteW(USHORT Port,
          USHORT Buffer);
 VOID
-IOWriteStrW(USHORT   Port,
+IOWriteStrW(USHORT  Port,
             PUSHORT Buffer,
             ULONG   Count);
 
 ULONG
 IOReadD(USHORT Port);
 VOID
-IOReadStrD(USHORT  Port,
+IOReadStrD(USHORT Port,
            PULONG Buffer,
            ULONG  Count);
 
 VOID
 IOWriteD(USHORT Port,
-         ULONG Buffer);
+         ULONG  Buffer);
 VOID
-IOWriteStrD(USHORT  Port,
+IOWriteStrD(USHORT Port,
             PULONG Buffer,
             ULONG  Count);
 

Modified: branches/shell-experiments/win32ss/user/ntuser/class.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/win32ss/user/ntuser/class.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/win32ss/user/ntuser/class.c      [iso-8859-1] 
(original)
+++ branches/shell-experiments/win32ss/user/ntuser/class.c      [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -9,7 +9,6 @@
 #include <win32k.h>
 DBG_DEFAULT_CHANNEL(UserClass);
 
-BOOL FASTCALL IntClassDestroyIcon(HANDLE hCurIcon);
 static NTSTATUS IntDeregisterClassAtom(IN RTL_ATOM Atom);
 
 REGISTER_SYSCLASS DefaultServerClasses[] =
@@ -251,7 +250,13 @@
     if (Class->spcur)
         UserDereferenceObject(Class->spcur);
     if (Class->spicnSm)
+    {
         UserDereferenceObject(Class->spicnSm);
+        /* Destroy the icon if we own it */
+        if ((Class->CSF_flags & CSF_CACHEDSMICON)
+                && !(UserObjectInDestroy(UserHMGetHandle(Class->spicnSm))))
+            IntDestroyCurIconObject(Class->spicnSm);
+    }
 #else
     if (Class->hIconSmIntern)
         IntClassDestroyIcon(Class->hIconSmIntern);
@@ -1969,6 +1974,7 @@
             {
                 /* We will change the small icon */
                 UserDereferenceObject(Class->spicnSm);
+                IntDestroyCurIconObject(Class->spicnSm);
                 Class->spicnSm = NULL;
                 Class->CSF_flags &= ~CSF_CACHEDSMICON;
             }
@@ -1985,7 +1991,7 @@
                         IMAGE_ICON,
                         UserGetSystemMetrics( SM_CXSMICON ),
                         UserGetSystemMetrics( SM_CYSMICON ),
-                        LR_COPYFROMRESOURCE | LR_SHARED);
+                        LR_COPYFROMRESOURCE);
                 }
                 if (!SmallIconHandle)
                 {
@@ -1995,7 +2001,7 @@
                         IMAGE_ICON,
                         UserGetSystemMetrics( SM_CXSMICON ),
                         UserGetSystemMetrics( SM_CYSMICON ),
-                        LR_SHARED);
+                        0);
                 }
                 if (SmallIconHandle)
                 {
@@ -2062,6 +2068,7 @@
 #ifdef NEW_CURSORICON
         {
             PCURICON_OBJECT NewSmallIcon = NULL;
+            BOOLEAN NewIconFromCache = FALSE;
 
             if (NewLong)
             {
@@ -2072,10 +2079,54 @@
                     return 0;
                 }
             }
+            else
+            {
+                /* Create the new small icon from the large one */
+                HICON SmallIconHandle = NULL;
+                if((Class->spicn->CURSORF_flags & (CURSORF_LRSHARED | 
CURSORF_FROMRESOURCE))
+                        == (CURSORF_LRSHARED | CURSORF_FROMRESOURCE))
+                {
+                    SmallIconHandle = co_IntCopyImage(
+                        UserHMGetHandle(Class->spicn),
+                        IMAGE_ICON,
+                        UserGetSystemMetrics( SM_CXSMICON ),
+                        UserGetSystemMetrics( SM_CYSMICON ),
+                        LR_COPYFROMRESOURCE);
+                }
+                if (!SmallIconHandle)
+                {
+                    /* Retry without copying from resource */
+                    SmallIconHandle = co_IntCopyImage(
+                        UserHMGetHandle(Class->spicn),
+                        IMAGE_ICON,
+                        UserGetSystemMetrics( SM_CXSMICON ),
+                        UserGetSystemMetrics( SM_CYSMICON ),
+                        0);
+                }
+                if (SmallIconHandle)
+                {
+                    /* So use it */
+                    NewSmallIcon = UserGetCurIconObject(SmallIconHandle);
+                    NewIconFromCache = TRUE;
+                }
+                else
+                {
+                    ERR("Failed getting a small icon for the class.\n");
+                }
+            }
 
             if (Class->spicnSm)
             {
-                Ret = (ULONG_PTR)UserHMGetHandle(Class->spicnSm);
+                if (Class->CSF_flags & CSF_CACHEDSMICON)
+                {
+                    /* We must destroy the icon if we own it */
+                    IntDestroyCurIconObject(Class->spicnSm);
+                    Ret = 0;
+                }
+                else
+                {
+                    Ret = (ULONG_PTR)UserHMGetHandle(Class->spicnSm);
+                }
                 UserDereferenceObject(Class->spicnSm);
             }
             else
@@ -2083,7 +2134,10 @@
                 Ret = 0;
             }
 
-            Class->CSF_flags &= ~CSF_CACHEDSMICON;
+            if (NewIconFromCache)
+                Class->CSF_flags |= CSF_CACHEDSMICON;
+            else
+                Class->CSF_flags &= ~CSF_CACHEDSMICON;
             Class->spicnSm = NewSmallIcon;
 
             /* Update the clones */
@@ -2094,7 +2148,10 @@
                     UserDereferenceObject(Class->spicnSm);
                 if (NewSmallIcon)
                     UserReferenceObject(NewSmallIcon);
-                Class->CSF_flags &= ~CSF_CACHEDSMICON;
+                if (NewIconFromCache)
+                    Class->CSF_flags |= CSF_CACHEDSMICON;
+                else
+                    Class->CSF_flags &= ~CSF_CACHEDSMICON;
                 Class->spicnSm = NewSmallIcon;
                 Class = Class->pclsNext;
             }

Modified: branches/shell-experiments/win32ss/user/ntuser/cursoricon_new.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/win32ss/user/ntuser/cursoricon_new.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/win32ss/user/ntuser/cursoricon_new.c     
[iso-8859-1] (original)
+++ branches/shell-experiments/win32ss/user/ntuser/cursoricon_new.c     
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -187,7 +187,8 @@
 
     /* We just mark the handle as being destroyed.
      * Deleting all the stuff will be deferred to the actual struct free. */
-    return UserDeleteObject(CurIcon->head.h, TYPE_CURSOR);
+    UserDeleteObject(CurIcon->head.h, TYPE_CURSOR);
+    return TRUE;
 }
 
 void
@@ -357,16 +358,18 @@
         /* Get the module name from the atom table */
         _SEH2_TRY
         {
-            if (BufLen > (lpModule->MaximumLength * sizeof(WCHAR)))
+            BufLen += sizeof(WCHAR);
+            if (BufLen > (lpModule->MaximumLength))
             {
                 lpModule->Length = 0;
+                lpModule->MaximumLength = BufLen;
             }
             else
             {
                 ProbeForWrite(lpModule->Buffer, lpModule->MaximumLength, 1);
-                BufLen = lpModule->MaximumLength * sizeof(WCHAR);
+                BufLen = lpModule->MaximumLength;
                 RtlQueryAtomInAtomTable(gAtomTable, CurIcon->atomModName, 
NULL, NULL, lpModule->Buffer, &BufLen);
-                lpModule->Length = BufLen/sizeof(WCHAR);
+                lpModule->Length = BufLen;
             }
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
@@ -395,15 +398,18 @@
             {
                 lpResName->Buffer = CurIcon->strName.Buffer;
                 lpResName->Length = 0;
+                lpResName->MaximumLength = 0;
             }
-            else if (lpResName->MaximumLength < CurIcon->strName.Length)
+            else if (lpResName->MaximumLength < CurIcon->strName.MaximumLength)
             {
                 lpResName->Length = 0;
+                lpResName->MaximumLength = CurIcon->strName.MaximumLength;
             }
             else
             {
-                ProbeForWrite(lpResName->Buffer, lpResName->MaximumLength * 
sizeof(WCHAR), 1);
-                RtlCopyMemory(lpResName->Buffer, CurIcon->strName.Buffer, 
lpResName->Length);
+                ProbeForWrite(lpResName->Buffer, lpResName->MaximumLength, 1);
+                RtlCopyMemory(lpResName->Buffer, CurIcon->strName.Buffer, 
CurIcon->strName.Length);
+                lpResName->Length = CurIcon->strName.Length;
             }
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)

Modified: branches/shell-experiments/win32ss/user/ntuser/window.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/win32ss/user/ntuser/window.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/win32ss/user/ntuser/window.c     [iso-8859-1] 
(original)
+++ branches/shell-experiments/win32ss/user/ntuser/window.c     [iso-8859-1] 
Thu Oct 23 19:52:45 2014
@@ -1686,7 +1686,7 @@
                IMAGE_ICON,
                UserGetSystemMetrics( SM_CXSMICON ),
                UserGetSystemMetrics( SM_CYSMICON ),
-               LR_COPYFROMRESOURCE | LR_SHARED);
+               LR_COPYFROMRESOURCE);
        }
        if (!IconSmHandle)
        {
@@ -1696,7 +1696,7 @@
                IMAGE_ICON,
                UserGetSystemMetrics( SM_CXSMICON ),
                UserGetSystemMetrics( SM_CYSMICON ),
-               LR_SHARED);
+               0);
        }
 
        if (IconSmHandle)

Modified: 
branches/shell-experiments/win32ss/user/user32/windows/cursoricon_new.c
URL: 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/win32ss/user/user32/windows/cursoricon_new.c?rev=64941&r1=64940&r2=64941&view=diff
==============================================================================
--- branches/shell-experiments/win32ss/user/user32/windows/cursoricon_new.c     
[iso-8859-1] (original)
+++ branches/shell-experiments/win32ss/user/user32/windows/cursoricon_new.c     
[iso-8859-1] Thu Oct 23 19:52:45 2014
@@ -397,7 +397,7 @@
     if ( dwFileSize < sizeof(*dir) )
         return NULL;
 
-    if (dwFileSize < (sizeof(*dir) + FIELD_OFFSET(CURSORICONFILEDIR, 
idEntries[dir->idCount])))
+    if (dwFileSize < FIELD_OFFSET(CURSORICONFILEDIR, idEntries[dir->idCount]))
         return NULL;
 
     /* 
@@ -1342,27 +1342,37 @@
         }
         else
             RtlInitUnicodeString(&ustrRsrc, lpszName);
-        
-        /* Prepare the module name string */
-        ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, size*sizeof(WCHAR));
-        /* Get it */
-        do
-        {
-            DWORD ret = GetModuleFileNameW(hinst, ustrModule.Buffer, size);
+
+        /* Get the module name string */
+        while (TRUE)
+        {
+            DWORD ret;
+            ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, 
size*sizeof(WCHAR));
+            if (!ustrModule.Buffer)
+            {
+                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+                return NULL;
+            }
+            ret = GetModuleFileNameW(hinst, ustrModule.Buffer, size);
             if(ret == 0)
             {
                 HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
                 return NULL;
             }
-            if(ret < size)
+
+            /* This API is completely broken... */
+            if (ret == size)
             {
-                ustrModule.Length = ret*sizeof(WCHAR);
-                ustrModule.MaximumLength = size*sizeof(WCHAR);
-                break;
+                HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
+                size *= 2;
+                continue;
             }
-            size *= 2;
-            ustrModule.Buffer = HeapReAlloc(GetProcessHeap(), 0, 
ustrModule.Buffer, size*sizeof(WCHAR));
-        } while(TRUE);
+
+            ustrModule.Buffer[ret] = UNICODE_NULL;
+            ustrModule.Length = ret * sizeof(WCHAR);
+            ustrModule.MaximumLength = size * sizeof(WCHAR);
+            break;
+        }
         
         /* Ask win32k */
         param.bIcon = bIcon;
@@ -1691,75 +1701,51 @@
         /* Get the icon module/resource names */
         UNICODE_STRING ustrModule;
         UNICODE_STRING ustrRsrc;
-        PVOID pvBuf;
         HMODULE hModule;
         
-        ustrModule.MaximumLength = MAX_PATH * sizeof(WCHAR);
-        ustrRsrc.MaximumLength = 256;
-        
+        ustrModule.MaximumLength = 0;
+        ustrRsrc.MaximumLength = 0;
+        
+        /* Get the buffer size */
+        if (!NtUserGetIconInfo(hicon, NULL, &ustrModule, &ustrRsrc, NULL, 
FALSE))
+        {
+            return NULL;
+        }
+
         ustrModule.Buffer = HeapAlloc(GetProcessHeap(), 0, 
ustrModule.MaximumLength);
         if (!ustrModule.Buffer)
         {
             SetLastError(ERROR_NOT_ENOUGH_MEMORY);
             return NULL;
         }
-        /* Keep track of the buffer for the resource, NtUserGetIconInfo might 
overwrite it */
-        pvBuf = HeapAlloc(GetProcessHeap(), 0, ustrRsrc.MaximumLength);
-        if (!pvBuf)
-        {
-            HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
-            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-            return NULL;
-        }
-        ustrRsrc.Buffer = pvBuf;
-        
-        do
-        {
-            if (!NtUserGetIconInfo(hicon, NULL, &ustrModule, &ustrRsrc, NULL, 
FALSE))
+        
+        if (ustrRsrc.MaximumLength)
+        {
+            ustrRsrc.Buffer = HeapAlloc(GetProcessHeap(), 0, 
ustrRsrc.MaximumLength);
+            if (!ustrRsrc.Buffer)
             {
                 HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
-                HeapFree(GetProcessHeap(), 0, pvBuf);
+                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
                 return NULL;
             }
-            
-            if (ustrModule.Length && (ustrRsrc.Length || 
IS_INTRESOURCE(ustrRsrc.Buffer)))
-            {
-                /* Buffers were big enough */
-                break;
-            }
-            
-            /* Find which buffer were too small */
-            if (!ustrModule.Length)
-            {
-                PWSTR newBuffer;
-                ustrModule.MaximumLength *= 2;
-                newBuffer = HeapReAlloc(GetProcessHeap(), 0, 
ustrModule.Buffer, ustrModule.MaximumLength);
-                if(!ustrModule.Buffer)
-                {
-                    SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-                    goto leave;
-                }
-                ustrModule.Buffer = newBuffer;
-            }
-            
-            if (!ustrRsrc.Length)
-            {
-                ustrRsrc.MaximumLength *= 2;
-                pvBuf = HeapReAlloc(GetProcessHeap(), 0, ustrRsrc.Buffer, 
ustrRsrc.MaximumLength);
-                if (!pvBuf)
-                {
-                    SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-                    goto leave;
-                }
-                ustrRsrc.Buffer = pvBuf;
-            }
-        } while(TRUE);
+        }
+
+        if (!NtUserGetIconInfo(hicon, NULL, &ustrModule, &ustrRsrc, NULL, 
FALSE))
+        {
+            HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
+            if (!IS_INTRESOURCE(ustrRsrc.Buffer))
+                HeapFree(GetProcessHeap(), 0, ustrRsrc.Buffer);
+            return NULL;
+        }
         
         /* NULL-terminate our strings */
-        ustrModule.Buffer[ustrModule.Length/sizeof(WCHAR)] = 0;
+        ustrModule.Buffer[ustrModule.Length/sizeof(WCHAR)] = UNICODE_NULL;
         if (!IS_INTRESOURCE(ustrRsrc.Buffer))
-            ustrRsrc.Buffer[ustrRsrc.Length/sizeof(WCHAR)] = 0;
-        
+            ustrRsrc.Buffer[ustrRsrc.Length/sizeof(WCHAR)] = UNICODE_NULL;
+        
+        TRACE("Got module %S, resource %p (%S).\n", ustrModule.Buffer,
+            ustrRsrc.Buffer, IS_INTRESOURCE(ustrRsrc.Buffer) ? L"" : 
ustrRsrc.Buffer);
+
         /* Get the module handle */
         if (!GetModuleHandleExW(0, ustrModule.Buffer, &hModule))
         {
@@ -1783,7 +1769,8 @@
         /* If we're here, that means that the passed icon is shared. Don't 
destroy it, even if LR_COPYDELETEORG is specified */
     leave:
         HeapFree(GetProcessHeap(), 0, ustrModule.Buffer);
-        HeapFree(GetProcessHeap(), 0, pvBuf);
+        if (!IS_INTRESOURCE(ustrRsrc.Buffer))
+            HeapFree(GetProcessHeap(), 0, ustrRsrc.Buffer);
         
         TRACE("Returning 0x%08x.\n", ret);
         


Reply via email to