📄 pdo.c
字号:
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 + -