Beispiel #1
0
NDIS_STATUS
FilterDoInternalRequest(
    IN PNETGW_ADAPT FilterModuleContext,
    IN NDIS_REQUEST_TYPE RequestType,
    IN NDIS_OID Oid,
    IN PVOID InformationBuffer,
    IN ULONG InformationBufferLength,
    IN ULONG OutputBufferLength
)
{
    PNETGW_ADAPT pAdapter = (PNETGW_ADAPT)FilterModuleContext;
    PFILTER_REQUEST_CONTEXT pContext;
    PINTERNAL_OID_REQUEST pInternalRequest;
    PNDIS_OID_REQUEST pNdisRequest = NULL;
    NDIS_STATUS Status;

    UNREFERENCED_PARAMETER(OutputBufferLength);

    pInternalRequest = (PINTERNAL_OID_REQUEST)NdisAllocateMemoryWithTagPriority(
        pAdapter->FilterHandle, sizeof(INTERNAL_OID_REQUEST), FILTER_TAG, NormalPoolPriority);
    if (pInternalRequest == NULL)
        return NDIS_STATUS_RESOURCES;
    NdisZeroMemory(pInternalRequest, sizeof(*pInternalRequest));

    pNdisRequest = &pInternalRequest->NdisReq;
    pNdisRequest->Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
    pNdisRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_1;
    pNdisRequest->Header.Size = sizeof(NDIS_OID_REQUEST);
    pNdisRequest->RequestType = RequestType;

    pInternalRequest->bLocal = TRUE;
    pInternalRequest->pReq = pNdisRequest;
    pInternalRequest->pOrigReq = NULL;

    pContext = (PFILTER_REQUEST_CONTEXT)(&pNdisRequest->SourceReserved[0]);
    *pContext = (NDIS_OID_REQUEST*)pInternalRequest;

    pNdisRequest->Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
    pNdisRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_1;
    pNdisRequest->Header.Size = NDIS_SIZEOF_OID_REQUEST_REVISION_1;
    pNdisRequest->RequestHandle = pAdapter->FilterHandle;
    pNdisRequest->SupportedRevision = NDIS_OID_REQUEST_REVISION_1;

    switch (RequestType) {
        case NdisRequestQueryInformation:
        pNdisRequest->DATA.QUERY_INFORMATION.Oid = Oid;
        pNdisRequest->DATA.QUERY_INFORMATION.InformationBuffer =
            InformationBuffer;
        pNdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength =
            InformationBufferLength;
        break;

        case NdisRequestSetInformation:
        pNdisRequest->DATA.SET_INFORMATION.Oid = Oid;
        pNdisRequest->DATA.SET_INFORMATION.InformationBuffer =
            InformationBuffer;
        pNdisRequest->DATA.SET_INFORMATION.InformationBufferLength =
            InformationBufferLength;
        break;

        default:
        ASSERT(FALSE);
        break;
    }
    pNdisRequest->RequestId = (PVOID)FILTER_REQUEST_ID;

    Status = NdisFOidRequest(pAdapter->FilterHandle, pNdisRequest);

    if (Status != NDIS_STATUS_PENDING)
        FilterOidRequestComplete(pAdapter, pNdisRequest, Status);

    return Status;
}
Beispiel #2
0
NDIS_STATUS
FilterOidRequest(
    IN NDIS_HANDLE         FilterModuleContext,
    IN PNDIS_OID_REQUEST   Request
)
{
    PNETGW_ADAPT pAdapter = (PNETGW_ADAPT)FilterModuleContext;
    NDIS_STATUS Status = NDIS_STATUS_FAILURE;
    PNDIS_OID_REQUEST ClonedRequest = NULL;
    PFILTER_REQUEST_CONTEXT pContext = NULL;
    BOOLEAN bSubmit = FALSE;

    if (NdisRequestSetInformation == Request->RequestType ||
        NdisRequestQueryInformation == Request->RequestType) {

        if (OID_TCP_OFFLOAD_PARAMETERS == Request->DATA.QUERY_INFORMATION.Oid ||
            OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES == Request->DATA.QUERY_INFORMATION.Oid ||
            OID_TCP_OFFLOAD_CURRENT_CONFIG == Request->DATA.QUERY_INFORMATION.Oid
            ) {
            Status = NDIS_STATUS_NOT_SUPPORTED;
            goto finish;
        }
    }

    Status = NdisAllocateCloneOidRequest(pAdapter->FilterHandle,
        Request,
        FILTER_TAG,
        &ClonedRequest);

    if (Status != NDIS_STATUS_SUCCESS)
        goto finish;

    bSubmit = TRUE;

    ClonedRequest->RequestId = Request->RequestId;

    pContext = (PFILTER_REQUEST_CONTEXT)(&ClonedRequest->SourceReserved[0]);
    *pContext = (NDIS_OID_REQUEST*)&(pAdapter->m_IntReq);
    pAdapter->m_IntReq.pOrigReq = Request;
    pAdapter->m_IntReq.pReq = ClonedRequest;

    pAdapter->m_IntReq.bLocal = FALSE;
    pAdapter->m_IntReq.Status = NDIS_STATUS_PENDING;

    Status = NdisFOidRequest(pAdapter->FilterHandle, ClonedRequest);

    if (Status != NDIS_STATUS_PENDING) {
        FilterOidRequestComplete(pAdapter, ClonedRequest, Status);
        Status = NDIS_STATUS_PENDING;
    }

finish:

    if (bSubmit)
        return Status;

    switch (Request->RequestType) {
        case NdisRequestMethod:
        Request->DATA.METHOD_INFORMATION.BytesRead = 0;
        Request->DATA.METHOD_INFORMATION.BytesNeeded = 0;
        Request->DATA.METHOD_INFORMATION.BytesWritten = 0;
        break;

        case NdisRequestSetInformation:
        Request->DATA.SET_INFORMATION.BytesRead = 0;
        Request->DATA.SET_INFORMATION.BytesNeeded = 0;
        break;

        case NdisRequestQueryInformation:
        case NdisRequestQueryStatistics:

        break;
        default:
        Request->DATA.QUERY_INFORMATION.BytesWritten = 0;
        Request->DATA.QUERY_INFORMATION.BytesNeeded = 0;
        break;
    }

    return Status;
}
Beispiel #3
0
_Use_decl_annotations_
NDIS_STATUS
FilterOidRequest(
    NDIS_HANDLE         FilterModuleContext,
    PNDIS_OID_REQUEST   Request
    )
/*++

Routine Description:

    Request handler
    Handle requests from upper layers

Arguments:

    FilterModuleContext   - our filter
    Request               - the request passed down


Return Value:

     NDIS_STATUS_SUCCESS
     NDIS_STATUS_PENDING
     NDIS_STATUS_XXX

NOTE: Called at <= DISPATCH_LEVEL  (unlike a miniport's MiniportOidRequest)

--*/
{
    PMS_FILTER              pFilter = (PMS_FILTER)FilterModuleContext;
    NDIS_STATUS             Status;
    PNDIS_OID_REQUEST       ClonedRequest=NULL;
    BOOLEAN                 bSubmitted = FALSE;
    POTLWF_REQUEST_CONTEXT Context;
    BOOLEAN                 bFalse = FALSE;

    LogFuncEntryMsg(DRIVER_OID, "Request %p", Request);

    //
    // Most of the time, a filter will clone the OID request and pass down
    // the clone.  When the clone completes, the filter completes the original
    // OID request.
    //
    // If your filter needs to modify a specific request, it can modify the
    // request before or after sending down the cloned request.  Or, it can
    // complete the original request on its own without sending down any
    // clone at all.
    //
    // If your filter driver does not need to modify any OID requests, then
    // you may simply omit this routine entirely; NDIS will pass OID requests
    // down on your behalf.  This is more efficient than implementing a 
    // routine that does nothing but clone all requests, as in the sample here.
    //

    do
    {
        Status = NdisAllocateCloneOidRequest(pFilter->FilterHandle,
                                            Request,
                                            OTLWF_CLONED_OID_TAG,
                                            &ClonedRequest);
        if (Status != NDIS_STATUS_SUCCESS)
        {
            LogWarning(DRIVER_OID, "Failed to Clone Request, %!NDIS_STATUS!", Status);
            break;
        }

        Context = (POTLWF_REQUEST_CONTEXT)(&ClonedRequest->SourceReserved[0]);
        *Context = Request;

        bSubmitted = TRUE;

        //
        // Use same request ID
        //
        ClonedRequest->RequestId = Request->RequestId;

        pFilter->PendingOidRequest = ClonedRequest;

        LogVerbose(DRIVER_OID, "Sending (cloned) Oid Request %p", ClonedRequest);

        Status = NdisFOidRequest(pFilter->FilterHandle, ClonedRequest);

        if (Status != NDIS_STATUS_PENDING)
        {
            FilterOidRequestComplete(pFilter, ClonedRequest, Status);
            Status = NDIS_STATUS_PENDING;
        }

    } while(bFalse);

    if (bSubmitted == FALSE)
    {
        switch(Request->RequestType)
        {
            case NdisRequestMethod:
                Request->DATA.METHOD_INFORMATION.BytesRead = 0;
                Request->DATA.METHOD_INFORMATION.BytesNeeded = 0;
                Request->DATA.METHOD_INFORMATION.BytesWritten = 0;
                break;

            case NdisRequestSetInformation:
                Request->DATA.SET_INFORMATION.BytesRead = 0;
                Request->DATA.SET_INFORMATION.BytesNeeded = 0;
                break;

            case NdisRequestQueryInformation:
            case NdisRequestQueryStatistics:
            default:
                Request->DATA.QUERY_INFORMATION.BytesWritten = 0;
                Request->DATA.QUERY_INFORMATION.BytesNeeded = 0;
                break;
        }

    }

    LogFuncExitNDIS(DRIVER_OID, Status);

    return Status;
}