Pregunta

Estoy tratando de escribir un conductor de filtro intermedio de NDIS, pero estoy atascado antes de que suceda algo.

Mi código aún no hace nada, más allá de intentar registrar el controlador de filtro:

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;
}

Todas las demás funciones están vacías (excepto algún código de rastreo).Ellos no importan aquí.

ndisfregisterfilterdriver siempre devuelve ndis_status_failure.La documentación haceNo describe por qué esto puede suceder. (No debería ser un problema con el archivo .inf, como lo he intentado con una copia literal del controlador de muestra del DDK.)

¿Fue útil?

Solución

I don't see anything wrong with the code you've posted. Is MIP_UNIQUE_NAME defined to be identical to the NetCfgInstanceId from the INF? (Incidentally, remember to generate a new GUID different from the sample GUID — I've seen collisions, and it's not pretty).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top