📄 openclos.c
字号:
IF_TRACE_MSG( "PACKET_RESERVED_b :%lx",sizeof(PACKET_RESERVED));
if ( nsErrorStatus != NDIS_STATUS_SUCCESS )
{
IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus );
NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) , 0 );
*Status = NDIS_STATUS_RESOURCES;
TRACE_LEAVE( "BindAdapter" );
return;
}
/*allocate a pool for the packet data*/
NdisAllocateBufferPool( &nsErrorStatus,
&(oiNew->BufferPool),
TRANSMIT_PACKETS );
if ( nsErrorStatus != NDIS_STATUS_SUCCESS )
{
IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus );
NdisFreePacketPool( oiNew->PacketPool );
NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) , 0 );
*Status = NDIS_STATUS_RESOURCES;
TRACE_LEAVE( "BindAdapter" );
return;
}
NdisAllocateSpinLock( &(oiNew->ResetSpinLock) );
InitializeListHead( &(oiNew->ResetIrpList) );
NdisAllocateSpinLock( &(oiNew->RcvQSpinLock) );
InitializeListHead( &(oiNew->RcvList) );
NdisAllocateSpinLock( &(oiNew->RequestSpinLock) );
InitializeListHead( &(oiNew->RequestList) );
for ( i=0;i<MAX_REQUESTS;i++ )
{
InsertTailList( &(oiNew->RequestList), &(oiNew->Requests[i].Reserved.ListElement) );
}
oiNew->Status = NDIS_STATUS_PENDING;
oiNew->BindAdapterContext = BindAdapterContext;
/*open the MAC driver calling NDIS*/
oiNew->hDevice=0;
oiNew->tagProcess=0;
NdisOpenAdapter( &nsOpenStatus,
&nsErrorStatus,
&oiNew->AdapterHandle,
&uiMedium,
MediumArray,
NUM_NDIS_MEDIA,
pde->NdisProtocolHandle,
oiNew,
AdapterName,
0,
NULL );
IF_TRACE_MSG( "Open Status : %lx", nsOpenStatus );
IF_TRACE_MSG( "Error Status : %lx", nsErrorStatus );
IF_TRACE_MSG( "Completion Status : %lx", oiNew->Status );
if ( nsOpenStatus == NDIS_STATUS_PENDING )
{
while ( oiNew->Status == NDIS_STATUS_PENDING )
YieldExecution();
}
else
{
PacketOpenAdapterComplete( oiNew, nsOpenStatus, nsErrorStatus );
}
pWPBlock = ((PWRAPPER_OPEN_BLOCK)(oiNew->AdapterHandle))->ProtocolHandle;
pNPChar = &pWPBlock->ProtocolCharacteristics;
IF_TRACE_MSG( "Protocol : %s", pNPChar->Name.Buffer );
IF_TRACE_MSG( "Protocol Handle : %lx", pde->NdisProtocolHandle );
IF_TRACE_MSG( "PWRAPPER_OPEN_BLOCK : %lx", oiNew->AdapterHandle );
IF_TRACE_MSG( "PWRAPPER_PROTOCOL_BLOCK : %lx", pWPBlock );
IF_TRACE_MSG( "NDIS_PROTOCOL_CHARACTERISTICS : %lx", pNPChar );
IF_TRACE_MSG( "Name : %lx", &pNPChar->Name );
IF_TRACE_MSG( "Adapter Name : %s", AdapterName->Buffer );
*Status = oiNew->Status;
if ( *Status != NDIS_STATUS_SUCCESS )
{
NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) , 0 );
IF_TRACE( "Bind Operation FAILED!" );
}
else
{
AName->realnamestr.Length=AdapterName->Length;
AName->realnamestr.MaximumLength=AdapterName->MaximumLength;
AName->realnamestr.Buffer=AName->realname;
for(i=0;i<32;i++)AName->realname[i]=AdapterName->Buffer[i];
pWMBlock = ((PWRAPPER_OPEN_BLOCK)(oiNew->AdapterHandle))->MacHandle;
pNMChar = &pWMBlock->MacCharacteristics;
lpzName = pNMChar->Name.Buffer;
for(i=0;i<32;i++)AName->devicename[i]=lpzName[i];
InsertTailList( &GlobalDeviceExtension->AdapterNames, &AName->ListElement);
//close the adapter
NdisCloseAdapter(&nsErrorStatus,oiNew->AdapterHandle);
if ( nsErrorStatus == NDIS_STATUS_PENDING )
{
while ( oiNew->Status == NDIS_STATUS_PENDING )
YieldExecution();
}
else
{
PacketUnbindAdapterComplete( oiNew, nsErrorStatus );
}
*Status = oiNew->Status;
if ( *Status == NDIS_STATUS_SUCCESS )
{
//remove this adapter from the list of open adapters
RemoveEntryList(&(oiNew->ListElement));
//free the memory
NdisFreeMemory( oiNew, sizeof( OPEN_INSTANCE ) , 0 );
}
else
{
IF_TRACE( "Close Operation FAILED!" );
}
}
TRACE_LEAVE( "BindAdapter" );
return;
}
/************************************************************
Function called by NDIS to indicate the completion of a bind
************************************************************/
VOID NDIS_API
PacketOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus )
{
POPEN_INSTANCE Open;
TRACE_ENTER( "BindAdapterComplete" );
IF_TRACE_MSG2( "ErrorStatus=%x Status=%x", OpenErrorStatus, Status );
Open = (POPEN_INSTANCE)ProtocolBindingContext;
if ( Status == NDIS_STATUS_SUCCESS )
{
/*Insert the just opened NIC in the list of initialized NICs*/
NdisAcquireSpinLock( &GlobalDeviceExtension->OpenSpinLock );
InsertHeadList( &GlobalDeviceExtension->OpenList, &Open->ListElement );
NdisReleaseSpinLock( &GlobalDeviceExtension->OpenSpinLock );
}
else
{
/*free resources.*/
PacketFreeResources( Open );
return;
}
Open->Status = Status;
/*complete the binding*/
NdisCompleteBindAdapter( Open->BindAdapterContext, Status, OpenErrorStatus );
TRACE_LEAVE( "BindAdapterComplete" );
return;
}
/************************************************************
Start the unbind of a network driver from the protocol driver
************************************************************/
VOID NDIS_API
PacketUnbindAdapter( OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE UnbindContext )
{
POPEN_INSTANCE Open;
NDIS_STATUS nsCloseStatus;
TRACE_ENTER( "UnbindAdapter" );
Open = (POPEN_INSTANCE)ProtocolBindingContext;
Open->BindAdapterContext = UnbindContext;
/*clean the pending requests*/
PacketCleanUp( Status, Open );
Open->Status = NDIS_STATUS_PENDING;
/*Calls NDIS to close the selected adapter*/
NdisCloseAdapter( &nsCloseStatus, Open->AdapterHandle );
if ( nsCloseStatus == NDIS_STATUS_PENDING )
{
while ( Open->Status == NDIS_STATUS_PENDING )
YieldExecution();
}
else
{
PacketUnbindAdapterComplete( Open, nsCloseStatus );
}
*Status = Open->Status;
if ( *Status == NDIS_STATUS_SUCCESS )
{
NdisFreeMemory( Open, sizeof( OPEN_INSTANCE ) , 0 );
}
else
{
IF_TRACE( "Unbind Operation FAILED!" );
}
TRACE_LEAVE( "CloseAdapter" );
return;
}
/************************************************************
Complete the unbind of a network driver from the protocol driver
************************************************************/
VOID NDIS_API
PacketUnbindAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status )
{
POPEN_INSTANCE Open;
TRACE_ENTER( "UnbindAdapterComplete" );
Open = (POPEN_INSTANCE)ProtocolBindingContext;
if ( Status == NDIS_STATUS_SUCCESS )
{
PacketFreeResources( Open );
}
Open->Status = Status;
TRACE_LEAVE( "UnbindAdapterComplete" );
return;
}
/************************************************************
free the resources allocated by an adapter
************************************************************/
VOID PacketFreeResources( POPEN_INSTANCE Open )
{
NdisFreeSpinLock( &Open->RequestSpinLock );
NdisFreeSpinLock( &Open->RcvQSpinLock );
NdisFreeSpinLock( &Open->ResetSpinLock );
NdisFreeBufferPool( Open->BufferPool );
NdisFreePacketPool( Open->PacketPool );
}
/************************************************************
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;
}
/************************************************************
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;
}
/************************************************************
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -