Hi folks!
I’m writing a ndis driver to retrieve the physical mac address from the
ethernet adapters installed on the system.
My driver works fine on Windows XP but fails on Windows 2000. I didn’t have
a chance to test it on Windows Vista x86 yet.
This is part of the code I wrote:
*//-------------------------------------------------------------------
NTSTATUS ConfigureAndRegisterProtocol( NDIS50_PROTOCOL_CHARACTERISTICS*
pProtChar )
{
ULONG MajorVersion;
ULONG MinorVersion;
UINT ProtocolSize;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PsGetVersion( &MajorVersion, &MinorVersion, NULL, NULL );
NdisZeroMemory( pProtChar, sizeof ( NDIS50_PROTOCOL_CHARACTERISTICS ) );
if ( MajorVersion == 4 )
{
ProtocolSize = sizeof( NDIS30_PROTOCOL_CHARACTERISTICS );
pProtChar->MajorNdisVersion = 3;
}
if ( MajorVersion == 5 )
{
if ( MinorVersion == 0 )
{
ProtocolSize = sizeof( NDIS40_PROTOCOL_CHARACTERISTICS );
pProtChar->MajorNdisVersion = 4;
}
if ( MinorVersion == 1 || MinorVersion == 2 )
{
ProtocolSize = sizeof( NDIS50_PROTOCOL_CHARACTERISTICS );
pProtChar->MajorNdisVersion = 5;
}
if ( MinorVersion > 2 )
{
return STATUS_UNSUCCESSFUL;
}
}
pProtChar->OpenAdapterCompleteHandler = NdisProtOpenAdapterComplete;
pProtChar->CloseAdapterCompleteHandler = NdisProtCloseAdapterComplete;
pProtChar->RequestCompleteHandler = NdisProtRequestComplete;
pProtChar->Name = g_ProtoName;
pProtChar->BindAdapterHandler = NdisProtBindAdapter;
pProtChar->UnbindAdapterHandler = NdisProtUnbindAdapter;
NdisRegisterProtocol( (PNDIS_STATUS)&Status, &g_NdisProtHandle,
pProtChar, ProtocolSize );
if ( Status != NDIS_STATUS_SUCCESS )
{
return STATUS_UNSUCCESSFUL;
}
else
{
g_AdapterProtocolRegistered = TRUE;
return STATUS_SUCCESS;
}
return STATUS_SUCCESS;
}*
*//-------------------------------------------------------------------
VOID UtilOpenAdapter( IN PADAPTER_INFORMATION pAdapter )
{
NTSTATUS Status, OpenError;
UINT MediumIndex, ArraySize;
NDIS_MEDIUM MediumArray;
LARGE_INTEGER timeout;
timeout.QuadPart = -5 * 10 * 1000 * 100;
MediumArray = NdisMedium802_3;
ArraySize = 0x1;
NdisOpenAdapter( &Status, &OpenError, &pAdapter->AdapterBindingHandle,
&MediumIndex, &MediumArray, ArraySize,
g_NdisProtHandle, (NDIS_HANDLE)pAdapter,
(PNDIS_STRING)&pAdapter->AdapterName, 0x0, NULL);
if ( Status != STATUS_SUCCESS )
{
if ( Status == NDIS_STATUS_PENDING )
{
pAdapter->AdapterState = ADAPTER_OPEN_PENDING;
Status = KeWaitForSingleObject( &pAdapter->AdapterEvent,
Executive, KernelMode, FALSE, &timeout );
}
else
{
pAdapter->AdapterState = ADAPTER_OPEN_ERROR;
}
}
else
{
pAdapter->AdapterState = ADAPTER_OPEN_SUCCESS;
}
}*
*//-------------------------------------------------------------------
VOID UtilRequestMacAddress( PADAPTER_INFORMATION pAdapter )
{
NTSTATUS Status;
LARGE_INTEGER timeout;
PNDIS_REQUEST pAdapterRequest = &pAdapter->AdapterReq;
timeout.QuadPart = -5 * 10 * 1000 * 100;
// Inicializa evento de espera
KeInitializeEvent( &pAdapter->AdapterEvent, NotificationEvent, FALSE );
// Preencha a estrutura NDIS_REQUEST
pAdapterRequest->RequestType = NdisRequestQueryInformation;
pAdapterRequest->DATA.QUERY_INFORMATION.Oid =
OID_802_3_PERMANENT_ADDRESS;
pAdapterRequest->DATA.QUERY_INFORMATION.InformationBuffer =
&pAdapter->AdapterMacAddress;
pAdapterRequest->DATA.QUERY_INFORMATION.InformationBufferLength =
sizeof( pAdapter->AdapterMacAddress );
NdisRequest( &Status, pAdapter->AdapterBindingHandle, pAdapterRequest );
if ( Status != NDIS_STATUS_SUCCESS )
{
if ( Status == NDIS_STATUS_PENDING )
{
pAdapter->AdapterState = ADAPTER_REQUEST_PENDING;
KeWaitForSingleObject( &pAdapter->AdapterEvent, Executive,
KernelMode, FALSE, &timeout );
}
else
{
pAdapter->AdapterState = ADAPTER_REQUEST_ERROR;
}
}
else
{
pAdapter->AdapterState = ADAPTER_REQUEST_SUCCESS;
}
}*
On the function *UtilRequestMacAddress *when I execute the NdisRequest
Function on Windows 2000 the Status always returns *NDIS_STATUS_PENDING *(*
*0x06 ).
Even if I call *KeWaitForSingleObject *with NULL at the timeout to wait
infinitely, I keep getting 0x06 and the request does not succeed.
I’m new to driver development so I’m really stuck on this problem. So I
decided to ask the experts some hints.
Can you guys point me the mistakes I made in this code?
Thanks in advance!
Silvio.