2

我一直在尝试调用示例驱动程序。我已经编写了 DriverEntry 方法,在该方法中我初始化了驱动程序名称和指向驱动程序的符号 ling。

// UNICODE_STRING DriverName, SymbolName; // Driver registry paths
...
    // Driver Entrypoint
    NTSTATUS
    DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) {
  Q_UNUSED(pRegistryPath);

  DbgPrintEx(0, 0, "Driver Loaded\n");

  // The PsSetLoadImageNotifyRoutine routine registers a driver-supplied
  // callback that is subsequently notified whenever
  // an image is loaded (or mapped into memory).
  PsSetLoadImageNotifyRoutine(ImageLoadCallback);

  // initialize driver name
  RtlInitUnicodeString(&DriverName, L"\\Device\\Explorer");
  // initialize symbolic link
  RtlInitUnicodeString(&SymbolName, L"\\DosDevices\\Explorer");

  IoCreateDevice(pDriverObject, 0, &SymbolName, FILE_DEVICE_UNKNOWN,
                 FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
  IoCreateSymbolicLink(&DriverName, &SymbolName);

  pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCall;
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCall;
  pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoControl;
  pDriverObject->DriverUnload = UnloadDriver;

  pDeviceObject->Flags |= DO_DIRECT_IO;
  pDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

  return STATUS_SUCCESS;
}

当我加载驱动程序时(使用 OSR Driver Loader,也可以使用 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 是因为我想访问系统内存。

我犯了什么明显的错误吗?

4

1 回答 1

2

我应该说距离我上次编写设备驱动程序已有 8 到 9 年了,但我脑海中浮现的是:

  1. 你说你得到0xa0hDriver一个有效的句柄值。
  2. 目前,您只能使用设备 IO 控制,因为您只有IRP_MJ_DEVICE_CONTROL.
  3. 尝试L"\\??\\Explorer"L"\\GLOBAL??\\Explorer"用于符号链接。
  4. 您需要DriverName使用IoCreateDevice.
  5. 您将不正确的参数传递给IoCreateSymbolicLink.

所以你的代码应该变成这样:

...
// 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);
...
于 2019-02-22T17:53:55.010 回答