利用文件IO相关的Wn32API对设备进行“打开”和“关闭”操作。要打开设备,必须通过设备的名字才能得到该设备的柄。前面介绍过,每个设备都有设备名称,如HelloDDK驱动程序的设备名为“Device\\MyDDKDevice”,但是设备名无法被用户模式下的应用程序查询到,设备名只能被内核模式下的程序査询到。
在应用程序中,设备可以通过符号链接进行访问。驱动程序通过loCreateSymbolicLink函数创建符号链接。HelloDDK驱动程序的设备所对应的符号链接是“\??\HelloDDK"。在编写程序时,符号链接的写法需要稍微改一下,将前面的“\??\”改为“\\.\”。因此符号链接“\??\HelloDDK”就变成了“\\.\HelloDDK”,写成C语言的字符串就是“\\\\.\\HelloDDK"。
下面的代码演示了如何利用 CreateFile 来打开设备句柄,以及如何利用 CloseHandle
关闭设备句柄。在打开和关闭设备句柄的时候,操作系统内部会创建IRP,并将IRP发送相应的派遣函数中。
#include <windows.h>
#include <stdio.h>
int main()
{
// 打开设备句柄,会触发IRP_MJ_CREATE
HANDLE hDevice =
CreateFile(L"\\\\.\\HelloDDK",
GENERIC_READ | GENERIC_WRITE,
0, // 非共享
NULL, //没有使用安全描述符
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL); // 没有模板
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("Failed to obtain fiel handle to deive:%s with win32 error code: %d\n",
"MYWDMDevice", GetLastError());
return 1;
}
CloseHandle(hDevice);
return 0;
}