Implement IoRegisterPlugPlayNotification,
IoUnregisterPlugPlayNotification
Implement IoSetDeviceInterfaceState
Fix IoRegisterDeviceInterface
Add prototype for ExFreePoolWithTag
namespc.c: change STATUS_UNSUCCESSFUL to STATUS_OBJECT_NAME_INVALID
SVN maintenance in ntoskrnl/kd/wrappers/
Modified: trunk/reactos/include/ddk/exfuncs.h
Modified: trunk/reactos/include/ddk/pnptypes.h
Modified: trunk/reactos/include/ntos/ntpnp.h
Modified: trunk/reactos/ntoskrnl/include/internal/io.h
Modified: trunk/reactos/ntoskrnl/io/deviface.c
Modified: trunk/reactos/ntoskrnl/io/iomgr.c
Modified: trunk/reactos/ntoskrnl/io/pnpnotify.c
Modified: trunk/reactos/ntoskrnl/io/pnproot.c
Modified: trunk/reactos/ntoskrnl/ob/namespc.c
_____
Modified: trunk/reactos/include/ddk/exfuncs.h
--- trunk/reactos/include/ddk/exfuncs.h 2005-04-30 05:08:13 UTC (rev
14865)
+++ trunk/reactos/include/ddk/exfuncs.h 2005-04-30 09:39:09 UTC (rev
14866)
@@ -215,6 +215,13 @@
PVOID block
);
+void
+STDCALL
+ExFreePoolWithTag (
+ PVOID block,
+ ULONG tag
+ );
+
/*
* PVOID
* ExFreeToZone (
_____
Modified: trunk/reactos/include/ddk/pnptypes.h
--- trunk/reactos/include/ddk/pnptypes.h 2005-04-30 05:08:13 UTC
(rev 14865)
+++ trunk/reactos/include/ddk/pnptypes.h 2005-04-30 09:39:09 UTC
(rev 14866)
@@ -147,6 +147,9 @@
EventCategoryTargetDeviceChange
} IO_NOTIFICATION_EVENT_CATEGORY;
+/* EventCategoryFlags for IoRegisterPlugPlayNotification */
+#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES
0x00000001
+
/* CallbackRoutine for IoRegisterPlugPlayNotification */
typedef NTSTATUS STDCALL_FUNC
(*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
_____
Modified: trunk/reactos/include/ntos/ntpnp.h
--- trunk/reactos/include/ntos/ntpnp.h 2005-04-30 05:08:13 UTC (rev
14865)
+++ trunk/reactos/include/ntos/ntpnp.h 2005-04-30 09:39:09 UTC (rev
14866)
@@ -38,8 +38,8 @@
DEFINE_GUID(GUID_DEVICE_HIBERNATE_VETOED, 0x61173AD9, 0x194F, 0x11D3,
0x97, 0xDC, 0x00, 0xA0, 0xC9, 0x40, 0x52, 0x2E);
DEFINE_GUID(GUID_DEVICE_BATTERY, 0x72631E54, 0x78A4, 0x11D0, 0xBC,
0xF7, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A);
DEFINE_GUID(GUID_DEVICE_SAFE_REMOVAL, 0x8FBEF967, 0xD6C5, 0x11D2, 0x97,
0xB5, 0x00, 0xA0, 0xC9, 0x40, 0x52, 0x2E);
-/* DEFINE_GUID(GUID_DEVICE_INTERFACE_ARRIVAL, 0xCB3A4004, 0x46F0,
0x11D0, 0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F); */
-/* DEFINE_GUID(GUID_DEVICE_INTERFACE_REMOVAL, 0xCB3A4005, 0x46F0,
0x11D0, 0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F); */
+DEFINE_GUID(GUID_DEVICE_INTERFACE_ARRIVAL, 0xCB3A4004, 0x46F0, 0x11D0,
0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F);
+DEFINE_GUID(GUID_DEVICE_INTERFACE_REMOVAL, 0xCB3A4005, 0x46F0, 0x11D0,
0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F);
DEFINE_GUID(GUID_DEVICE_ARRIVAL, 0xCB3A4009, 0x46F0, 0x11D0, 0xB0,
0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F);
DEFINE_GUID(GUID_DEVICE_ENUMERATED, 0xCB3A400A, 0x46F0, 0x11D0, 0xB0,
0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F);
DEFINE_GUID(GUID_DEVICE_ENUMERATE_REQUEST, 0xCB3A400B, 0x46F0, 0x11D0,
0xB0, 0x8F, 0x00, 0x60, 0x97, 0x13, 0x05, 0x3F);
_____
Modified: trunk/reactos/ntoskrnl/include/internal/io.h
--- trunk/reactos/ntoskrnl/include/internal/io.h 2005-04-30
05:08:13 UTC (rev 14865)
+++ trunk/reactos/ntoskrnl/include/internal/io.h 2005-04-30
09:39:09 UTC (rev 14866)
@@ -330,6 +330,17 @@
VOID
IopInitDriverImplementation(VOID);
+VOID
+IopInitPnpNotificationImplementation(VOID);
+
+VOID
+IopNotifyPlugPlayNotification(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
+ IN GUID* Event,
+ IN PVOID EventCategoryData1,
+ IN PVOID EventCategoryData2);
+
NTSTATUS
IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject);
NTSTATUS
_____
Modified: trunk/reactos/ntoskrnl/io/deviface.c
--- trunk/reactos/ntoskrnl/io/deviface.c 2005-04-30 05:08:13 UTC
(rev 14865)
+++ trunk/reactos/ntoskrnl/io/deviface.c 2005-04-30 09:39:09 UTC
(rev 14866)
@@ -7,6 +7,7 @@
*
* PROGRAMMERS: Filip Navara (xnavara(a)volny.cz)
* Matthew Brace (ismarc(a)austin.rr.com)
+ * HervÚ Poussineau (hpoussin(a)reactos.com)
*/
/* INCLUDES
******************************************************************/
@@ -573,6 +574,8 @@
UNICODE_STRING GuidString;
UNICODE_STRING SubKeyName;
UNICODE_STRING BaseKeyName;
+ UCHAR PdoNameInfoBuffer[sizeof(OBJECT_NAME_INFORMATION) + (256 *
sizeof(WCHAR))];
+ POBJECT_NAME_INFORMATION PdoNameInfo =
(POBJECT_NAME_INFORMATION)PdoNameInfoBuffer;
UNICODE_STRING DeviceInstance =
RTL_CONSTANT_STRING(L"DeviceInstance");
UNICODE_STRING SymbolicLink = RTL_CONSTANT_STRING(L"SymbolicLink");
HANDLE InterfaceKey;
@@ -589,6 +592,19 @@
return Status;
}
+ /* Create Pdo name: \Device\xxxxxxxx (unnamed device) */
+ Status = ObQueryNameString(
+ PhysicalDeviceObject,
+ PdoNameInfo,
+ sizeof(PdoNameInfoBuffer),
+ &i);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ObQueryNameString() failed with status 0x%08lx\n",
Status);
+ return Status;
+ }
+ ASSERT(PdoNameInfo->Name.Length);
+
/* Create base key name for this interface:
HKLM\SYSTEM\CurrentControlSet\DeviceClasses\{GUID}\##?#ACPI#PNP0501#1#{G
UID} */
InstancePath =
&PhysicalDeviceObject->DeviceObjectExtension->DeviceNode->InstancePath;
BaseKeyName.Length = wcslen(BaseKeyString) * sizeof(WCHAR);
@@ -703,10 +719,10 @@
return Status;
}
- /* Create symbolic link name:
\\?\ACPI#PNP0501#1#{GUID}\ReferenceString */
+ /* Create symbolic link name:
\??\ACPI#PNP0501#1#{GUID}\ReferenceString */
SymbolicLinkName->Length = 0;
SymbolicLinkName->MaximumLength = SymbolicLinkName->Length
- + 4 * sizeof(WCHAR) /* 5 = size of \\??\ */
+ + 4 * sizeof(WCHAR) /* 4 = size of \??\ */
+ InstancePath->Length
+ sizeof(WCHAR) /* 1 = size of # */
+ GuidString.Length
@@ -725,7 +741,7 @@
ExFreePool(BaseKeyName.Buffer);
return STATUS_INSUFFICIENT_RESOURCES;
}
- RtlAppendUnicodeToString(SymbolicLinkName, L"\\\\??\\");
+ RtlAppendUnicodeToString(SymbolicLinkName, L"\\??\\");
StartIndex = SymbolicLinkName->Length / sizeof(WCHAR);
RtlAppendUnicodeStringToString(SymbolicLinkName, InstancePath);
for (i = 0; i < InstancePath->Length / sizeof(WCHAR); i++)
@@ -743,7 +759,8 @@
SymbolicLinkName->Buffer[SymbolicLinkName->Length] = '\0';
/* Create symbolic link */
- Status = IoCreateSymbolicLink(SymbolicLinkName, InstancePath);
+ DPRINT("IoRegisterDeviceInterface(): creating symbolic link %wZ ->
%wZ\n", SymbolicLinkName, &PdoNameInfo->Name);
+ Status = IoCreateSymbolicLink(SymbolicLinkName, &PdoNameInfo->Name);
if (!NT_SUCCESS(Status))
{
DPRINT("IoCreateSymbolicLink() failed with status 0x%08lx\n",
Status);
@@ -778,7 +795,7 @@
}
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS STDCALL
@@ -786,7 +803,40 @@
IN PUNICODE_STRING SymbolicLinkName,
IN BOOLEAN Enable)
{
- DPRINT("IoSetDeviceInterfaceState called (UNIMPLEMENTED)\n");
+ PDEVICE_OBJECT PhysicalDeviceObject;
+ PFILE_OBJECT FileObject;
+ UNICODE_STRING GuidString;
+ PWCHAR StartPosition;
+ PWCHAR EndPosition;
+ NTSTATUS Status;
+
+ if (SymbolicLinkName == NULL)
+ return STATUS_INVALID_PARAMETER_1;
+
+ DPRINT("IoSetDeviceInterfaceState('%wZ', %d)\n", SymbolicLinkName,
Enable);
+ Status = IoGetDeviceObjectPointer(SymbolicLinkName,
+ 0, /* DesiredAccess */
+ &FileObject,
+ &PhysicalDeviceObject);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ /* Symbolic link name is \??\ACPI#PNP0501#1#{GUID}\ReferenceString
*/
+ /* Get GUID from SymbolicLinkName */
+ StartPosition = wcschr(SymbolicLinkName->Buffer, L'{');
+ EndPosition = wcschr(SymbolicLinkName->Buffer, L'}');
+ if (!StartPosition ||!EndPosition || StartPosition > EndPosition)
+ return STATUS_INVALID_PARAMETER_1;
+ GuidString.Buffer = StartPosition;
+ GuidString.MaximumLength = GuidString.Length =
(ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)StartPosition;
+
+ IopNotifyPlugPlayNotification(
+ PhysicalDeviceObject,
+ EventCategoryDeviceInterfaceChange,
+ Enable ? (LPGUID)&GUID_DEVICE_INTERFACE_ARRIVAL :
(LPGUID)&GUID_DEVICE_INTERFACE_REMOVAL,
+ &GuidString,
+ (PVOID)SymbolicLinkName);
+
return STATUS_SUCCESS;
}
_____
Modified: trunk/reactos/ntoskrnl/io/iomgr.c
--- trunk/reactos/ntoskrnl/io/iomgr.c 2005-04-30 05:08:13 UTC (rev
14865)
+++ trunk/reactos/ntoskrnl/io/iomgr.c 2005-04-30 09:39:09 UTC (rev
14866)
@@ -216,6 +216,7 @@
IoInitFileSystemImplementation();
IoInitVpbImplementation();
IoInitShutdownNotification();
+ IopInitPnpNotificationImplementation();
IopInitErrorLog();
IopInitTimerImplementation();
IopInitIoCompletionImplementation();
_____
Modified: trunk/reactos/ntoskrnl/io/pnpnotify.c
--- trunk/reactos/ntoskrnl/io/pnpnotify.c 2005-04-30 05:08:13 UTC
(rev 14865)
+++ trunk/reactos/ntoskrnl/io/pnpnotify.c 2005-04-30 09:39:09 UTC
(rev 14866)
@@ -6,13 +6,32 @@
* PURPOSE: Plug & Play notification functions
*
* PROGRAMMERS: Filip Navara (xnavara(a)volny.cz)
+ * HervÚ Poussineau (hpoussin(a)reactos.com)
*/
/* INCLUDES
******************************************************************/
+#define NDEBUG
#include <ntoskrnl.h>
#include <internal/debug.h>
+/* TYPES
*******************************************************************/
+
+typedef struct _PNP_NOTIFY_ENTRY
+{
+ LIST_ENTRY PnpNotifyList;
+ IO_NOTIFICATION_EVENT_CATEGORY EventCategory;
+ PVOID Context;
+ UNICODE_STRING Guid;
+ PFILE_OBJECT FileObject;
+ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE PnpNotificationProc;
+} PNP_NOTIFY_ENTRY, *PPNP_NOTIFY_ENTRY;
+
+static KGUARDED_MUTEX PnpNotifyListLock;
+static LIST_ENTRY PnpNotifyListHead;
+
+#define TAG_PNP_NOTIFY TAG('P', 'n', 'P', 'N')
+
/* FUNCTIONS
*****************************************************************/
/*
@@ -32,33 +51,262 @@
}
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS
STDCALL
IoRegisterPlugPlayNotification(
- IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
- IN ULONG EventCategoryFlags,
- IN PVOID EventCategoryData OPTIONAL,
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
- IN PVOID Context,
- OUT PVOID *NotificationEntry)
+ IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
+ IN ULONG EventCategoryFlags,
+ IN PVOID EventCategoryData OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
+ IN PVOID Context,
+ OUT PVOID *NotificationEntry)
{
- DPRINT("IoRegisterPlugPlayNotification called (UNIMPLEMENTED)\n");
- return STATUS_NOT_IMPLEMENTED;
+ PPNP_NOTIFY_ENTRY Entry;
+ PWSTR SymbolicLinkList;
+ NTSTATUS Status;
+
+ PAGED_CODE();
+
+ DPRINT("IoRegisterPlugPlayNotification(EventCategory 0x%x,
EventCategoryFlags 0x%lx, DriverObject %p) called.\n",
+ EventCategory,
+ EventCategoryFlags,
+ DriverObject);
+
+ ObReferenceObject(DriverObject);
+
+ /* Try to allocate entry for notification before sending any
notification */
+ Entry = ExAllocatePoolWithTag(
+ NonPagedPool,
+ sizeof(PNP_NOTIFY_ENTRY),
+ TAG_PNP_NOTIFY);
+ if (!Entry)
+ {
+ DPRINT("ExAllocatePool() failed\n");
+ ObDereferenceObject(DriverObject);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ if (EventCategory == EventCategoryTargetDeviceChange
+ && EventCategoryFlags &
PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES)
+ {
+ Status = IoGetDeviceInterfaces(
+ (LPGUID)EventCategoryData,
+ NULL, /* PhysicalDeviceObject OPTIONAL */
+ 0, /* Flags */
+ &SymbolicLinkList);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("IoGetDeviceInterfaces() failed with
status 0x%08lx\n", Status);
+ ExFreePoolWithTag(Entry, TAG_PNP_NOTIFY);
+ ObDereferenceObject(DriverObject);
+ return Status;
+ }
+ /* FIXME: enumerate SymbolicLinkList */
+ DPRINT1("IoRegisterPlugPlayNotification(): need to send
notifications for existing interfaces!\n");
+ ExFreePool(SymbolicLinkList);
+ }
+
+ Entry->PnpNotificationProc = CallbackRoutine;
+ Entry->EventCategory = EventCategory;
+ Entry->Context = Context;
+ switch (EventCategory)
+ {
+ case EventCategoryDeviceInterfaceChange:
+ {
+ Status = RtlStringFromGUID(EventCategoryData,
&Entry->Guid);
+ if (!NT_SUCCESS(Status))
+ {
+ ExFreePoolWithTag(Entry,
TAG_PNP_NOTIFY);
+ ObDereferenceObject(DriverObject);
+ return Status;
+ }
+ break;
+ }
+ case EventCategoryHardwareProfileChange:
+ {
+ /* nothing to do */
+ break;
+ }
+ case EventCategoryTargetDeviceChange:
+ {
+ Entry->FileObject =
(PFILE_OBJECT)EventCategoryData;
+ break;
+ }
+ default:
+ {
+ DPRINT1("IoRegisterPlugPlayNotification():
unknown EventCategory 0x%x UNIMPLEMENTED\n", EventCategory);
+ break;
+ }
+ }
+
+ KeAcquireGuardedMutex(&PnpNotifyListLock);
+ InsertHeadList(&PnpNotifyListHead,
+ &Entry->PnpNotifyList);
+ KeReleaseGuardedMutex(&PnpNotifyListLock);
+
+ DPRINT("IoRegisterPlugPlayNotification() returns
NotificationEntry %p\n",
+ Entry);
+ *NotificationEntry = Entry;
+ return STATUS_SUCCESS;
}
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS
STDCALL
IoUnregisterPlugPlayNotification(
- IN PVOID NotificationEntry)
+ IN PVOID NotificationEntry)
{
- DPRINT("IoUnregisterPlugPlayNotification called (UNIMPLEMENTED)\n");
- return STATUS_NOT_IMPLEMENTED;
+ PPNP_NOTIFY_ENTRY Entry;
+
+ PAGED_CODE();
+
+ Entry = (PPNP_NOTIFY_ENTRY)NotificationEntry;
+ DPRINT("IoUnregisterPlugPlayNotification(NotificationEntry %p)
called\n",
+ Entry);
+
+ KeAcquireGuardedMutex(&PnpNotifyListLock);
+ RtlFreeUnicodeString(&Entry->Guid);
+ RemoveEntryList(&Entry->PnpNotifyList);
+ KeReleaseGuardedMutex(&PnpNotifyListLock);
+
+ return STATUS_SUCCESS;
}
+VOID
+IopNotifyPlugPlayNotification(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
+ IN GUID* Event,
+ IN PVOID EventCategoryData1,
+ IN PVOID EventCategoryData2)
+{
+ PPNP_NOTIFY_ENTRY ChangeEntry;
+ PLIST_ENTRY Entry;
+ PVOID NotificationStructure;
+ BOOLEAN CallCurrentEntry;
+
+ ASSERT(DeviceObject);
+
+ KeAcquireGuardedMutex(&PnpNotifyListLock);
+ if (IsListEmpty(&PnpNotifyListHead))
+ {
+ KeReleaseGuardedMutex(&PnpNotifyListLock);
+ return;
+ }
+
+ switch (EventCategory)
+ {
+ case EventCategoryDeviceInterfaceChange:
+ {
+ PDEVICE_INTERFACE_CHANGE_NOTIFICATION
NotificationInfos;
+ NotificationStructure = NotificationInfos =
ExAllocatePoolWithTag(
+ PagedPool,
+
sizeof(DEVICE_INTERFACE_CHANGE_NOTIFICATION),
+ TAG_PNP_NOTIFY);
+ NotificationInfos->Version = 1;
+ NotificationInfos->Size =
sizeof(DEVICE_INTERFACE_CHANGE_NOTIFICATION);
+ RtlCopyMemory(&NotificationInfos->Event, Event,
sizeof(GUID));
+
RtlCopyMemory(&NotificationInfos->InterfaceClassGuid,
EventCategoryData1, sizeof(GUID));
+ NotificationInfos->SymbolicLinkName =
(PUNICODE_STRING)EventCategoryData2;
+ break;
+ }
+ case EventCategoryHardwareProfileChange:
+ {
+ PHWPROFILE_CHANGE_NOTIFICATION
NotificationInfos;
+ NotificationStructure = NotificationInfos =
ExAllocatePoolWithTag(
+ PagedPool,
+ sizeof(HWPROFILE_CHANGE_NOTIFICATION),
+ TAG_PNP_NOTIFY);
+ NotificationInfos->Version = 1;
+ NotificationInfos->Size =
sizeof(HWPROFILE_CHANGE_NOTIFICATION);
+ RtlCopyMemory(&NotificationInfos->Event, Event,
sizeof(GUID));
+ break;
+ }
+ case EventCategoryTargetDeviceChange:
+ {
+ PTARGET_DEVICE_REMOVAL_NOTIFICATION
NotificationInfos;
+ NotificationStructure = NotificationInfos =
ExAllocatePoolWithTag(
+ PagedPool,
+
sizeof(TARGET_DEVICE_REMOVAL_NOTIFICATION),
+ TAG_PNP_NOTIFY);
+ NotificationInfos->Version = 1;
+ NotificationInfos->Size =
sizeof(TARGET_DEVICE_REMOVAL_NOTIFICATION);
+ RtlCopyMemory(&NotificationInfos->Event, Event,
sizeof(GUID));
+ NotificationInfos->FileObject =
(PFILE_OBJECT)EventCategoryData1;
+ break;
+ }
+ default:
+ {
+ DPRINT1("IopNotifyPlugPlayNotification():
unknown EventCategory 0x%x UNIMPLEMENTED\n", EventCategory);
+ return;
+ }
+ }
+
+ /* Loop through procedures registred in PnpNotifyListHead
+ * list to find those that meet some criteria.
+ */
+
+ Entry = PnpNotifyListHead.Flink;
+ while (Entry != &PnpNotifyListHead)
+ {
+ ChangeEntry = CONTAINING_RECORD(Entry, PNP_NOTIFY_ENTRY,
PnpNotifyList);
+ CallCurrentEntry = FALSE;
+
+ switch (EventCategory)
+ {
+ case EventCategoryDeviceInterfaceChange:
+ {
+ if (ChangeEntry->EventCategory ==
EventCategory
+ &&
RtlCompareUnicodeString(&ChangeEntry->Guid,
(PUNICODE_STRING)EventCategoryData1, FALSE) == 0)
+ {
+ CallCurrentEntry = TRUE;
+ }
+ break;
+ }
+ case EventCategoryHardwareProfileChange:
+ {
+ CallCurrentEntry = TRUE;
+ break;
+ }
+ case EventCategoryTargetDeviceChange:
+ {
+ if (ChangeEntry->FileObject ==
(PFILE_OBJECT)EventCategoryData1)
+ CallCurrentEntry = TRUE;
+ }
+ default:
+ {
+
DPRINT1("IopNotifyPlugPlayNotification(): unknown EventCategory 0x%x
UNIMPLEMENTED\n", EventCategory);
+ break;
+ }
+ }
+
+ if (CallCurrentEntry)
+ {
+ /* Call entry into new allocated memory */
+ DPRINT("IopNotifyPlugPlayNotification(): found
suitable callback %p\n",
+ ChangeEntry);
+
+ (ChangeEntry->PnpNotificationProc)(
+ NotificationStructure,
+ ChangeEntry->Context);
+ }
+
+ Entry = Entry->Flink;
+ }
+ KeReleaseGuardedMutex(&PnpNotifyListLock);
+ ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY);
+}
+
+VOID INIT_FUNCTION
+IopInitPnpNotificationImplementation(VOID)
+{
+ KeInitializeGuardedMutex(&PnpNotifyListLock);
+ InitializeListHead(&PnpNotifyListHead);
+}
+
/* EOF */
_____
Modified: trunk/reactos/ntoskrnl/io/pnproot.c
--- trunk/reactos/ntoskrnl/io/pnproot.c 2005-04-30 05:08:13 UTC (rev
14865)
+++ trunk/reactos/ntoskrnl/io/pnproot.c 2005-04-30 09:39:09 UTC (rev
14866)
@@ -634,7 +634,7 @@
sizeof(PNPROOT_PDO_DEVICE_EXTENSION),
NULL,
FILE_DEVICE_CONTROLLER,
- 0,
+ FILE_AUTOGENERATED_DEVICE_NAME,
FALSE,
&Device->Pdo);
if (!NT_SUCCESS(Status))
Property changes on: trunk/reactos/ntoskrnl/kd/wrappers
___________________________________________________________________
Name: svn:ignore
+ *.d
_____
Modified: trunk/reactos/ntoskrnl/ob/namespc.c
--- trunk/reactos/ntoskrnl/ob/namespc.c 2005-04-30 05:08:13 UTC (rev
14865)
+++ trunk/reactos/ntoskrnl/ob/namespc.c 2005-04-30 09:39:09 UTC (rev
14866)
@@ -147,7 +147,7 @@
Object == NULL)
{
RtlFreeUnicodeString(&RemainingPath);
- return STATUS_UNSUCCESSFUL;
+ return STATUS_OBJECT_NAME_INVALID;
}
Status = ObCreateHandle(PsGetCurrentProcess(),