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

📄 pdo.c

📁 虚拟Scsi Disk源程序 版权归原作者
💻 C
📖 第 1 页 / 共 3 页
字号:
            else
            {
                status = STATUS_INSUFFICIENT_RESOURCES;
            }

        }
        else
        {
            status = Irp->IoStatus.Status;
        }

        break;

    case DeviceTextLocationInformation:
        status = Irp->IoStatus.Status;
        break;

    default:
        status = Irp->IoStatus.Status;
        break;
    }

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoQueryResources
//      IRP_MN_QUERY_RESOURCES handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_QUERY_RESOURCES Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoQueryResources(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;
	PCM_RESOURCE_LIST pResList;
    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

	status = Irp->IoStatus.Status;
 	pResList = (PCM_RESOURCE_LIST)(ExAllocatePoolWithTag(PagedPool,
				sizeof(CM_RESOURCE_LIST),VSCSIDISK_POOL_TAG));

	if(pResList)
	{
		// shareed busnumber resource 
		RtlZeroMemory(pResList,sizeof(CM_RESOURCE_LIST));
		pResList->Count = 1;
		pResList->List[0].BusNumber = 0;
		pResList->List[0].InterfaceType = Internal;
		pResList->List[0].PartialResourceList.Count = 1;
		pResList->List[0].PartialResourceList.Revision = 1;
		pResList->List[0].PartialResourceList.Version = 1;
		pResList->List[0].PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareShared;
		pResList->List[0].PartialResourceList.PartialDescriptors[0].Type = CmResourceTypeBusNumber;
		pResList->List[0].PartialResourceList.PartialDescriptors[0].u.BusNumber.Length = 1;
		Irp->IoStatus.Information = PtrToUlong(pResList);
	}
	else
	{
		status = STATUS_INSUFFICIENT_RESOURCES;
	}
    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoQueryResourceRequirements
//      IRP_MN_QUERY_RESOURCE_REQUIREMENTS handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_QUERY_RESOURCE_REQUIREMENTS Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoQueryResourceRequirements(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;
	PIO_RESOURCE_REQUIREMENTS_LIST pList;
    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = Irp->IoStatus.Status;
	pList = (PIO_RESOURCE_REQUIREMENTS_LIST)(
			ExAllocatePoolWithTag(PagedPool,sizeof(IO_RESOURCE_REQUIREMENTS_LIST),VSCSIDISK_POOL_TAG));

	if(pList)
	{
		RtlZeroMemory(pList,sizeof(IO_RESOURCE_REQUIREMENTS_LIST));

		pList->ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
		pList->AlternativeLists = 1;
		pList->InterfaceType = InterfaceTypeUndefined;
		pList->BusNumber = 0;
		pList->List[0].Version = 1;
		pList->List[0].Revision = 1;
		pList->List[0].Count = 1;
		pList->List[0].Descriptors[0].Option = IO_RESOURCE_PREFERRED;
		pList->List[0].Descriptors[0].ShareDisposition = CmResourceShareShared;

		pList->List[0].Descriptors[0].Type = CmResourceTypeBusNumber;
		pList->List[0].Descriptors[0].u.BusNumber.MaxBusNumber = 0x10;
		pList->List[0].Descriptors[0].u.BusNumber.Length = 1;

		Irp->IoStatus.Information = PtrToUlong(pList);
	}
	else
	{
		status = STATUS_INSUFFICIENT_RESOURCES;
	}
    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoQueryBusInformation
//      IRP_MN_QUERY_BUS_INFORMATION handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_QUERY_BUS_INFORMATION Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoQueryBusInformation(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status=STATUS_SUCCESS;
	PPNP_BUS_INFORMATION busInfo;
//	PAGED_CODE ();
    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);
//  We should NOT forward the irp,because the bus is hypothetical!
//	status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, TRUE);	
	
    busInfo = ExAllocatePoolWithTag (PagedPool, sizeof(PNP_BUS_INFORMATION),
                                        VSCSIDISK_POOL_TAG);

    if (busInfo == NULL) {
      return STATUS_INSUFFICIENT_RESOURCES;
    }

    busInfo->BusTypeGuid = GUID_OSM_MINIPORT;

    //
    // Some buses have a specific INTERFACE_TYPE value, 
    // such as PCMCIABus, PCIBus, or PNPISABus. 
    // For other buses, especially newer buses like this, the bus 
    // driver sets this member to PNPBus. 
    //

    busInfo->LegacyBusType =Internal;

    //
    // This is an hypothetical bus
    //

    busInfo->BusNumber = 0;

    Irp->IoStatus.Information = (ULONG_PTR)busInfo;
    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoDeviceUsageNotification
//      IRP_MN_DEVICE_USAGE_NOTIFICATION handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_DEVICE_USAGE_NOTIFICATION Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoDeviceUsageNotification(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, TRUE);

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoEject
//      IRP_MN_EJECT handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_EJECT Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoEject(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, TRUE);

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoReadConfig
//      IRP_MN_READ_CONFIG handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_READ_CONFIG Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoReadConfig(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, TRUE);

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoWriteConfig
//      IRP_MN_WRITE_CONFIG handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_WRITE_CONFIG Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoWriteConfig(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, TRUE);

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoSetLock
//      IRP_MN_SET_LOCK handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_SET_LOCK Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoSetLock(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, TRUE);

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoFilterResourceRequirements
//      IRP_MN_FILTER_RESOURCE_REQUIREMENTS handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_FILTER_RESOURCE_REQUIREMENTS Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoFilterResourceRequirements(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = Irp->IoStatus.Status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoPnpDeviceState
//      IRP_MN_QUERY_PNP_DEVICE_STATE handler.
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              IRP_MN_QUERY_PNP_DEVICE_STATE Irp
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoPnpDeviceState(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp
    )
{
    NTSTATUS    status;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    status = VScsiDiskPdoForwardRequestToParent(PdoExtension, Irp, FALSE);

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  VScsiDiskPdoForwardRequestToParent
//      Routine to reroute IRP from one device stack to a parent
//      device stack
//
//  Arguments:
//      IN  PdoExtension
//              PDO device extension
//
//      IN  Irp
//              irp to reroute
//
//      IN  MustHandle
//              true if device stack must handle this IRP
//              even if parent stack does not support it      
//
//  Return Value:
//      NT status code.
//
NTSTATUS VScsiDiskPdoForwardRequestToParent(
    IN  PVSCSIDISK_PDO_DEVICE_EXTENSION   PdoExtension,
    IN  PIRP                                    Irp,
    IN  BOOLEAN                                 MustHandle
    )
{
    NTSTATUS            status;
    PDEVICE_OBJECT      targetDeviceObject;
    PIRP                newIrp;
    PIO_STACK_LOCATION  irpStack;

    VScsiDiskDebugPrint(DBG_PNP, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    targetDeviceObject = IoGetAttachedDeviceReference(PdoExtension->ParentDeviceObject);

    newIrp = IoAllocateIrp(targetDeviceObject->StackSize + 1, FALSE);
    if (newIrp != NULL)
    {
        // save some parameters for our completion routine
        IoSetNextIrpStackLocation(newIrp);
        irpStack = IoGetCurrentIrpStackLocation(newIrp);
        irpStack->DeviceObject = targetDeviceObject;
        irpStack->Parameters.Others.Argument1 = Irp;

        // copy parameters from original IRP to new IRP
        irpStack = IoGetNextIrpStackLocation(newIrp);
        RtlCopyMemory(
            irpStack, 
            IoGetCurrentIrpStackLocation(Irp), 
            FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)
            );

        irpStack->Control = 0;

        // set our completion routine
        IoSetCompletionRoutine(
            newIrp,
            VScsiDiskPdoForwardComplete,
            (PVOID)MustHandle,
            TRUE,
            TRUE,
            TRUE
            );

        newIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;

        IoMarkIrpPending(Irp);
        IoCallDriver(targetDeviceObject, newIrp);

        status = STATUS_PENDING;

    }
    else
    {
        ObDereferenceObject(targetDeviceObject);

⌨️ 快捷键说明

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