⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resource.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:

   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_NO_SYSTEM_RESOURCES;
            }
         }
         else
         {
            VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0;
            DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0;
            SlotIdToFind = Slot != NULL ? *Slot : 0;
            PciSlotNumber.u.AsULONG = SlotIdToFind;

            DPRINT("Looking for VendorId 0x%04x DeviceId 0x%04x\n",
                   VendorIdToFind, DeviceIdToFind);

            /*
             * Search for the device id and vendor id on this bus.
             */

            for (FunctionNumber = 0; FunctionNumber < 8; FunctionNumber++)
            {
               DPRINT("- Function number: %d\n", FunctionNumber);
               PciSlotNumber.u.bits.FunctionNumber = FunctionNumber;
               ReturnedLength = HalGetBusData(
                  PCIConfiguration,
                  DeviceExtension->SystemIoBusNumber,
                  PciSlotNumber.u.AsULONG,
                  &Config,
                  sizeof(PCI_COMMON_CONFIG));
               DPRINT("- Length of data: %x\n", ReturnedLength);
               if (ReturnedLength == sizeof(PCI_COMMON_CONFIG))
               {
                  DPRINT("- 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))
                  {
                     break;
                  }
               }
            }

            if (FunctionNumber == 8)
            {
               DPRINT("Didn't find device.\n");
               return ERROR_DEV_NOT_EXIST;
            }
         }

         Status = HalAssignSlotResources(
            NULL, NULL, NULL, NULL,
            DeviceExtension->AdapterInterfaceType,
            DeviceExtension->SystemIoBusNumber,
            PciSlotNumber.u.AsULONG,
            &AllocatedResources);

         if (!NT_SUCCESS(Status))
         {
            return Status;
         }
         DeviceExtension->AllocatedResources = AllocatedResources;
      }
      if (AllocatedResources == NULL)
         return ERROR_NO_SYSTEM_RESOURCES;

      AssignedCount = 0;
      for (FullList = AllocatedResources->List;
           FullList < AllocatedResources->List + AllocatedResources->Count;
           FullList++)
      {
         ASSERT(FullList->InterfaceType == PCIBus &&
                FullList->BusNumber == DeviceExtension->SystemIoBusNumber &&
                1 == FullList->PartialResourceList.Version &&
                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)
            {
               DPRINT1("Too many access ranges found\n");
               return ERROR_NO_SYSTEM_RESOURCES;
            }
            if (Descriptor->Type == CmResourceTypeMemory)
            {
               if (NumAccessRanges <= AssignedCount)
               {
                  DPRINT1("Too many access ranges found\n");
                  return ERROR_NO_SYSTEM_RESOURCES;
               }
               DPRINT("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);
               AssignedCount++;
            }
            else if (Descriptor->Type == CmResourceTypePort)
            {
               DPRINT("Port range starting at 0x%04x length %d\n",
                      Descriptor->u.Memory.Start.u.LowPart, Descriptor->u.Memory.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 = 0;
               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;
            }
         }
      }
   }
   else
   {
      UNIMPLEMENTED
   }

   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;

   DPRINT("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)
   {
      DPRINT("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)
{
   DPRINT("VideoPortGetDeviceData\n");
   UNIMPLEMENTED;
   return ERROR_CALL_NOT_IMPLEMENTED;
}

/*
 * @implemented
 */

PVOID NTAPI
VideoPortAllocatePool(
   IN PVOID HwDeviceExtension,
   IN VP_POOL_TYPE PoolType,
   IN SIZE_T NumberOfBytes,
   IN ULONG Tag)
{
   DPRINT("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)
{
   DPRINT("VideoPortAllocateBuffer\n");
   *Buffer = ExAllocatePool(PagedPool, Size);
   return *Buffer == NULL ? ERROR_NOT_ENOUGH_MEMORY : NO_ERROR;
}

/*
 * @implemented
 */

VOID NTAPI
VideoPortReleaseBuffer(
   IN PVOID HwDeviceExtension,
   IN PVOID Ptr)
{
   DPRINT("VideoPortReleaseBuffer\n");
   ExFreePool(Ptr);
}

/*
 * @unimplemented
 */

PVOID NTAPI
VideoPortLockBuffer(
   IN PVOID HwDeviceExtension,
   IN PVOID BaseAddress,
   IN ULONG Length,
   IN VP_LOCK_OPERATION Operation)
{
   DPRINT1("VideoPortLockBuffer: Unimplemented.\n");
   return NULL;
}

/*
 * @unimplemented
 */

VOID NTAPI
VideoPortUnlockBuffer(
   IN PVOID HwDeviceExtension,
   IN PVOID Mdl)
{
   DPRINT1("VideoPortUnlockBuffer: Unimplemented.\n");
}

/*
 * @unimplemented
 */

VP_STATUS NTAPI
VideoPortSetTrappedEmulatorPorts(
   IN PVOID HwDeviceExtension,
   IN ULONG NumAccessRanges,
   IN PVIDEO_ACCESS_RANGE AccessRange)
{
   DPRINT("VideoPortSetTrappedEmulatorPorts\n");
   /* 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;

   DPRINT("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;

   DPRINT("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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -