[WIN32SS]
[reactos.git] / reactos / drivers / video / videoprt / resource.c
diff --git a/reactos/drivers/video/videoprt/resource.c b/reactos/drivers/video/videoprt/resource.c
deleted file mode 100644 (file)
index f6982cf..0000000
+++ /dev/null
@@ -1,1126 +0,0 @@
-/*
- * VideoPort driver
- *
- * Copyright (C) 2002 - 2005 ReactOS Team
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#include "videoprt.h"
-
-/* PRIVATE FUNCTIONS **********************************************************/
-
-NTSTATUS NTAPI
-IntVideoPortGetLegacyResources(
-    IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension,
-    IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
-    OUT PVIDEO_ACCESS_RANGE *AccessRanges,
-    OUT PULONG AccessRangeCount)
-{
-    PCI_COMMON_CONFIG PciConfig;
-    ULONG ReadLength;
-    
-    if (!DriverExtension->InitializationData.HwGetLegacyResources &&
-        !DriverExtension->InitializationData.HwLegacyResourceCount)
-    {
-        /* No legacy resources to report */
-        *AccessRangeCount = 0;
-        return STATUS_SUCCESS;
-    }
-    
-    if (DriverExtension->InitializationData.HwGetLegacyResources)
-    {
-        ReadLength = HalGetBusData(PCIConfiguration,
-                                   DeviceExtension->SystemIoBusNumber,
-                                   DeviceExtension->SystemIoSlotNumber,
-                                   &PciConfig,
-                                   sizeof(PciConfig));
-        if (ReadLength != sizeof(PciConfig))
-        {
-            /* This device doesn't exist */
-            return STATUS_NO_SUCH_DEVICE;
-        }
-        
-        DriverExtension->InitializationData.HwGetLegacyResources(PciConfig.VendorID,
-                                                                 PciConfig.DeviceID,
-                                                                 AccessRanges,
-                                                                 AccessRangeCount);
-    }
-    else
-    {
-        *AccessRanges = DriverExtension->InitializationData.HwLegacyResourceList;
-        *AccessRangeCount = DriverExtension->InitializationData.HwLegacyResourceCount;
-    }
-
-    INFO_(VIDEOPRT, "Got %d legacy access ranges\n", *AccessRangeCount);
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS NTAPI
-IntVideoPortFilterResourceRequirements(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PIRP Irp)
-{
-    PDRIVER_OBJECT DriverObject;
-    PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
-    PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
-    PVIDEO_ACCESS_RANGE AccessRanges;
-    ULONG AccessRangeCount, ListSize, i;
-    PIO_RESOURCE_REQUIREMENTS_LIST ResList, OldResList = (PVOID)Irp->IoStatus.Information;
-    PIO_RESOURCE_DESCRIPTOR CurrentDescriptor;
-    NTSTATUS Status;
-
-    DriverObject = DeviceObject->DriverObject;
-    DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
-    DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
-    Status = IntVideoPortGetLegacyResources(DriverExtension, DeviceExtension, &AccessRanges, &AccessRangeCount);
-    if (!NT_SUCCESS(Status))
-        return Status;
-    if (!AccessRangeCount)
-    {
-        /* No legacy resources to report */
-        return Irp->IoStatus.Information;
-    }
-
-    /* OK, we've got the access ranges now. Let's set up the resource requirements list */
-
-    if (OldResList)
-    {
-        /* Already one there so let's add to it */
-        ListSize = OldResList->ListSize + sizeof(IO_RESOURCE_DESCRIPTOR) * AccessRangeCount;
-        ResList = ExAllocatePool(NonPagedPool,
-                                 ListSize);
-        if (!ResList) return STATUS_NO_MEMORY;
-        
-        RtlCopyMemory(ResList, OldResList, OldResList->ListSize);
-        
-        ASSERT(ResList->AlternativeLists == 1);
-        
-        ResList->ListSize = ListSize;
-        ResList->List[0].Count += AccessRangeCount;
-        
-        CurrentDescriptor = (PIO_RESOURCE_DESCRIPTOR)((PUCHAR)ResList + OldResList->ListSize);
-        
-        ExFreePool(OldResList);
-        Irp->IoStatus.Information = 0;
-    }
-    else
-    {
-        /* We need to make a new one */
-        ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (AccessRangeCount - 1);
-        ResList = ExAllocatePool(NonPagedPool,
-                                 ListSize);
-        if (!ResList) return STATUS_NO_MEMORY;
-        
-        RtlZeroMemory(ResList, ListSize);
-        
-        /* We need to initialize some fields */
-        ResList->ListSize = ListSize;
-        ResList->InterfaceType = DeviceExtension->AdapterInterfaceType;
-        ResList->BusNumber = DeviceExtension->SystemIoBusNumber;
-        ResList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
-        ResList->AlternativeLists = 1;
-        ResList->List[0].Version = 1;
-        ResList->List[0].Revision = 1;
-        ResList->List[0].Count = AccessRangeCount;
-        
-        CurrentDescriptor = ResList->List[0].Descriptors;
-    }
-
-    for (i = 0; i < AccessRangeCount; i++)
-    {
-        /* This is a required resource */
-        CurrentDescriptor->Option = 0;
-        
-        if (AccessRanges[i].RangeInIoSpace)
-            CurrentDescriptor->Type = CmResourceTypePort;
-        else
-            CurrentDescriptor->Type = CmResourceTypeMemory;
-        
-        CurrentDescriptor->ShareDisposition =
-        (AccessRanges[i].RangeShareable ? CmResourceShareShared : CmResourceShareDeviceExclusive);
-        
-        CurrentDescriptor->Flags = 0;
-        
-        if (CurrentDescriptor->Type == CmResourceTypePort)
-        {
-            CurrentDescriptor->u.Port.Length = AccessRanges[i].RangeLength;
-            CurrentDescriptor->u.Port.MinimumAddress =
-            CurrentDescriptor->u.Port.MaximumAddress = AccessRanges[i].RangeStart;
-            CurrentDescriptor->u.Port.Alignment = 1;
-            if (AccessRanges[i].RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
-                CurrentDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
-            if (AccessRanges[i].RangePassive & VIDEO_RANGE_10_BIT_DECODE)
-                CurrentDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-        }
-        else
-        {
-            CurrentDescriptor->u.Memory.Length = AccessRanges[i].RangeLength;
-            CurrentDescriptor->u.Memory.MinimumAddress =
-            CurrentDescriptor->u.Memory.MaximumAddress = AccessRanges[i].RangeStart;
-            CurrentDescriptor->u.Memory.Alignment = 1;
-            CurrentDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
-        }
-        
-        CurrentDescriptor++;
-    }
-
-    Irp->IoStatus.Information = (ULONG_PTR)ResList;
-
-    return STATUS_SUCCESS;
-}
-
-NTSTATUS NTAPI
-IntVideoPortMapPhysicalMemory(
-   IN HANDLE Process,
-   IN PHYSICAL_ADDRESS PhysicalAddress,
-   IN ULONG SizeInBytes,
-   IN ULONG Protect,
-   IN OUT PVOID *VirtualAddress  OPTIONAL)
-{
-   OBJECT_ATTRIBUTES ObjAttribs;
-   UNICODE_STRING UnicodeString;
-   HANDLE hMemObj;
-   NTSTATUS Status;
-   SIZE_T Size;
-
-   /* Initialize object attribs */
-   RtlInitUnicodeString(&UnicodeString, L"\\Device\\PhysicalMemory");
-   InitializeObjectAttributes(&ObjAttribs,
-                              &UnicodeString,
-                              OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
-                              NULL, NULL);
-
-   /* Open physical memory section */
-   Status = ZwOpenSection(&hMemObj, SECTION_ALL_ACCESS, &ObjAttribs);
-   if (!NT_SUCCESS(Status))
-   {
-      WARN_(VIDEOPRT, "ZwOpenSection() failed! (0x%x)\n", Status);
-      return Status;
-   }
-
-   /* Map view of section */
-   Size = SizeInBytes;
-   Status = ZwMapViewOfSection(hMemObj,
-                               Process,
-                               VirtualAddress,
-                               0,
-                               Size,
-                               (PLARGE_INTEGER)(&PhysicalAddress),
-                               &Size,
-                               ViewUnmap,
-                               0,
-                               Protect);
-   ZwClose(hMemObj);
-   if (!NT_SUCCESS(Status))
-   {
-      WARN_(VIDEOPRT, "ZwMapViewOfSection() failed! (0x%x)\n", Status);
-   }
-
-   return Status;
-}
-
-
-PVOID NTAPI
-IntVideoPortMapMemory(
-   IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
-   IN PHYSICAL_ADDRESS IoAddress,
-   IN ULONG NumberOfUchars,
-   IN ULONG InIoSpace,
-   IN HANDLE ProcessHandle,
-   OUT VP_STATUS *Status)
-{
-   PHYSICAL_ADDRESS TranslatedAddress;
-   PVIDEO_PORT_ADDRESS_MAPPING AddressMapping;
-   ULONG AddressSpace;
-   PVOID MappedAddress;
-   PLIST_ENTRY Entry;
-
-   INFO_(VIDEOPRT, "- IoAddress: %lx\n", IoAddress.u.LowPart);
-   INFO_(VIDEOPRT, "- NumberOfUchars: %lx\n", NumberOfUchars);
-   INFO_(VIDEOPRT, "- InIoSpace: %x\n", InIoSpace);
-
-   InIoSpace &= ~VIDEO_MEMORY_SPACE_DENSE;
-   if ((InIoSpace & VIDEO_MEMORY_SPACE_P6CACHE) != 0)
-   {
-      INFO_(VIDEOPRT, "VIDEO_MEMORY_SPACE_P6CACHE not supported, turning off\n");
-      InIoSpace &= ~VIDEO_MEMORY_SPACE_P6CACHE;
-   }
-
-   if (ProcessHandle != NULL && (InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) == 0)
-   {
-      INFO_(VIDEOPRT, "ProcessHandle is not NULL (0x%x) but InIoSpace does not have "
-             "VIDEO_MEMORY_SPACE_USER_MODE set! Setting "
-             "VIDEO_MEMORY_SPACE_USER_MODE.\n",
-             ProcessHandle);
-      InIoSpace |= VIDEO_MEMORY_SPACE_USER_MODE;
-   }
-   else if (ProcessHandle == NULL && (InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) != 0)
-   {
-      INFO_(VIDEOPRT, "ProcessHandle is NULL (0x%x) but InIoSpace does have "
-             "VIDEO_MEMORY_SPACE_USER_MODE set! Setting ProcessHandle "
-             "to NtCurrentProcess()\n",
-             ProcessHandle);
-      ProcessHandle = NtCurrentProcess();
-   }
-
-   if ((InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) == 0 &&
-       !IsListEmpty(&DeviceExtension->AddressMappingListHead))
-   {
-      Entry = DeviceExtension->AddressMappingListHead.Flink;
-      while (Entry != &DeviceExtension->AddressMappingListHead)
-      {
-         AddressMapping = CONTAINING_RECORD(
-            Entry,
-            VIDEO_PORT_ADDRESS_MAPPING,
-            List);
-         if (IoAddress.QuadPart == AddressMapping->IoAddress.QuadPart &&
-             NumberOfUchars <= AddressMapping->NumberOfUchars)
-         {
-            {
-               AddressMapping->MappingCount++;
-               if (Status)
-                  *Status = NO_ERROR;
-               return AddressMapping->MappedAddress;
-            }
-         }
-         Entry = Entry->Flink;
-      }
-   }
-
-   AddressSpace = (ULONG)InIoSpace;
-   AddressSpace &= ~VIDEO_MEMORY_SPACE_USER_MODE;
-   if (HalTranslateBusAddress(
-          DeviceExtension->AdapterInterfaceType,
-          DeviceExtension->SystemIoBusNumber,
-          IoAddress,
-          &AddressSpace,
-          &TranslatedAddress) == FALSE)
-   {
-      if (Status)
-         *Status = ERROR_NOT_ENOUGH_MEMORY;
-
-      return NULL;
-   }
-
-   /* I/O space */
-   if (AddressSpace != 0)
-   {
-      ASSERT(0 == TranslatedAddress.u.HighPart);
-      if (Status)
-         *Status = NO_ERROR;
-
-      return (PVOID)(ULONG_PTR)TranslatedAddress.u.LowPart;
-   }
-
-   /* user space */
-   if ((InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) != 0)
-   {
-      NTSTATUS NtStatus;
-      MappedAddress = NULL;
-      NtStatus = IntVideoPortMapPhysicalMemory(ProcessHandle,
-                                               TranslatedAddress,
-                                               NumberOfUchars,
-                                               PAGE_READWRITE/* | PAGE_WRITECOMBINE*/,
-                                               &MappedAddress);
-      if (!NT_SUCCESS(NtStatus))
-      {
-         WARN_(VIDEOPRT, "IntVideoPortMapPhysicalMemory() failed! (0x%x)\n", NtStatus);
-         if (Status)
-            *Status = NO_ERROR;
-         return NULL;
-      }
-      INFO_(VIDEOPRT, "Mapped user address = 0x%08x\n", MappedAddress);
-   }
-   else /* kernel space */
-   {
-      MappedAddress = MmMapIoSpace(
-         TranslatedAddress,
-         NumberOfUchars,
-         MmNonCached);
-   }
-
-   if (MappedAddress != NULL)
-   {
-      if (Status)
-      {
-         *Status = NO_ERROR;
-      }
-      if ((InIoSpace & VIDEO_MEMORY_SPACE_USER_MODE) == 0)
-      {
-         AddressMapping = ExAllocatePoolWithTag(
-            PagedPool,
-            sizeof(VIDEO_PORT_ADDRESS_MAPPING),
-            TAG_VIDEO_PORT);
-
-         if (AddressMapping == NULL)
-            return MappedAddress;
-
-         RtlZeroMemory(AddressMapping, sizeof(VIDEO_PORT_ADDRESS_MAPPING));
-         AddressMapping->NumberOfUchars = NumberOfUchars;
-         AddressMapping->IoAddress = IoAddress;
-         AddressMapping->SystemIoBusNumber = DeviceExtension->SystemIoBusNumber;
-         AddressMapping->MappedAddress = MappedAddress;
-         AddressMapping->MappingCount = 1;
-         InsertHeadList(
-            &DeviceExtension->AddressMappingListHead,
-            &AddressMapping->List);
-      }
-
-      return MappedAddress;
-   }
-
-   if (Status)
-      *Status = NO_ERROR;
-
-   return NULL;
-}
-
-VOID NTAPI
-IntVideoPortUnmapMemory(
-   IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
-   IN PVOID MappedAddress)
-{
-   PVIDEO_PORT_ADDRESS_MAPPING AddressMapping;
-   PLIST_ENTRY Entry;
-   NTSTATUS Status;
-
-   Entry = DeviceExtension->AddressMappingListHead.Flink;
-   while (Entry != &DeviceExtension->AddressMappingListHead)
-   {
-      AddressMapping = CONTAINING_RECORD(
-         Entry,
-         VIDEO_PORT_ADDRESS_MAPPING,
-         List);
-      if (AddressMapping->MappedAddress == MappedAddress)
-      {
-         ASSERT(AddressMapping->MappingCount > 0);
-         AddressMapping->MappingCount--;
-         if (AddressMapping->MappingCount == 0)
-         {
-            MmUnmapIoSpace(
-               AddressMapping->MappedAddress,
-               AddressMapping->NumberOfUchars);
-            RemoveEntryList(Entry);
-            ExFreePool(AddressMapping);
-         }
-         return;
-      }
-
-      Entry = Entry->Flink;
-   }
-
-   /* If there was no kernelmode mapping for the given address found we assume
-    * that the given address is a usermode mapping and try to unmap it.
-    *
-    * FIXME: Is it ok to use NtCurrentProcess?
-    */
-   Status = ZwUnmapViewOfSection(NtCurrentProcess(), MappedAddress);
-   if (!NT_SUCCESS(Status))
-   {
-      WARN_(VIDEOPRT, "Warning: Mapping for address 0x%p not found!\n", MappedAddress);
-   }
-}
-
-/* PUBLIC FUNCTIONS ***********************************************************/
-
-/*
- * @implemented
- */
-
-PVOID NTAPI
-VideoPortGetDeviceBase(
-   IN PVOID HwDeviceExtension,
-   IN PHYSICAL_ADDRESS IoAddress,
-   IN ULONG NumberOfUchars,
-   IN UCHAR InIoSpace)
-{
-   TRACE_(VIDEOPRT, "VideoPortGetDeviceBase\n");
-   return IntVideoPortMapMemory(
-      VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension),
-      IoAddress,
-      NumberOfUchars,
-      InIoSpace,
-      NULL,
-      NULL);
-}
-
-/*
- * @implemented
- */
-
-VOID NTAPI
-VideoPortFreeDeviceBase(
-   IN PVOID HwDeviceExtension,
-   IN PVOID MappedAddress)
-{
-   TRACE_(VIDEOPRT, "VideoPortFreeDeviceBase\n");
-   IntVideoPortUnmapMemory(
-      VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension),
-      MappedAddress);
-}
-
-/*
- * @unimplemented
- */
-
-VP_STATUS NTAPI
-VideoPortMapBankedMemory(
-   IN PVOID HwDeviceExtension,
-   IN PHYSICAL_ADDRESS PhysicalAddress,
-   IN PULONG Length,
-   IN PULONG InIoSpace,
-   OUT PVOID *VirtualAddress,
-   IN ULONG BankLength,
-   IN UCHAR ReadWriteBank,
-   IN PBANKED_SECTION_ROUTINE BankRoutine,
-   IN PVOID Context)
-{
-   TRACE_(VIDEOPRT, "VideoPortMapBankedMemory\n");
-   UNIMPLEMENTED;
-   return ERROR_INVALID_FUNCTION;
-}
-
-
-/*
- * @implemented
- */
-
-VP_STATUS NTAPI
-VideoPortMapMemory(
-   IN PVOID HwDeviceExtension,
-   IN PHYSICAL_ADDRESS PhysicalAddress,
-   IN PULONG Length,
-   IN PULONG InIoSpace,
-   OUT PVOID *VirtualAddress)
-{
-   PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
-   NTSTATUS Status;
-
-   TRACE_(VIDEOPRT, "VideoPortMapMemory\n");
-   INFO_(VIDEOPRT, "- *VirtualAddress: 0x%x\n", *VirtualAddress);
-
-   DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
-   *VirtualAddress = IntVideoPortMapMemory(
-      DeviceExtension,
-      PhysicalAddress,
-      *Length,
-      *InIoSpace,
-      (HANDLE)*VirtualAddress,
-      &Status);
-
-   return Status;
-}
-
-/*
- * @implemented
- */
-
-VP_STATUS NTAPI
-VideoPortUnmapMemory(
-   IN PVOID HwDeviceExtension,
-   IN PVOID VirtualAddress,
-   IN HANDLE ProcessHandle)
-{
-   TRACE_(VIDEOPRT, "VideoPortFreeDeviceBase\n");
-
-   IntVideoPortUnmapMemory(
-      VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension),
-      VirtualAddress);
-
-   return NO_ERROR;
-}
-
-/*
- * @implemented
- */
-
-VP_STATUS NTAPI
-VideoPortGetAccessRanges(
-   IN PVOID HwDeviceExtension,
-   IN ULONG NumRequestedResources,
-   IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
-   IN ULONG NumAccessRanges,
-   IN PVIDEO_ACCESS_RANGE AccessRanges,
-   IN PVOID VendorId,
-   IN PVOID DeviceId,
-   OUT PULONG Slot)
-{
-    PCI_SLOT_NUMBER PciSlotNumber;
-    ULONG DeviceNumber;
-    ULONG FunctionNumber;
-    PCI_COMMON_CONFIG Config;
-    PCM_RESOURCE_LIST AllocatedResources;
-    NTSTATUS Status;
-    UINT AssignedCount = 0;
-    CM_FULL_RESOURCE_DESCRIPTOR *FullList;
-    CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor;
-    PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
-    PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
-    USHORT VendorIdToFind;
-    USHORT DeviceIdToFind;
-    ULONG ReturnedLength;
-    PVIDEO_ACCESS_RANGE LegacyAccessRanges;
-    ULONG LegacyAccessRangeCount;
-    PDRIVER_OBJECT DriverObject;
-    ULONG ListSize;
-    PIO_RESOURCE_REQUIREMENTS_LIST ResReqList;
-    BOOLEAN DeviceAndVendorFound = FALSE;
-    
-    TRACE_(VIDEOPRT, "VideoPortGetAccessRanges(%d, %p, %d, %p)\n", NumRequestedResources, RequestedResources, NumAccessRanges, AccessRanges);
-    
-    DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
-    DriverObject = DeviceExtension->DriverObject;
-    DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
-
-    if (NumRequestedResources == 0)
-    {
-        AllocatedResources = DeviceExtension->AllocatedResources;
-        if (AllocatedResources == NULL &&
-            DeviceExtension->AdapterInterfaceType == PCIBus)
-        {
-            if (DeviceExtension->PhysicalDeviceObject != NULL)
-            {
-                PciSlotNumber.u.AsULONG = DeviceExtension->SystemIoSlotNumber;
-                
-                ReturnedLength = HalGetBusData(PCIConfiguration,
-                                               DeviceExtension->SystemIoBusNumber,
-                                               PciSlotNumber.u.AsULONG,
-                                               &Config,
-                                               sizeof(PCI_COMMON_CONFIG));
-                
-                if (ReturnedLength != sizeof(PCI_COMMON_CONFIG))
-                {
-                    return ERROR_NOT_ENOUGH_MEMORY;
-                }
-            }
-            else
-            {
-                VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0;
-                DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0;
-                
-                if (VendorIdToFind == 0 && DeviceIdToFind == 0)
-                {
-                    /* We're screwed */
-                    return ERROR_DEV_NOT_EXIST;
-                }
-                
-                INFO_(VIDEOPRT, "Looking for VendorId 0x%04x DeviceId 0x%04x\n",
-                      VendorIdToFind, DeviceIdToFind);
-                
-                /*
-                 * Search for the device id and vendor id on this bus.
-                 */
-                for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
-                {
-                    PciSlotNumber.u.bits.DeviceNumber = DeviceNumber;
-                    for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
-                    {
-                        INFO_(VIDEOPRT, "- Function number: %d\n", FunctionNumber);
-                        PciSlotNumber.u.bits.FunctionNumber = FunctionNumber;
-                        ReturnedLength = HalGetBusData(PCIConfiguration,
-                                                       DeviceExtension->SystemIoBusNumber,
-                                                       PciSlotNumber.u.AsULONG,
-                                                       &Config,
-                                                       sizeof(PCI_COMMON_CONFIG));
-                        INFO_(VIDEOPRT, "- Length of data: %x\n", ReturnedLength);
-                        if (ReturnedLength == sizeof(PCI_COMMON_CONFIG))
-                        {
-                            INFO_(VIDEOPRT, "- Slot 0x%02x (Device %d Function %d) VendorId 0x%04x "
-                                  "DeviceId 0x%04x\n",
-                                  PciSlotNumber.u.AsULONG,
-                                  PciSlotNumber.u.bits.DeviceNumber,
-                                  PciSlotNumber.u.bits.FunctionNumber,
-                                  Config.VendorID,
-                                  Config.DeviceID);
-                            
-                            if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind) &&
-                                (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind))
-                            {
-                                DeviceAndVendorFound = TRUE;
-                                break;
-                            }
-                        }
-                    }
-                    if (DeviceAndVendorFound) break;
-                }
-                if (FunctionNumber == PCI_MAX_FUNCTION)
-                {
-                    WARN_(VIDEOPRT, "Didn't find device.\n");
-                    return ERROR_DEV_NOT_EXIST;
-                }
-            }
-            
-            Status = HalAssignSlotResources(&DeviceExtension->RegistryPath,
-                                            NULL,
-                                            DeviceExtension->DriverObject,
-                                            DeviceExtension->DriverObject->DeviceObject,
-                                            DeviceExtension->AdapterInterfaceType,
-                                            DeviceExtension->SystemIoBusNumber,
-                                            PciSlotNumber.u.AsULONG,
-                                            &AllocatedResources);
-            
-            if (!NT_SUCCESS(Status))
-            {
-                WARN_(VIDEOPRT, "HalAssignSlotResources failed with status %x.\n",Status);
-                return Status;
-            }
-            DeviceExtension->AllocatedResources = AllocatedResources;
-            DeviceExtension->SystemIoSlotNumber = PciSlotNumber.u.AsULONG;
-
-            /* Add legacy resources to the resources from HAL */
-            Status = IntVideoPortGetLegacyResources(DriverExtension, DeviceExtension,
-                                                    &LegacyAccessRanges, &LegacyAccessRangeCount);
-            if (!NT_SUCCESS(Status))
-                return ERROR_DEV_NOT_EXIST;
-
-            if (NumAccessRanges < LegacyAccessRangeCount)
-            {
-                ERR_(VIDEOPRT, "Too many legacy access ranges found\n");
-                return ERROR_NOT_ENOUGH_MEMORY;
-            }
-
-            RtlCopyMemory(AccessRanges, LegacyAccessRanges, LegacyAccessRangeCount * sizeof(VIDEO_ACCESS_RANGE));
-            AssignedCount = LegacyAccessRangeCount;
-        }
-    }
-    else
-    {
-        ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + (NumRequestedResources - 1) * sizeof(IO_RESOURCE_DESCRIPTOR);
-        ResReqList = ExAllocatePool(NonPagedPool, ListSize);
-        if (!ResReqList) return ERROR_NOT_ENOUGH_MEMORY;
-        
-        ResReqList->ListSize = ListSize;
-        ResReqList->InterfaceType = DeviceExtension->AdapterInterfaceType;
-        ResReqList->BusNumber = DeviceExtension->SystemIoBusNumber;
-        ResReqList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
-        ResReqList->AlternativeLists = 1;
-        ResReqList->List[0].Version = 1;
-        ResReqList->List[0].Revision = 1;
-        ResReqList->List[0].Count = NumRequestedResources;
-        
-        /* Copy in the caller's resource list */
-        RtlCopyMemory(ResReqList->List[0].Descriptors,
-                      RequestedResources,
-                      NumRequestedResources * sizeof(IO_RESOURCE_DESCRIPTOR));
-        
-        Status = IoAssignResources(&DeviceExtension->RegistryPath,
-                                   NULL,
-                                   DeviceExtension->DriverObject,
-                                   DeviceExtension->PhysicalDeviceObject ?
-                                   DeviceExtension->PhysicalDeviceObject :
-                                   DeviceExtension->DriverObject->DeviceObject,
-                                   ResReqList,
-                                   &AllocatedResources);
-
-        if (!NT_SUCCESS(Status))
-            return Status;
-        
-        if (!DeviceExtension->AllocatedResources)
-            DeviceExtension->AllocatedResources = AllocatedResources;
-    }
-    
-    if (AllocatedResources == NULL)
-        return ERROR_NOT_ENOUGH_MEMORY;
-    
-    /* Return the slot number if the caller wants it */
-    if (Slot != NULL) *Slot = DeviceExtension->SystemIoBusNumber;
-
-    for (FullList = AllocatedResources->List;
-         FullList < AllocatedResources->List + AllocatedResources->Count;
-         FullList++)
-    {
-        INFO_(VIDEOPRT, "InterfaceType %u BusNumber List %u Device BusNumber %u Version %u Revision %u\n", 
-              FullList->InterfaceType, FullList->BusNumber, DeviceExtension->SystemIoBusNumber, FullList->PartialResourceList.Version, FullList->PartialResourceList.Revision);
-        
-        ASSERT(FullList->InterfaceType == PCIBus);
-        ASSERT(FullList->BusNumber == DeviceExtension->SystemIoBusNumber);
-        ASSERT(1 == FullList->PartialResourceList.Version);
-        ASSERT(1 == FullList->PartialResourceList.Revision);
-        for (Descriptor = FullList->PartialResourceList.PartialDescriptors;
-             Descriptor < FullList->PartialResourceList.PartialDescriptors + FullList->PartialResourceList.Count;
-             Descriptor++)
-        {
-            if ((Descriptor->Type == CmResourceTypeMemory ||
-                 Descriptor->Type == CmResourceTypePort) &&
-                AssignedCount >= NumAccessRanges)
-            {
-                ERR_(VIDEOPRT, "Too many access ranges found\n");
-                return ERROR_NOT_ENOUGH_MEMORY;
-            }
-            if (Descriptor->Type == CmResourceTypeMemory)
-            {
-                INFO_(VIDEOPRT, "Memory range starting at 0x%08x length 0x%08x\n",
-                      Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.Length);
-                AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start;
-                AccessRanges[AssignedCount].RangeLength = Descriptor->u.Memory.Length;
-                AccessRanges[AssignedCount].RangeInIoSpace = 0;
-                AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
-                AccessRanges[AssignedCount].RangeShareable =
-                (Descriptor->ShareDisposition == CmResourceShareShared);
-                AccessRanges[AssignedCount].RangePassive = 0;
-                AssignedCount++;
-            }
-            else if (Descriptor->Type == CmResourceTypePort)
-            {
-                INFO_(VIDEOPRT, "Port range starting at 0x%04x length %d\n",
-                      Descriptor->u.Port.Start.u.LowPart, Descriptor->u.Port.Length);
-                AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start;
-                AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length;
-                AccessRanges[AssignedCount].RangeInIoSpace = 1;
-                AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
-                AccessRanges[AssignedCount].RangeShareable =
-                (Descriptor->ShareDisposition == CmResourceShareShared);
-                AccessRanges[AssignedCount].RangePassive = 0;
-                if (Descriptor->Flags & CM_RESOURCE_PORT_10_BIT_DECODE)
-                    AccessRanges[AssignedCount].RangePassive |= VIDEO_RANGE_10_BIT_DECODE;
-                if (Descriptor->Flags & CM_RESOURCE_PORT_PASSIVE_DECODE)
-                    AccessRanges[AssignedCount].RangePassive |= VIDEO_RANGE_PASSIVE_DECODE;
-                AssignedCount++;
-            }
-            else if (Descriptor->Type == CmResourceTypeInterrupt)
-            {
-                DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level;
-                DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector;
-                if (Descriptor->ShareDisposition == CmResourceShareShared)
-                    DeviceExtension->InterruptShared = TRUE;
-                else
-                    DeviceExtension->InterruptShared = FALSE;
-            }
-        }
-    }
-
-   return NO_ERROR;
-}
-
-/*
- * @implemented
- */
-
-VP_STATUS NTAPI
-VideoPortVerifyAccessRanges(
-   IN PVOID HwDeviceExtension,
-   IN ULONG NumAccessRanges,
-   IN PVIDEO_ACCESS_RANGE AccessRanges)
-{
-   PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
-   BOOLEAN ConflictDetected;
-   ULONG i;
-   PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
-   PCM_RESOURCE_LIST ResourceList;
-   ULONG ResourceListSize;
-   NTSTATUS Status;
-
-   TRACE_(VIDEOPRT, "VideoPortVerifyAccessRanges\n");
-
-   DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
-
-   /* Create the resource list */
-   ResourceListSize = sizeof(CM_RESOURCE_LIST)
-      + (NumAccessRanges - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
-   ResourceList = ExAllocatePool(PagedPool, ResourceListSize);
-   if (!ResourceList)
-   {
-      WARN_(VIDEOPRT, "ExAllocatePool() failed\n");
-      return ERROR_INVALID_PARAMETER;
-   }
-
-   /* Fill resource list */
-   ResourceList->Count = 1;
-   ResourceList->List[0].InterfaceType = DeviceExtension->AdapterInterfaceType;
-   ResourceList->List[0].BusNumber = DeviceExtension->SystemIoBusNumber;
-   ResourceList->List[0].PartialResourceList.Version = 1;
-   ResourceList->List[0].PartialResourceList.Revision = 1;
-   ResourceList->List[0].PartialResourceList.Count = NumAccessRanges;
-   for (i = 0; i < NumAccessRanges; i++, AccessRanges++)
-   {
-      PartialDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
-      if (AccessRanges->RangeInIoSpace)
-      {
-         PartialDescriptor->Type = CmResourceTypePort;
-         PartialDescriptor->u.Port.Start = AccessRanges->RangeStart;
-         PartialDescriptor->u.Port.Length = AccessRanges->RangeLength;
-      }
-      else
-      {
-         PartialDescriptor->Type = CmResourceTypeMemory;
-         PartialDescriptor->u.Memory.Start = AccessRanges->RangeStart;
-         PartialDescriptor->u.Memory.Length = AccessRanges->RangeLength;
-      }
-      if (AccessRanges->RangeShareable)
-         PartialDescriptor->ShareDisposition = CmResourceShareShared;
-      else
-         PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
-      PartialDescriptor->Flags = 0;
-      if (AccessRanges->RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
-         PartialDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
-      if (AccessRanges->RangePassive & VIDEO_RANGE_10_BIT_DECODE)
-         PartialDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
-   }
-
-   /* Try to acquire all resource ranges */
-   Status = IoReportResourceForDetection(
-      DeviceExtension->DriverObject,
-      NULL, 0, /* Driver List */
-      DeviceExtension->PhysicalDeviceObject,
-      ResourceList, ResourceListSize,
-      &ConflictDetected);
-   ExFreePool(ResourceList);
-
-   if (!NT_SUCCESS(Status) || ConflictDetected)
-      return ERROR_INVALID_PARAMETER;
-   else
-      return NO_ERROR;
-}
-
-/*
- * @unimplemented
- */
-
-VP_STATUS NTAPI
-VideoPortGetDeviceData(
-   IN PVOID HwDeviceExtension,
-   IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
-   IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
-   IN PVOID Context)
-{
-   TRACE_(VIDEOPRT, "VideoPortGetDeviceData\n");
-   UNIMPLEMENTED;
-   return ERROR_INVALID_FUNCTION;
-}
-
-/*
- * @implemented
- */
-
-PVOID NTAPI
-VideoPortAllocatePool(
-   IN PVOID HwDeviceExtension,
-   IN VP_POOL_TYPE PoolType,
-   IN SIZE_T NumberOfBytes,
-   IN ULONG Tag)
-{
-   TRACE_(VIDEOPRT, "VideoPortAllocatePool\n");
-   return ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
-}
-
-/*
- * @implemented
- */
-
-VOID NTAPI
-VideoPortFreePool(
-   IN PVOID HwDeviceExtension,
-   IN PVOID Ptr)
-{
-   ExFreePool(Ptr);
-}
-
-/*
- * @implemented
- */
-
-VP_STATUS NTAPI
-VideoPortAllocateBuffer(
-   IN PVOID HwDeviceExtension,
-   IN ULONG Size,
-   OUT PVOID *Buffer)
-{
-   TRACE_(VIDEOPRT, "VideoPortAllocateBuffer\n");
-   *Buffer = ExAllocatePoolWithTag ( PagedPool, Size, TAG_VIDEO_PORT_BUFFER ) ;
-   return *Buffer == NULL ? ERROR_NOT_ENOUGH_MEMORY : NO_ERROR;
-}
-
-/*
- * @implemented
- */
-
-VOID NTAPI
-VideoPortReleaseBuffer(
-   IN PVOID HwDeviceExtension,
-   IN PVOID Ptr)
-{
-   TRACE_(VIDEOPRT, "VideoPortReleaseBuffer\n");
-   ExFreePool(Ptr);
-}
-
-/*
- * @implemented
- */
-
-PVOID NTAPI
-VideoPortLockBuffer(
-   IN PVOID HwDeviceExtension,
-   IN PVOID BaseAddress,
-   IN ULONG Length,
-   IN VP_LOCK_OPERATION Operation)
-{
-    PMDL Mdl;
-
-    Mdl = IoAllocateMdl(BaseAddress, Length, FALSE, FALSE, NULL);
-    if (!Mdl)
-    {
-        return NULL;
-    }
-    /* FIXME use seh */
-    MmProbeAndLockPages(Mdl, KernelMode,Operation);
-    return Mdl;
-}
-
-/*
- * @implemented
- */
-
-BOOLEAN
-NTAPI
-VideoPortLockPages(
-    IN PVOID HwDeviceExtension,
-    IN OUT PVIDEO_REQUEST_PACKET pVrp,
-    IN PEVENT pUEvent,
-    IN PEVENT pDisplayEvent,
-    IN DMA_FLAGS DmaFlags)
-{
-    PVOID Buffer;
-
-    /* clear output buffer */
-    pVrp->OutputBuffer = NULL;
-
-    if (DmaFlags != VideoPortDmaInitOnly)
-    {
-        /* VideoPortKeepPagesLocked / VideoPortUnlockAfterDma is no-op */
-        return FALSE;
-    }
-
-    /* lock the buffer */
-    Buffer = VideoPortLockBuffer(HwDeviceExtension, pVrp->InputBuffer, pVrp->InputBufferLength, IoModifyAccess);
-
-    if (Buffer)
-    {
-        /* store result buffer & length */
-        pVrp->OutputBuffer = Buffer;
-        pVrp->OutputBufferLength = pVrp->InputBufferLength;
-
-        /* operation succeeded */
-        return TRUE;
-    }
-
-    /* operation failed */
-    return FALSE;
-}
-
-
-/*
- * @implemented
- */
-
-VOID NTAPI
-VideoPortUnlockBuffer(
-   IN PVOID HwDeviceExtension,
-   IN PVOID Mdl)
-{
-    if (Mdl)
-    {
-        MmUnlockPages((PMDL)Mdl);
-        IoFreeMdl(Mdl);
-    }
-}
-
-/*
- * @unimplemented
- */
-
-VP_STATUS NTAPI
-VideoPortSetTrappedEmulatorPorts(
-   IN PVOID HwDeviceExtension,
-   IN ULONG NumAccessRanges,
-   IN PVIDEO_ACCESS_RANGE AccessRange)
-{
-    UNIMPLEMENTED;
-    /* Should store the ranges in the device extension for use by ntvdm. */
-    return NO_ERROR;
-}
-
-/*
- * @implemented
- */
-
-ULONG NTAPI
-VideoPortGetBusData(
-   IN PVOID HwDeviceExtension,
-   IN BUS_DATA_TYPE BusDataType,
-   IN ULONG SlotNumber,
-   OUT PVOID Buffer,
-   IN ULONG Offset,
-   IN ULONG Length)
-{
-   PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
-
-   TRACE_(VIDEOPRT, "VideoPortGetBusData\n");
-
-   DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
-
-   if (BusDataType != Cmos)
-   {
-      /* Legacy vs. PnP behaviour */
-      if (DeviceExtension->PhysicalDeviceObject != NULL)
-         SlotNumber = DeviceExtension->SystemIoSlotNumber;
-   }
-
-   return HalGetBusDataByOffset(
-      BusDataType,
-      DeviceExtension->SystemIoBusNumber,
-      SlotNumber,
-      Buffer,
-      Offset,
-      Length);
-}
-
-/*
- * @implemented
- */
-
-ULONG NTAPI
-VideoPortSetBusData(
-   IN PVOID HwDeviceExtension,
-   IN BUS_DATA_TYPE BusDataType,
-   IN ULONG SlotNumber,
-   IN PVOID Buffer,
-   IN ULONG Offset,
-   IN ULONG Length)
-{
-   PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
-
-   TRACE_(VIDEOPRT, "VideoPortSetBusData\n");
-
-   DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
-
-   if (BusDataType != Cmos)
-   {
-      /* Legacy vs. PnP behaviour */
-      if (DeviceExtension->PhysicalDeviceObject != NULL)
-         SlotNumber = DeviceExtension->SystemIoSlotNumber;
-   }
-
-   return HalSetBusDataByOffset(
-      BusDataType,
-      DeviceExtension->SystemIoBusNumber,
-      SlotNumber,
-      Buffer,
-      Offset,
-      Length);
-}