📄 ioctl.c
字号:
ntStatus = t1394_BusReset( DeviceObject,
Irp,
*((PULONG)ioBuffer)
);
}
}
break; // IOCTL_BUS_RESET
case IOCTL_GET_GENERATION_COUNT:
{
TRACE(TL_TRACE, ("IOCTL_GET_GENERATION_COUNT\n"));
if (outputBufferLength < sizeof(ULONG)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
ntStatus = t1394_GetGenerationCount( DeviceObject,
Irp,
(PULONG)ioBuffer
);
if (NT_SUCCESS(ntStatus))
Irp->IoStatus.Information = outputBufferLength;
}
}
break; // IOCTL_GET_GENERATION_COUNT
case IOCTL_SEND_PHY_CONFIGURATION_PACKET:
{
TRACE(TL_TRACE, ("IOCTL_SEND_PHY_CONFIGURATION_PACKET\n"));
if (inputBufferLength < sizeof(PHY_CONFIGURATION_PACKET)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
ntStatus = t1394_SendPhyConfigurationPacket( DeviceObject,
Irp,
*(PPHY_CONFIGURATION_PACKET)ioBuffer
);
}
}
break; // IOCTL_SEND_PHY_CONFIGURATION_PACKET
case IOCTL_BUS_RESET_NOTIFICATION:
{
TRACE(TL_TRACE, ("IOCTL_BUS_RESET_NOTIFICATION\n"));
if (inputBufferLength < sizeof(ULONG)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
ntStatus = t1394_BusResetNotification( DeviceObject,
Irp,
*((PULONG)ioBuffer)
);
}
}
break; // IOCTL_BUS_RESET_NOTIFICATION
case IOCTL_SET_LOCAL_HOST_INFORMATION:
{
PSET_LOCAL_HOST_INFORMATION SetLocalHostInformation;
TRACE(TL_TRACE, ("IOCTL_SET_LOCAL_HOST_INFORMATION\n"));
if (inputBufferLength < sizeof(SET_LOCAL_HOST_INFORMATION)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
SetLocalHostInformation = (PSET_LOCAL_HOST_INFORMATION)ioBuffer;
if (inputBufferLength < (sizeof(SET_LOCAL_HOST_INFORMATION) +
SetLocalHostInformation->ulBufferSize)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
ntStatus = t1394_SetLocalHostProperties( DeviceObject,
Irp,
SetLocalHostInformation->nLevel,
(PVOID)&SetLocalHostInformation->Information
);
if (NT_SUCCESS(ntStatus))
Irp->IoStatus.Information = outputBufferLength;
}
}
}
break; // IOCTL_SET_LOCAL_HOST_INFORMATION
case IOCTL_SET_ADDRESS_DATA:
{
PSET_ADDRESS_DATA SetAddressData;
TRACE(TL_TRACE, ("IOCTL_SET_ADDRESS_DATA\n"));
if (inputBufferLength < sizeof(SET_ADDRESS_DATA)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
SetAddressData = (PSET_ADDRESS_DATA)ioBuffer;
if (inputBufferLength < (sizeof(SET_ADDRESS_DATA)+SetAddressData->nLength)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
ntStatus = t1394_SetAddressData( DeviceObject,
Irp,
SetAddressData->hAddressRange,
SetAddressData->nLength,
SetAddressData->ulOffset,
(PVOID)SetAddressData->Data
);
}
}
}
break; // IOCTL_SET_ADDRESS_DATA
case IOCTL_GET_ADDRESS_DATA:
{
PGET_ADDRESS_DATA GetAddressData;
TRACE(TL_TRACE, ("IOCTL_GET_ADDRESS_DATA\n"));
if ((inputBufferLength < sizeof(GET_ADDRESS_DATA)) ||
(outputBufferLength < sizeof(GET_ADDRESS_DATA))) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
GetAddressData = (PGET_ADDRESS_DATA)ioBuffer;
if (FAILED(ULongAdd(GetAddressData->nLength , sizeof(GET_ADDRESS_DATA) , &tempLength)) ||
(inputBufferLength < tempLength) || (outputBufferLength < tempLength)) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
ntStatus = t1394_GetAddressData( DeviceObject,
Irp,
GetAddressData->hAddressRange,
GetAddressData->nLength,
GetAddressData->ulOffset,
(PVOID)GetAddressData->Data
);
if (NT_SUCCESS(ntStatus))
Irp->IoStatus.Information = outputBufferLength;
}
}
}
break; // IOCTL_GET_ADDRESS_DATA
case IOCTL_BUS_RESET_NOTIFY: {
PBUS_RESET_IRP BusResetIrp;
KIRQL Irql;
TRACE(TL_TRACE, ("IOCTL_BUS_RESET_NOTIFY\n"));
BusResetIrp = ExAllocatePool(NonPagedPool, sizeof(BUS_RESET_IRP));
if (BusResetIrp) {
ntStatus = STATUS_PENDING;
BusResetIrp->Irp = Irp;
TRACE(TL_TRACE, ("Adding BusResetIrp->Irp = 0x%p\n", BusResetIrp->Irp));
// add the irp to the list...
KeAcquireSpinLock(&deviceExtension->ResetSpinLock, &Irql);
IoMarkIrpPending (BusResetIrp->Irp);
InsertHeadList(&deviceExtension->BusResetIrps, &BusResetIrp->BusResetIrpList);
// set the cancel routine for the irp
IoSetCancelRoutine(Irp, t1394VDev_CancelIrp);
if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL)) {
RemoveEntryList(&BusResetIrp->BusResetIrpList);
ntStatus = STATUS_CANCELLED;
}
KeReleaseSpinLock(&deviceExtension->ResetSpinLock, Irql);
// goto t1394VDev_IoControlExit on success so we don't complete the irp
if (ntStatus == STATUS_PENDING)
{
// mark it pending
IoMarkIrpPending(Irp);
goto t1394VDev_IoControlExit;
}
}
else
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
break; // IOCTL_BUS_RESET_NOTIFY
case IOCTL_GET_DIAG_VERSION:
{
PVERSION_DATA Version;
TRACE(TL_TRACE, ("IOCTL_GET_DIAG_VERSION\n"));
if ((inputBufferLength < sizeof(VERSION_DATA)) &&
(outputBufferLength < sizeof(VERSION_DATA))) {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else {
Version = (PVERSION_DATA)ioBuffer;
Version->ulVersion = DIAGNOSTIC_VERSION;
Version->ulSubVersion = DIAGNOSTIC_SUB_VERSION;
Irp->IoStatus.Information = outputBufferLength;
}
}
break; // IOCTL_GET_DIAG_VERSION
default:
TRACE(TL_ERROR, ("Invalid ioControlCode = 0x%x\n", ioControlCode));
ntStatus = STATUS_INVALID_PARAMETER;
break; // default
} // switch
break; // IRP_MJ_DEVICE_CONTROL
default:
TRACE(TL_TRACE, ("Unknown IrpSp->MajorFunction = 0x%x\n", IrpSp->MajorFunction));
// submit this to the driver below us
ntStatus = t1394_SubmitIrpAsync (deviceExtension->StackDeviceObject, Irp, NULL);
return (ntStatus);
break;
} // switch
// only complete if the device is there
if (ntStatus != STATUS_NO_SUCH_DEVICE) {
Irp->IoStatus.Status = ntStatus;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
t1394VDev_IoControlExit:
EXIT("t1394VDev_IoControl", ntStatus);
return(ntStatus);
} // t1394VDev_IoControl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -