mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 16:35:49 +00:00
[KS]
- fix multiple bugs in the software bus enumerator svn path=/trunk/; revision=66559
This commit is contained in:
parent
4fa5f10a81
commit
55a3ce0d00
2 changed files with 24 additions and 14 deletions
|
@ -258,7 +258,7 @@ KspCreateDeviceAssociation(
|
||||||
IN LPWSTR ReferenceString,
|
IN LPWSTR ReferenceString,
|
||||||
IN LPWSTR InterfaceString)
|
IN LPWSTR InterfaceString)
|
||||||
{
|
{
|
||||||
GUID DeviceGuid;
|
GUID InterfaceGUID;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PBUS_INSTANCE_ENTRY CurEntry;
|
PBUS_INSTANCE_ENTRY CurEntry;
|
||||||
|
@ -268,7 +268,7 @@ KspCreateDeviceAssociation(
|
||||||
RtlInitUnicodeString(&DeviceName, InterfaceString);
|
RtlInitUnicodeString(&DeviceName, InterfaceString);
|
||||||
|
|
||||||
/* first convert device name to guid */
|
/* first convert device name to guid */
|
||||||
RtlGUIDFromString(&DeviceName, &DeviceGuid);
|
RtlGUIDFromString(&DeviceName, &InterfaceGUID);
|
||||||
|
|
||||||
/* check if the device is already present */
|
/* check if the device is already present */
|
||||||
Entry = DeviceEntry->DeviceInterfaceList.Flink;
|
Entry = DeviceEntry->DeviceInterfaceList.Flink;
|
||||||
|
@ -278,7 +278,7 @@ KspCreateDeviceAssociation(
|
||||||
/* get offset */
|
/* get offset */
|
||||||
CurEntry = (PBUS_INSTANCE_ENTRY)CONTAINING_RECORD(Entry, BUS_INSTANCE_ENTRY, Entry);
|
CurEntry = (PBUS_INSTANCE_ENTRY)CONTAINING_RECORD(Entry, BUS_INSTANCE_ENTRY, Entry);
|
||||||
|
|
||||||
if (IsEqualGUIDAligned(&CurEntry->InterfaceGuid, &DeviceGuid))
|
if (IsEqualGUIDAligned(&CurEntry->InterfaceGuid, &InterfaceGUID))
|
||||||
{
|
{
|
||||||
/* entry already exists */
|
/* entry already exists */
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
@ -298,7 +298,7 @@ KspCreateDeviceAssociation(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* store guid */
|
/* store guid */
|
||||||
RtlMoveMemory(&CurEntry->InterfaceGuid, &DeviceGuid, sizeof(GUID));
|
RtlMoveMemory(&CurEntry->InterfaceGuid, &InterfaceGUID, sizeof(GUID));
|
||||||
|
|
||||||
/* now register the association */
|
/* now register the association */
|
||||||
Status = KspRegisterDeviceAssociation(BusDeviceExtension, DeviceEntry, CurEntry);
|
Status = KspRegisterDeviceAssociation(BusDeviceExtension, DeviceEntry, CurEntry);
|
||||||
|
@ -391,7 +391,7 @@ KspCreateDeviceReference(
|
||||||
InitializeListHead(&DeviceEntry->IrpPendingList);
|
InitializeListHead(&DeviceEntry->IrpPendingList);
|
||||||
|
|
||||||
/* copy device guid */
|
/* copy device guid */
|
||||||
RtlInitUnicodeString(&String, ReferenceString);
|
RtlInitUnicodeString(&String, DeviceCategory);
|
||||||
RtlGUIDFromString(&String, &DeviceEntry->DeviceGuid);
|
RtlGUIDFromString(&String, &DeviceEntry->DeviceGuid);
|
||||||
|
|
||||||
/* copy device names */
|
/* copy device names */
|
||||||
|
@ -1110,10 +1110,14 @@ KspInstallBusEnumInterface(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* now scan the bus */
|
||||||
|
KspScanBus(Context->BusDeviceExtension);
|
||||||
|
|
||||||
/* acquire device entry lock */
|
/* acquire device entry lock */
|
||||||
KeAcquireSpinLock(&Context->BusDeviceExtension->Lock, &OldLevel);
|
KeAcquireSpinLock(&Context->BusDeviceExtension->Lock, &OldLevel);
|
||||||
|
|
||||||
/* now iterate all device entries */
|
/* now iterate all device entries */
|
||||||
|
ASSERT(!IsListEmpty(&Context->BusDeviceExtension->Common.Entry));
|
||||||
Entry = Context->BusDeviceExtension->Common.Entry.Flink;
|
Entry = Context->BusDeviceExtension->Common.Entry.Flink;
|
||||||
while(Entry != &Context->BusDeviceExtension->Common.Entry)
|
while(Entry != &Context->BusDeviceExtension->Common.Entry)
|
||||||
{
|
{
|
||||||
|
@ -1514,8 +1518,6 @@ KsCreateBusEnumObject(
|
||||||
/* get device extension */
|
/* get device extension */
|
||||||
DeviceExtension = (PDEV_EXTENSION)BusDeviceObject->DeviceExtension;
|
DeviceExtension = (PDEV_EXTENSION)BusDeviceObject->DeviceExtension;
|
||||||
|
|
||||||
DPRINT1("DeviceExtension %p BusDeviceExtension %p\n", DeviceExtension, DeviceExtension->Ext);
|
|
||||||
|
|
||||||
/* store bus device extension */
|
/* store bus device extension */
|
||||||
DeviceExtension->Ext = (PCOMMON_DEVICE_EXTENSION)BusDeviceExtension;
|
DeviceExtension->Ext = (PCOMMON_DEVICE_EXTENSION)BusDeviceExtension;
|
||||||
|
|
||||||
|
@ -1567,7 +1569,7 @@ KsCreateBusEnumObject(
|
||||||
/* check for success */
|
/* check for success */
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
DPRINT1("IoRegisterDeviceInterface failed Status %lx\n", Status);
|
||||||
FreeItem(BusDeviceExtension->ServicePath.Buffer);
|
FreeItem(BusDeviceExtension->ServicePath.Buffer);
|
||||||
FreeItem(BusDeviceExtension);
|
FreeItem(BusDeviceExtension);
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -1578,6 +1580,7 @@ KsCreateBusEnumObject(
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
DPRINT1("IoSetDeviceInterfaceState failed Status %lx\n", Status);
|
||||||
FreeItem(BusDeviceExtension->ServicePath.Buffer);
|
FreeItem(BusDeviceExtension->ServicePath.Buffer);
|
||||||
FreeItem(BusDeviceExtension);
|
FreeItem(BusDeviceExtension);
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -1618,6 +1621,7 @@ KsCreateBusEnumObject(
|
||||||
if (!BusDeviceExtension->PnpDeviceObject)
|
if (!BusDeviceExtension->PnpDeviceObject)
|
||||||
{
|
{
|
||||||
/* failed to attach device */
|
/* failed to attach device */
|
||||||
|
DPRINT1("IoAttachDeviceToDeviceStack failed with %x\n", Status);
|
||||||
if (BusDeviceExtension->DeviceInterfaceLink.Buffer)
|
if (BusDeviceExtension->DeviceInterfaceLink.Buffer)
|
||||||
{
|
{
|
||||||
IoSetDeviceInterfaceState(&BusDeviceExtension->DeviceInterfaceLink, FALSE);
|
IoSetDeviceInterfaceState(&BusDeviceExtension->DeviceInterfaceLink, FALSE);
|
||||||
|
@ -1753,8 +1757,8 @@ KsInstallBusEnumInterface(
|
||||||
/* perform access check */
|
/* perform access check */
|
||||||
if (!SeSinglePrivilegeCheck(luid, Mode))
|
if (!SeSinglePrivilegeCheck(luid, Mode))
|
||||||
{
|
{
|
||||||
/* insufficient privileges */
|
/* FIXME insufficient privileges */
|
||||||
return STATUS_PRIVILEGE_NOT_HELD;
|
//return STATUS_PRIVILEGE_NOT_HELD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get device extension */
|
/* get device extension */
|
||||||
|
@ -1848,6 +1852,13 @@ KsServiceBusEnumCreateRequest(
|
||||||
|
|
||||||
/* sanity checks */
|
/* sanity checks */
|
||||||
ASSERT(IoStack->FileObject);
|
ASSERT(IoStack->FileObject);
|
||||||
|
if (IoStack->FileObject->FileName.Buffer == NULL)
|
||||||
|
{
|
||||||
|
DPRINT1("KsServiceBusEnumCreateRequest PNP Hack\n");
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT(IoStack->FileObject->FileName.Buffer);
|
ASSERT(IoStack->FileObject->FileName.Buffer);
|
||||||
|
|
||||||
DPRINT1("KsServiceBusEnumCreateRequest IRP %p Name %wZ\n", Irp, &IoStack->FileObject->FileName);
|
DPRINT1("KsServiceBusEnumCreateRequest IRP %p Name %wZ\n", Irp, &IoStack->FileObject->FileName);
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
const GUID KSMEDIUMSETID_Standard = {0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
const GUID KSMEDIUMSETID_Standard = {0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SwDispatchPower(
|
SwDispatchPower(
|
||||||
|
@ -312,7 +311,7 @@ SwDispatchCreate(
|
||||||
/* check if the device object is a child device */
|
/* check if the device object is a child device */
|
||||||
Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
|
Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
|
||||||
|
|
||||||
DPRINT("SwDispatchCreate %x\n", Status);
|
DPRINT1("SwDispatchCreate %x\n", Status);
|
||||||
|
|
||||||
/* check for success */
|
/* check for success */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
|
@ -326,7 +325,7 @@ SwDispatchCreate(
|
||||||
}
|
}
|
||||||
/* perform the create request */
|
/* perform the create request */
|
||||||
Status = KsServiceBusEnumCreateRequest(DeviceObject, Irp);
|
Status = KsServiceBusEnumCreateRequest(DeviceObject, Irp);
|
||||||
DPRINT("SwDispatchCreate %x\n", Status);
|
DPRINT1("SwDispatchCreate %x\n", Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check the irp is pending */
|
/* check the irp is pending */
|
||||||
|
@ -426,7 +425,7 @@ DriverEntry(
|
||||||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SwDispatchDeviceControl;
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SwDispatchDeviceControl;
|
||||||
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = SwDispatchSystemControl;
|
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = SwDispatchSystemControl;
|
||||||
|
|
||||||
DPRINT("SWENUM loaded\n");
|
DPRINT1("SWENUM loaded\n");
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue