Tag: ioctl

C#联盟结构编组

我正在尝试将Video4Linux集成到我的托管应用程序中。 事实上,我已经宣布了所有必需的结构和相对的ioctl 。 在这个问题中,我提出了两个ioctl : SetFormat和GetFormat ; 虽然前者工作得很好(就像我实际使用的那样),但后者却让我记忆力不好。 GetFormat ioctl实际上正在执行,但是一旦应用程序访问ioctl参数(调试器或我的应用程序本身),它总是会崩溃以下堆栈: System.NullReferenceException: … at System.String.mempy4(…) in :0 at System.String.memcpy(…) in :0 at Derm.Platform.Video4Linux.ControlGetFormat(…) in … 我对p /调用ioctl进行了一些调查,再一次,我无法理解为什么我的应用程序崩溃了。 我怀疑它是由于结构内存布局,但我无法解释为什么SetFormat工作而GetFormat不工作(因为他们使用相同的参数)。 我必须P / Invoke接收/返回结构v4l2_format的ioctl例程: struct v4l2_format { enum v4l2_buf_type type; union { struct v4l2_pix_format pix; /* V4L2_BUF_TYPE_VIDEO_CAPTURE */ struct v4l2_pix_format_mplane pix_mp; /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ struct v4l2_window win; /* V4L2_BUF_TYPE_VIDEO_OVERLAY […]

使用IOCTL_DVD_ *控制代码从C#调用DeviceIoControl

我试图从C#调用DeviceIoControl用于IOCTL_DVD_*控制代码。 阅读了大量信息并尝试了一些例子后,我没有取得多大进展。 我最终要做的是获取DVD_LAYER_DESCRIPTOR结构,了解当前DVD驱动器中的媒体。 我可以在DVD设备上成功调用CreateFile ,但是当我尝试使用控制代码IOCTL_DVD_START_SESSION调用DeviceIoControl ,它返回成功代码,但我似乎没有成功恢复sessionId值,总是返回0.(并且任何尝试我然后尝试使用IOCTL_DVD_READ_STRUCTURE获取图层描述失败,即函数失败或返回成功但是给出一个空白的输出结构。) 在找到一些进行类似调用的C代码后,我能够编译这段代码(使用Visual C ++ 2008 Express Edition),并且它成功地能够启动会话,读取DVD_LAYER_DESCRIPTOR ,并且没有问题地关闭会话,所以我知道这有效。 C#问题似乎与如何定义外部函数和编组参数有关。 以及如何定义传递和返回的各种结构。 我已经查看了www.pinvoke.net他们如何定义它,并使用了一些给出的示例代码和定义,但仍然具有上述相同的问题。 部分问题似乎是每个IOCTL控制代码的参数都不同,主要是结构,但对于IOCTL_DVD_START_SESSION ,输出值是32位整数。 如何定义C#中的extern方法来处理这些不同的情况? 另外,使用正确大小的成员类型定义的各种结构显示它们在C和C#代码之间的大小不同,但各个成员的大小相同??? 如果我使用像DeviceIOView这样的程序并观察IOCTL_DVD_START_SESSION的C代码和C#代码IOCTL_DVD_START_SESSION则C版本返回一个3的sessionid,并且当运行C#代码时,DeviceIOView显示发回的数据也是3所以似乎是返回参数的某种编组问题,因为我们在C#代码中只看到0 有没有人有任何想法或工作示例代码如何从C#调用DeviceIoControl来访问DVD信息? (显示应如何定义和使用结构和function。)非常感谢任何指向有用网站或其他建议的链接。 (在Visual C#2008 Express Edition,.NET 3.5中开发。) N Johns 示例代码(已添加) using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; using System.IO; using System.Threading; namespace Example { class Program { static void […]

物理磁盘大小不正确(IoCtlDiskGetDriveGeometry)

我使用下面的代码来获取物理磁盘大小 ,但返回的大小不正确。 我用其他工具检查了尺寸。 以下代码报告 总磁盘空间: 8.249.955.840字节 它应该是 总磁盘空间: 8.254.390.272字节 如何检索实际/正确的物理磁盘大小? 在USB驱动器和普通硬盘上测试。 代码很长,这里将它分开来显示。 结构: [StructLayout(LayoutKind.Sequential)] internal struct DiskGeometry { public long Cylinders; public int MediaType; public int TracksPerCylinder; public int SectorsPerTrack; public int BytesPerSector; } 原生方法: internal static class NativeMethods { [DllImport(“Kernel32.dll”, SetLastError=true, CharSet=CharSet.Auto)] public static extern SafeFileHandle CreateFile( string fileName, uint fileAccess, uint fileShare, IntPtr […]