控制台程序“IddSampleApp”
因为我对C++只能算的上一知半解,所以我一开始认知“IddSampleApp”也是驱动,后来发现这个程序的入口函数与驱动的入口函数不同,所以就新建了一个控制台程序试了下,然后就成功运行了。
自己新建的控制台程序可能会报错“无法解析的外部符号 SwDeviceClose、无法解析的外部符号 SwDeviceCreate”的错误,这是因为么有为swdevice.h添加输入swdevice.lib。
添加后应该就能生成了。
代码:
#include <iostream>
#include <vector>
#include <windows.h>
#include <swdevice.h>
#include <conio.h>
#include <wrl.h>
VOID WINAPI
CreationCallback(
_In_ HSWDEVICE hSwDevice,
_In_ HRESULT hrCreateResult,
_In_opt_ PVOID pContext,
_In_opt_ PCWSTR pszDeviceInstanceId
)
{
HANDLE hEvent = *(HANDLE*)pContext;
SetEvent(hEvent);
UNREFERENCED_PARAMETER(hSwDevice);
UNREFERENCED_PARAMETER(hrCreateResult);
UNREFERENCED_PARAMETER(pszDeviceInstanceId);
}
int __cdecl main(int argc, wchar_t *argv[])
{
//告诉编译器,已经使用了该变量,不必检测警告!
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
//创建一个事件
HANDLE hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
//软件设备的HSWDEVICE句柄
HSWDEVICE hSwDevice;
//描述PnP用于创建软件设备的信息 https://docs.microsoft.com/en-us/windows/win32/api/swdevicedef/ns-swdevicedef-sw_device_create_info
SW_DEVICE_CREATE_INFO createInfo = { 0 };
PCWSTR description = L"Idd Sample Driver";
// 这些与inf文件中的Pnp ID匹配,用于匹配驱动程序
PCWSTR instanceId = L"IddSampleDriver";
PCWSTR hardwareIds = L"IddSampleDriver\0\0";
PCWSTR compatibleIds = L"IddSampleDriver\0\0";
createInfo.cbSize = sizeof(createInfo);
createInfo.pszzCompatibleIds = compatibleIds;
createInfo.pszInstanceId = instanceId;
createInfo.pszzHardwareIds = hardwareIds;
createInfo.pszDeviceDescription = description;
createInfo.CapabilityFlags =
SWDeviceCapabilitiesRemovable |
SWDeviceCapabilitiesSilentInstall |
SWDeviceCapabilitiesDriverRequired;
// 创建软设备
HRESULT hr = SwDeviceCreate(L"IddSampleDriver",
L"HTREE\\ROOT\\0",
&createInfo,
0,
nullptr,
CreationCallback,
&hEvent,
&hSwDevice);
//判断创建的结果
if (FAILED(hr))
{
printf("SwDeviceCreate失败,原因为 0x%lx\n", hr);
return 1;
}
// 等待回调以表明设备已创建
printf("等待设备创建....\n");
DWORD waitResult = WaitForSingleObject(hEvent, 10 * 1000);
if (waitResult != WAIT_OBJECT_0)
{
printf("等待设备创建失败\n");
return 1;
}
printf("设备已创建\n\n");
// 现在等待用户指示设备应停止
printf("按“ x”退出并销毁软件设备\n");
bool bExit = false;
do
{
//等待按键
int key = _getch();
if (key == 'x' || key == 'X')
{
bExit = true;
}
} while (!bExit);
//停止设备
SwDeviceClose(hSwDevice);
return 0;
}