Пример #1
0
/************************************************************
complete the reset of a instance of the driver
************************************************************/
VOID NDIS_API
PacketResetComplete( IN NDIS_HANDLE	ProtocolBindingContext,
                     IN NDIS_STATUS	Status   )
{
    POPEN_INSTANCE		Open;
    PLIST_ENTRY			ResetListEntry;

    TRACE_ENTER( "PacketResetComplete" );
    Open = (POPEN_INSTANCE)ProtocolBindingContext;

    NdisAcquireSpinLock( &Open->ResetSpinLock );
    ResetListEntry = PacketRemoveHeadList( &Open->ResetIrpList );
    NdisReleaseSpinLock( &Open->ResetSpinLock );
    if ( ResetListEntry == NULL )
    {
        IF_VERY_LOUD( "Reset List Empty Error" );
        TRACE_LEAVE( "PacketResetComplete" );
        return;
    }

    NdisAcquireSpinLock( &Open->RequestSpinLock );
    InsertTailList( &Open->RequestList, ResetListEntry );
    NdisReleaseSpinLock( &Open->RequestSpinLock );
    TRACE_LEAVE( "PacketResetComplete" );
    return;
}
Пример #2
0
/************************************************************
Start the reset of a instance of the driver
************************************************************/
VOID
PacketReset( PNDIS_STATUS	pStatus,
             POPEN_INSTANCE	pOpen )
{
    PLIST_ENTRY	ResetListEntry;

    TRACE_ENTER( "PacketReset" );

    NdisAcquireSpinLock( &pOpen->RequestSpinLock );
    ResetListEntry = PacketRemoveHeadList( &pOpen->RequestList );
    NdisReleaseSpinLock( &pOpen->RequestSpinLock );
    if ( ResetListEntry == NULL )
    {
        *pStatus = NDIS_STATUS_RESOURCES;
        TRACE_LEAVE( "PacketReset" );
        return;
    }
    NdisAcquireSpinLock( &pOpen->ResetSpinLock );
    InsertTailList( &pOpen->ResetIrpList, ResetListEntry );
    NdisReleaseSpinLock( &pOpen->ResetSpinLock );

    /*Call NDIS to reset the adapter*/
    NdisReset( pStatus, pOpen->AdapterHandle );
    if ( *pStatus != NDIS_STATUS_PENDING )
    {
        /*synchronous reset of the adapter*/
        PacketResetComplete( pOpen, *pStatus );
    }
    TRACE_LEAVE( "PacketReset" );
    return;
}
Пример #3
0
/************************************************************
Function that allows to perform a query on a network driver
or to set the parameters of an adapter.
************************************************************/
DWORD
PacketRequest(	POPEN_INSTANCE		Open,
				DWORD  				FunctionCode,
				DWORD  				dwDDB,
				DWORD				hDevice,
				PDIOCPARAMETERS 	pDiocParms )
{
	PLIST_ENTRY       RequestListEntry;
	PINTERNAL_REQUEST	pRequest;
	PPACKET_RESERVED  pReserved;
	PPACKET_OID_DATA	OidData;
	NDIS_STATUS			Status;
	TRACE_ENTER( "Request Packet" );
	/*extract a request from the list*/
	NdisAcquireSpinLock( &Open->RequestSpinLock );
	RequestListEntry = PacketRemoveHeadList(&Open->RequestList);
	NdisReleaseSpinLock( &Open->RequestSpinLock );
	if ( RequestListEntry == NULL ) 
	{
		IF_TRACE( "Request List Error" );
		*(DWORD *)(pDiocParms->lpcbBytesReturned) = 0;
		TRACE_LEAVE( "Request Packet" );
		return NDIS_STATUS_FAILURE/*NDIS_STATUS_SUCCESS*/;
	}
	pReserved = CONTAINING_RECORD( RequestListEntry, PACKET_RESERVED, ListElement );
	pRequest  = CONTAINING_RECORD( pReserved, INTERNAL_REQUEST, Reserved );
	OidData   = (PPACKET_OID_DATA)(pDiocParms->lpvInBuffer);
	if ( ( pDiocParms->cbInBuffer == pDiocParms->cbOutBuffer )	&&
	( pDiocParms->cbInBuffer >= sizeof(PACKET_OID_DATA) - 1 + OidData->Length) ) 
	{
		pReserved->lpBuffer			= (PVOID)PacketPageLock( pDiocParms->lpvInBuffer, 
									 					 pDiocParms->cbInBuffer );
		pReserved->lpcbBytesReturned= (PVOID)PacketPageLock( (PVOID)pDiocParms->lpcbBytesReturned,
													 sizeof(DWORD) );
		pReserved->lpoOverlapped	= (PVOID)PacketPageLock( (PVOID)pDiocParms->lpoOverlapped,
													 sizeof(OVERLAPPED) );
		pReserved->cbBuffer			= pDiocParms->cbInBuffer;
		if ( FunctionCode == BIOCSETOID ) 
		{
			pRequest->Request.RequestType              						= NdisRequestSetInformation;
			pRequest->Request.DATA.SET_INFORMATION.Oid 						= OidData->Oid;
			pRequest->Request.DATA.SET_INFORMATION.InformationBufferLength	= OidData->Length;
			pRequest->Request.DATA.SET_INFORMATION.InformationBuffer 	  	= OidData->Data;
			IF_PACKETDEBUG( PACKET_DEBUG_VERY_LOUD )
			{
				IF_TRACE_MSG2( "Request Set: Oid=%08lx, Length=%08lx",
								OidData->Oid,
								OidData->Length );
			}
		} 
Пример #4
0
/************************************************************
Function that frees the pending requests
************************************************************/
VOID
PacketCleanUp(	PNDIS_STATUS	Status,
                POPEN_INSTANCE	Open )
{
    PLIST_ENTRY			PacketListEntry;
    PNDIS_PACKET   	pPacket;
    PPACKET_RESERVED  Reserved;

    TRACE_ENTER( "Cleanup" );
    /*clean all the pending requests*/
    NdisAcquireSpinLock( &(Open->RcvQSpinLock) );
    while( (PacketListEntry = PacketRemoveHeadList( &(Open->RcvList) )) != NULL )
    {
        IF_VERY_LOUD( "CleanUp - Completing read" );
        Reserved = CONTAINING_RECORD( PacketListEntry, PACKET_RESERVED, ListElement );
        pPacket  = CONTAINING_RECORD( Reserved, NDIS_PACKET, ProtocolReserved );
        /*emulate the end of a transfer to wake the processes that
        are waiting on a request */
        PacketTransferDataComplete( Open, pPacket, NDIS_STATUS_SUCCESS, 0 );
    }
    NdisReleaseSpinLock( &(Open->RcvQSpinLock) );
    TRACE_LEAVE( "Cleanup" );
    return;
}