Почему NdisFRegisterFilterDriver возвращает NDIS_STATUS_FAILURE? - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь написать драйвер промежуточного фильтра 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.Документация не описывает, почему это может произойти.(Это не должно быть проблемой с файлом .inf, как я пытался с буквальной копией примера драйвера из DDK.)

1 Ответ

3 голосов
/ 27 января 2012

Я не вижу ничего плохого в размещенном вами коде. MIP_UNIQUE_NAME определен, чтобы быть идентичным с NetCfgInstanceId из INF? (Кстати, не забудьте сгенерировать новый GUID, отличный от образца GUID - я видел столкновения, и это не красиво).

...