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

📄 ioctl.c

📁 1394 驱动程序源代码,有兴趣的朋友可以看看
💻 C
📖 第 1 页 / 共 4 页
字号:

                            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 + -