标签:
首先通过OpenSCManager打开服务会话管理器,然后利用CreateService创建驱动所对应的服务,这个函数很重要,它涉及到了驱动的安装。它会在注册表的对应位置创建一个服务名。它相当于InstDrv中的安装按钮:
服务会创建在注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SrvName
比如disk的驱动就可以这样找到它在磁盘中的位置:
整个函数如下:
//创建驱动所对应的服务 hServiceDDK = CreateService( hServiceMgr, lpszDriverName, //驱动程序的在注册表中的名字 lpszDriverName, // 注册表驱动程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值 SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值 szDriverImagePath, // 注册表驱动程序的 ImagePath 值 NULL, //GroupOrder HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList NULL, NULL, NULL, NULL);
这个函数中有一个参数SERVICE_DEMAND_START比较值得注意,这个位置的参数有如下几种可选:
其中,SERVICE_DEMAND_START是手动启动,而前三个都是自动启动,启动优先顺序依次从上至下。
还有一个参数,就是GroupOrder,其中定义了驱动的分组,如图:
这里边越靠上的驱动启动得越早。我们肯定希望自己的驱动越早启动越好,所以要尽可能将启动方式设为自动,GroupOrder设置得要尽量早。
在CreateService之后有一个StartService
这是R3与R0交互的核心代码。先打开驱动对象:
就会得到一个Device,随后即可对其进行操作、发送命令:
ReadFile(hDevice, bufRead, 1024, &dwRead, NULL); WriteFile(hDevice, bufWrite, (wcslen(bufWrite)+1)*sizeof(WCHAR), &dwWrite, NULL); CHAR bufInput[1024] ="Hello, world"; CHAR bufOutput[1024] = {0}; DWORD dwRet = 0; WCHAR bufFileInput[1024] =L"c:\\tmp\\tmp.txt"; DeviceIoControl(hDevice, CTL_HELLO, NULL, 0, NULL, 0, &dwRet, NULL);
结合之前的sys文件,测试运行结果如下:
标签:
原文地址:http://www.cnblogs.com/predator-wang/p/5352471.html