reactos操作系统实现(114)

PciIdeXAddDevice函数是用来添加PCIIDEX的设备,设置一个功能设备,并读取PCI总线的配置参数。具体实现代码如下:

#001 NTSTATUS NTAPI

#002 PciIdeXAddDevice(

#003 IN PDRIVER_OBJECT DriverObject,

#004 IN PDEVICE_OBJECT Pdo)

#005 {

#006 PPCIIDEX_DRIVER_EXTENSION DriverExtension;

#007 PFDO_DEVICE_EXTENSION DeviceExtension;

#008 PDEVICE_OBJECT Fdo;

#009 ULONG BytesRead;

#010 PCI_COMMON_CONfig PciConfig;

#011 NTSTATUS Status;

#012

#013 DPRINT("PciIdeXAddDevice(%p %p)/n",DriverObject,Pdo);

#014

获取扩展设备对象。

#015 DriverExtension = IoGetDriverObjectExtension(DriverObject,DriverObject);

#016 ASSERT(DriverExtension);

#017

创建一个总线功能设备对象。

#018 Status = IoCreateDevice(

#019 DriverObject,

#020 sizeof(FDO_DEVICE_EXTENSION) + DriverExtension->MiniControllerExtensionSize,

#021 NULL,

#022 FILE_DEVICE_BUS_EXTENDER,

#023 FILE_DEVICE_SECURE_OPEN,

#024 TRUE,

#025 &Fdo);

#026 if (!NT_SUCCESS(Status))

#027 {

#028 DPRINT("IoCreateDevice() Failed with status 0x%08lx/n",Status);

#029 return Status;

#030 }

#031

清空功能设备对象扩展结构。

#032 DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;

#033 RtlZeroMemory(DeviceExtension,sizeof(FDO_DEVICE_EXTENSION));

#034

设置这是一个功能设备对象。

#035 DeviceExtension->Common.IsFDO = TRUE;

#036

设置功能设备到物理设备栈里,这里绑定了功能和物理设备,同时把这个设备保存到低级设备里DeviceExtension->LowerDevice,以后就可以通过这个来访问物理设备。

#037 Status = IoAttachDevicetoDeviceStackSafe(Fdo,Pdo,&DeviceExtension->LowerDevice);

#038 if (!NT_SUCCESS(Status))

#039 {

#040 DPRINT("IoAttachDevicetoDeviceStackSafe() Failed with status 0x%08lx/n",Status);

#041 return Status;

#042 }

#043

设置驱动程序可以通过接口来访问PCI总线的函数

#044 Status = GetBusInterface(DeviceExtension);

#045 if (!NT_SUCCESS(Status))

#046 {

#047 DPRINT("GetBusInterface() Failed with status 0x%08lx/n",Status);

#048 IoDetachDevice(DeviceExtension->LowerDevice);

#049 return Status;

#050 }

#051

通过PCI总线函数读取PCI的配置。

#052 BytesRead = (*DeviceExtension->BusInterface->GetBusData)(

#053 DeviceExtension->BusInterface->Context,

#054 PCI_WHICHSPACE_CONfig,

#055 &PciConfig,

#056 0,

#057 PCI_COMMON_HDR_LENGTH);

#058 if (BytesRead != PCI_COMMON_HDR_LENGTH)

#059 {

#060 DPRINT("BusInterface->GetBusData() Failed()/n");

#061 ReleaseBusInterface(DeviceExtension);

#062 IoDetachDevice(DeviceExtension->LowerDevice);

#063 return STATUS_IO_DEVICE_ERROR;

#064 }

#065

保存PCI配置厂家号和设备号。

#066 DeviceExtension->vendorId = PciConfig.vendorID;

#067 DeviceExtension->deviceid = PciConfig.deviceid;

#068

#069 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;

#070

#071 return STATUS_SUCCESS;

#072}

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...