NdisCloseAdapter not returns

My driver don’t returns from NdisCloseAdapter in win 2000
but in win 4.0 it’s works fine
here is some code:

NTSTATUS DriverEntry( )
{

NdisInitializeEvent(&Event);
RtlZeroMemory( &aProtocolChar,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

aProtocolChar.MajorNdisVersion = 4;
aProtocolChar.MinorNdisVersion = 0;
aProtocolChar.Reserved = 0;
aProtocolChar.OpenAdapterCompleteHandler = OnOpenAdapterDone;
aProtocolChar.CloseAdapterCompleteHandler = OnCloseAdapterDone;
aProtocolChar.SendCompleteHandler = OnSendDone;
aProtocolChar.TransferDataCompleteHandler = OnTransferDataDone;
aProtocolChar.ResetCompleteHandler = OnResetDone;
aProtocolChar.RequestCompleteHandler = OnRequestDone;
aProtocolChar.ReceiveHandler = OnReceiveStub;
aProtocolChar.ReceiveCompleteHandler = OnReceiveDoneStub;
aProtocolChar.StatusHandler = OnStatus;
aProtocolChar.StatusCompleteHandler = OnStatusDone;
aProtocolChar.Name = aProtoName;

NdisRegisterProtocol( &aStatus,&NdisProtocolHandle,&aProtocolChar,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

theDriverObject->DriverUnload = OnUnload;

NdisOpenAdapter(&aStatus,&ErrorStatus,&NdisBindingHandle,&MediumIndex,MediumArray,sizeof (MediumArray),
NdisProtocolHandle,NULL,&aNetCardName,0,NULL);

//complete this binding
if(aStatus==NDIS_STATUS_PENDING)
{
NdisWaitEvent(&Event, 0);
aStatus = GlobalStatus;
NdisResetEvent(&Event);
}
//if we have error then exit
if (aStatus!=NDIS_STATUS_SUCCESS)
{
NdisResetEvent(&Event);
}

NdisResetEvent(&Event);

return STATUS_SUCCESS;

}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{

NdisCloseAdapter(&aStatus,NdisBindingHandle);
//complete this unbinding
if(aStatus==NDIS_STATUS_PENDING)
{
NdisWaitEvent(&Event, 0);
}
NdisDeregisterProtocol(&aStatus,NdisProtocolHandle);

return;
}

VOID
OnOpenAdapterDone( )
{
//must set event to complete binding
GlobalStatus=Status;
NdisSetEvent(&Event);
return;
}

VOID
OnCloseAdapterDone( )
{
DbgPrint(“OnCloseAdapterDone called\n”);
//must set event to complete unbinding
NdisSetEvent(&Event);

return;
}
well i know that “OnCloseAdapterDone called” but
NdisCloseAdapter not return in win 2000…


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Strange, I haven’t noticed such a problem at w2k. The difference is I call
NdisCloseAdapter() from ProtocolUnbindAdapter() function which you haven’t
implemented. Why? It is required function. See docs:

The ProtocolUnbindAdapter function is required to support Plug and Play. All
NDIS protocol drivers must export a ProtocolUnBindAdapter function.

A guess: your driver entry always returns success even if there is an error
opening adapter. Maybe you call NdisCloseAdapter() when it isn’t really
opened. Also, do you send or receive any packet? Maybe adapter is internally
referenced and close waits for something to complete. Sometimes it isn’t
possible to make incomplete NDIS driver working. Improve your code: add
asserts, always check status, assert expected IRQLs, implement all callbacks
etc.

Best regards,

Michal Vodicka
STMicroelectronics Design and Application s.r.o.
[michal.vodicka@st.com, http:://www.st.com]


From: xxxxx@mail.ru[SMTP:xxxxx@mail.ru]
Reply To: xxxxx@lists.osr.com
Sent: Friday, February 08, 2002 8:01 AM
To: xxxxx@lists.osr.com
Subject: [ntdev] NdisCloseAdapter not returns

My driver don’t returns from NdisCloseAdapter in win 2000
but in win 4.0 it’s works fine
here is some code:

NTSTATUS DriverEntry( )
{

NdisInitializeEvent(&Event);
RtlZeroMemory(
&aProtocolChar,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

aProtocolChar.MajorNdisVersion = 4;
aProtocolChar.MinorNdisVersion = 0;
aProtocolChar.Reserved = 0;
aProtocolChar.OpenAdapterCompleteHandler = OnOpenAdapterDone;
aProtocolChar.CloseAdapterCompleteHandler = OnCloseAdapterDone;
aProtocolChar.SendCompleteHandler = OnSendDone;
aProtocolChar.TransferDataCompleteHandler = OnTransferDataDone;
aProtocolChar.ResetCompleteHandler = OnResetDone;
aProtocolChar.RequestCompleteHandler = OnRequestDone;
aProtocolChar.ReceiveHandler = OnReceiveStub;
aProtocolChar.ReceiveCompleteHandler = OnReceiveDoneStub;
aProtocolChar.StatusHandler = OnStatus;
aProtocolChar.StatusCompleteHandler = OnStatusDone;
aProtocolChar.Name = aProtoName;

NdisRegisterProtocol(
&aStatus,&NdisProtocolHandle,&aProtocolChar,sizeof(NDIS_PROTOCOL_CHARACTER
ISTICS));

theDriverObject->DriverUnload = OnUnload;

NdisOpenAdapter(&aStatus,&ErrorStatus,&NdisBindingHandle,&MediumIndex,Medi
umArray,sizeof (MediumArray),

NdisProtocolHandle,NULL,&aNetCardName,0,NULL);

//complete this binding
if(aStatus==NDIS_STATUS_PENDING)
{
NdisWaitEvent(&Event, 0);
aStatus = GlobalStatus;
NdisResetEvent(&Event);
}
//if we have error then exit
if (aStatus!=NDIS_STATUS_SUCCESS)
{
NdisResetEvent(&Event);
}

NdisResetEvent(&Event);

return STATUS_SUCCESS;

}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{

NdisCloseAdapter(&aStatus,NdisBindingHandle);
//complete this unbinding
if(aStatus==NDIS_STATUS_PENDING)
{
NdisWaitEvent(&Event, 0);
}
NdisDeregisterProtocol(&aStatus,NdisProtocolHandle);

return;
}

VOID
OnOpenAdapterDone( )
{
//must set event to complete binding
GlobalStatus=Status;
NdisSetEvent(&Event);
return;
}

VOID
OnCloseAdapterDone( )
{
DbgPrint(“OnCloseAdapterDone called\n”);
//must set event to complete unbinding
NdisSetEvent(&Event);

return;
}
well i know that “OnCloseAdapterDone called” but
NdisCloseAdapter not return in win 2000…


You are currently subscribed to ntdev as: michal.vodicka@st.com
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntdev as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntdev-$subst(‘Recip.MemberIDChar’)@lists.osr.com