📄 isochapi.c
字号:
NextIrpStack = IoGetNextIrpStackLocation(Irp);
NextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
NextIrpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_1394_CLASS;
NextIrpStack->Parameters.Others.Argument1 = pIrb;
IoSetCompletionRoutine( Irp,
t1394Diag_IsochAttachCompletionRoutine,
pIsochDetachData,
TRUE,
TRUE,
TRUE
);
IoCallDriver(deviceExtension->StackDeviceObject, Irp);
Exit_IsochAttachBuffers:
if (ntStatus == STATUS_INSUFFICIENT_RESOURCES) {
KeReleaseSpinLock(&deviceExtension->IsochSpinLock, Irql);
}
EXIT("t1394Diag_IsochAttachBuffers", ntStatus);
return(STATUS_PENDING);
} // t1394Diag_IsochAttachBuffers
NTSTATUS
t1394Diag_IsochDetachBuffers(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN HANDLE hResource,
IN ULONG nNumberOfDescriptors,
IN PISOCH_DESCRIPTOR IsochDescriptor
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ULONG i;
ENTER("");
TRACE(TL_TRACE, ("hResource = 0x%x\n", hResource));
TRACE(TL_TRACE, ("nNumberOfDescriptors = 0x%x\n", nNumberOfDescriptors));
TRACE(TL_TRACE, ("IsochDescriptor = 0x%x\n", IsochDescriptor));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochDetachBuffers;
} // if
pIrb->FunctionNumber = REQUEST_ISOCH_DETACH_BUFFERS;
pIrb->Flags = 0;
pIrb->u.IsochDetachBuffers.hResource = hResource;
pIrb->u.IsochDetachBuffers.nNumberOfDescriptors = nNumberOfDescriptors;
pIrb->u.IsochDetachBuffers.pIsochDescriptor = IsochDescriptor;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (!NT_SUCCESS(ntStatus)) {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
if (pIrb)
ExFreePool(pIrb);
for (i=0; i<nNumberOfDescriptors; i++)
ExFreePool(IsochDescriptor[i].Mdl);
ExFreePool(IsochDescriptor);
Exit_IsochDetachBuffers:
EXIT("t1394Diag_IsochDetachBuffers", ntStatus);
return(ntStatus);
} // t1394Diag_IsochDetachBuffers
NTSTATUS
t1394Diag_IsochFreeBandwidth(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN HANDLE hBandwidth
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ENTER("t1394Diag_IsochFreeBandwidth");
TRACE(TL_TRACE, ("hBandwidth = 0x%x\n", hBandwidth));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochFreeBandwidth;
} // if
pIrb->FunctionNumber = REQUEST_ISOCH_FREE_BANDWIDTH;
pIrb->Flags = 0;
pIrb->u.IsochFreeBandwidth.hBandwidth = hBandwidth;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (!NT_SUCCESS(ntStatus)) {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
ExFreePool(pIrb);
Exit_IsochFreeBandwidth:
EXIT("t1394Diag_IsochFreeBandwidth", ntStatus);
return(ntStatus);
} // t1394Diag_IsochFreeBandwidth
NTSTATUS
t1394Diag_IsochFreeChannel(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG nChannel
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ENTER("t1394Diag_IsochFreeChannel");
TRACE(TL_TRACE, ("nChannel = 0x%x\n", nChannel));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochFreeChannel;
} // if
pIrb->FunctionNumber = REQUEST_ISOCH_FREE_CHANNEL;
pIrb->Flags = 0;
pIrb->u.IsochFreeChannel.nChannel = nChannel;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (!NT_SUCCESS(ntStatus)) {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
ExFreePool(pIrb);
Exit_IsochFreeChannel:
EXIT("t1394Diag_IsochFreeChannel", ntStatus);
return(ntStatus);
} // t1394Diag_IsochFreeChannel
NTSTATUS
t1394Diag_IsochFreeResources(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN HANDLE hResource
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
PISOCH_RESOURCE_DATA IsochResourceData;
KIRQL Irql;
ENTER("t1394Diag_IsochFreeResources");
TRACE(TL_TRACE, ("hResource = 0x%x\n", hResource));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochFreeResources;
} // if
// remove this one from our list...
KeAcquireSpinLock(&deviceExtension->IsochResourceSpinLock, &Irql);
IsochResourceData = (PISOCH_RESOURCE_DATA)deviceExtension->IsochResourceData.Flink;
while (IsochResourceData) {
TRACE(TL_TRACE, ("Removing hResource = 0x%x\n", hResource));
if (IsochResourceData->hResource == hResource) {
RemoveEntryList(&IsochResourceData->IsochResourceList);
ExFreePool(IsochResourceData);
break;
}
else if (IsochResourceData->IsochResourceList.Flink == &deviceExtension->IsochResourceData) {
break;
}
else
IsochResourceData = (PISOCH_RESOURCE_DATA)IsochResourceData->IsochResourceList.Flink;
}
KeReleaseSpinLock(&deviceExtension->IsochResourceSpinLock, Irql);
pIrb->FunctionNumber = REQUEST_ISOCH_FREE_RESOURCES;
pIrb->Flags = 0;
pIrb->u.IsochFreeResources.hResource = hResource;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (!NT_SUCCESS(ntStatus)) {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
ExFreePool(pIrb);
Exit_IsochFreeResources:
EXIT("t1394Diag_IsochFreeResources", ntStatus);
return(ntStatus);
} // t1394Diag_IsochFreeResources
NTSTATUS
t1394Diag_IsochListen(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN HANDLE hResource,
IN ULONG fulFlags,
IN CYCLE_TIME StartTime
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ENTER("t1394Diag_IsochListen");
TRACE(TL_TRACE, ("hResource = 0x%x\n", hResource));
TRACE(TL_TRACE, ("fulFlags = 0x%x\n", fulFlags));
TRACE(TL_TRACE, ("StartTime.CL_CycleOffset = 0x%x\n", StartTime.CL_CycleOffset));
TRACE(TL_TRACE, ("StartTime.CL_CycleCount = 0x%x\n", StartTime.CL_CycleCount));
TRACE(TL_TRACE, ("StartTime.CL_SecondCount = 0x%x\n", StartTime.CL_SecondCount));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochListen;
} // if
pIrb->FunctionNumber = REQUEST_ISOCH_LISTEN;
pIrb->Flags = 0;
pIrb->u.IsochListen.hResource = hResource;
pIrb->u.IsochListen.fulFlags = fulFlags;
pIrb->u.IsochListen.StartTime = StartTime;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (!NT_SUCCESS(ntStatus)) {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
ExFreePool(pIrb);
Exit_IsochListen:
EXIT("t1394Diag_IsochListen", ntStatus);
return(ntStatus);
} // t1394Diag_IsochListen
NTSTATUS
t1394Diag_IsochQueryCurrentCycleTime(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
OUT PCYCLE_TIME pCurrentCycleTime
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ENTER("t1394Diag_IsochQueryCurrentCycleTime");
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochQueryCurrentCycleTime;
} // if
pIrb->FunctionNumber = REQUEST_ISOCH_QUERY_CYCLE_TIME;
pIrb->Flags = 0;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (NT_SUCCESS(ntStatus)) {
*pCurrentCycleTime = pIrb->u.IsochQueryCurrentCycleTime.CycleTime;
TRACE(TL_TRACE, ("CurrentCycleTime.CL_CycleOffset = 0x%x\n", pCurrentCycleTime->CL_CycleOffset));
TRACE(TL_TRACE, ("CurrentCycleTime.CL_CycleCount = 0x%x\n", pCurrentCycleTime->CL_CycleCount));
TRACE(TL_TRACE, ("CurrentCycleTime.CL_SecondCount = 0x%x\n", pCurrentCycleTime->CL_SecondCount));
}
else {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
ExFreePool(pIrb);
Exit_IsochQueryCurrentCycleTime:
EXIT("t1394Diag_IsochQueryCurrentCycleTime", ntStatus);
return(ntStatus);
} // t1394Diag_IsochQueryCurrentCycleTime
NTSTATUS
t1394Diag_IsochQueryResources(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN ULONG fulSpeed,
OUT PULONG pBytesPerFrameAvailable,
OUT PLARGE_INTEGER pChannelsAvailable
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ENTER("t1394Diag_IsochQueryResources");
TRACE(TL_TRACE, ("fulSpeed = 0x%x\n", fulSpeed));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
if (!pIrb) {
TRACE(TL_ERROR, ("Failed to allocate pIrb!\n"));
TRAP;
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
goto Exit_IsochQueryResources;
} // if
pIrb->FunctionNumber = REQUEST_ISOCH_QUERY_RESOURCES;
pIrb->Flags = 0;
pIrb->u.IsochQueryResources.fulSpeed = fulSpeed;
ntStatus = t1394Diag_SubmitIrpSynch(deviceExtension->StackDeviceObject, Irp, pIrb);
if (NT_SUCCESS(ntStatus)) {
*pBytesPerFrameAvailable = pIrb->u.IsochQueryResources.BytesPerFrameAvailable;
*pChannelsAvailable = pIrb->u.IsochQueryResources.ChannelsAvailable;
TRACE(TL_TRACE, ("BytesPerFrameAvailable = 0x%x\n", *pBytesPerFrameAvailable));
TRACE(TL_TRACE, ("ChannelsAvailable.LowPart = 0x%x\n", pChannelsAvailable->LowPart));
TRACE(TL_TRACE, ("ChannelsAvailable.HighPart = 0x%x\n", pChannelsAvailable->HighPart));
}
else {
TRACE(TL_ERROR, ("SubmitIrpSync failed = 0x%x\n", ntStatus));
TRAP;
}
ExFreePool(pIrb);
Exit_IsochQueryResources:
EXIT("t1394Diag_IsochQueryResources", ntStatus);
return(ntStatus);
} // t1394Diag_IsochQueryResources
NTSTATUS
t1394Diag_IsochSetChannelBandwidth(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN HANDLE hBandwidth,
IN ULONG nMaxBytesPerFrame
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
PIRB pIrb;
ENTER("t1394Diag_IsochSetChannelBandwidth");
TRACE(TL_TRACE, ("hBandwidth = 0x%x\n", hBandwidth));
TRACE(TL_TRACE, ("nMaxBytesPerFrame = 0x%x\n", nMaxBytesPerFrame));
pIrb = ExAllocatePool(NonPagedPool, sizeof(IRB));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -