C++ 从c+调用WDF驱动程序+;

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例程注册提供的驱

我一直在打电话给一个样本司机。我已经编写了DriverEntry方法,在这里我初始化了驱动程序名和指向驱动程序的符号

//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
    ,这是一个有效的句柄值
  • 现在,您只能使用设备IO控件,因为您只有
    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
    的有效句柄值。