📄 initproc.c
字号:
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 + -