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)
后面没什么说的了,