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/applicat…
==============================================================================
--- 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/applicat…
==============================================================================
--- 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/applicat…
==============================================================================
--- 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/applicat…
==============================================================================
--- 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/applicat…
==============================================================================
--- 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/applicat…
==============================================================================
--- 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/w…
==============================================================================
--- 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/adv…
==============================================================================
--- 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/adv…
==============================================================================
--- 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/win…
==============================================================================
--- 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/a…
==============================================================================
--- 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/p…
==============================================================================
--- 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/REA…
==============================================================================
--- 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/incl…
==============================================================================
--- 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/i…
==============================================================================
--- 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/nt…
==============================================================================
--- 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/nt…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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/…
==============================================================================
--- 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);