Author: cgutman
Date: Fri Apr 30 00:35:49 2010
New Revision: 47064
URL:
http://svn.reactos.org/svn/reactos?rev=47064&view=rev
Log:
[NTOSKRNL]
- Fix a horrible casting bug
- EventCategoryData1 is a pointer to a GUID not a pointer to a UNICODE_STRING
- Convert the GUID into a UNICODE_STRING properly by using RtlStringFromGUID and pass that
string to RtlCompareUnicodeString
- Fix another bug which results in us sending EventCategoryHardwareProfileChange and
EventCategoryTargetDeviceChange events to everyone registered for PnP notifications
- Fixes sending EventCategoryDeviceInterfaceChange notifications that happen after calling
IoRegisterPlugPlayNotification
Modified:
trunk/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpnoti…
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c [iso-8859-1] Fri Apr 30 00:35:49 2010
@@ -42,6 +42,8 @@
PLIST_ENTRY ListEntry;
PVOID NotificationStructure;
BOOLEAN CallCurrentEntry;
+ UNICODE_STRING GuidString;
+ NTSTATUS Status;
ASSERT(DeviceObject);
@@ -71,6 +73,13 @@
RtlCopyMemory(&NotificationInfos->Event, Event, sizeof(GUID));
RtlCopyMemory(&NotificationInfos->InterfaceClassGuid, EventCategoryData1,
sizeof(GUID));
NotificationInfos->SymbolicLinkName = (PUNICODE_STRING)EventCategoryData2;
+ Status = RtlStringFromGUID(&NotificationInfos->InterfaceClassGuid,
&GuidString);
+ if (!NT_SUCCESS(Status))
+ {
+ KeReleaseGuardedMutex(&PnpNotifyListLock);
+ ExFreePool(NotificationStructure);
+ return;
+ }
break;
}
case EventCategoryHardwareProfileChange:
@@ -125,12 +134,17 @@
ChangeEntry = CONTAINING_RECORD(ListEntry, PNP_NOTIFY_ENTRY, PnpNotifyList);
CallCurrentEntry = FALSE;
+ if (ChangeEntry->EventCategory != EventCategory)
+ {
+ ListEntry = ListEntry->Flink;
+ continue;
+ }
+
switch (EventCategory)
{
case EventCategoryDeviceInterfaceChange:
{
- if (ChangeEntry->EventCategory == EventCategory
- && RtlCompareUnicodeString(&ChangeEntry->Guid,
(PUNICODE_STRING)EventCategoryData1, FALSE) == 0)
+ if (RtlCompareUnicodeString(&ChangeEntry->Guid, &GuidString, FALSE) == 0)
{
CallCurrentEntry = TRUE;
}
@@ -174,6 +188,8 @@
}
KeReleaseGuardedMutex(&PnpNotifyListLock);
ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY);
+ if (EventCategory == EventCategoryDeviceInterfaceChange)
+ RtlFreeUnicodeString(&GuidString);
}
/* PUBLIC FUNCTIONS **********************************************************/