windows - 为什么 NdisFRegisterFilterDriver 返回 NDIS_STATUS_FAILURE?

标签 windows kernel ndis

我正在尝试编写一个 NDIS 中间过滤器驱动程序,但在任何事情发生之前我都卡住了。

除了尝试注册过滤器驱动程序之外,我的代码还没有做任何事情:

NTSTATUS 
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
NDIS_FILTER_DRIVER_CHARACTERISTICS FChars;
NDIS_STRING ServiceName, UniqueName, FriendlyName;
NDIS_STATUS Status;

UNUSED(RegistryPath);

g_FilterObject = DriverObject;

RtlInitUnicodeString(&ServiceName, MIP_SERVICE_NAME);
RtlInitUnicodeString(&FriendlyName, MIP_FRIENDLY_NAME);
RtlInitUnicodeString(&UniqueName, MIP_UNIQUE_NAME);

NdisZeroMemory(&FChars, sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS));

FChars.Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS;
FChars.Header.Size = sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS);
FChars.Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_1;
FChars.MajorNdisVersion = 6;
FChars.MinorNdisVersion = 0;
FChars.MajorDriverVersion = 1;
FChars.MinorDriverVersion = 0;
FChars.Flags = 0;

FChars.FriendlyName = FriendlyName;
FChars.UniqueName = UniqueName;
FChars.ServiceName = ServiceName;

FChars.AttachHandler = FilterAttach;
FChars.DetachHandler = FilterDetach;
FChars.RestartHandler = FilterRestart;
FChars.PauseHandler = FilterPause;

FChars.SetOptionsHandler = FilterRegisterOptions;
FChars.SetFilterModuleOptionsHandler = FilterSetModuleOptions;

FChars.SendNetBufferListsHandler = FilterSend;
FChars.ReturnNetBufferListsHandler = FilterReturnNetBufferLists;
FChars.SendNetBufferListsCompleteHandler = FilterSendComplete;
FChars.ReceiveNetBufferListsHandler = FilterReceive;
FChars.CancelSendNetBufferListsHandler = FilterCancelSend;

FChars.DevicePnPEventNotifyHandler = FilterDevicePnPEvent;
FChars.NetPnPEventHandler = FilterNetPnPEvent;
FChars.StatusHandler = FilterStatus;

DriverObject->DriverUnload = FilterUnload;

Status = NdisFRegisterFilterDriver(DriverObject,
        (NDIS_HANDLE)g_FilterObject,
        &FChars,
        &g_FilterHandle);
if (Status != NDIS_STATUS_SUCCESS)
{
    MDBG("Failed to register filter driver %x", Status);
    return Status;
}

return NDIS_STATUS_SUCCESS;
}

所有其他函数都是空的(除了一些跟踪代码)。它们在这里无关紧要。

NdisFRegisterFilterDriver 总是返回 NDIS_STATUS_FAILURE。 documentation没有描述为什么会发生这种情况。 (这不应该是 .inf 文件的问题,因为我已经尝试使用 DDK 中示例驱动程序的文字副本。)

最佳答案

我没有发现您发布的代码有任何问题。 MIP_UNIQUE_NAME 是否定义为与 INF 中的 NetCfgInstanceId 相同? (顺便说一下,请记住生成一个与示例 GUID 不同的新 GUID — 我已经看到了冲突,但它并不漂亮)。

关于windows - 为什么 NdisFRegisterFilterDriver 返回 NDIS_STATUS_FAILURE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025765/

相关文章:

c - 查找内核数据结构的内存地址

windows - 通过 WSL2 在 Ubuntu 上调整 qcow2 图像的大小? libguestfs-tools virt-resize 无法读取内核

javascript - 在 Node js 中创建桌面应用程序会让我的代码面临公开的危险吗?

c - 内核模块中未声明的变量

Windows驱动程序开发

c++ - NDIS版本与Windows版本的兼容性问题

windows - NDIS 协议(protocol)驱动程序(WinPcap 的 npf.sys)是否可以移植到 LWF 或 WFP?

c++ - 在 Windows 环境中从 C 或 C++ 访问 COM 接口(interface)

windows - 错误 0xc000007b 尝试绕行注入(inject) DLL 时

linux - Linux 中的多个硬件定时器