C#调用WinApi?

2023-12-13

我正在尝试调用 WinAPI 函数DeviceIoControl在 C# 中使用代码IOCTL_DISK_SET_DISK_ATTRIBUTES并传递结构SET_DISK_ATTRIBUTES。我正在尝试用这段代码来做到这一点:

const uint GENERIC_READ = 0x80000000;
const uint GENERIC_WRITE = 0x40000000;
const int FILE_SHARE_READ = 0x1;
const int FILE_SHARE_WRITE = 0x2;

const uint IOCTL_DISK_SET_DISK_ATTRIBUTES = 0x0007c0f4;
const ulong DISK_ATTRIBUTE_READ_ONLY = 0x0000000000000002;

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr CreateFile(
    string lpFileName,
    uint dwDesiredAccess,
    uint dwShareMode,
    IntPtr SecurityAttributes,
    uint dwCreationDisposition,
    uint dwFlagsAndAttributes,
    IntPtr hTemplateFile
);

[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool DeviceIoControl(
    IntPtr hDevice,
    uint dwIoControlCode,
    IntPtr lpInBuffer,
    uint nInBufferSize,
    IntPtr lpOutBuffer,
    uint nOutBufferSize,
    out uint lpBytesReturned,
    IntPtr lpOverlapped
);

struct SET_DISK_ATTRIBUTES
{
    public uint Version;
    public bool Persist;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] Reserved1;
    public ulong Attributes;
    public ulong AttributesMask;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public uint[] Reserved2;
};

private bool SetReadonly(IntPtr handle)
{
    var sda = new SET_DISK_ATTRIBUTES();
    sda.AttributesMask = DISK_ATTRIBUTE_READ_ONLY;
    sda.Attributes = DISK_ATTRIBUTE_READ_ONLY;

    int nPtrQryBytes = Marshal.SizeOf(sda);
    sda.Version = (uint)nPtrQryBytes;

    IntPtr ptrQuery = Marshal.AllocHGlobal(nPtrQryBytes);
    Marshal.StructureToPtr(sda, ptrQuery, false);

    uint byteReturned;
    var res = DeviceIoControl(handle, IOCTL_DISK_SET_DISK_ATTRIBUTES, ptrQuery, (uint)nPtrQryBytes, IntPtr.Zero, 0, out byteReturned, IntPtr.Zero);

    var ex = new Win32Exception(Marshal.GetLastWin32Error());
    MessageBox.Show(ex.Message);

    return res;
}

我收到错误“参数不正确”。正确的打电话方式是什么DeviceIoControl函数传递结构SET_DISK_ATTRIBUTES?


原来的定义SET_DISK_ATTRIBUTES:

typedef struct _SET_DISK_ATTRIBUTES {
  DWORD     Version;
  BOOLEAN   Persist;
  BYTE      Reserved1[3];
  DWORDLONG Attributes;
  DWORDLONG AttributesMask;
  DWORD     Reserved2[4];
} SET_DISK_ATTRIBUTES, *PSET_DISK_ATTRIBUTES;

利用BOOLEAN数据类型,即defined作为同义词unsigned char(1 个字节),而不是BOOL这是一个同义词int(4字节)。

C#'s bool编组为BOOL默认情况下。
你需要强制将其变成一个字节:

{
    ...
    [MarshalAs(UnmanagedType.I1)]
    public bool Persist;
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#调用WinApi? 的相关文章

随机推荐

  • 在 Accordion 中一次打开一个选项卡

    我有一个工作得很好的手风琴 但我需要的是一次只打开一个选项卡 这意味着当打开一个选项卡时 应该关闭另一个选项卡 目前您可以看到我们可以通过单击选项卡链接来打开所有选项卡 代码在这里 accordion gt li gt span click
  • 为了防止性能问题,“滚动链接定位效果”的替代方案是什么?

    我在 Firefox 中收到以下警告 该网站似乎使用了滚动链接定位效果 这可能不适用于异步平移 看https developer mozilla org docs Mozilla Performance ScrollLinkedEffect
  • 复制到剪贴板的图像在 Linux 上不会保留

    我正在尝试将图像保存到系统剪贴板 所以我编写了一些如下代码 usr bin python3 from PyQt5 Qt import QApplication from PyQt5 QtWidgets import QWidget QPus
  • 当父进程被杀死时,使用 fork() 创建的子进程是否会自动被杀死?

    我正在创建子进程fork 在 C C 中 当父进程结束 或由于某种原因被杀死 时 我希望所有子进程也被杀死 这是系统自动完成的吗 还是我必须自己做 先前存在的类似问题 当父进程退出时 如何使子进程退出 如何让子进程在父进程退出后终止 不会
  • iPhone 模拟器在应用程序启动时崩溃

    升级到 Lion 和 XCode 4 1 后 我在使用 iPhone 模拟器时遇到了一些问题 当我启动 4 0 4 1 或 4 2 的模拟器 我从 Time Machine 恢复 时 我得到一个EXC BAD ACCESS几乎立即出现错误
  • 在Python中每n个项目分割一个生成器/迭代器(splitEvery)

    我正在尝试用 Python 编写 Haskell 函数 splitEvery 这是它的定义 splitEvery Int gt e gt e splitEvery n splits a list into length n pieces T
  • pygame精灵墙碰撞[重复]

    这个问题在这里已经有答案了 我正在用 python 和 pygame 开发一个平台游戏 完整代码可以在 https github com C Kimber FBLA Game 我遇到的问题是玩家精灵和墙壁精灵之间的碰撞 特别是角落 当玩家按
  • 术语查找机制可以通过id以外的其他字段查询吗?

    这里是elasticsearch官网关于术语的介绍 https www elastic co guide en elasticsearch reference 2 1 query dsl terms query html 正如我们所看到的
  • 使用 JavaScript 检查浏览器 CSS 属性支持?

    JavaScript 是否可以知道客户端浏览器是否支持 CSS 属性 我说的是CSS3的旋转属性 我只想在浏览器支持的情况下执行某些功能 我相信你可以这样做 if WebkitTransform in document body style
  • 如何手动验证模型的属性?

    我有一堂课叫User和一个财产Name public class User Required public string Name get set 我想验证它 如果有任何错误添加到控制器的ModelState或实例化另一个模型状态 Http
  • 通过互联网的 RMI iiop

    我正在尝试获取 OracleRMI IIOP 示例工作 但我在 Netbeans 中执行此操作时遇到问题 我的代码如下 界面 import java rmi Remote import java rmi RemoteException pu
  • 为什么在 while 循环之后我只获得最后一行值?

    这是我正在阅读的文件 Log1 Time Src id Des id Address 0 34 56 x9870 2 36 58 x9872 4 38 60 x9874 6 40 62 x9876 8 42 64 x9878 Log2 Ti
  • 如何将 FacesMessage 从支持 bean 附加到 ui:repeat 中的特定字段?

    我有一个具有可变数量输入元素的表单 如下所示
  • 创建文件后发生文件共享冲突?

    因此 我尝试创建一个 txt 文件 然后向其中写入一些愚蠢的数据 但我遇到了共享违规 我感觉这可能是因为我试图在创建文件后直接为其创建 StreamWriter 但这没有意义 所以我有点失落 我已经尝试删除类中除错误行之外的所有其他 Str
  • PHP 脚本不会在后台运行

    我正在尝试在后台运行 php CLI 脚本 但它无法运行 它的状态为 已停止 SIGTOU 尝试写入输出 以下是详细信息 Mac OS X Lion 10 7 2 PHP 5 3 6 与 Suhosin Patch cli 构建时间 201
  • 为什么我的 CodeIgniter 表单验证不起作用?

    我正在尝试在使用表单助手创建的简单联系表单上设置验证 根本不会发生任何验证 怎么了 在下面的代码中 无论在表单中输入什么内容 good 关键字始终显示 并且从不显示通过 set value 设置的保存值 控制器 Contact functi
  • CasperJS 不能要求下划线

    我在用着CasperJS运行自动化前端测试 但在我的测试中使用其他 npm 模块时遇到了问题 我知道patchRequire但是我相信这只能在测试环境之外调用 因为测试运行程序补丁会自动需要 我确实包含了它 但结果是一样的 它说找不到该模块
  • 更改 JavaScript Prompt() 显示的格式和文本?

    我正在使用 JavaScriptprompt 功能 var favorite prompt What is your favorite color RED 我使用的是 IE 7 打开的提示框有一个标题栏 上面写着 资源管理器用户提示 还有更
  • constexpr 与 const 对比 constexpr const

    变量上的 const 与 constexpr 这家伙关于 constexpr 的说法是正确的if double被使用 或float当然 但是 如果您将 var 类型更改为double对于像 int char 等整数类型 一切正常 为什么会发
  • C#调用WinApi?

    我正在尝试调用 WinAPI 函数DeviceIoControl在 C 中使用代码IOCTL DISK SET DISK ATTRIBUTES并传递结构SET DISK ATTRIBUTES 我正在尝试用这段代码来做到这一点 const u