Author: hpoussin
Date: Mon Dec 3 11:25:54 2007
New Revision: 30978
URL:
http://svn.reactos.org/svn/reactos?rev=30978&view=rev
Log:
[FORMATTING] Fix indentation, no code change
Modified:
trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnproot…
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c Mon Dec 3 11:25:54 2007
@@ -22,69 +22,69 @@
typedef struct _PNPROOT_DEVICE
{
- // Entry on device list
- LIST_ENTRY ListEntry;
- // Physical Device Object of device
- PDEVICE_OBJECT Pdo;
- // Device ID
- UNICODE_STRING DeviceID;
- // Instance ID
- UNICODE_STRING InstanceID;
- // Device description
- UNICODE_STRING DeviceDescription;
- // Resource requirement list
- PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList;
- ULONG ResourceRequirementsListSize;
- // Associated resource list
- PCM_RESOURCE_LIST ResourceList;
- ULONG ResourceListSize;
+ // Entry on device list
+ LIST_ENTRY ListEntry;
+ // Physical Device Object of device
+ PDEVICE_OBJECT Pdo;
+ // Device ID
+ UNICODE_STRING DeviceID;
+ // Instance ID
+ UNICODE_STRING InstanceID;
+ // Device description
+ UNICODE_STRING DeviceDescription;
+ // Resource requirement list
+ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList;
+ ULONG ResourceRequirementsListSize;
+ // Associated resource list
+ PCM_RESOURCE_LIST ResourceList;
+ ULONG ResourceListSize;
} PNPROOT_DEVICE, *PPNPROOT_DEVICE;
typedef enum
{
- dsStopped,
- dsStarted,
- dsPaused,
- dsRemoved,
- dsSurpriseRemoved
+ dsStopped,
+ dsStarted,
+ dsPaused,
+ dsRemoved,
+ dsSurpriseRemoved
} PNPROOT_DEVICE_STATE;
typedef struct _PNPROOT_COMMON_DEVICE_EXTENSION
{
- // Wether this device extension is for an FDO or PDO
- BOOLEAN IsFDO;
+ // Wether this device extension is for an FDO or PDO
+ BOOLEAN IsFDO;
} PNPROOT_COMMON_DEVICE_EXTENSION, *PPNPROOT_COMMON_DEVICE_EXTENSION;
/* Physical Device Object device extension for a child device */
typedef struct _PNPROOT_PDO_DEVICE_EXTENSION
{
- // Common device data
- PNPROOT_COMMON_DEVICE_EXTENSION Common;
- // Informations about the device
- PPNPROOT_DEVICE DeviceInfo;
+ // Common device data
+ PNPROOT_COMMON_DEVICE_EXTENSION Common;
+ // Informations about the device
+ PPNPROOT_DEVICE DeviceInfo;
} PNPROOT_PDO_DEVICE_EXTENSION, *PPNPROOT_PDO_DEVICE_EXTENSION;
/* Physical Device Object device extension for the Root bus device object */
typedef struct _PNPROOT_FDO_DEVICE_EXTENSION
{
- // Common device data
- PNPROOT_COMMON_DEVICE_EXTENSION Common;
- // Lower device object
- PDEVICE_OBJECT Ldo;
- // Current state of the driver
- PNPROOT_DEVICE_STATE State;
- // Namespace device list
- LIST_ENTRY DeviceListHead;
- // Number of (not removed) devices in device list
- ULONG DeviceListCount;
- // Lock for namespace device list
- KGUARDED_MUTEX DeviceListLock;
+ // Common device data
+ PNPROOT_COMMON_DEVICE_EXTENSION Common;
+ // Lower device object
+ PDEVICE_OBJECT Ldo;
+ // Current state of the driver
+ PNPROOT_DEVICE_STATE State;
+ // Namespace device list
+ LIST_ENTRY DeviceListHead;
+ // Number of (not removed) devices in device list
+ ULONG DeviceListCount;
+ // Lock for namespace device list
+ KGUARDED_MUTEX DeviceListLock;
} PNPROOT_FDO_DEVICE_EXTENSION, *PPNPROOT_FDO_DEVICE_EXTENSION;
typedef struct _BUFFER
{
- PVOID *Buffer;
- PULONG Length;
+ PVOID *Buffer;
+ PULONG Length;
} BUFFER, *PBUFFER;
static PDEVICE_OBJECT PnpRootDeviceObject = NULL;
@@ -93,139 +93,137 @@
static NTSTATUS
LocateChildDevice(
- IN PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension,
- IN PCWSTR DeviceId,
- IN PCWSTR InstanceId,
- OUT PPNPROOT_DEVICE* ChildDevice)
-{
- PPNPROOT_DEVICE Device;
- UNICODE_STRING DeviceIdU, InstanceIdU;
-
- RtlInitUnicodeString(&DeviceIdU, DeviceId);
- RtlInitUnicodeString(&InstanceIdU, InstanceId);
-
- LIST_FOR_EACH(Device, &DeviceExtension->DeviceListHead, PNPROOT_DEVICE,
ListEntry)
- {
- if (RtlEqualUnicodeString(&DeviceIdU, &Device->DeviceID, TRUE)
- && RtlEqualUnicodeString(&InstanceIdU, &Device->InstanceID, TRUE))
- {
- *ChildDevice = Device;
- return STATUS_SUCCESS;
- }
- }
-
- return STATUS_NO_SUCH_DEVICE;
+ IN PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension,
+ IN PCWSTR DeviceId,
+ IN PCWSTR InstanceId,
+ OUT PPNPROOT_DEVICE* ChildDevice)
+{
+ PPNPROOT_DEVICE Device;
+ UNICODE_STRING DeviceIdU, InstanceIdU;
+
+ RtlInitUnicodeString(&DeviceIdU, DeviceId);
+ RtlInitUnicodeString(&InstanceIdU, InstanceId);
+
+ LIST_FOR_EACH(Device, &DeviceExtension->DeviceListHead, PNPROOT_DEVICE,
ListEntry)
+ {
+ if (RtlEqualUnicodeString(&DeviceIdU, &Device->DeviceID, TRUE)
+ && RtlEqualUnicodeString(&InstanceIdU, &Device->InstanceID,
TRUE))
+ {
+ *ChildDevice = Device;
+ return STATUS_SUCCESS;
+ }
+ }
+
+ return STATUS_NO_SUCH_DEVICE;
}
/* Creates a new PnP device for a legacy driver */
NTSTATUS
PnpRootCreateDevice(
- IN PUNICODE_STRING ServiceName,
- IN PDEVICE_OBJECT *PhysicalDeviceObject)
-{
- PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
- UNICODE_STRING UnknownServiceName = RTL_CONSTANT_STRING(L"UNKNOWN");
- PUNICODE_STRING LocalServiceName;
- PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension;
- WCHAR DevicePath[MAX_PATH + 1];
- WCHAR InstancePath[5];
- PPNPROOT_DEVICE Device = NULL;
- NTSTATUS Status;
- ULONG i;
-
- DeviceExtension = PnpRootDeviceObject->DeviceExtension;
- KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock);
-
- if (ServiceName)
- LocalServiceName = ServiceName;
- else
- LocalServiceName = &UnknownServiceName;
-
- DPRINT("Creating a PnP root device for service '%wZ'\n",
LocalServiceName);
-
- /* Search for a free instance ID */
- _snwprintf(DevicePath, sizeof(DevicePath) / sizeof(WCHAR), L"%s\\LEGACY_%wZ",
REGSTR_KEY_ROOTENUM, LocalServiceName);
- for (i = 0; i < 9999; i++)
- {
- _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu",
i);
- Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device);
- if (Status == STATUS_NO_SUCH_DEVICE)
- break;
- }
- if (i > 9999)
- {
- DPRINT1("Too much legacy devices reported for service '%wZ'\n",
&LocalServiceName);
- Status = STATUS_INSUFFICIENT_RESOURCES;
- goto cleanup;
- }
-
- /* FIXME: save the new device to registry? */
-
- /* Initialize a PNPROOT_DEVICE structure */
- Device = ExAllocatePoolWithTag(PagedPool, sizeof(PNPROOT_DEVICE), TAG_PNP_ROOT);
- if (!Device)
- {
- DPRINT("ExAllocatePoolWithTag() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
- RtlZeroMemory(Device, sizeof(PNPROOT_DEVICE));
- if (!RtlCreateUnicodeString(&Device->DeviceID, DevicePath))
- {
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
- if (!RtlCreateUnicodeString(&Device->InstanceID, InstancePath))
- {
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
-
- /* Initialize a device object */
- Status = IoCreateDevice(
- PnpRootDeviceObject->DriverObject,
- sizeof(PNPROOT_PDO_DEVICE_EXTENSION),
- NULL,
- FILE_DEVICE_CONTROLLER,
- FILE_AUTOGENERATED_DEVICE_NAME,
- FALSE,
- &Device->Pdo);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
-
- PdoDeviceExtension =
(PPNPROOT_PDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension;
- RtlZeroMemory(PdoDeviceExtension, sizeof(PNPROOT_PDO_DEVICE_EXTENSION));
- PdoDeviceExtension->Common.IsFDO = FALSE;
- PdoDeviceExtension->DeviceInfo = Device;
-
- Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
- Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
- InsertTailList(
- &DeviceExtension->DeviceListHead,
- &Device->ListEntry);
- DeviceExtension->DeviceListCount++;
-
- *PhysicalDeviceObject = Device->Pdo;
- DPRINT("Created PDO %p (%wZ\\%wZ)\n", *PhysicalDeviceObject,
&Device->DeviceID, &Device->InstanceID);
- Device = NULL;
- Status = STATUS_SUCCESS;
+ IN PUNICODE_STRING ServiceName,
+ IN PDEVICE_OBJECT *PhysicalDeviceObject)
+{
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ UNICODE_STRING UnknownServiceName = RTL_CONSTANT_STRING(L"UNKNOWN");
+ PUNICODE_STRING LocalServiceName;
+ PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension;
+ WCHAR DevicePath[MAX_PATH + 1];
+ WCHAR InstancePath[5];
+ PPNPROOT_DEVICE Device = NULL;
+ NTSTATUS Status;
+ ULONG i;
+
+ DeviceExtension = PnpRootDeviceObject->DeviceExtension;
+ KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock);
+
+ if (ServiceName)
+ LocalServiceName = ServiceName;
+ else
+ LocalServiceName = &UnknownServiceName;
+
+ DPRINT("Creating a PnP root device for service '%wZ'\n",
LocalServiceName);
+
+ /* Search for a free instance ID */
+ _snwprintf(DevicePath, sizeof(DevicePath) / sizeof(WCHAR),
L"%s\\LEGACY_%wZ", REGSTR_KEY_ROOTENUM, LocalServiceName);
+ for (i = 0; i < 9999; i++)
+ {
+ _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR),
L"%04lu", i);
+ Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath,
&Device);
+ if (Status == STATUS_NO_SUCH_DEVICE)
+ break;
+ }
+ if (i > 9999)
+ {
+ DPRINT1("Too much legacy devices reported for service '%wZ'\n",
&LocalServiceName);
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto cleanup;
+ }
+
+ /* Initialize a PNPROOT_DEVICE structure */
+ Device = ExAllocatePoolWithTag(PagedPool, sizeof(PNPROOT_DEVICE), TAG_PNP_ROOT);
+ if (!Device)
+ {
+ DPRINT("ExAllocatePoolWithTag() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+ RtlZeroMemory(Device, sizeof(PNPROOT_DEVICE));
+ if (!RtlCreateUnicodeString(&Device->DeviceID, DevicePath))
+ {
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+ if (!RtlCreateUnicodeString(&Device->InstanceID, InstancePath))
+ {
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+
+ /* Initialize a device object */
+ Status = IoCreateDevice(
+ PnpRootDeviceObject->DriverObject,
+ sizeof(PNPROOT_PDO_DEVICE_EXTENSION),
+ NULL,
+ FILE_DEVICE_CONTROLLER,
+ FILE_AUTOGENERATED_DEVICE_NAME,
+ FALSE,
+ &Device->Pdo);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+
+ PdoDeviceExtension =
(PPNPROOT_PDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension;
+ RtlZeroMemory(PdoDeviceExtension, sizeof(PNPROOT_PDO_DEVICE_EXTENSION));
+ PdoDeviceExtension->Common.IsFDO = FALSE;
+ PdoDeviceExtension->DeviceInfo = Device;
+
+ Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
+ Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
+
+ InsertTailList(
+ &DeviceExtension->DeviceListHead,
+ &Device->ListEntry);
+ DeviceExtension->DeviceListCount++;
+
+ *PhysicalDeviceObject = Device->Pdo;
+ DPRINT("Created PDO %p (%wZ\\%wZ)\n", *PhysicalDeviceObject,
&Device->DeviceID, &Device->InstanceID);
+ Device = NULL;
+ Status = STATUS_SUCCESS;
cleanup:
- KeReleaseGuardedMutex(&DeviceExtension->DeviceListLock);
- if (Device)
- {
- if (Device->Pdo)
- IoDeleteDevice(Device->Pdo);
- RtlFreeUnicodeString(&Device->DeviceID);
- RtlFreeUnicodeString(&Device->InstanceID);
- ExFreePoolWithTag(Device, TAG_PNP_ROOT);
- }
- return Status;
+ KeReleaseGuardedMutex(&DeviceExtension->DeviceListLock);
+ if (Device)
+ {
+ if (Device->Pdo)
+ IoDeleteDevice(Device->Pdo);
+ RtlFreeUnicodeString(&Device->DeviceID);
+ RtlFreeUnicodeString(&Device->InstanceID);
+ ExFreePoolWithTag(Device, TAG_PNP_ROOT);
+ }
+ return Status;
}
static NTSTATUS STDCALL
@@ -272,297 +270,297 @@
static NTSTATUS NTAPI
QueryStringCallback(
- IN PWSTR ValueName,
- IN ULONG ValueType,
- IN PVOID ValueData,
- IN ULONG ValueLength,
- IN PVOID Context,
- IN PVOID EntryContext)
-{
- PUNICODE_STRING String = (PUNICODE_STRING)EntryContext;
-
- if (ValueType != REG_SZ || ValueLength == 0 || ValueLength % sizeof(WCHAR) != 0)
- return STATUS_SUCCESS;
-
- String->Buffer = ExAllocatePoolWithTag(PagedPool, ValueLength, TAG_PNP_ROOT);
- if (String->Buffer == NULL)
- return STATUS_NO_MEMORY;
- String->Length = String->MaximumLength = (USHORT)ValueLength;
- RtlCopyMemory(String->Buffer, ValueData, ValueLength);
- if (ValueLength > 0 && String->Buffer[ValueLength / sizeof(WCHAR) - 1] ==
L'\0')
- String->Length -= sizeof(WCHAR);
- return STATUS_SUCCESS;
+ IN PWSTR ValueName,
+ IN ULONG ValueType,
+ IN PVOID ValueData,
+ IN ULONG ValueLength,
+ IN PVOID Context,
+ IN PVOID EntryContext)
+{
+ PUNICODE_STRING String = (PUNICODE_STRING)EntryContext;
+
+ if (ValueType != REG_SZ || ValueLength == 0 || ValueLength % sizeof(WCHAR) != 0)
+ return STATUS_SUCCESS;
+
+ String->Buffer = ExAllocatePoolWithTag(PagedPool, ValueLength, TAG_PNP_ROOT);
+ if (String->Buffer == NULL)
+ return STATUS_NO_MEMORY;
+ String->Length = String->MaximumLength = (USHORT)ValueLength;
+ RtlCopyMemory(String->Buffer, ValueData, ValueLength);
+ if (ValueLength > 0 && String->Buffer[ValueLength / sizeof(WCHAR) - 1]
== L'\0')
+ String->Length -= sizeof(WCHAR);
+ return STATUS_SUCCESS;
}
static NTSTATUS NTAPI
QueryBinaryValueCallback(
- IN PWSTR ValueName,
- IN ULONG ValueType,
- IN PVOID ValueData,
- IN ULONG ValueLength,
- IN PVOID Context,
- IN PVOID EntryContext)
-{
- PBUFFER Buffer = (PBUFFER)EntryContext;
- PVOID BinaryValue;
-
- if (ValueLength == 0)
- {
- *Buffer->Buffer = NULL;
- return STATUS_SUCCESS;
- }
-
- BinaryValue = ExAllocatePoolWithTag(PagedPool, ValueLength, TAG_PNP_ROOT);
- if (BinaryValue == NULL)
- return STATUS_NO_MEMORY;
- RtlCopyMemory(BinaryValue, ValueData, ValueLength);
- *Buffer->Buffer = BinaryValue;
- if (Buffer->Length) *Buffer->Length = ValueLength;
- return STATUS_SUCCESS;
+ IN PWSTR ValueName,
+ IN ULONG ValueType,
+ IN PVOID ValueData,
+ IN ULONG ValueLength,
+ IN PVOID Context,
+ IN PVOID EntryContext)
+{
+ PBUFFER Buffer = (PBUFFER)EntryContext;
+ PVOID BinaryValue;
+
+ if (ValueLength == 0)
+ {
+ *Buffer->Buffer = NULL;
+ return STATUS_SUCCESS;
+ }
+
+ BinaryValue = ExAllocatePoolWithTag(PagedPool, ValueLength, TAG_PNP_ROOT);
+ if (BinaryValue == NULL)
+ return STATUS_NO_MEMORY;
+ RtlCopyMemory(BinaryValue, ValueData, ValueLength);
+ *Buffer->Buffer = BinaryValue;
+ if (Buffer->Length) *Buffer->Length = ValueLength;
+ return STATUS_SUCCESS;
}
static NTSTATUS
EnumerateDevices(
- IN PDEVICE_OBJECT DeviceObject)
-{
- PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
- OBJECT_ATTRIBUTES ObjectAttributes;
- PKEY_BASIC_INFORMATION KeyInfo = NULL, SubKeyInfo = NULL;
- UNICODE_STRING LegacyU = RTL_CONSTANT_STRING(L"LEGACY_");
- UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\"
REGSTR_PATH_SYSTEMENUM L"\\" REGSTR_KEY_ROOTENUM);
- UNICODE_STRING SubKeyName;
- WCHAR DevicePath[MAX_PATH + 1];
- RTL_QUERY_REGISTRY_TABLE QueryTable[5];
- PPNPROOT_DEVICE Device = NULL;
- HANDLE KeyHandle = INVALID_HANDLE_VALUE;
- HANDLE SubKeyHandle = INVALID_HANDLE_VALUE;
- HANDLE DeviceKeyHandle = INVALID_HANDLE_VALUE;
- ULONG BufferSize;
- ULONG ResultSize;
- ULONG Index1, Index2;
- BUFFER Buffer1, Buffer2;
- NTSTATUS Status = STATUS_UNSUCCESSFUL;
-
- DPRINT("EnumerateDevices(FDO %p)\n", DeviceObject);
-
- DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock);
-
- BufferSize = sizeof(KEY_BASIC_INFORMATION) + (MAX_PATH + 1) * sizeof(WCHAR);
- KeyInfo = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_PNP_ROOT);
- if (!KeyInfo)
- {
- DPRINT("ExAllocatePoolWithTag() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
- SubKeyInfo = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_PNP_ROOT);
- if (!SubKeyInfo)
- {
- DPRINT("ExAllocatePoolWithTag() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
-
- InitializeObjectAttributes(
- &ObjectAttributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
-
- Status = ZwOpenKey(&KeyHandle, KEY_ENUMERATE_SUB_KEYS, &ObjectAttributes);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("ZwOpenKey(%wZ) failed with status 0x%08lx\n", &KeyName,
Status);
- goto cleanup;
- }
-
- /* Devices are sub-sub-keys of 'KeyName'. KeyName is already opened as
- * KeyHandle. We'll first do a first enumeration to have first level keys,
- * and an inner one to have the real devices list.
- */
- Index1 = 0;
- while (TRUE)
- {
- Status = ZwEnumerateKey(
- KeyHandle,
- Index1,
- KeyBasicInformation,
- KeyInfo,
- BufferSize,
- &ResultSize);
- if (Status == STATUS_NO_MORE_ENTRIES)
- {
- Status = STATUS_SUCCESS;
- break;
- }
- else if (!NT_SUCCESS(Status))
- {
- DPRINT("ZwEnumerateKey() failed with status 0x%08lx\n", Status);
- goto cleanup;
- }
-
- /* Terminate the string */
- KeyInfo->Name[KeyInfo->NameLength / sizeof(WCHAR)] = 0;
-
- /* Check if it is a legacy driver */
- RtlInitUnicodeString(&SubKeyName, KeyInfo->Name);
- if (RtlPrefixUnicodeString(&LegacyU, &SubKeyName, FALSE))
- {
- DPRINT("Ignoring legacy driver '%wZ'\n", &SubKeyName);
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ PKEY_BASIC_INFORMATION KeyInfo = NULL, SubKeyInfo = NULL;
+ UNICODE_STRING LegacyU = RTL_CONSTANT_STRING(L"LEGACY_");
+ UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\"
REGSTR_PATH_SYSTEMENUM L"\\" REGSTR_KEY_ROOTENUM);
+ UNICODE_STRING SubKeyName;
+ WCHAR DevicePath[MAX_PATH + 1];
+ RTL_QUERY_REGISTRY_TABLE QueryTable[5];
+ PPNPROOT_DEVICE Device = NULL;
+ HANDLE KeyHandle = INVALID_HANDLE_VALUE;
+ HANDLE SubKeyHandle = INVALID_HANDLE_VALUE;
+ HANDLE DeviceKeyHandle = INVALID_HANDLE_VALUE;
+ ULONG BufferSize;
+ ULONG ResultSize;
+ ULONG Index1, Index2;
+ BUFFER Buffer1, Buffer2;
+ NTSTATUS Status = STATUS_UNSUCCESSFUL;
+
+ DPRINT("EnumerateDevices(FDO %p)\n", DeviceObject);
+
+ DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock);
+
+ BufferSize = sizeof(KEY_BASIC_INFORMATION) + (MAX_PATH + 1) * sizeof(WCHAR);
+ KeyInfo = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_PNP_ROOT);
+ if (!KeyInfo)
+ {
+ DPRINT("ExAllocatePoolWithTag() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+ SubKeyInfo = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_PNP_ROOT);
+ if (!SubKeyInfo)
+ {
+ DPRINT("ExAllocatePoolWithTag() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ Status = ZwOpenKey(&KeyHandle, KEY_ENUMERATE_SUB_KEYS, &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ZwOpenKey(%wZ) failed with status 0x%08lx\n", &KeyName,
Status);
+ goto cleanup;
+ }
+
+ /* Devices are sub-sub-keys of 'KeyName'. KeyName is already opened as
+ * KeyHandle. We'll first do a first enumeration to have first level keys,
+ * and an inner one to have the real devices list.
+ */
+ Index1 = 0;
+ while (TRUE)
+ {
+ Status = ZwEnumerateKey(
+ KeyHandle,
+ Index1,
+ KeyBasicInformation,
+ KeyInfo,
+ BufferSize,
+ &ResultSize);
+ if (Status == STATUS_NO_MORE_ENTRIES)
+ {
+ Status = STATUS_SUCCESS;
+ break;
+ }
+ else if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ZwEnumerateKey() failed with status 0x%08lx\n", Status);
+ goto cleanup;
+ }
+
+ /* Terminate the string */
+ KeyInfo->Name[KeyInfo->NameLength / sizeof(WCHAR)] = 0;
+
+ /* Check if it is a legacy driver */
+ RtlInitUnicodeString(&SubKeyName, KeyInfo->Name);
+ if (RtlPrefixUnicodeString(&LegacyU, &SubKeyName, FALSE))
+ {
+ DPRINT("Ignoring legacy driver '%wZ'\n", &SubKeyName);
+ Index1++;
+ continue;
+ }
+
+ /* Open the key */
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &SubKeyName,
+ 0, /* Attributes */
+ KeyHandle,
+ NULL); /* Security descriptor */
+ Status = ZwOpenKey(&SubKeyHandle, KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status);
+ break;
+ }
+
+ /* Enumerate the sub-keys */
+ Index2 = 0;
+ while (TRUE)
+ {
+ Status = ZwEnumerateKey(
+ SubKeyHandle,
+ Index2,
+ KeyBasicInformation,
+ SubKeyInfo,
+ BufferSize,
+ &ResultSize);
+ if (Status == STATUS_NO_MORE_ENTRIES)
+ break;
+ else if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
+ break;
+ }
+
+ /* Terminate the string */
+ SubKeyInfo->Name[SubKeyInfo->NameLength / sizeof(WCHAR)] = 0;
+
+ _snwprintf(
+ DevicePath,
+ sizeof(DevicePath) / sizeof(WCHAR),
+ L"%s\\%s", REGSTR_KEY_ROOTENUM, KeyInfo->Name);
+ DPRINT("Found device %S\\%s!\n", DevicePath, SubKeyInfo->Name);
+ if (LocateChildDevice(DeviceExtension, DevicePath, SubKeyInfo->Name,
&Device) == STATUS_NO_SUCH_DEVICE)
+ {
+ /* Create a PPNPROOT_DEVICE object, and add if in the list of known
devices */
+ Device = (PPNPROOT_DEVICE)ExAllocatePoolWithTag(PagedPool,
sizeof(PNPROOT_DEVICE), TAG_PNP_ROOT);
+ if (!Device)
+ {
+ DPRINT("ExAllocatePoolWithTag() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+ RtlZeroMemory(Device, sizeof(PNPROOT_DEVICE));
+
+ /* Fill device ID and instance ID */
+ if (!RtlCreateUnicodeString(&Device->DeviceID, DevicePath))
+ {
+ DPRINT("RtlCreateUnicodeString() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+
+ if (!RtlCreateUnicodeString(&Device->InstanceID,
SubKeyInfo->Name))
+ {
+ DPRINT("RtlCreateUnicodeString() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+
+ /* Open registry key to fill other informations */
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &Device->InstanceID,
+ 0, /* Attributes */
+ SubKeyHandle,
+ NULL); /* Security descriptor */
+ Status = ZwOpenKey(&DeviceKeyHandle, KEY_READ,
&ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ZwOpenKey() failed with status 0x%08lx\n",
Status);
+ break;
+ }
+
+ /* Fill other informations */
+ Buffer1.Buffer = (PVOID *)&Device->ResourceRequirementsList;
+ Buffer1.Length = NULL;
+ Buffer2.Buffer = (PVOID *)&Device->ResourceList;
+ Buffer2.Length = &Device->ResourceListSize;
+ RtlZeroMemory(QueryTable, sizeof(QueryTable));
+ QueryTable[0].QueryRoutine = QueryStringCallback;
+ QueryTable[0].Name = L"DeviceDesc";
+ QueryTable[0].EntryContext = &Device->DeviceDescription;
+ QueryTable[1].Flags = RTL_QUERY_REGISTRY_SUBKEY;
+ QueryTable[1].Name = L"LogConf";
+ QueryTable[2].QueryRoutine = QueryBinaryValueCallback;
+ QueryTable[2].Name = L"BasicConfigVector";
+ QueryTable[2].EntryContext = &Buffer1;
+ QueryTable[3].QueryRoutine = QueryBinaryValueCallback;
+ QueryTable[3].Name = L"BootConfig";
+ QueryTable[3].EntryContext = &Buffer2;
+
+ Status = RtlQueryRegistryValues(
+ RTL_REGISTRY_HANDLE,
+ (PCWSTR)DeviceKeyHandle,
+ QueryTable,
+ NULL,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("RtlQueryRegistryValues() failed with status
0x%08lx\n", Status);
+ break;
+ }
+
+ ZwClose(DeviceKeyHandle);
+ DeviceKeyHandle = INVALID_HANDLE_VALUE;
+
+ /* Insert the newly created device into the list */
+ InsertTailList(
+ &DeviceExtension->DeviceListHead,
+ &Device->ListEntry);
+ DeviceExtension->DeviceListCount++;
+ }
+ Device = NULL;
+
+ Index2++;
+ }
+
+ ZwClose(SubKeyHandle);
+ SubKeyHandle = INVALID_HANDLE_VALUE;
Index1++;
- continue;
- }
-
- /* Open the key */
- InitializeObjectAttributes(
- &ObjectAttributes,
- &SubKeyName,
- 0, /* Attributes */
- KeyHandle,
- NULL); /* Security descriptor */
- Status = ZwOpenKey(&SubKeyHandle, KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status);
- break;
- }
-
- /* Enumerate the sub-keys */
- Index2 = 0;
- while (TRUE)
- {
- Status = ZwEnumerateKey(
- SubKeyHandle,
- Index2,
- KeyBasicInformation,
- SubKeyInfo,
- BufferSize,
- &ResultSize);
- if (Status == STATUS_NO_MORE_ENTRIES)
- break;
- else if (!NT_SUCCESS(Status))
- {
- DPRINT("ZwEnumerateKey() failed with status 0x%08lx\n", Status);
- break;
- }
-
- /* Terminate the string */
- SubKeyInfo->Name[SubKeyInfo->NameLength / sizeof(WCHAR)] = 0;
-
- _snwprintf(
- DevicePath,
- sizeof(DevicePath) / sizeof(WCHAR),
- L"%s\\%s", REGSTR_KEY_ROOTENUM, KeyInfo->Name);
- DPRINT("Found device %S\\%s!\n", DevicePath, SubKeyInfo->Name);
- if (LocateChildDevice(DeviceExtension, DevicePath, SubKeyInfo->Name,
&Device) == STATUS_NO_SUCH_DEVICE)
- {
- /* Create a PPNPROOT_DEVICE object, and add if in the list of known devices */
- Device = (PPNPROOT_DEVICE)ExAllocatePoolWithTag(PagedPool,
sizeof(PNPROOT_DEVICE), TAG_PNP_ROOT);
- if (!Device)
- {
- DPRINT("ExAllocatePoolWithTag() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
- RtlZeroMemory(Device, sizeof(PNPROOT_DEVICE));
-
- /* Fill device ID and instance ID */
- if (!RtlCreateUnicodeString(&Device->DeviceID, DevicePath))
- {
- DPRINT("RtlCreateUnicodeString() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
-
- if (!RtlCreateUnicodeString(&Device->InstanceID, SubKeyInfo->Name))
- {
- DPRINT("RtlCreateUnicodeString() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
-
- /* Open registry key to fill other informations */
- InitializeObjectAttributes(
- &ObjectAttributes,
- &Device->InstanceID,
- 0, /* Attributes */
- SubKeyHandle,
- NULL); /* Security descriptor */
- Status = ZwOpenKey(&DeviceKeyHandle, KEY_READ, &ObjectAttributes);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status);
- break;
- }
-
- /* Fill other informations */
- Buffer1.Buffer = (PVOID *)&Device->ResourceRequirementsList;
- Buffer1.Length = NULL;
- Buffer2.Buffer = (PVOID *)&Device->ResourceList;
- Buffer2.Length = &Device->ResourceListSize;
- RtlZeroMemory(QueryTable, sizeof(QueryTable));
- QueryTable[0].QueryRoutine = QueryStringCallback;
- QueryTable[0].Name = L"DeviceDesc";
- QueryTable[0].EntryContext = &Device->DeviceDescription;
- QueryTable[1].Flags = RTL_QUERY_REGISTRY_SUBKEY;
- QueryTable[1].Name = L"LogConf";
- QueryTable[2].QueryRoutine = QueryBinaryValueCallback;
- QueryTable[2].Name = L"BasicConfigVector";
- QueryTable[2].EntryContext = &Buffer1;
- QueryTable[3].QueryRoutine = QueryBinaryValueCallback;
- QueryTable[3].Name = L"BootConfig";
- QueryTable[3].EntryContext = &Buffer2;
-
- Status = RtlQueryRegistryValues(
- RTL_REGISTRY_HANDLE,
- (PCWSTR)DeviceKeyHandle,
- QueryTable,
- NULL,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("RtlQueryRegistryValues() failed with status 0x%08lx\n",
Status);
- break;
- }
-
+ }
+
+cleanup:
+ if (Device)
+ {
+ /* We have a device that has not been added to device list. We need to clean it
up */
+ /* FIXME */
+ ExFreePoolWithTag(Device, TAG_PNP_ROOT);
+ }
+ if (DeviceKeyHandle != INVALID_HANDLE_VALUE)
ZwClose(DeviceKeyHandle);
- DeviceKeyHandle = INVALID_HANDLE_VALUE;
-
- /* Insert the newly created device into the list */
- InsertTailList(
- &DeviceExtension->DeviceListHead,
- &Device->ListEntry);
- DeviceExtension->DeviceListCount++;
- }
- Device = NULL;
-
- Index2++;
- }
-
- ZwClose(SubKeyHandle);
- SubKeyHandle = INVALID_HANDLE_VALUE;
- Index1++;
- }
-
-cleanup:
- if (Device)
- {
- /* We have a device that has not been added to device list. We need to clean it up
*/
- /* FIXME */
- ExFreePoolWithTag(Device, TAG_PNP_ROOT);
- }
- if (DeviceKeyHandle != INVALID_HANDLE_VALUE)
- ZwClose(DeviceKeyHandle);
- if (SubKeyHandle != INVALID_HANDLE_VALUE)
- ZwClose(SubKeyHandle);
- if (KeyHandle != INVALID_HANDLE_VALUE)
- ZwClose(KeyHandle);
- ExFreePoolWithTag(KeyInfo, TAG_PNP_ROOT);
- ExFreePoolWithTag(SubKeyInfo, TAG_PNP_ROOT);
- KeReleaseGuardedMutex(&DeviceExtension->DeviceListLock);
- return Status;
+ if (SubKeyHandle != INVALID_HANDLE_VALUE)
+ ZwClose(SubKeyHandle);
+ if (KeyHandle != INVALID_HANDLE_VALUE)
+ ZwClose(KeyHandle);
+ ExFreePoolWithTag(KeyInfo, TAG_PNP_ROOT);
+ ExFreePoolWithTag(SubKeyInfo, TAG_PNP_ROOT);
+ KeReleaseGuardedMutex(&DeviceExtension->DeviceListLock);
+ return Status;
}
/* FUNCTION: Handle IRP_MN_QUERY_DEVICE_RELATIONS IRPs for the root bus device object
@@ -574,104 +572,104 @@
*/
static NTSTATUS
PnpRootQueryDeviceRelations(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension;
- PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
- PDEVICE_RELATIONS Relations = NULL, OtherRelations =
(PDEVICE_RELATIONS)Irp->IoStatus.Information;
- PPNPROOT_DEVICE Device = NULL;
- ULONG Size;
- NTSTATUS Status;
-
- DPRINT("PnpRootQueryDeviceRelations(FDO %p, Irp %p)\n", DeviceObject, Irp);
-
- Status = EnumerateDevices(DeviceObject);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("EnumerateDevices() failed with status 0x%08lx\n", Status);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension;
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ PDEVICE_RELATIONS Relations = NULL, OtherRelations =
(PDEVICE_RELATIONS)Irp->IoStatus.Information;
+ PPNPROOT_DEVICE Device = NULL;
+ ULONG Size;
+ NTSTATUS Status;
+
+ DPRINT("PnpRootQueryDeviceRelations(FDO %p, Irp %p)\n", DeviceObject,
Irp);
+
+ Status = EnumerateDevices(DeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("EnumerateDevices() failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + sizeof(PDEVICE_OBJECT) *
DeviceExtension->DeviceListCount;
+ if (OtherRelations)
+ {
+ /* Another bus driver has already created a DEVICE_RELATIONS
+ * structure so we must merge this structure with our own */
+
+ Size += sizeof(PDEVICE_OBJECT) * OtherRelations->Count;
+ }
+ Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
+ if (!Relations)
+ {
+ DPRINT("ExAllocatePoolWithTag() failed\n");
+ Status = STATUS_NO_MEMORY;
+ goto cleanup;
+ }
+ RtlZeroMemory(Relations, Size);
+ if (OtherRelations)
+ {
+ Relations->Count = OtherRelations->Count;
+ RtlCopyMemory(Relations->Objects, OtherRelations->Objects,
sizeof(PDEVICE_OBJECT) * OtherRelations->Count);
+ }
+
+ KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock);
+ LIST_FOR_EACH(Device, &DeviceExtension->DeviceListHead, PNPROOT_DEVICE,
ListEntry)
+ {
+ if (!Device->Pdo)
+ {
+ /* Create a physical device object for the
+ * device as it does not already have one */
+ Status = IoCreateDevice(
+ DeviceObject->DriverObject,
+ sizeof(PNPROOT_PDO_DEVICE_EXTENSION),
+ NULL,
+ FILE_DEVICE_CONTROLLER,
+ FILE_AUTOGENERATED_DEVICE_NAME,
+ FALSE,
+ &Device->Pdo);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("IoCreateDevice() failed with status 0x%08lx\n",
Status);
+ break;
+ }
+
+ PdoDeviceExtension =
(PPNPROOT_PDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension;
+ RtlZeroMemory(PdoDeviceExtension, sizeof(PNPROOT_PDO_DEVICE_EXTENSION));
+ PdoDeviceExtension->Common.IsFDO = FALSE;
+ PdoDeviceExtension->DeviceInfo = Device;
+
+ Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
+ Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
+ }
+
+ /* Reference the physical device object. The PnP manager
+ will dereference it again when it is no longer needed */
+ ObReferenceObject(Device->Pdo);
+
+ Relations->Objects[Relations->Count++] = Device->Pdo;
+ }
+ KeReleaseGuardedMutex(&DeviceExtension->DeviceListLock);
+
+ Irp->IoStatus.Information = (ULONG_PTR)Relations;
+
+cleanup:
+ if (!NT_SUCCESS(Status))
+ {
+ if (OtherRelations)
+ ExFreePool(OtherRelations);
+ if (Relations)
+ ExFreePool(Relations);
+ if (Device && Device->Pdo)
+ {
+ IoDeleteDevice(Device->Pdo);
+ Device->Pdo = NULL;
+ }
+ }
+
return Status;
- }
-
- DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + sizeof(PDEVICE_OBJECT) *
DeviceExtension->DeviceListCount;
- if (OtherRelations)
- {
- /* Another bus driver has already created a DEVICE_RELATIONS
- * structure so we must merge this structure with our own */
-
- Size += sizeof(PDEVICE_OBJECT) * OtherRelations->Count;
- }
- Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
- if (!Relations)
- {
- DPRINT("ExAllocatePoolWithTag() failed\n");
- Status = STATUS_NO_MEMORY;
- goto cleanup;
- }
- RtlZeroMemory(Relations, Size);
- if (OtherRelations)
- {
- Relations->Count = OtherRelations->Count;
- RtlCopyMemory(Relations->Objects, OtherRelations->Objects,
sizeof(PDEVICE_OBJECT) * OtherRelations->Count);
- }
-
- KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock);
- LIST_FOR_EACH(Device, &DeviceExtension->DeviceListHead, PNPROOT_DEVICE,
ListEntry)
- {
- if (!Device->Pdo)
- {
- /* Create a physical device object for the
- * device as it does not already have one */
- Status = IoCreateDevice(
- DeviceObject->DriverObject,
- sizeof(PNPROOT_PDO_DEVICE_EXTENSION),
- NULL,
- FILE_DEVICE_CONTROLLER,
- FILE_AUTOGENERATED_DEVICE_NAME,
- FALSE,
- &Device->Pdo);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);
- break;
- }
-
- PdoDeviceExtension =
(PPNPROOT_PDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension;
- RtlZeroMemory(PdoDeviceExtension, sizeof(PNPROOT_PDO_DEVICE_EXTENSION));
- PdoDeviceExtension->Common.IsFDO = FALSE;
- PdoDeviceExtension->DeviceInfo = Device;
-
- Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
- Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
- }
-
- /* Reference the physical device object. The PnP manager
- will dereference it again when it is no longer needed */
- ObReferenceObject(Device->Pdo);
-
- Relations->Objects[Relations->Count++] = Device->Pdo;
- }
- KeReleaseGuardedMutex(&DeviceExtension->DeviceListLock);
-
- Irp->IoStatus.Information = (ULONG_PTR)Relations;
-
-cleanup:
- if (!NT_SUCCESS(Status))
- {
- if (OtherRelations)
- ExFreePool(OtherRelations);
- if (Relations)
- ExFreePool(Relations);
- if (Device && Device->Pdo)
- {
- IoDeleteDevice(Device->Pdo);
- Device->Pdo = NULL;
- }
- }
-
- return Status;
}
/*
@@ -684,343 +682,341 @@
*/
static NTSTATUS
PnpRootFdoPnpControl(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
- PIO_STACK_LOCATION IrpSp;
- NTSTATUS Status;
-
- DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- Status = Irp->IoStatus.Status;
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
-
- switch (IrpSp->MinorFunction)
- {
- case IRP_MN_QUERY_DEVICE_RELATIONS:
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
- Status = PnpRootQueryDeviceRelations(DeviceObject, Irp);
- break;
-
- case IRP_MN_START_DEVICE:
- DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
- Status = ForwardIrpAndWait(DeviceObject, Irp);
- if (NT_SUCCESS(Status))
- DeviceExtension->State = dsStarted;
- Status = STATUS_SUCCESS;
- break;
-
- case IRP_MN_STOP_DEVICE:
- DPRINT("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
- /* Root device cannot be stopped */
- Status = STATUS_NOT_SUPPORTED;
- break;
-
- default:
- DPRINT("IRP_MJ_PNP / Unknown minor function 0x%lx\n",
IrpSp->MinorFunction);
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
-
- if (Status != STATUS_PENDING)
- {
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
-
- return Status;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ PIO_STACK_LOCATION IrpSp;
+ NTSTATUS Status;
+
+ DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ Status = Irp->IoStatus.Status;
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IrpSp->MinorFunction)
+ {
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
+ Status = PnpRootQueryDeviceRelations(DeviceObject, Irp);
+ break;
+
+ case IRP_MN_START_DEVICE:
+ DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
+ Status = ForwardIrpAndWait(DeviceObject, Irp);
+ if (NT_SUCCESS(Status))
+ DeviceExtension->State = dsStarted;
+ Status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_STOP_DEVICE:
+ DPRINT("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
+ /* Root device cannot be stopped */
+ Status = STATUS_NOT_SUPPORTED;
+ break;
+
+ default:
+ DPRINT("IRP_MJ_PNP / Unknown minor function 0x%lx\n",
IrpSp->MinorFunction);
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (Status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ return Status;
}
static NTSTATUS
PdoQueryDeviceRelations(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- //PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
- PDEVICE_RELATIONS Relations;
- DEVICE_RELATION_TYPE RelationType;
- NTSTATUS Status = Irp->IoStatus.Status;
-
- //DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- RelationType = IrpSp->Parameters.QueryDeviceRelations.Type;
-
- switch (RelationType)
- {
- /* FIXME: remove */
- case BusRelations:
- {
- if (IoGetAttachedDevice(DeviceObject) != DeviceObject)
- {
- /* We're not alone in the stack */
- PDEVICE_NODE DeviceNode;
- DeviceNode =
IopGetDeviceNode(IopGetDeviceNode(DeviceObject)->PhysicalDeviceObject);
- DPRINT1("Device stack for '%wZ' (%wZ) is misbehaving ; shouldn't
receive IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n",
- &DeviceNode->InstancePath, &DeviceNode->ServiceName);
- }
- break;
- }
-
- case TargetDeviceRelation:
- {
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
TargetDeviceRelation\n");
- Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
- if (!Relations)
- {
- DPRINT("ExAllocatePoolWithTag() failed\n");
- Status = STATUS_NO_MEMORY;
- }
- else
- {
- ObReferenceObject(DeviceObject);
- Relations->Count = 1;
- Relations->Objects[0] = DeviceObject;
- Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = (ULONG_PTR)Relations;
- }
- break;
- }
-
- default:
- {
- DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / unknown relation type
0x%lx\n", RelationType);
- }
- }
-
- return Status;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PDEVICE_RELATIONS Relations;
+ DEVICE_RELATION_TYPE RelationType;
+ NTSTATUS Status = Irp->IoStatus.Status;
+
+ RelationType = IrpSp->Parameters.QueryDeviceRelations.Type;
+
+ switch (RelationType)
+ {
+ /* FIXME: remove */
+ case BusRelations:
+ {
+ if (IoGetAttachedDevice(DeviceObject) != DeviceObject)
+ {
+ /* We're not alone in the stack */
+ PDEVICE_NODE DeviceNode;
+ DeviceNode =
IopGetDeviceNode(IopGetDeviceNode(DeviceObject)->PhysicalDeviceObject);
+ DPRINT1("Device stack for '%wZ' (%wZ) is misbehaving ;
shouldn't receive IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n",
+ &DeviceNode->InstancePath, &DeviceNode->ServiceName);
+ }
+ break;
+ }
+
+ case TargetDeviceRelation:
+ {
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS /
TargetDeviceRelation\n");
+ Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool,
sizeof(DEVICE_RELATIONS));
+ if (!Relations)
+ {
+ DPRINT("ExAllocatePoolWithTag() failed\n");
+ Status = STATUS_NO_MEMORY;
+ }
+ else
+ {
+ ObReferenceObject(DeviceObject);
+ Relations->Count = 1;
+ Relations->Objects[0] = DeviceObject;
+ Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = (ULONG_PTR)Relations;
+ }
+ break;
+ }
+
+ default:
+ {
+ DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / unknown relation
type 0x%lx\n", RelationType);
+ }
+ }
+
+ return Status;
}
static NTSTATUS
PdoQueryCapabilities(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
- PDEVICE_CAPABILITIES DeviceCapabilities;
-
- DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities;
-
- if (DeviceCapabilities->Version != 1)
- return STATUS_REVISION_MISMATCH;
-
- DeviceCapabilities->UniqueID = TRUE;
- /* FIXME: Fill other fields */
-
- return STATUS_SUCCESS;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ PDEVICE_CAPABILITIES DeviceCapabilities;
+
+ DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities;
+
+ if (DeviceCapabilities->Version != 1)
+ return STATUS_REVISION_MISMATCH;
+
+ DeviceCapabilities->UniqueID = TRUE;
+ /* FIXME: Fill other fields */
+
+ return STATUS_SUCCESS;
}
static NTSTATUS
PdoQueryResources(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
- PCM_RESOURCE_LIST ResourceList;
-
- DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- if (DeviceExtension->DeviceInfo->ResourceList == NULL)
- {
- /* Create an empty resource list */
- ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST));
- if (!ResourceList)
- return STATUS_NO_MEMORY;
-
- ResourceList->Count = 0;
-
- Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
- }
- else
- {
- /* Copy existing resource requirement list */
- ResourceList = ExAllocatePool(
- PagedPool,
- FIELD_OFFSET(CM_RESOURCE_LIST, List) +
DeviceExtension->DeviceInfo->ResourceListSize);
- if (!ResourceList)
- return STATUS_NO_MEMORY;
-
- ResourceList->Count = 1;
- RtlCopyMemory(
- &ResourceList->List,
- DeviceExtension->DeviceInfo->ResourceList,
- DeviceExtension->DeviceInfo->ResourceListSize);
- Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
- }
-
- return STATUS_SUCCESS;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
+ PCM_RESOURCE_LIST ResourceList;
+
+ DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (DeviceExtension->DeviceInfo->ResourceList == NULL)
+ {
+ /* Create an empty resource list */
+ ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST));
+ if (!ResourceList)
+ return STATUS_NO_MEMORY;
+
+ ResourceList->Count = 0;
+
+ Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+ }
+ else
+ {
+ /* Copy existing resource requirement list */
+ ResourceList = ExAllocatePool(
+ PagedPool,
+ FIELD_OFFSET(CM_RESOURCE_LIST, List) +
DeviceExtension->DeviceInfo->ResourceListSize);
+ if (!ResourceList)
+ return STATUS_NO_MEMORY;
+
+ ResourceList->Count = 1;
+ RtlCopyMemory(
+ &ResourceList->List,
+ DeviceExtension->DeviceInfo->ResourceList,
+ DeviceExtension->DeviceInfo->ResourceListSize);
+ Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+ }
+
+ return STATUS_SUCCESS;
}
static NTSTATUS
PdoQueryResourceRequirements(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
- PIO_RESOURCE_REQUIREMENTS_LIST ResourceList;
- ULONG ResourceListSize = FIELD_OFFSET(IO_RESOURCE_REQUIREMENTS_LIST, List);
-
- DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- if (DeviceExtension->DeviceInfo->ResourceRequirementsList == NULL)
- {
- /* Create an empty resource list */
- ResourceList = ExAllocatePool(PagedPool, ResourceListSize);
- if (!ResourceList)
- return STATUS_NO_MEMORY;
-
- RtlZeroMemory(ResourceList, ResourceListSize);
- ResourceList->ListSize = ResourceListSize;
-
- Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
- }
- else
- {
- /* Copy existing resource requirement list */
- ResourceList = ExAllocatePool(PagedPool,
DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize);
- if (!ResourceList)
- return STATUS_NO_MEMORY;
-
- RtlCopyMemory(
- ResourceList,
- DeviceExtension->DeviceInfo->ResourceRequirementsList,
- DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize);
- Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
- }
-
- return STATUS_SUCCESS;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
+ PIO_RESOURCE_REQUIREMENTS_LIST ResourceList;
+ ULONG ResourceListSize = FIELD_OFFSET(IO_RESOURCE_REQUIREMENTS_LIST, List);
+
+ DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (DeviceExtension->DeviceInfo->ResourceRequirementsList == NULL)
+ {
+ /* Create an empty resource list */
+ ResourceList = ExAllocatePool(PagedPool, ResourceListSize);
+ if (!ResourceList)
+ return STATUS_NO_MEMORY;
+
+ RtlZeroMemory(ResourceList, ResourceListSize);
+ ResourceList->ListSize = ResourceListSize;
+
+ Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+ }
+ else
+ {
+ /* Copy existing resource requirement list */
+ ResourceList = ExAllocatePool(PagedPool,
DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize);
+ if (!ResourceList)
+ return STATUS_NO_MEMORY;
+
+ RtlCopyMemory(
+ ResourceList,
+ DeviceExtension->DeviceInfo->ResourceRequirementsList,
+ DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize);
+ Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+ }
+
+ return STATUS_SUCCESS;
}
static NTSTATUS
PdoQueryDeviceText(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
- DEVICE_TEXT_TYPE DeviceTextType;
- NTSTATUS Status = Irp->IoStatus.Status;
-
- DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- DeviceTextType = IrpSp->Parameters.QueryDeviceText.DeviceTextType;
-
- switch (DeviceTextType)
- {
- case DeviceTextDescription:
- {
- UNICODE_STRING String;
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextDescription\n");
-
- Status = RtlDuplicateUnicodeString(
- RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
- &DeviceExtension->DeviceInfo->DeviceDescription,
- &String);
- Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
- break;
- }
-
- case DeviceTextLocationInformation:
- {
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT /
DeviceTextLocationInformation\n");
- Status = STATUS_NOT_SUPPORTED;
- break;
- }
-
- default:
- {
- DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown query id type
0x%lx\n", DeviceTextType);
- }
- }
-
- return Status;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
+ DEVICE_TEXT_TYPE DeviceTextType;
+ NTSTATUS Status = Irp->IoStatus.Status;
+
+ DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DeviceTextType = IrpSp->Parameters.QueryDeviceText.DeviceTextType;
+
+ switch (DeviceTextType)
+ {
+ case DeviceTextDescription:
+ {
+ UNICODE_STRING String;
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT /
DeviceTextDescription\n");
+
+ Status = RtlDuplicateUnicodeString(
+ RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
+ &DeviceExtension->DeviceInfo->DeviceDescription,
+ &String);
+ Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
+ break;
+ }
+
+ case DeviceTextLocationInformation:
+ {
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT /
DeviceTextLocationInformation\n");
+ Status = STATUS_NOT_SUPPORTED;
+ break;
+ }
+
+ default:
+ {
+ DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown query id type
0x%lx\n", DeviceTextType);
+ }
+ }
+
+ return Status;
}
static NTSTATUS
PdoQueryId(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
- BUS_QUERY_ID_TYPE IdType;
- NTSTATUS Status = Irp->IoStatus.Status;
-
- DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- IdType = IrpSp->Parameters.QueryId.IdType;
-
- switch (IdType)
- {
- case BusQueryDeviceID:
- {
- UNICODE_STRING String;
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
-
- Status = RtlDuplicateUnicodeString(
- RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
- &DeviceExtension->DeviceInfo->DeviceID,
- &String);
- Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
- break;
- }
-
- case BusQueryHardwareIDs:
- case BusQueryCompatibleIDs:
- {
- /* Optional, do nothing */
- break;
- }
-
- case BusQueryInstanceID:
- {
- UNICODE_STRING String;
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
-
- Status = RtlDuplicateUnicodeString(
- RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
- &DeviceExtension->DeviceInfo->InstanceID,
- &String);
- Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
- break;
- }
-
- default:
- {
- DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n",
IdType);
- }
- }
-
- return Status;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
+ BUS_QUERY_ID_TYPE IdType;
+ NTSTATUS Status = Irp->IoStatus.Status;
+
+ DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ IdType = IrpSp->Parameters.QueryId.IdType;
+
+ switch (IdType)
+ {
+ case BusQueryDeviceID:
+ {
+ UNICODE_STRING String;
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
+
+ Status = RtlDuplicateUnicodeString(
+ RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
+ &DeviceExtension->DeviceInfo->DeviceID,
+ &String);
+ Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
+ break;
+ }
+
+ case BusQueryHardwareIDs:
+ case BusQueryCompatibleIDs:
+ {
+ /* Optional, do nothing */
+ break;
+ }
+
+ case BusQueryInstanceID:
+ {
+ UNICODE_STRING String;
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
+
+ Status = RtlDuplicateUnicodeString(
+ RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
+ &DeviceExtension->DeviceInfo->InstanceID,
+ &String);
+ Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
+ break;
+ }
+
+ default:
+ {
+ DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type
0x%lx\n", IdType);
+ }
+ }
+
+ return Status;
}
static NTSTATUS
PdoQueryBusInformation(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_STACK_LOCATION IrpSp)
-{
- PPNP_BUS_INFORMATION BusInfo;
- NTSTATUS Status;
-
- BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePoolWithTag(PagedPool,
sizeof(PNP_BUS_INFORMATION), TAG_PNP_ROOT);
- if (!BusInfo)
- Status = STATUS_NO_MEMORY;
- else
- {
- RtlCopyMemory(
- &BusInfo->BusTypeGuid,
- &GUID_BUS_TYPE_INTERNAL,
- sizeof(BusInfo->BusTypeGuid));
- BusInfo->LegacyBusType = PNPBus;
- /* We're the only root bus enumerator on the computer */
- BusInfo->BusNumber = 0;
- Irp->IoStatus.Information = (ULONG_PTR)BusInfo;
- Status = STATUS_SUCCESS;
- }
-
- return Status;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_STACK_LOCATION IrpSp)
+{
+ PPNP_BUS_INFORMATION BusInfo;
+ NTSTATUS Status;
+
+ BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePoolWithTag(PagedPool,
sizeof(PNP_BUS_INFORMATION), TAG_PNP_ROOT);
+ if (!BusInfo)
+ Status = STATUS_NO_MEMORY;
+ else
+ {
+ RtlCopyMemory(
+ &BusInfo->BusTypeGuid,
+ &GUID_BUS_TYPE_INTERNAL,
+ sizeof(BusInfo->BusTypeGuid));
+ BusInfo->LegacyBusType = PNPBus;
+ /* We're the only root bus enumerator on the computer */
+ BusInfo->BusNumber = 0;
+ Irp->IoStatus.Information = (ULONG_PTR)BusInfo;
+ Status = STATUS_SUCCESS;
+ }
+
+ return Status;
}
/*
@@ -1083,24 +1079,24 @@
Status = PdoQueryId(DeviceObject, Irp, IrpSp);
break;
- case IRP_MN_QUERY_BUS_INFORMATION: /* 0x15 */
- DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n");
- Status = PdoQueryBusInformation(DeviceObject, Irp, IrpSp);
- break;
-
- default:
- DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n",
IrpSp->MinorFunction);
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
-
- if (Status != STATUS_PENDING)
- {
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
-
- return Status;
+ case IRP_MN_QUERY_BUS_INFORMATION: /* 0x15 */
+ DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n");
+ Status = PdoQueryBusInformation(DeviceObject, Irp, IrpSp);
+ break;
+
+ default:
+ DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n",
IrpSp->MinorFunction);
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (Status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ return Status;
}
/*
@@ -1113,94 +1109,94 @@
*/
static NTSTATUS NTAPI
PnpRootPnpControl(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PPNPROOT_COMMON_DEVICE_EXTENSION DeviceExtension;
- NTSTATUS Status;
-
- DeviceExtension = (PPNPROOT_COMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- if (DeviceExtension->IsFDO)
- Status = PnpRootFdoPnpControl(DeviceObject, Irp);
- else
- Status = PnpRootPdoPnpControl(DeviceObject, Irp);
-
- return Status;
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PPNPROOT_COMMON_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+
+ DeviceExtension =
(PPNPROOT_COMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (DeviceExtension->IsFDO)
+ Status = PnpRootFdoPnpControl(DeviceObject, Irp);
+ else
+ Status = PnpRootPdoPnpControl(DeviceObject, Irp);
+
+ return Status;
}
NTSTATUS
STDCALL
PnpRootAddDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT PhysicalDeviceObject)
-{
- PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
- NTSTATUS Status;
-
- DPRINT("PnpRootAddDevice(DriverObject %p, Pdo %p)\n", DriverObject,
PhysicalDeviceObject);
-
- if (!PhysicalDeviceObject)
- {
- DPRINT("PhysicalDeviceObject 0x%p\n", PhysicalDeviceObject);
- Status = STATUS_INSUFFICIENT_RESOURCES;
- KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
- }
-
- Status = IoCreateDevice(
- DriverObject,
- sizeof(PNPROOT_FDO_DEVICE_EXTENSION),
- NULL,
- FILE_DEVICE_BUS_EXTENDER,
- FILE_DEVICE_SECURE_OPEN,
- TRUE,
- &PnpRootDeviceObject);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);
- KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
- }
- DPRINT("Created FDO %p\n", PnpRootDeviceObject);
-
- DeviceExtension =
(PPNPROOT_FDO_DEVICE_EXTENSION)PnpRootDeviceObject->DeviceExtension;
- RtlZeroMemory(DeviceExtension, sizeof(PNPROOT_FDO_DEVICE_EXTENSION));
-
- DeviceExtension->Common.IsFDO = TRUE;
- DeviceExtension->State = dsStopped;
- InitializeListHead(&DeviceExtension->DeviceListHead);
- DeviceExtension->DeviceListCount = 0;
- KeInitializeGuardedMutex(&DeviceExtension->DeviceListLock);
-
- Status = IoAttachDeviceToDeviceStackSafe(
- PnpRootDeviceObject,
- PhysicalDeviceObject,
- &DeviceExtension->Ldo);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n",
Status);
- KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
- }
-
- PnpRootDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-
- DPRINT("Done AddDevice()\n");
-
- return STATUS_SUCCESS;
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+
+ DPRINT("PnpRootAddDevice(DriverObject %p, Pdo %p)\n", DriverObject,
PhysicalDeviceObject);
+
+ if (!PhysicalDeviceObject)
+ {
+ DPRINT("PhysicalDeviceObject 0x%p\n", PhysicalDeviceObject);
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ }
+
+ Status = IoCreateDevice(
+ DriverObject,
+ sizeof(PNPROOT_FDO_DEVICE_EXTENSION),
+ NULL,
+ FILE_DEVICE_BUS_EXTENDER,
+ FILE_DEVICE_SECURE_OPEN,
+ TRUE,
+ &PnpRootDeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);
+ KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ }
+ DPRINT("Created FDO %p\n", PnpRootDeviceObject);
+
+ DeviceExtension =
(PPNPROOT_FDO_DEVICE_EXTENSION)PnpRootDeviceObject->DeviceExtension;
+ RtlZeroMemory(DeviceExtension, sizeof(PNPROOT_FDO_DEVICE_EXTENSION));
+
+ DeviceExtension->Common.IsFDO = TRUE;
+ DeviceExtension->State = dsStopped;
+ InitializeListHead(&DeviceExtension->DeviceListHead);
+ DeviceExtension->DeviceListCount = 0;
+ KeInitializeGuardedMutex(&DeviceExtension->DeviceListLock);
+
+ Status = IoAttachDeviceToDeviceStackSafe(
+ PnpRootDeviceObject,
+ PhysicalDeviceObject,
+ &DeviceExtension->Ldo);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("IoAttachDeviceToDeviceStackSafe() failed with status
0x%08lx\n", Status);
+ KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ }
+
+ PnpRootDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+
+ DPRINT("Done AddDevice()\n");
+
+ return STATUS_SUCCESS;
}
NTSTATUS NTAPI
PnpRootDriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath)
-{
- DPRINT("PnpRootDriverEntry(%p %wZ)\n", DriverObject, RegistryPath);
-
- DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
-
- DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
- //DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
-
- return STATUS_SUCCESS;
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPath)
+{
+ DPRINT("PnpRootDriverEntry(%p %wZ)\n", DriverObject, RegistryPath);
+
+ DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
+
+ DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
+ //DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
+
+ return STATUS_SUCCESS;
}
/* EOF */