¿Por qué NDisfregisterFilterDriver devuelve ndis_status_failure?
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.)
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).