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

📄 ioctl.c

📁 关于1394diag的资料和源代码的实例
💻 C
📖 第 1 页 / 共 3 页
字号:
                        }
                        else {

                            Get1394Address = (PGET_1394_ADDRESS)ioBuffer;

                            ntStatus = t1394Diag_Get1394AddressFromDeviceObject( DeviceObject,
                                                                                 Irp,
                                                                                 Get1394Address->fulFlags,
                                                                                 &Get1394Address->NodeAddress
                                                                                 );

                            if (NT_SUCCESS(ntStatus))
                                Irp->IoStatus.Information = outputBufferLength;
                        }
                    }
                    break; // IOCTL_GET_1394_ADDRESS_FROM_DEVICE_OBJECT

                case IOCTL_CONTROL:
                    TRACE(TL_TRACE, ("IOCTL_CONTROL\n"));

                    ntStatus = t1394Diag_Control( DeviceObject,
                                                  Irp
                                                  );

                    break; // IOCTL_CONTROL

                case IOCTL_GET_MAX_SPEED_BETWEEN_DEVICES:
                    {
                        PGET_MAX_SPEED_BETWEEN_DEVICES  MaxSpeedBetweenDevices;

                        TRACE(TL_TRACE, ("IOCTL_GET_MAX_SPEED_BETWEEN_DEVICES\n"));

                        if ((inputBufferLength < sizeof(GET_MAX_SPEED_BETWEEN_DEVICES)) ||
                            (outputBufferLength < sizeof(GET_MAX_SPEED_BETWEEN_DEVICES))) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            MaxSpeedBetweenDevices = (PGET_MAX_SPEED_BETWEEN_DEVICES)ioBuffer;

                            ntStatus = t1394Diag_GetMaxSpeedBetweenDevices( DeviceObject,
                                                                            Irp,
                                                                            MaxSpeedBetweenDevices->fulFlags,
                                                                            MaxSpeedBetweenDevices->ulNumberOfDestinations,
                                                                            (PVOID)MaxSpeedBetweenDevices->hDestinationDeviceObjects[64],
                                                                            &MaxSpeedBetweenDevices->fulSpeed
                                                                            );

                            if (NT_SUCCESS(ntStatus))
                                Irp->IoStatus.Information = outputBufferLength;
                        }
                    }                    
                    break; // IOCTL_GET_MAX_SPEED_BETWEEN_DEVICES

                case IOCTL_SET_DEVICE_XMIT_PROPERTIES:
                    {
                        PDEVICE_XMIT_PROPERTIES     DeviceXmitProperties;

                        TRACE(TL_TRACE, ("IOCTL_SET_DEVICE_XMIT_PROPERTIES\n"));

                        if (inputBufferLength < sizeof(DEVICE_XMIT_PROPERTIES)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            DeviceXmitProperties = (PDEVICE_XMIT_PROPERTIES)ioBuffer;

                            ntStatus = t1394Diag_SetDeviceXmitProperties( DeviceObject,
                                                                          Irp,
                                                                          DeviceXmitProperties->fulSpeed,
                                                                          DeviceXmitProperties->fulPriority
                                                                          );
                        }
                    }
                    break; // IOCTL_SET_DEVICE_XMIT_PROPERTIES

                case IOCTL_GET_CONFIGURATION_INFORMATION:
                    TRACE(TL_TRACE, ("IOCTL_GET_CONFIGURATION_INFORMATION\n"));

                    ntStatus = t1394Diag_GetConfigurationInformation( DeviceObject,
                                                                      Irp
                                                                      );

                    break; // IOCTL_GET_CONFIGURATION_INFORMATION

                case IOCTL_BUS_RESET:
                    {
                        TRACE(TL_TRACE, ("IOCTL_BUS_RESET\n"));

                        if (inputBufferLength < sizeof(ULONG)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            ntStatus = t1394Diag_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 = t1394Diag_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 = t1394Diag_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 = t1394Diag_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 = t1394Diag_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 = t1394Diag_SetAddressData( DeviceObject,
                                                                     Irp,
                                                                     SetAddressData->hAddressRange,
                                                                     SetAddressData->nLength,
                                                                     SetAddressData->ulOffset,
                                                                     (PVOID)&SetAddressData->Data
                                                                     );
                            }
                        }
                    }
                    break; // IOCTL_SET_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) {

                        // mark it pending
                        IoMarkIrpPending(Irp);
                        ntStatus = Irp->IoStatus.Status = STATUS_PENDING;
                        BusResetIrp->Irp = Irp;

                        TRACE(TL_TRACE, ("Adding BusResetIrp->Irp = 0x%x\n", BusResetIrp->Irp));

                        // add the irp to the list...
                        KeAcquireSpinLock(&deviceExtension->ResetSpinLock, &Irql);

                        InsertHeadList(&deviceExtension->BusResetIrps, &BusResetIrp->BusResetIrpList);

                        // set the cancel routine for the irp
                        IoSetCancelRoutine(Irp, t1394Diag_CancelIrp);

                        if (Irp->Cancel && IoSetCancelRoutine(Irp, t1394Diag_CancelIrp)) {

                            RemoveEntryList(&BusResetIrp->BusResetIrpList);
                            ntStatus = STATUS_CANCELLED;
                        }

                        KeReleaseSpinLock(&deviceExtension->ResetSpinLock, Irql);

                        // goto t1394Diag_IoControlExit on success so we don't complete the irp
                        if (ntStatus == STATUS_PENDING)
                            goto t1394Diag_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));
                    TRAP;

                    ntStatus = STATUS_INVALID_PARAMETER;
                    break; // default

            } // switch

            break; // IRP_MJ_DEVICE_CONTROL

        default:
            TRACE(TL_TRACE, ("Unknown IrpSp->MajorFunction = 0x%x\n", IrpSp->MajorFunction));

            ntStatus = STATUS_INVALID_PARAMETER;
            break;

    } // switch

    // only complete if the device is there
    if (ntStatus != STATUS_NO_SUCH_DEVICE) {
    
        Irp->IoStatus.Status = ntStatus;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
    }

t1394Diag_IoControlExit:

    EXIT("t1394Diag_IoControl", ntStatus);
    return(ntStatus);
} // t1394Diag_IoControl


⌨️ 快捷键说明

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