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

📄 ioctl.c

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

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

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

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochAllocateResources = (PISOCH_ALLOCATE_RESOURCES)ioBuffer;

                            ntStatus = t1394Diag_IsochAllocateResources( DeviceObject,
                                                                         Irp,
                                                                         IsochAllocateResources->fulSpeed,
                                                                         IsochAllocateResources->fulFlags,
                                                                         IsochAllocateResources->nChannel,
                                                                         IsochAllocateResources->nMaxBytesPerFrame,
                                                                         IsochAllocateResources->nNumberOfBuffers,
                                                                         IsochAllocateResources->nMaxBufferSize,
                                                                         IsochAllocateResources->nQuadletsToStrip,
                                                                         &IsochAllocateResources->hResource
                                                                         );

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

                case IOCTL_ISOCH_ATTACH_BUFFERS:
                    {
                        PISOCH_ATTACH_BUFFERS       IsochAttachBuffers;

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

                        if (inputBufferLength < (sizeof(ISOCH_ATTACH_BUFFERS)+sizeof(RING3_ISOCH_DESCRIPTOR))) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochAttachBuffers = (PISOCH_ATTACH_BUFFERS)ioBuffer;

                            if (outputBufferLength < (sizeof(ISOCH_ATTACH_BUFFERS) + 
                                (sizeof(RING3_ISOCH_DESCRIPTOR)*IsochAttachBuffers->nNumberOfDescriptors))) {

                                ntStatus = STATUS_BUFFER_TOO_SMALL;
                            }
                            else {

                                ntStatus = t1394Diag_IsochAttachBuffers( DeviceObject,
                                                                         Irp,
                                                                         outputBufferLength,
                                                                         IsochAttachBuffers->hResource,
                                                                         IsochAttachBuffers->nNumberOfDescriptors,
                                                                         (PISOCH_DESCRIPTOR)IsochAttachBuffers->pIsochDescriptor,
                                                                         (PRING3_ISOCH_DESCRIPTOR)&IsochAttachBuffers->R3_IsochDescriptor
                                                                         );

                                if (ntStatus == STATUS_PENDING)
                                    goto t1394Diag_IoControlExit;
                            }
                        }
                    }
                    break; // IOCTL_ISOCH_ATTACH_BUFFERS

                case IOCTL_ISOCH_DETACH_BUFFERS:
                    {
                        PISOCH_DETACH_BUFFERS       IsochDetachBuffers;

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

                        if (inputBufferLength < sizeof(ISOCH_DETACH_BUFFERS)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochDetachBuffers = (PISOCH_DETACH_BUFFERS)ioBuffer;

                            ntStatus = t1394Diag_IsochDetachBuffers( DeviceObject,
                                                                     Irp,
                                                                     IsochDetachBuffers->hResource,
                                                                     IsochDetachBuffers->nNumberOfDescriptors,
                                                                     (PISOCH_DESCRIPTOR)IsochDetachBuffers->pIsochDescriptor
                                                                     );
                        }
                    }

                    break; // IOCTL_ISOCH_DETACH_BUFFERS

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

                        if (inputBufferLength < sizeof(HANDLE)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            ntStatus = t1394Diag_IsochFreeBandwidth( DeviceObject,
                                                                     Irp,
                                                                     *(PHANDLE)ioBuffer
                                                                     );
                        }
                    }
                    break; // IOCTL_ISOCH_FREE_BANDWIDTH
  
                case IOCTL_ISOCH_FREE_CHANNEL:
                    {
                        TRACE(TL_TRACE, ("IOCTL_ISOCH_FREE_CHANNEL\n"));

                        if (inputBufferLength < sizeof(ULONG)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            ntStatus = t1394Diag_IsochFreeChannel( DeviceObject,
                                                                   Irp,
                                                                   *(PULONG)ioBuffer
                                                                   );
                        }
                    }
                    break; // IOCTL_ISOCH_FREE_CHANNEL
  
                case IOCTL_ISOCH_FREE_RESOURCES:
                    {
                        TRACE(TL_TRACE, ("IOCTL_ISOCH_FREE_RESOURCES\n"));

                        if (inputBufferLength < sizeof(HANDLE)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            ntStatus = t1394Diag_IsochFreeResources( DeviceObject,
                                                                     Irp,
                                                                     *(PHANDLE)ioBuffer
                                                                     );
                        }
                    }
                    break; // IOCTL_ISOCH_FREE_RESOURCES

                case IOCTL_ISOCH_LISTEN:
                    {
                        PISOCH_LISTEN       IsochListen;

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

                        if (inputBufferLength < sizeof(ISOCH_LISTEN)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochListen = (PISOCH_LISTEN)ioBuffer;

                            ntStatus = t1394Diag_IsochListen( DeviceObject,
                                                              Irp,
                                                              IsochListen->hResource,
                                                              IsochListen->fulFlags,
                                                              IsochListen->StartTime
                                                              );
                        }
                    }
                    break; // IOCTL_ISOCH_LISTEN

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

                        if (outputBufferLength < sizeof(CYCLE_TIME)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            ntStatus = t1394Diag_IsochQueryCurrentCycleTime( DeviceObject,
                                                                             Irp,
                                                                             (PCYCLE_TIME)ioBuffer
                                                                             );

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

                case IOCTL_ISOCH_QUERY_RESOURCES:
                    {
                        PISOCH_QUERY_RESOURCES      IsochQueryResources;

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

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

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochQueryResources = (PISOCH_QUERY_RESOURCES)ioBuffer;

                            ntStatus = t1394Diag_IsochQueryResources( DeviceObject,
                                                                      Irp,
                                                                      IsochQueryResources->fulSpeed,
                                                                      &IsochQueryResources->BytesPerFrameAvailable,
                                                                      &IsochQueryResources->ChannelsAvailable
                                                                      );

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

                case IOCTL_ISOCH_SET_CHANNEL_BANDWIDTH:
                    {
                        PISOCH_SET_CHANNEL_BANDWIDTH    IsochSetChannelBandwidth;

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

                        if (inputBufferLength < sizeof(ISOCH_SET_CHANNEL_BANDWIDTH)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochSetChannelBandwidth = (PISOCH_SET_CHANNEL_BANDWIDTH)ioBuffer;

                            ntStatus = t1394Diag_IsochSetChannelBandwidth( DeviceObject,
                                                                           Irp,
                                                                           IsochSetChannelBandwidth->hBandwidth,
                                                                           IsochSetChannelBandwidth->nMaxBytesPerFrame
                                                                           );
                        }
                    }
                    break; // IOCTL_ISOCH_SET_CHANNEL_BANDWIDTH

                case IOCTL_ISOCH_STOP:
                    {
                        PISOCH_STOP     IsochStop;

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

                        if (inputBufferLength < sizeof(ISOCH_STOP)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochStop = (PISOCH_STOP)ioBuffer;

                            ntStatus = t1394Diag_IsochStop( DeviceObject,
                                                            Irp,
                                                            IsochStop->hResource,
                                                            IsochStop->fulFlags
                                                            );
                        }
                    }
                    break; // IOCTL_ISOCH_STOP

                case IOCTL_ISOCH_TALK:
                    {
                        PISOCH_TALK     IsochTalk;

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

                        if (inputBufferLength < sizeof(ISOCH_TALK)) {

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            IsochTalk = (PISOCH_TALK)ioBuffer;

                            ntStatus = t1394Diag_IsochTalk( DeviceObject,
                                                            Irp,
                                                            IsochTalk->hResource,
                                                            IsochTalk->fulFlags,
                                                            IsochTalk->StartTime
                                                            );
                        }
                    }
                    break; // IOCTL_ISOCH_TALK

                case IOCTL_GET_LOCAL_HOST_INFORMATION:
                    {
                        PGET_LOCAL_HOST_INFORMATION     GetLocalHostInformation;

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

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

                            ntStatus = STATUS_BUFFER_TOO_SMALL;
                        }
                        else {

                            GetLocalHostInformation = (PGET_LOCAL_HOST_INFORMATION)ioBuffer;

                            ntStatus = t1394Diag_GetLocalHostInformation( DeviceObject,
                                                                          Irp,
                                                                          GetLocalHostInformation->nLevel,
                                                                          &GetLocalHostInformation->Status,
                                                                          (PVOID)GetLocalHostInformation->Information
                                                                          );

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

                case IOCTL_GET_1394_ADDRESS_FROM_DEVICE_OBJECT:
                    {
                        PGET_1394_ADDRESS   Get1394Address;

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

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

                            ntStatus = STATUS_BUFFER_TOO_SMALL;

⌨️ 快捷键说明

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