⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zdwlanadapter.cpp

📁 这个是无线网卡WirelessLAN 测试程序NDIS
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	W32N_Request.NdisRequest.RequestType									= NdisRequestQueryInformation;
    W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.InformationBuffer		= pInfoBuf;
    W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.InformationBufferLength	= nInfoBufLen;
    W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.BytesWritten			= 0;
    W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.BytesNeeded				= 0;
	W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.Oid						= oid;
    
    nNdisStatus = W32N_MakeNdisRequest(
                     pWLAdapterInfoIn->hNICAdapterDevice,
                     &W32N_Request,
                     &ovRidOverlap,
                     TRUE               // Synchronous
                     );

    if( nNdisStatus )
    {
		char szBuffer[200];
		sprintf(szBuffer, "MakeNdisRequest fails!! The nNdisStatus = %8X\n", nNdisStatus);
		TRACE( szBuffer );

		pWLAdapterInfoIn->nFailCount++;

		if( (pWLAdapterInfoIn->nFailAvoidCount) > 0 ) {
			if( (pWLAdapterInfoIn->nFailCount) > (pWLAdapterInfoIn->nFailAvoidCount) ) {
				pWLAdapterInfoIn->bAdapterOK = 0;
			}
		}

		CloseHandle(ovRidOverlap.hEvent);
        return ZDNDIS_FAIL;
    }

	if( (pWLAdapterInfoIn->nFailCount) > 0 )
		pWLAdapterInfoIn->nFailCount--;

	dBytes = W32N_Request.NdisRequest.DATA.QUERY_INFORMATION.BytesWritten;

	// Close some handles 	
	CloseHandle(ovRidOverlap.hEvent);

	return dBytes;
}


INT CZDWlanAdapter::SetWin32NDISOid(PWLADAPTERINFO pWLAdapterInfoIn, DWORD oid, PVOID pInfoBuf, DWORD nInfoBufLen)
{

	W32N_REQUEST	W32N_Request;
	NDIS_STATUS		nNdisStatus;
	OVERLAPPED		ovRidOverlap;
	DWORD			dBytes;

	ovRidOverlap.hEvent = CreateEvent(
                           NULL,    // Security Attributes
                           FALSE,   // Auto-Reset
                           FALSE,   // Initial State Signaled
                           NULL     // Event-object Name
                           );

	if( !ovRidOverlap.hEvent ) {
		return ZDNDIS_FAIL;
	}

	W32N_Request.NdisRequest.RequestType									= NdisRequestSetInformation;
    W32N_Request.NdisRequest.DATA.SET_INFORMATION.InformationBuffer			= pInfoBuf;
    W32N_Request.NdisRequest.DATA.SET_INFORMATION.InformationBufferLength	= nInfoBufLen;
    W32N_Request.NdisRequest.DATA.SET_INFORMATION.BytesRead					= 0;
    W32N_Request.NdisRequest.DATA.SET_INFORMATION.BytesNeeded				= 0;
	W32N_Request.NdisRequest.DATA.SET_INFORMATION.Oid						= oid;

    nNdisStatus = W32N_MakeNdisRequest(
                     pWLAdapterInfoIn->hNICAdapterDevice,
                     &W32N_Request,
                     &ovRidOverlap,
                     TRUE               // Synchronous
                     );

    if( nNdisStatus ) {
		char	szBuffer[100];
		sprintf(szBuffer, "MakeNdisRequest fails!! The nNdisStatus = %8X\n", nNdisStatus);
		TRACE( szBuffer );

		pWLAdapterInfoIn->nFailCount++;

		if( (pWLAdapterInfoIn->nFailAvoidCount) > 0 ) {
			if( (pWLAdapterInfoIn->nFailCount) > (pWLAdapterInfoIn->nFailAvoidCount) ) {
				pWLAdapterInfoIn->bAdapterOK = 0;
			}
		}

		CloseHandle( ovRidOverlap.hEvent);
        return ZDNDIS_FAIL;
    }
	
	if( (pWLAdapterInfoIn->nFailCount) > 0 )
		pWLAdapterInfoIn->nFailCount--;

	dBytes = W32N_Request.NdisRequest.DATA.SET_INFORMATION.BytesRead;

	// Close some handles 	
	CloseHandle(ovRidOverlap.hEvent);

	return (int)dBytes;
}

BOOL CZDWlanAdapter::QueryWL_IsWindows95(void)
{
	return W32N_IsWindows95();
}

BOOL CZDWlanAdapter::QueryWL_IsWindows2000(void)
{
	return W32N_IsWindows2000();
}

//      This function translate the string "[1]..."    to "0001"
//                                         "[7]..."    to "0007"
//                                         "[15]..."   to "0015"
//                                         "[256]..."  to "0256"
//                                         "[9876]..." to "9876"
VOID CZDWlanAdapter::GetNICNumber(char* InStr,char *OutStr)
{
	int	i;
	int	position = 3;

	for(i=0; i<4; i++)
		OutStr[i] = '0';
	OutStr[4] = NULL;

	while(*InStr != NULL)
	{
		if(*InStr == ']')
		{
			InStr--;
			position = 3;
			while( (*InStr >= '0') && (*InStr <= '9') && (position >= 0) )
			{
				OutStr[position--] = *InStr;
				InStr--;
			}
			break;
		}
		InStr++;
	}
}

INT CZDWlanAdapter::CreateAllNICAdapterList(PWLADAPTERLIST pWLAdapterList, int nBufferSize)
{
	W32N_ADAPTER_INFO	AdapterInfo;
	int					i;							// Number of adapter.

	DWORD				nResult;
	char				szBuffer[_MAX_PATH];


	i = 0;
	nResult = W32N_GetFirstAdapterRegistryInfo( &AdapterInfo );
	while( !nResult ) {
		if( QueryWL_IsWindows95() ) {
			sprintf( szBuffer, "%s"				, AdapterInfo.cServiceName );

		} else {
			sprintf( szBuffer, "\\Device\\%s"	, AdapterInfo.cServiceName );
		}

		lstrcpy( pWLAdapterList[i].csNICAdapterServiceName, szBuffer );
		lstrcpy( pWLAdapterList[i].csNICAdapterDescription, AdapterInfo.cDescription);

		sprintf(szBuffer, "%s", AdapterInfo.cTitle);
		GetNICNumber(szBuffer, pWLAdapterList[i].csNICAdapterNumber);

		i++;
		if(i >= nBufferSize)
			break;

		nResult = W32N_GetNextAdapterRegistryInfo( &AdapterInfo );
	}
	return i;
}

INT CZDWlanAdapter::CreateNICAdapterList(PWLADAPTERLIST pWLAdapterList, int nBufferSize)
{
	W32N_ADAPTER_INFO	AdapterInfo;
	HANDLE				CardAdapter;
	int					i;							// Number of adapter.

	DWORD				nResult;
	char				szBuffer[_MAX_PATH];


	i = 0;
	nResult = W32N_GetFirstAdapterRegistryInfo( &AdapterInfo );
	while( !nResult ) {
		if( QueryWL_IsWindows95() ) {
			sprintf( szBuffer, "%s"				, AdapterInfo.cServiceName );

		} else {
			sprintf( szBuffer, "\\Device\\%s"	, AdapterInfo.cServiceName );
		}
		CardAdapter = W32N_OpenAdapter(szBuffer);			// Try to open the adapter

		if(CardAdapter != INVALID_HANDLE_VALUE) {
			lstrcpy( pWLAdapterList[i].csNICAdapterServiceName, szBuffer );
			lstrcpy( pWLAdapterList[i].csNICAdapterDescription, AdapterInfo.cDescription);

			sprintf(szBuffer, "%s", AdapterInfo.cTitle);
			GetNICNumber(szBuffer, pWLAdapterList[i].csNICAdapterNumber);

			W32N_CloseAdapter( CardAdapter );				// Close adapter
			i++;
			if(i >= nBufferSize)
				break;

		}
		nResult = W32N_GetNextAdapterRegistryInfo( &AdapterInfo );
	}
	return i;
}

INT CZDWlanAdapter::ScanZDAdapter()
{
	int			nTempInt1, nTempInt2;
	CString		sTempString1, sTempString2;
	char		szBuffer[256];
	char		szBuffer1[256];
	int			i, j;
	DWORD		dwTemp;
	int			AdapterNum=0;

	//----------------------------------------------------------------
	// Create Combo box list item.
	nTempInt1 = sizeof(tempWLAdapterList) / sizeof(WLADAPTERLIST);
	nTempInt2 = CreateAllNICAdapterList(tempWLAdapterList, nTempInt1); //add

	if (nTempInt2 <= 0) return 0;

	for(i=0; i<nTempInt2; i++) {
		//get Adapter matching device ID within register
		sprintf(szBuffer, tempWLAdapterList[i].csNICAdapterNumber);
		if( QueryWL_IsWindows95() ) {
			sprintf(szBuffer1,
					"System\\CurrentControlSet\\Services\\Class\\Net\\%s", 
					szBuffer);
		} else {
			sprintf(szBuffer1,
					"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s",
					szBuffer);
		}
		dwTemp = sizeof(szBuffer); 
		if(QueryHLMReg(szBuffer1, "MatchingDeviceId", (char*)szBuffer, &dwTemp) == 0) {
			sTempString1 = szBuffer;
			j=0;
			while(1) {
				sTempString2 = g_sMatchingDeviceId[j];
				if(sTempString2 == "") {
					break;
				}

				sTempString1.MakeUpper();
				sTempString2.MakeUpper();

				if(sTempString1 == sTempString2) {
					AdapterNumberIndes[AdapterNum] = i;
					AdapterNum++;
				}

				j++;
			}
		} // End of if(QueryHLMReg(szBuffer1,...

	} // End of for(i=0; i<nTempInt2; i++)

	
	return AdapterNum;

}

VOID CZDWlanAdapter::CloseAdapter(PWLADAPTERINFO pWLAdapterInfoIn)
{
	if (pWLAdapterInfoIn->hNICAdapterDevice != INVALID_HANDLE_VALUE) {
		W32N_CloseAdapter( pWLAdapterInfoIn->hNICAdapterDevice );
		pWLAdapterInfoIn->hNICAdapterDevice = INVALID_HANDLE_VALUE;
	}

	return;
}

BOOL CZDWlanAdapter::OpenAdapter(PWLADAPTERINFO pWLAdapterInfoIn, int indes)
{
	memcpy(pWLAdapterInfoIn->csNICAdapterServiceName, tempWLAdapterList[indes].csNICAdapterServiceName, 
				sizeof(tempWLAdapterList[indes].csNICAdapterServiceName));
	memcpy(pWLAdapterInfoIn->csNICAdapterDescription, tempWLAdapterList[indes].csNICAdapterDescription, 
				sizeof(tempWLAdapterList[indes].csNICAdapterDescription));
	memcpy(pWLAdapterInfoIn->csNICAdapterNumber, tempWLAdapterList[indes].csNICAdapterNumber, 
				sizeof(tempWLAdapterList[indes].csNICAdapterNumber));

	pWLAdapterInfoIn->hNICAdapterDevice = INVALID_HANDLE_VALUE; //Must be set before open adapter
	pWLAdapterInfoIn->bAdapterOK = 1;
	pWLAdapterInfoIn->nFailAvoidCount = 15; //15 is depend on ZDConfig.INI file

	pWLAdapterInfoIn->hNICAdapterDevice = W32N_OpenAdapter(pWLAdapterInfoIn->csNICAdapterServiceName);
	if( pWLAdapterInfoIn->hNICAdapterDevice == INVALID_HANDLE_VALUE ) {
		pWLAdapterInfoIn->bAdapterOK = 0;
		return FALSE;
	}

	return TRUE;
}

UINT CZDWlanAdapter::Query_ZDDLLVersion()
{
	return (UINT)ZD12APP_DLL_VER;
}

//---------------------------------------------------------------------------
//		uRegisterNo
//			[in] The PHY register number. (CR0...CRxxx)
//				 Specified by integer 0...xxx
//
//		uDataOut
//			[in/out] Specified the UINT buffer to store the return value.
//					 Note: The PHY register data is 8-bit.
INT CZDWlanAdapter::ReadPHYRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterNo, UINT *uDataOut)
{
	ZD_CMD_STRUCT		CmdStruct;

	CmdStruct.u.send.cmd = 0x0030;		// MSB field =0   Least significant bit transfer first.
	CmdStruct.u.send.param0 = (USHORT)(uRegisterNo * 2);

	if(QueryWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD,(PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
		return ZDNDIS_FAIL;

	*uDataOut = (BYTE)(CmdStruct.u.rsp.resp0 & 0x00FF);
	return ZDNDIS_SUCCESS;
}

//---------------------------------------------------------------------------
//		uRegisterNo
//			[in] The PHY register number. (CR0...CRxxx)
//				 Specified by integer 0...xxx
//
//		uDataIn
//			[out] The data to be write to the specified PHY register.
//				  Note: The PHY register data is 8-bit.
INT CZDWlanAdapter::WritePHYRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterNo, UINT uDataIn)
{
	ZD_CMD_STRUCT		CmdStruct;

	CmdStruct.u.send.cmd = 0x0031;		// MSB field =0   Least significant bit transfer first.
	CmdStruct.u.send.param0 = (USHORT)(uRegisterNo * 2);
	CmdStruct.u.send.param1 = (USHORT)uDataIn;

	if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
		return ZDNDIS_FAIL;

	return ZDNDIS_SUCCESS;
}

//---------------------------------------------------------------------------
//		uRegisterAddr
//			[in] The MAC memory mapped register address.
//				 Note: The MAC memory mapped register address is 32-bit.
//
//		uDataOut
//			[in/out] Specified the UINT buffer to store the return value.
//					 Note: The MAC memory mapped register data is 32-bit.
INT CZDWlanAdapter::ReadMACRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterAddr, UINT *uDataOut)
{
	ZD_CMD_STRUCT		CmdStruct;

	CmdStruct.u.send.cmd = 0x0032;		// MSB field =0   Least significant bit transfer first.
	CmdStruct.u.send.param0 = (USHORT)( uRegisterAddr        & 0x0000FFFF);
	CmdStruct.u.send.param1 = (USHORT)((uRegisterAddr >> 16) & 0x0000FFFF);

	if(QueryWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD,(PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
		return ZDNDIS_FAIL;

	*uDataOut = (UINT)(CmdStruct.u.rsp.resp0) + (((UINT)(CmdStruct.u.rsp.resp1) << 16) & 0xFFFF0000);
	return ZDNDIS_SUCCESS;
}

//---------------------------------------------------------------------------
//		uRegisterAddr
//			[in] The MAC memory mapped register address.
//				 Note: The MAC memory mapped register address is 32-bit.
//					   The valid MAC register address to be write is:
//							0000xxxxh
//							0001xxxxh
//							0040xxxxh
//							0060xxxxh
//
//		uDataIn
//			[in] The data to be write to the specified MAC register address.
//				 Note: The MAC memory mapped register data is 32-bit.
INT CZDWlanAdapter::WriteMACRegister(PWLADAPTERINFO pWLAdapterInfoIn, UINT uRegisterAddr, UINT uDataIn)
{
	ZD_CMD_STRUCT	CmdStruct;
	UINT			uTemp;

	uTemp = (uRegisterAddr >> 16) & 0x0000FFFF;
	if( (uTemp == 0x00) || (uTemp == 0x01) || (uTemp == 0x40) || (uTemp == 0x60) ) {
		uRegisterAddr = uRegisterAddr & 0x0000FFFC;
		switch(uTemp) {
		  case 0x00:
			uRegisterAddr = uRegisterAddr + 0;
			break;
		  case 0x01:
			uRegisterAddr = uRegisterAddr + 1;
			break;
		  case 0x40:
			uRegisterAddr = uRegisterAddr + 2;
			break;
		  case 0x60:
			uRegisterAddr = uRegisterAddr + 3;
			break;
		}
	} else {
		return ZDNDIS_FAIL;
	}

	CmdStruct.u.send.cmd = 0x0033;		// MSB field =0   Least significant bit transfer first.
	CmdStruct.u.send.param0 = (USHORT)( uRegisterAddr  & 0x0000FFFF);
	CmdStruct.u.send.param1 = (USHORT)( uDataIn        & 0x0000FFFF);
	CmdStruct.u.send.param2 = (USHORT)((uDataIn >> 16) & 0x0000FFFF);

	if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD,(PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
		return ZDNDIS_FAIL;
	return ZDNDIS_SUCCESS;
}

INT CZDWlanAdapter::SetWL_InitializeNIC(PWLADAPTERINFO pWLAdapterInfoIn)
{
	ZD_CMD_STRUCT CmdStruct;

	CmdStruct.u.send.cmd = 0;
	if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
		return ZDNDIS_FAIL;

	return ZDNDIS_SUCCESS;
}

INT CZDWlanAdapter::SetWL_EnableNIC(PWLADAPTERINFO pWLAdapterInfoIn)
{
	ZD_CMD_STRUCT CmdStruct;

	CmdStruct.u.send.cmd = 1;
	if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)
		return ZDNDIS_FAIL;

	return ZDNDIS_SUCCESS;
}

INT CZDWlanAdapter::SetWL_DisableNIC(PWLADAPTERINFO pWLAdapterInfoIn)
{
	ZD_CMD_STRUCT CmdStruct;

	CmdStruct.u.send.cmd = 2;    
	if(SetWin32NDISOid(pWLAdapterInfoIn, OID_ZD_CMD, (PVOID)&CmdStruct, sizeof(ZD_CMD_STRUCT)) == ZDNDIS_FAIL)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -