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

📄 initproc.c

📁 Windows CE 6.0 BSP for VOIP sample phone. Intel PXA270 platform.
💻 C
📖 第 1 页 / 共 5 页
字号:
        	return NULL;
    	}

	// GobalHSock.uSocket = hSock.uSocket;
	// GobalHSock.uFunction = hSock.uFunction;
	// GobalHSock.uSocket = hSock.uSocket;
	// DBGPRINT(DBG_ALLEN, ("hSock = %x, %x\n", hSock.uSocket, hSock.uFunction));
       // DBGPRINT(DBG_ALLEN, ("GobalHSock = %x, %x\n", GobalHSock.uSocket, GobalHSock.uFunction));

    	pTuple = (PCARD_TUPLE_PARMS)buf;
    	pTuple->hSocket = hSock;
    	pTuple->uDesiredTuple = CISTPL_VERS_1;
    	pTuple->fAttributes = 0;        // Don't want link info.
    	cerr = pfnGetFirstTuple(pTuple);
    	if (cerr == CERR_SUCCESS)
	{
       	pParms = (PCARD_DATA_PARMS)buf;
       	pParms->uBufLen = sizeof(buf) - sizeof(CARD_DATA_PARMS);
       	pParms->uTupleOffset = 0;
       	cerr = pfnGetTupleData(pParms);
        	if (cerr == CERR_SUCCESS)
		{
            		//
            		// Check manufacturer string
            		//
           		pData = buf + sizeof(CARD_DATA_PARMS) + 2;
			if (strstr(pData, "Marvell"))
			{
				//
				// Check product string
				//
				pData += strlen(pData) + 1;
				if (strstr(pData, "Eagle 802.11b PC Card") || 
				    strstr(pData, "88W8300 802.11b PC Card") || 
                                strstr(pData, "88W8300 802.11g PC Card")|| 
                                strstr(pData, "802.11 CF"))  // 8385H 
				{
					//
					// Check product info string
					//
	                		pData += strlen(pData) + 1;
                    			// skip this extra check, seems unnecessary
		            		//if (strstr(pData, "Version 1.1"))
					{

#ifdef MRV_CHIP_8385H
						wcscpy(DevKey, (TEXT("CF8385H")));
#endif // #ifdef MRV_CHIP_8385H

#ifdef MRV_CHIP_8381PN
						wcscpy(DevKey, (TEXT("CF8381PN")));
#endif // #ifdef MRV_CHIP_8381PN
					
#ifdef MRV_CHIP_8381P
						wcscpy(DevKey, (TEXT("CF8381P")));
#endif // #ifdef MRV_CHIP_8381P

#ifdef MRV_CHIP_8385PN
						wcscpy(DevKey, (TEXT("CF8385PN")));
#endif // #ifdef MRV_CHIP_8385PN

#ifdef MRV_CHIP_8305
						wcscpy(DevKey, (TEXT("EAGLEND5")));
#endif // #ifdef MRV_CHIP_8305


						Install_Driver(
								DevKey,
								(LPWSTR)buf,
								sizeof(buf)/sizeof(WCHAR));
						lpwstrRet = DevKey;
						
					///	DBGPRINT(DBG_ALLEN | DBG_SP | DBG_ALLEN, ("MRVDRVND5: DetectMrvDrv : device detected!\n"));
					///    	DEBUGMSG(1, (TEXT("MRVDRVND5: DetectMrvDrv : device detected!\n")));
   	                		}
		        	}
				///else
				///	DBGPRINT(DBG_ALLEN | DBG_SP | DBG_ALLEN, ("MRVDRVND5: DetectMrvDrv : 1 \n"));
			}
			///else
			///	DBGPRINT(DBG_ALLEN | DBG_SP | DBG_ALLEN, ("MRVDRVND5: DetectMrvDrv : 2 \n"));
		}
		///else
		///	DBGPRINT(DBG_ALLEN | DBG_SP | DBG_ALLEN, ("MRVDRVND5: DetectMrvDrv :3 \n"));
    }

    FreeLibrary(hPcmciaDll);
	
    return lpwstrRet;
}
#endif // UNDER_CE

// jeff.spurgat 2003-04-14
// This function may need to be called by Install_Driver() to get a
// valid/unused detect key 
#ifdef UNDER_CE
//-----------------------------------------------------------------------------
// Description:
// Find an unused Detect key number and return the registry path name for it.
//
// Arguments:
//
// Return Value:
// Return NULL for failure
//
//-----------------------------------------------------------------------------
LPWSTR
FindDetectKey(VOID)
{
    	HKEY hDetectKey;
    	DWORD dwKeyNum;
    	DWORD dwDisp;
    	DWORD Status;
    	WCHAR * pKeyName;
   	LPWSTR pKeyNum;

    	pKeyName = LocalAlloc(LPTR, sizeof(WCHAR) * 255);
    	if (pKeyName == NULL) 
	{
        	return NULL;
    	}
    	wcscpy(pKeyName, (TEXT("Drivers\\PCMCIA\\Detect\\")));
    	pKeyNum = pKeyName + wcslen(pKeyName);
    
    	//
    	// Find a detect number and create the detect key.
    	//
    	for (dwKeyNum = 40; dwKeyNum < 99; dwKeyNum++) 
	{
       	wsprintf(pKeyNum, (TEXT("%02d")), dwKeyNum);
        	Status = RegCreateKeyEx(
                     		HKEY_LOCAL_MACHINE,
                     		pKeyName,
                    		 	0,
                     		NULL,
                     		REG_OPTION_NON_VOLATILE,
                     		0,
                     		NULL,
                     		&hDetectKey,
                     		&dwDisp);
        	if (Status == ERROR_SUCCESS) 
		{
            		RegCloseKey(hDetectKey);
            		if (dwDisp == REG_CREATED_NEW_KEY)
			{
                		return pKeyName;
            		}
        	}
    	}
		
    	LocalFree(pKeyName);
    	return NULL;
}
#endif // UNDER_CE

NDIS_HANDLE gNdisWrapperHandle=NULL;


/******************************************************************************
 *
 *  Name: DriverEntry()
 *
 *  Description:	
 *		NDIS miniport driver primary driver entry. 
 *
 *  Arguments:
 *      DriverObject - Pointer to driver object created by the system.
 *      RegistryPath - The registry path of this driver
 *    
 *  Return Value:
 *
 *		NDIS_STATUS_SUCCESS 
 *		NDIS_STATUS_BAD_CHARACTERISTICS 
 *		NDIS_STATUS_BAD_VERSION 
 *		NDIS_STATUS_RESOURCES 
 *		NDIS_STATUS_FAILURE
 * 
 *  Notes:                
 *
 *****************************************************************************/
NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,
    PUNICODE_STRING RegistryPath
	)
{
    	NDIS_STATUS Status;
    	NDIS_HANDLE NdisWrapperHandle;

    	NDIS_MINIPORT_CHARACTERISTICS MrvDrvNMC;

    	INITDEBUG();
    	DBGPRINT(DBG_LOAD | DBG_SP,("INIT - Enter DriverEntry\n"));
		
       ///RETAILMSG(1, (TEXT("INIT - Enter DriverEntry() \r\n")));		

	//AllenDBGPRINT(DBG_ALLEN | DBG_SP, ("INIT - DriverEntry() >> \n"));
	
#ifdef MRV_CHIP_8305
    	DBGPRINT(DBG_ALL, ("*** CF8305 Driver ***\n"));
#endif // #ifdef MRV_CHIP_8305

#ifdef MRV_CHIP_8381P
    	DBGPRINT(DBG_ALL, ("*** CF8381P Driver ***\n"));
#endif // #ifdef MRV_CHIP_8381P

#ifdef MRV_CHIP_8381PN
    	DBGPRINT(DBG_ALL, ("*** CF8381PN Driver ***\n"));
#endif // #ifdef MRV_CHIP_8381PN

#ifdef MRV_CHIP_8385PN
    	DBGPRINT(DBG_ALL, ("*** CF8385PN Driver ***\n"));
#endif // #ifdef MRV_CHIP_8385PN

#ifdef MRV_CHIP_8385H
    	DBGPRINT(DBG_ALL, ("*** CF8385H Driver ***\n"));
#endif // #ifdef MRV_CHIP_8385H

    	DBGPRINT(DBG_ALL, ("*** Driver version %s ***\n",
                        MRVDRV_DRIVER_BUILD_VERSION));
    	DBGPRINT(DBG_ALL, ("*** Built on %s %s ***\n",
                      __DATE__, 
                      __TIME__));

#if DBG
    	DBGPRINT(DBG_ALL, ("*** DEBGUG version ***\n"));
#else
    	DBGPRINT(DBG_ALL, ("*** FREE version ***\n"));
#endif

    // Now we must initialize the wrapper, and then register the Miniport
#if DBG
    	isrTimeDelay.QuadPart = 0;
#endif 

    	NdisMInitializeWrapper( 
			&NdisWrapperHandle,
			DriverObject,
        		RegistryPath,
        		NULL
       		);

gNdisWrapperHandle=NdisWrapperHandle;

    	NdisZeroMemory(&MrvDrvNMC, sizeof(MrvDrvNMC));

    	// Initialize the Miniport characteristics for NdisMRegisterMiniport.
    	MrvDrvNMC.MajorNdisVersion         	= MRVDRV_NDIS_MAJOR_VERSION;
    	MrvDrvNMC.MinorNdisVersion         	= MRVDRV_NDIS_MINOR_VERSION;

    	MrvDrvNMC.InitializeHandler        	= MrvDrvInitialize;

    	MrvDrvNMC.ResetHandler             	= MrvDrvReset;
    	MrvDrvNMC.CheckForHangHandler      = MrvDrvCheckForHang;
    	MrvDrvNMC.HaltHandler              		= MrvDrvHalt;
	
    	MrvDrvNMC.HandleInterruptHandler   	= MrvDrvHandleInterrupt;
    	MrvDrvNMC.DisableInterruptHandler  	= MrvDrvDisableInterrupt;
    	MrvDrvNMC.EnableInterruptHandler   	= MrvDrvEnableInterrupt;
    	MrvDrvNMC.ISRHandler               	= MrvDrvIsr;
	
    	MrvDrvNMC.QueryInformationHandler  = MrvDrvQueryInformation;
    	MrvDrvNMC.SetInformationHandler    	= MrvDrvSetInformation;  
	
    	MrvDrvNMC.AllocateCompleteHandler  = MrvDrvAllocateComplete;
    	MrvDrvNMC.ReconfigureHandler       	= NULL;

#ifdef NDIS51_MINIPORT
    	MrvDrvNMC.PnPEventNotifyHandler    	= MrvDrvPnPEventNotify;
    	MrvDrvNMC.CancelSendPacketsHandler = MrvDrvCancelSendPackets; 
    	MrvDrvNMC.AdapterShutdownHandler   = MrvDrvShutdownHandler;
#endif

#ifdef USE_RX_QUEUE
    	MrvDrvNMC.ReturnPacketHandler      	= MrvDrvReturnPacket;
    	MrvDrvNMC.TransferDataHandler      	= NULL;
#else
	MrvDrvNMC.ReturnPacketHandler      	= NULL;
    	MrvDrvNMC.TransferDataHandler      	= MrvDrvTransferData;
#endif

	MrvDrvNMC.SendPacketsHandler       	= NULL;    
    	MrvDrvNMC.SendHandler              	= MrvDrvSend;


    	//  Register this driver with the NDIS wrapper
    	//  This will cause MrvDrvInitialize to be called before returning
	Status = NdisMRegisterMiniport(
				NdisWrapperHandle,
				&MrvDrvNMC,
			        sizeof(NDIS_MINIPORT_CHARACTERISTICS));

    	if (Status == NDIS_STATUS_SUCCESS) 
    	{	
		DBGPRINT(DBG_LOAD,("<== DriverEntry: register miniport success\n"));
		return NDIS_STATUS_SUCCESS;	
    	}
	
    	NdisTerminateWrapper(NdisWrapperHandle, NULL);
	gNdisWrapperHandle=NULL;
    	DBGPRINT(DBG_LOAD,("<== INIT - DriverEntry: register miniport failed!!\n"));
    
    	return Status;
}

/******************************************************************************
 *
 *  Name: MrvDrvInitialize()
 *
 *  Description: 
 *      NDIS miniport initialization routine, upper layer interface to the NDIS wrapper.
 *      This routine will check medium support and call rsource allocation and HW 
 *      initialization routines to set up the staion.
 *
 *  Conditions for Use: 
 *      Will be called by NDIS wrapper to initialize the device
 *
 *  Arguments: 
 *      OUT PNDIS_STATUS OpenErrorStatus,
 *	    OUT PUINT SelectedMediumIndex,
 *	    IN PNDIS_MEDIUM MediumArray,
 *	    IN UINT MediumArraySize,
 *	    IN NDIS_HANDLE MiniportAdapterHandle,
 *	    IN NDIS_HANDLE WrapperConfigurationContext
 *    
 *  Return Value:         
 *      NDIS_STATUS_SUCCESS
 *      NDIS_STATUS_FAILURE
 * 
 *  Notes:                
 *
 *****************************************************************************/
NDIS_STATUS
MrvDrvInitialize(
	OUT PNDIS_STATUS OpenErrorStatus,
	OUT PUINT SelectedMediumIndex,
	IN PNDIS_MEDIUM MediumArray,
	IN UINT MediumArraySize,
	IN NDIS_HANDLE MiniportAdapterHandle,
	IN NDIS_HANDLE WrapperConfigurationContext
	)
{
	ULONG i;
       NDIS_STATUS Status;
       PMRVDRV_ADAPTER Adapter;
	NDIS_HANDLE RegHdl;
	
	///AllenDBGPRINT(DBG_LOAD ,("INIT - Enter MrvDrvInitialize >> \n"));

	// Only support medium type 802.3
       for ( i = 0; i < MediumArraySize; i++ )
	{
       	if ( MediumArray[i] == NdisMedium802_3 ) 
			break;
       }

	// If 802.3 is not found, return error
       if ( i == MediumArraySize) 
	{
              DBGPRINT(DBG_LOAD ,("802.3 Media type not found.\n"));
		NdisTerminateWrapper(WrapperConfigurationContext, NULL);	  
		gNdisWrapperHandle=NULL;
		return NDIS_STATUS_UNSUPPORTED_MEDIA;
       }

       // Select medium type 802.3
       *SelectedMediumIndex = i;

       /// Allocate the Adapter
       Adapter = AllocateAdapter();
	if (Adapter == NULL)
	{	
	       DBGPRINT(DBG_LOAD ,(" Adapter allocate error \n"));
		NdisTerminateWrapper(WrapperConfigurationContext, NULL);   
		gNdisWrapperHandle=NULL;
		return NDIS_STATUS_FAILURE;
	}   
       Adapter->MrvDrvAdapterHdl = MiniportAdapterHandle;

⌨️ 快捷键说明

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