首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KMDF下滤波器驱动程序

KMDF下滤波器驱动程序
EN

Stack Overflow用户
提问于 2018-01-11 13:20:48
回答 2查看 592关注 0票数 0

我正在编写一个过滤器驱动程序,并希望将过滤器附加到系统中的多个物理键盘上。如果我将筛选器附加到第一个键盘“\Device\KeyboardClass0 0”,它可以正常工作,但对另一个不起作用。对于“\ IoAttachDevice \KeyboardClass1 1”,失败。其他班级也是一样。我已经附加了3个物理键盘。

&((PDEVICE_EXTENSION)gkbdDevice->DeviceExtension)->kbdDevice); = status = IoAttachDevice(gkbdDevice,&TargetDevice,

有人能帮忙吗?

EN

回答 2

Stack Overflow用户

发布于 2018-01-12 08:01:08

使用下面的代码,我现在可以打开第二个键盘,但是..。

代码语言:javascript
复制
    /*
* Form the Device Name and symbolic name
*/
RtlInitUnicodeString(&devNameFlt, L"\\Device\\KeyboardClass0");
RtlInitUnicodeString(&devName, L"\\Device\\MultikeyboardCnt");

status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION),
    &devName,
    FILE_DEVICE_KEYBOARD,
    SYNCHRONIZE,
    FALSE,
    &pDevObj);

if (!NT_SUCCESS(status))
{
    DbgPrint("%s, IoCreateDevice failed:0x%0x\n", __FUNCTION__, status);
    return status;
}

HANDLE hFile;
OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, 0, OBJ_CASE_INSENSITIVE };
oa.ObjectName = &devNameFlt;

IO_STATUS_BLOCK iosb;
status = IoCreateFile(&hFile, SYNCHRONIZE, &oa, &iosb, 0, 0, FILE_SHARE_VALID_FLAGS, FILE_OPEN,
    0, 0, 0, CreateFileTypeNone, 0, IO_ATTACH_DEVICE);
if (!NT_SUCCESS(status))
{
    DbgPrint("%s, IoCreateFile failed to call:0x%0x\n", __FUNCTION__, status);
    return status;
}

/* Get File Object */
PFILE_OBJECT LocalFileObject;
status = ObReferenceObjectByHandle(hFile,
                                   0,
                                   *IoFileObjectType,
                                   KernelMode,
                                   (PVOID*)&LocalFileObject,
                                   NULL);

pLBKdev = IoGetRelatedDeviceObject(LocalFileObject);
DbgPrint("%s at IoCreateFile ok\n", __FUNCTION__);
ObReferenceObject(pLBKdev);

/*
* Retrieve device extension pointer from device object
*/
pDevExt = (PDEVICE_EXTENSION)pLBKdev->DeviceExtension;

status = IoAttachDeviceToDeviceStackSafe(pDevObj, pLBKdev, &pDevExt->kbdDevice);
if (status != STATUS_SUCCESS) {
    DbgPrint("IoGetDeviceObjectPointer failed with error = 0x%0x\n", status);
    goto cleanup_failure;
}

pDevObj->Flags |= DO_BUFFERED_IO;
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;

/*
* Create the symbolic link name, this is not mandatory
* but can be helpful for user mode apps to communicate
*/
status = IoCreateSymbolicLink(&symLinkNameFlt, &devNameFlt);
if (!NT_SUCCESS(status)) {
    // if it fails now, must delete Device object
    DbgPrint("IoCreateSymbolicLink failed with error = 0x%0x\n", status);
    goto cleanup_failure;
}

但是,如果我在键盘上键入一个键,常规DispatchRead就会崩溃。

票数 0
EN

Stack Overflow用户

发布于 2020-07-24 14:46:02

尝试在DO_BUFFERED_IO和~DO_DEVICE_INITIALIZING之后执行DO_BUFFERED_IO()。

代码语言:javascript
复制
pDevObj->Flags |= DO_BUFFERED_IO;
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;

status = IoAttachDeviceToDeviceStackSafe(pDevObj, pLBKdev, &pDevExt->kbdDevice);
if (status != STATUS_SUCCESS) {
    DbgPrint("IoGetDeviceObjectPointer failed with error = 0x%0x\n", status);
    goto cleanup_failure;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48208105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档