1. 如何調用驅動功能
1 編寫調用驅動的應用程序
1.1 定義驅動設備接口,以及調用接口的控制碼
例如:
DEFINE_GUID(GUID_DEVINTERFACE_SampleDriver,\
0xc459a9ec, 0xb463, 0x4838, 0x9a, 0xd5,0xe0, 0x4a, 0x9a, 0xa2, 0xc4, 0xbe);
#define CharSample_IOCTL_800 CTL_CODE(FILE_DEVICE_UNKNOWN,0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
其中GUID_DEVINTERFACE_SampleDriver,就是創建設備時,定義的設備接口。CharSample_IOCTL_800就是定義設備控制事件隊列的
1.2 通過設備接口查詢設備路徑
PCHAR
GetDevicePath(
IN LPGUID InterfaceGuid
)
{
HDEVINFO HardwareDeviceInfo;
SP_DEVICE_INTERFACE_DATADeviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData= NULL;
ULONG Length, RequiredLength = 0;
BOOL bResult;
HardwareDeviceInfo = SetupDiGetClassDevs(
InterfaceGuid,
NULL,
NULL,
(DIGCF_PRESENT |DIGCF_DEVICEINTERFACE));
if (HardwareDeviceInfo ==INVALID_HANDLE_VALUE) {
printf("SetupDiGetClassDevsfailed!\n");
exit(1);
}
DeviceInterfaceData.cbSize =sizeof(SP_DEVICE_INTERFACE_DATA);
bResult =SetupDiEnumDeviceInterfaces(HardwareDeviceInfo,
0,
InterfaceGuid,
0,
&DeviceInterfaceData);
if (bResult == FALSE) {
/*
LPVOID lpMsgBuf;
if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&lpMsgBuf,
0,
NULL
)) {
printf("Error: %s",(LPSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
*/
printf("SetupDiEnumDeviceInterfaces failed.\n");
SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
exit(1);
}
SetupDiGetDeviceInterfaceDetail(
HardwareDeviceInfo,
&DeviceInterfaceData,
NULL,
0,
&RequiredLength,
NULL
);
DeviceInterfaceDetailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA) LocalAlloc(LMEM_FIXED, RequiredLength);
if (DeviceInterfaceDetailData == NULL) {
SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
printf("Failed to allocatememory.\n");
exit(1);
}
DeviceInterfaceDetailData->cbSize =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
Length = RequiredLength;
bResult = SetupDiGetDeviceInterfaceDetail(
HardwareDeviceInfo,
&DeviceInterfaceData,
DeviceInterfaceDetailData,
Length,
&RequiredLength,
NULL);
if (bResult == FALSE) {
/*
LPVOID lpMsgBuf;
if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPSTR) &lpMsgBuf,
0,
NULL
)) {
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK);
LocalFree(lpMsgBuf);
}
*/
printf("Error inSetupDiGetDeviceInterfaceDetail\n");
SetupDiDestroyDeviceInfoList(HardwareDeviceInfo);
LocalFree(DeviceInterfaceDetailData);
exit(1);
}
returnDeviceInterfaceDetailData->DevicePath;
}
1.3 打開設備
CreateFile這裏的路徑需要填寫設備路徑,可以通過上面的函數查到,也可以自己直接指定。
1.4 DeviceIoControl控制設備
// Call device IO Control interface(CharSample_IOCTL_800) in driver
if (!DeviceIoControl(hDevice,
CharSample_IOCTL_800,
bufInput,
1,
bufOutput,
2,
&nOutput,
NULL)
)
{
printf("ERROR:DeviceIoControl returns %0x.", GetLastError());
goto exit;
}
說明下: 這裏的CharSample_IOCTL_800就是在設備事件隊列中定義的驅動IO控制功能
1.5 CloseHandle(hDevice)
最後關閉設備就可以了