- Merge aicom-network-fixes up to r36151

svn path=/trunk/; revision=36152
This commit is contained in:
Cameron Gutman 2008-09-12 04:08:55 +00:00
parent 4046b602f2
commit 5f008ce5b8
12 changed files with 90 additions and 32 deletions

View file

@ -39,7 +39,6 @@ AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
NTSTATUS STDCALL
AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp ) {
NTSTATUS Status = STATUS_BUFFER_TOO_SMALL;
PFILE_OBJECT FileObject = IrpSp->FileObject;
PAFD_FCB FCB = FileObject->FsContext;
@ -47,25 +46,19 @@ AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
if( FCB->Context ) {
ExFreePool( FCB->Context );
FCB->Context = NULL;
FCB->ContextSize = 0;
}
if( FCB->ContextSize <
IrpSp->Parameters.DeviceIoControl.InputBufferLength ) {
FCB->Context =
ExAllocatePool
( PagedPool,
IrpSp->Parameters.DeviceIoControl.InputBufferLength );
FCB->Context = ExAllocatePool( PagedPool,
IrpSp->Parameters.DeviceIoControl.InputBufferLength );
if( !FCB->Context ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
if( !FCB->Context ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
RtlCopyMemory( FCB->Context,
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
IrpSp->Parameters.DeviceIoControl.InputBufferLength );
Status = STATUS_SUCCESS;
}
FCB->ContextSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
RtlCopyMemory( FCB->Context,
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
FCB->ContextSize );
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
return UnlockAndMaybeComplete( FCB, STATUS_SUCCESS, Irp, 0, NULL );
}

View file

@ -174,8 +174,8 @@ PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ) {
( NonPagedPool, HandleCount * sizeof(AFD_HANDLE) );
for( i = 0; FileObjects && i < HandleCount; i++ ) {
HandleArray[i].Status = 0;
HandleArray[i].Events = HandleArray[i].Events;
FileObjects[i].Status = 0;
FileObjects[i].Events = HandleArray[i].Events;
FileObjects[i].Handle = 0;
if( !HandleArray[i].Handle ) continue;
if( NT_SUCCESS(Status) ) {
@ -206,6 +206,7 @@ VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ) {
}
ExFreePool( HandleArray );
HandleArray = NULL;
}
/* Returns transitioned state or SOCKET_STATE_INVALID_TRANSITION */

View file

@ -52,6 +52,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
ULONG EaLength;
PWCHAR EaInfoValue = NULL;
UINT Disposition, i;
NTSTATUS Status = STATUS_SUCCESS;
AFD_DbgPrint(MID_TRACE,
("AfdCreate(DeviceObject %p Irp %p)\n", DeviceObject, Irp));
@ -140,16 +141,27 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Packet oriented socket\n"));
/* Allocate our backup buffer */
FCB->Recv.Window = ExAllocatePool( NonPagedPool, FCB->Recv.Size );
if( !FCB->Recv.Window ) Status = STATUS_NO_MEMORY;
FCB->Send.Window = ExAllocatePool( NonPagedPool, FCB->Send.Size );
if( !FCB->Send.Window ) {
if( FCB->Recv.Window ) ExFreePool( FCB->Recv.Window );
Status = STATUS_NO_MEMORY;
}
/* A datagram socket is always sendable */
FCB->PollState |= AFD_EVENT_SEND;
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
Irp->IoStatus.Status = STATUS_SUCCESS;
if( !NT_SUCCESS(Status) ) {
if( FCB->TdiDeviceName.Buffer ) ExFreePool( FCB->TdiDeviceName.Buffer );
ExFreePool( FCB );
FileObject->FsContext = NULL;
}
Irp->IoStatus.Status = Status;
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
return STATUS_SUCCESS;
return Status;
}
VOID DestroySocket( PAFD_FCB FCB ) {

View file

@ -642,6 +642,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
Status = STATUS_CANT_WAIT;
PollReeval( FCB->DeviceExt, FCB->FileObject );
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
} else {
PollReeval( FCB->DeviceExt, FCB->FileObject );

View file

@ -311,7 +311,7 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
return UnlockAndMaybeComplete( FCB, STATUS_SUCCESS, Irp,
return UnlockAndMaybeComplete( FCB, Status, Irp,
0, NULL );
}

View file

@ -349,7 +349,10 @@ NDIS_STATUS STDCALL ProtocolReceive(
/* Get a transfer data packet */
KeAcquireSpinLockAtDpcLevel(&Adapter->Lock);
NdisStatus = AllocatePacketWithBuffer( &NdisPacket, NULL, Adapter->MTU );
if( NdisStatus != NDIS_STATUS_SUCCESS ) return NDIS_STATUS_NOT_ACCEPTED;
if( NdisStatus != NDIS_STATUS_SUCCESS ) {
KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);
return NDIS_STATUS_NOT_ACCEPTED;
}
LA_DbgPrint(DEBUG_DATALINK, ("pretransfer LookaheadBufferSize %d packsize %d\n",LookaheadBufferSize,PacketSize));
{
UINT temp;

View file

@ -283,6 +283,7 @@ NdisOpenProtocolConfiguration(
if(!ConfigurationContext)
{
NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
ZwClose(KeyHandle);
*ConfigurationHandle = NULL;
*Status = NDIS_STATUS_FAILURE;
return;
@ -849,6 +850,7 @@ NdisOpenConfigurationKeyByIndex(
if(!ConfigurationContext)
{
NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
ZwClose(RegKeyHandle);
*Status = NDIS_STATUS_FAILURE;
return;
}
@ -907,6 +909,7 @@ NdisOpenConfigurationKeyByName(
if(!ConfigurationContext)
{
NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n"));
ZwClose(RegKeyHandle);
*Status = NDIS_STATUS_FAILURE;
return;
}

View file

@ -407,6 +407,7 @@ NdisMAllocateMapRegisters(
if(!NT_SUCCESS(NtStatus))
{
NDIS_DbgPrint(MIN_TRACE, ("IoAllocateAdapterChannel failed: 0x%x\n", NtStatus));
ExFreePool(Adapter->MapRegisters);
return NDIS_STATUS_RESOURCES;
}
@ -417,6 +418,7 @@ NdisMAllocateMapRegisters(
if(!NT_SUCCESS(NtStatus))
{
NDIS_DbgPrint(MIN_TRACE, ("KeWaitForSingleObject failed: 0x%x\n", NtStatus));
ExFreePool(Adapter->MapRegisters);
return NDIS_STATUS_RESOURCES;
}

View file

@ -314,15 +314,18 @@ MiniRequestComplete(
IN NDIS_STATUS Status)
{
PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)Request->MacReserved;
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
if( MacBlock->Binding->RequestCompleteHandler ) {
(*MacBlock->Binding->RequestCompleteHandler)(
MacBlock->Binding->ProtocolBindingContext,
Request,
Status);
}
KeLowerIrql(OldIrql);
}
VOID NTAPI
@ -340,15 +343,18 @@ MiniSendComplete(
*/
{
PADAPTER_BINDING AdapterBinding;
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
(*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
Packet,
Status);
KeLowerIrql(OldIrql);
}
@ -370,15 +376,18 @@ MiniTransferDataComplete(
IN UINT BytesTransferred)
{
PADAPTER_BINDING AdapterBinding;
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
AdapterBinding = (PADAPTER_BINDING)Packet->Reserved[0];
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
(*AdapterBinding->ProtocolBinding->Chars.SendCompleteHandler)(
AdapterBinding->NdisOpenBlock.ProtocolBindingContext,
Packet,
Status);
KeLowerIrql(OldIrql);
}
@ -548,10 +557,12 @@ MiniQueryInformation(
{
NDIS_STATUS NdisStatus;
ULONG BytesNeeded;
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
/* call the miniport's queryinfo handler */
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext,
Oid,
@ -559,6 +570,7 @@ MiniQueryInformation(
Size,
BytesWritten,
&BytesNeeded);
KeLowerIrql(OldIrql);
/* FIXME: Wait in pending case! */
@ -678,14 +690,17 @@ MiniDoRequest(
* Status of operation
*/
{
NDIS_STATUS Status;
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
Adapter->MediaRequest = NdisRequest;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
switch (NdisRequest->RequestType)
{
case NdisRequestQueryInformation:
return (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
Status = (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)(
Adapter->MiniportAdapterContext,
NdisRequest->DATA.QUERY_INFORMATION.Oid,
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
@ -695,7 +710,7 @@ MiniDoRequest(
break;
case NdisRequestSetInformation:
return (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
Status = (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)(
Adapter->MiniportAdapterContext,
NdisRequest->DATA.SET_INFORMATION.Oid,
NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
@ -705,8 +720,11 @@ MiniDoRequest(
break;
default:
return NDIS_STATUS_FAILURE;
Status = NDIS_STATUS_FAILURE;
}
KeLowerIrql(OldIrql);
return Status;
}
@ -722,9 +740,12 @@ NdisMQueryInformationComplete(
{
PNDIS_MINIPORT_BLOCK MiniportBlock =
(PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle;
KIRQL OldIrql;
ASSERT(MiniportBlock);
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
if( MiniportBlock->QueryCompleteHandler )
(MiniportBlock->QueryCompleteHandler)(MiniportAdapterHandle, Status);
KeLowerIrql(OldIrql);
}
@ -746,9 +767,12 @@ VOID NTAPI MiniportDpc(
PVOID WorkItemContext;
NDIS_WORK_ITEM_TYPE WorkItemType;
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
KIRQL OldIrql;
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
NdisStatus =
MiniDequeueWorkItem
(Adapter, &WorkItemType, &WorkItemContext);
@ -845,6 +869,8 @@ VOID NTAPI MiniportDpc(
break;
}
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
}
@ -1281,6 +1307,7 @@ NdisIPnPStartDevice(
if (!NT_SUCCESS(Status))
{
NDIS_DbgPrint(MIN_TRACE,("failed to open adapter-specific reg key\n"));
ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
return Status;
}
@ -1909,7 +1936,10 @@ NdisMSetInformationComplete(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_STATUS Status)
{
KIRQL OldIrql;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
(*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)(MiniportAdapterHandle, Status);
KeLowerIrql(OldIrql);
}

View file

@ -238,7 +238,6 @@ ProSend(
*/
NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n"));
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql);
{
/*
* if the miniport is marked as busy, we queue the packet as a work item,
* else we send the packet directly to the miniport. Sending to the miniport
@ -251,8 +250,6 @@ ProSend(
NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to busy\n"));
Adapter->MiniportBusy = TRUE;
}
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
/*
* Test the packet to see if it is a MAC loopback.
@ -269,9 +266,12 @@ ProSend(
if (QueueWorkItem)
{
MiniQueueWorkItem(Adapter, NdisWorkItemSendLoopback, (PVOID)Packet);
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
return NDIS_STATUS_PENDING;
}
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql);
{
/*
@ -306,12 +306,15 @@ ProSend(
if (QueueWorkItem)
{
MiniQueueWorkItem(Adapter, NdisWorkItemSend, (PVOID)Packet);
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
NDIS_DbgPrint(MAX_TRACE, ("Queued a work item and returning\n"));
return NDIS_STATUS_PENDING;
}
ASSERT(Adapter->NdisMiniportBlock.DriverHandle);
KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql);
/*
* Call the appropriate send handler
*

View file

@ -301,7 +301,10 @@ NdisOpenFile(
memmove ( FullFileName.Buffer, NDIS_FILE_FOLDER, FullFileName.Length );
*Status = RtlAppendUnicodeStringToString ( &FullFileName, FileName );
if ( !NT_SUCCESS(*Status) )
{
*Status = NDIS_STATUS_FAILURE;
goto cleanup;
}
InitializeObjectAttributes ( &ObjectAttributes,
&FullFileName,
@ -321,6 +324,11 @@ NdisOpenFile(
FILE_SYNCHRONOUS_IO_NONALERT, // ULONG CreateOptions
0, // PVOID EaBuffer
0 ); // ULONG EaLength
if ( !NT_SUCCESS(*Status) )
{
*Status = NDIS_STATUS_FAILURE;
}
cleanup:
if ( FullFileName.Buffer != NULL )

View file

@ -595,7 +595,6 @@ VOID LANTransmit(
PETH_HEADER EHeader;
PCHAR Data;
UINT Size;
KIRQL OldIrql;
PLAN_ADAPTER Adapter = (PLAN_ADAPTER)Context;
TI_DbgPrint(DEBUG_DATALINK,
@ -673,13 +672,11 @@ VOID LANTransmit(
((PCHAR)LinkAddress)[5] & 0xff));
}
TcpipAcquireSpinLock( &Adapter->Lock, &OldIrql );
TI_DbgPrint(MID_TRACE, ("NdisSend\n"));
NdisSend(&NdisStatus, Adapter->NdisHandle, NdisPacket);
TI_DbgPrint(MID_TRACE, ("NdisSend %s\n",
NdisStatus == NDIS_STATUS_PENDING ?
"Pending" : "Complete"));
TcpipReleaseSpinLock( &Adapter->Lock, OldIrql );
/* I had a talk with vizzini: these really ought to be here.
* we're supposed to see these completed by ndis *only* when
@ -861,6 +858,11 @@ static NTSTATUS FindDeviceDescForAdapter( PUNICODE_STRING Name,
ExFreePool( Kbio );
KbioLength = ResultLength;
Kbio = ExAllocatePool( NonPagedPool, KbioLength );
if( !Kbio ) {
TI_DbgPrint(DEBUG_DATALINK,("Failed to allocate memory\n"));
NtClose( EnumKey );
return STATUS_NO_MEMORY;
}
Status = ZwEnumerateKey( EnumKey, i, KeyBasicInformation,
Kbio, KbioLength, &ResultLength );
@ -1262,7 +1264,7 @@ NDIS_STATUS LANUnregisterAdapter(
FreeAdapter(Adapter);
return NDIS_STATUS_SUCCESS;
return NdisStatus;
}