From 57e548bec43c9eb9730f2b2a191ff2f073994e38 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 27 Jun 2007 18:05:04 +0000 Subject: [PATCH] - Fix incompatibility: In Windows IoGetDeviceProperty(DevicePropertyAddress) returns information as 0xDDDDFFFF (D=Device, F=Function) and not as a PCI_SLOT_NUMBER structure. This is confirmed by tests in Windows XP and 2003, and also found via Google. - Fix incorrect usage of DevicePropertyAddress in videoprt and ndis (thus ndis.sys+pcnet.sys load [again] in Windows XP). svn path=/trunk/; revision=27290 --- reactos/drivers/bus/pci/pdo.c | 6 +++++- reactos/drivers/network/ndis/ndis/miniport.c | 11 +++++++++++ reactos/drivers/video/videoprt/videoprt.c | 10 +++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index 2b882202440..a8e6271bf24 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -157,6 +157,7 @@ PdoQueryCapabilities( { PPDO_DEVICE_EXTENSION DeviceExtension; PDEVICE_CAPABILITIES DeviceCapabilities; + ULONG DeviceNumber, FunctionNumber; DPRINT("Called\n"); @@ -166,8 +167,11 @@ PdoQueryCapabilities( if (DeviceCapabilities->Version != 1) return STATUS_UNSUCCESSFUL; + DeviceNumber = DeviceExtension->PciDevice->SlotNumber.u.bits.DeviceNumber; + FunctionNumber = DeviceExtension->PciDevice->SlotNumber.u.bits.FunctionNumber; + DeviceCapabilities->UniqueID = FALSE; - DeviceCapabilities->Address = DeviceExtension->PciDevice->SlotNumber.u.AsULONG; + DeviceCapabilities->Address = ((DeviceNumber << 16) & 0xFFFF0000) + (FunctionNumber & 0xFFFF); DeviceCapabilities->UINumber = (ULONG)-1; /* FIXME */ return STATUS_SUCCESS; diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 3080568c6d0..284b45eb198 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1404,7 +1404,18 @@ NdisIPnPStartDevice( else Adapter->NdisMiniportBlock.SlotNumber = 0; } + else + { + /* Convert slotnumber to PCI_SLOT_NUMBER */ + ULONG PciSlotNumber = Adapter->NdisMiniportBlock.SlotNumber; + PCI_SLOT_NUMBER SlotNumber; + SlotNumber.u.AsULONG = 0; + SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF; + SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF; + + Adapter->NdisMiniportBlock.SlotNumber = SlotNumber.u.AsULONG; + } NdisCloseConfiguration(ConfigHandle); /* diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 39680805c22..960390e9b3e 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -227,6 +227,8 @@ IntVideoPortCreateAdapterDeviceObject( { PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; ULONG DeviceNumber; + ULONG PciSlotNumber; + PCI_SLOT_NUMBER SlotNumber; ULONG Size; NTSTATUS Status; WCHAR DeviceBuffer[20]; @@ -345,8 +347,14 @@ IntVideoPortCreateAdapterDeviceObject( PhysicalDeviceObject, DevicePropertyAddress, Size, - &DeviceExtension->SystemIoSlotNumber, + &PciSlotNumber, &Size); + + /* Convert slotnumber to PCI_SLOT_NUMBER */ + SlotNumber.u.AsULONG = 0; + SlotNumber.u.bits.DeviceNumber = (PciSlotNumber >> 16) & 0xFFFF; + SlotNumber.u.bits.FunctionNumber = PciSlotNumber & 0xFFFF; + DeviceExtension->SystemIoSlotNumber = SlotNumber.u.AsULONG; } InitializeListHead(&DeviceExtension->AddressMappingListHead);