Newsgroup: it.comp.programmare
Titolo: problema interrogazione ndis per piattaforma pocket pc 2003

buongiorno, sto cercando di realizzare una dll per pocket pc 2003 che
mi permetta di determinare il mac address dell'access point a cui sono
connesso.
dovrei avere tutti gli header e le librerie necessarie, ma non ne sono
del tutto sicuro. ottengo, infatti, il seguente errore durante la
costruzione della dll (per la precisione durante la fase di linking):
dipDLLmac.obj : error LNK2019: unresolved external symbol
"__declspec(dllimport) void __cdecl NdisOpenAdapter(int *,int *,void *
*,unsigned int *,enum _NDIS_MEDIUM *,unsigned int,void *,void *,struct
_UNICODE_STRING *,unsigned int,struct _STRING *)"
 (__imp_?NdisOpenAdapter@@YAXPAH0PAPAXPAIPAW4_NDIS_MEDIUM@@IPAX4PAU_UNICODE_STRING@@IPAU_STRING@@@Z)
referenced in function "char * __cdecl GetAccessPointMAC(unsigned
short *)" (?GetAccessPointMAC@@YAPADPAG@Z)
emulatorDbg/dipDLLmac.dll : fatal error LNK1120: 1 unresolved
externals
oltre ad 1 warning (variabile "handle" non inizializzata), ma questo
non è un problema.
il codice è il seguente (premetto che non conosco troppo bene la
programmazione in c/c++)
// OID_802_11_BSSID
//
#include "stdafx.h"
#include "Ndis.h"
#include "Iptypes.h"
#include "Iphlpapi.h"
PIP_ADAPTER_INFO GetAdapters()
{
	PIP_ADAPTER_INFO pAdapterInfo = NULL;
	PULONG pOutBufLen = (PULONG)sizeof(PIP_ADAPTER_INFO);
	GetAdaptersInfo(pAdapterInfo, pOutBufLen);
	return pAdapterInfo;
}
char* GetAccessPointMAC(PWSTR AdapterName)
{
	char* result = "MAC";
	UNICODE_STRING uAdapterName;
	uAdapterName.Length = sizeof(AdapterName);
	uAdapterName.MaximumLength = sizeof(AdapterName);
	uAdapterName.Buffer = AdapterName;
	// servono NDIS_REQUEST ed NdisOpenAdapter
	NDIS_STATUS status;	//*
	NDIS_HANDLE handle;
	NDIS_REQUEST request; //*
	//NdisOpenAdapter
	NDIS_STATUS opStatus; //*
	NDIS_STATUS opOpenErrorStatus; //*
	NDIS_HANDLE NdisHandle; //*
	UINT opSelectMediumIndex;	//*
	NDIS_MEDIUM opMediumArray = NdisMediumWirelessWan; //*
	UINT opMediumArraySize = 1;
	NDIS_HANDLE opNdisHandle = 0;
	NDIS_HANDLE *opProtocolBindingContext;	//*
	NDIS_STRING opAdapterName = uAdapterName;
	UINT OpenOptions = 0;
	PSTRING AddressingInformation = NULL;
	NdisOpenAdapter(&opStatus, &opOpenErrorStatus, &NdisHandle,
		&opSelectMediumIndex, &opMediumArray, opMediumArraySize,
		&opNdisHandle, &opProtocolBindingContext, &opAdapterName,
		OpenOptions, AddressingInformation);
	//query informations
	PVOID buffer;
	request.RequestType = NdisRequestQueryInformation;
	request.DATA.QUERY_INFORMATION.Oid = OID_802_11_BSSID;
	request.DATA.QUERY_INFORMATION.InformationBuffer = &buffer;
	request.DATA.QUERY_INFORMATION.InformationBufferLength =
sizeof(PVOID);
	request.DATA.QUERY_INFORMATION.BytesWritten = 6;
	request.DATA.QUERY_INFORMATION.BytesNeeded = 6;
	NdisRequest(&status, handle, &request);
	return result;
}
ogni tipo di aiuto è gradito.
saluti.

aggiornamento.
pare che il problema derivi dalla mancanza di ndis.dll (in tutta la
macchina su cui lavoro). dove posso trovarla? non dovrebbe essere
inclusa nell'sdk di pocketpc 2003? (ho installato anche platform
builder x ce .NET 4.2 per ottenere determinate librerie ed header
file)
saluti