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