C++ 从c+调用WDF驱动程序+;
我一直在打电话给一个样本司机。我已经编写了DriverEntry方法,在这里我初始化了驱动程序名和指向驱动程序的符号C++ 从c+调用WDF驱动程序+;,c++,c,windows,driver,wdf,C++,C,Windows,Driver,Wdf,我一直在打电话给一个样本司机。我已经编写了DriverEntry方法,在这里我初始化了驱动程序名和指向驱动程序的符号 //UNICODE\u字符串驱动器名称,SymbolName;//驱动程序注册表路径 ... //驾驶员入口点 NTSTATUS DriverEntry(PDRIVER\u对象PDRIVER对象,PUNICODE\u字符串预存路径){ Q_未使用(预分配路径); DbgPrintEx(0,0,“驱动程序已加载\n”); //PSSetLoadImageNotify例程注册提供的驱
//UNICODE\u字符串驱动器名称,SymbolName;//驱动程序注册表路径
...
//驾驶员入口点
NTSTATUS
DriverEntry(PDRIVER\u对象PDRIVER对象,PUNICODE\u字符串预存路径){
Q_未使用(预分配路径);
DbgPrintEx(0,0,“驱动程序已加载\n”);
//PSSetLoadImageNotify例程注册提供的驱动程序
//随后在任何时候通知的回调
//图像被加载(或映射到内存中)。
PSSetLoadImageNotify例程(ImageLoadCallback);
//初始化驱动程序名
RTLinitUnicode字符串(&DriverName,L“\\Device\\Explorer”);
//初始化符号链接
RTLinitUnicode字符串(&SymbolName,L“\\DosDevices\\Explorer”);
IoCreateDevice(pDriverObject,0,&SymbolName,文件\u设备\u未知,
文件\u设备\u安全\u打开、错误和pDeviceObject);
iocreatesymbolClink(&DriverName,&SymbolName);
pDriverObject->MajorFunction[IRP_MJ_CREATE]=CreateCall;
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=CloseCall;
pDriverObject->MajorFunction[IRP_MJ_设备控制]=IoControl;
pDriverObject->drivernload=UnloadDriver;
pDeviceObject->Flags |=DO_DIRECT_IO;
pDeviceObject->Flags&=~DO\u设备\u初始化;
返回状态\成功;
}
当我加载驱动程序时(使用OSR驱动程序加载器,也可以使用cmd完成,通过将驱动程序注册为新服务),我在DebugView(允许查看内核调试日志的sysinternals工具)中获得预期的输出
现在我需要确保设备和符号链接都存在于Windows对象目录中。为此,我使用WinObj(sysinternals的另一个工具),以下是输出
让我困惑的是,符号链接位于设备文件夹中,而不是全局文件夹中。
设备中的符号链接
全球范围内的设备
现在,最后,调用驱动程序本身。我用C++来实现这个目的,这是我的代码,
class Test
{
public:
HANDLE hDriver; // Handle to driver
// Initializer
Test::Test(LPCSTR RegistryPath)
{
LPCSTR path = "\\\\.\\Explorer";
hDriver = CreateFileA(path, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if (hDriver == INVALID_HANDLE_VALUE)
{
// Handle the error.
char result = GetLastError();
bool zadek = false;
}
}
问题是我不能为司机找到一个有效的把手。hDriver的值始终为0x00000000000000a0或0xffffffff,无论我使用的路径如何。我使用createFileA是因为我想访问系统内存
我犯了什么明显的错误吗 我应该说,自从我上次编写设备驱动程序以来,已经过去了8-9年,但我脑子里想的是:
hDriver
的0xa0
,这是一个有效的句柄值IRP\u MJ\u device\u控件的回调
L“\\??\\Explorer”
或L“\\GLOBAL\ \\Explorer”
获取符号链接IoCreateDevice
,您需要使用DriverName
iocreatesymbolicink
传递的参数不正确...
// initialize driver name
RtlInitUnicodeString(&DriverName, L"\\Device\\Explorer");
// initialize symbolic link
RtlInitUnicodeString(&SymbolName, L"\\??\\Explorer");
IoCreateDevice(pDriverObject, 0, &DriverName, FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
IoCreateSymbolicLink(&SymbolName, &DriverName);
...
0x00000000000000a0的值是
hDriver
的有效句柄值。