C#调用SYS驱动的一些坑

C# 调用sys驱动整理的一些坑
OpenSCManager
CreateService
OpenService
StartService
上面几个API用于加载驱动,网上一大堆教程不再描述~
加载后。直接CreateFile 创建设备我在VS里面 建议直接用CreateFile不要去纠结用CreateFileA还是CreateFileW,因为我试过了。编码不一样的,具体可百度了解。CreateFile会根据你的编码自行选择CreateFileA还是CreateFileW。

 hDriver =  WinAPI.CreateFile(names, DESIREDACCESS.GENERIC_READ | DESIREDACCESS.GENERIC_WRITE,
                            0,
                            0,
                            CREATIONDISPOSITION.OPEN_EXISTING,
                            FLAGSANDATTRIBUTES.FILE_ATTRIBUTE_NORMAL,
                            0);

需要注意的是第3个参数和第7个参数。第三个参数xp系统里面 直接用0,后面的系统好像是要改成共享读写的。第七个参数选择的默认,一般来说 选默认就行了,网上很多教程用的选择的 叠加(可能是系统原因。我也没怎么研究)。
这个也没什么说的,
最后重点来了:

WinAPI.DeviceIoControl(hDriver, IOCTL_GET_PROCESS_INFO, inpProcInfo, 10u, ref outpProcInfo, 10u, ref dwRet2, IntPtr.Zero)

第二个参数,可以理解成操作码,一般来说是0x801、0x802这样但是C# 里面直接传入 肯定是错的,因为他根据读写权限等会计算一个新的值。
C++代码中这样写的(一般看这文章的,不对 一般也没人看 就当做笔记吧)

IOCTL_GET_PROCESS_INFO = (ULONG) CTL_CODE(SYS_DEVICE_TYPE, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)

计算结果是
2236420(十进制 你也可以转成16进制 不影响,别问我是怎么计算的,我也不知道怎么给你们描述)
2236420 = (ULONG) CTL_CODE(SYS_DEVICE_TYPE, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
2236424 = (ULONG) CTL_CODE(SYS_DEVICE_TYPE, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

第三个参数,就是要传递的值了。也有可能 不需要。我们传的是PID。 但是如果直接传了PID的值,又凉凉了,
要传递的是一个byte[] 数组,实不相瞒 如果直接BitConverter的话 又GG了,
坑死人为啥。因为这个byte数组 一位代表的 一个字符的byte值
比如PID等于1001 那么这个byte里面的值应该是31,30,30,31,0,0,0,…
所以

  public void getULong(ref byte[] buff,uint pid)
   {
          
            char[] tmp= id.ToString().ToCharArray();
            if (tmp.Length > buff.Length)
                return;
            for (int i =0;i<tmp.Length;i++)
            {
                buff[i] =(byte)tmp[ii];
            }

   }

static byte[] inpProcInfo = new byte[10];

getULong(ref inpProcInfo ,PID)
后面没什么说的了,

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值