📄 lan91c111_ndis.c
字号:
// Copyright (c) David Vescovi. All rights reserved.
// Part of Project DrumStix
// Windows Embedded Developers Interest Group (WE-DIG) community project.
// http://www.we-dig.org
/*
*
* Copyright (c) Standard MicroSystems Corporation. All Rights Reserved.
*
* LAN91C111 Driver for Windows CE .NET
*
* Revision History
*_______________________________________________________________________________
* Author Date Version Description
*_______________________________________________________________________________
* Pramod Bhardwaj 6/18/2002 0.1 Beta Release
* Pramod Bhardwaj 7/15/2002 1.0 Release
* Pramod Bhardwaj 1/22/2003 1.1 Removed some platform dependencies
* Pramod Bhardwaj 4/15/2003 2.0 Added support for alloc interrupt
*_______________________________________________________________________________
*
*Description:
* Contains the functions to be exported.
*
*
*/
#include "bsp.h"
#include <devload.h>
#include "LAN91C111.h"
#ifdef DEBUG
DBGPARAM dpCurSettings = {
TEXT("aumac"), {
TEXT("lan91Dll"),TEXT("Init"),TEXT("Rx"),TEXT("Tx"),
TEXT("Intr"), L"IndRx", L"IndTx", L"OID",
L"Power", L"MediaState", L"Undefined", L"Undefined",
L"Undefined", L"Settings", L"Undefined", L"Error" },
//0x83e3
0x8003
};
#endif
const NDIS_PHYSICAL_ADDRESS HighestAcceptedMax = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
NDIS_MINIPORT_CHARACTERISTICS Characteristics;
NDIS_HANDLE LAN91C111_WrapperHandle;
NDIS_STATUS Status=NDIS_STATUS_SUCCESS;
DWORD dwHardwareConfig;
DWORD dwBytesReturned;
HKEY hKey;
DWORD dwRegVal;
DWORD dwDataSize;
DWORD dwType;
// Get load information from hardware configuration.
if (!KernelIoControl(IOCTL_HAL_HARDWARE_CNFG, NULL,
0, &dwHardwareConfig, sizeof(DWORD), &dwBytesReturned))
{
DEBUGMSG(ZONE_ERROR, (_T("IOCTL_HAL_HARDWARE_CNFG failed!\r\n")));
return NDIS_STATUS_FAILURE;
}
if (0 == wcscmp(&RegistryPath->Buffer[5],TEXT("ETH1")) && !(dwHardwareConfig & GUMCFG_ETH1))
{
DEBUGMSG(ZONE_INIT, (_T("LAN: Hardware configuration does not support this driver!\r\n")));
return NDIS_STATUS_RESOURCES;
}
if (0 == wcscmp(&RegistryPath->Buffer[5],TEXT("ETH2")) && !(dwHardwareConfig & GUMCFG_ETH2))
{
DEBUGMSG(ZONE_INIT, (_T("LAN: Hardware configuration does not support this driver!\r\n")));
return NDIS_STATUS_RESOURCES;
}
// Get load information from the registry.
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCWSTR)RegistryPath->Buffer, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
{
DEBUGMSG(1, (TEXT("ERROR: RegOpenDeviceKey failed.\r\n")));
return NDIS_STATUS_FAILURE;
}
dwDataSize = sizeof(DWORD);
if( ERROR_SUCCESS == RegQueryValueEx( hKey, (_T("Flags")),
NULL, &dwType, (LPBYTE)&dwRegVal, &dwDataSize ) &&
REG_DWORD == dwType )
{
RegCloseKey(hKey);
if (dwRegVal == DEVFLAGS_NOLOAD)
{
RETAILMSG(1, (TEXT("%s: NOLOAD flag set. KITL use.\r\n"),&RegistryPath->Buffer[5]));
return NDIS_STATUS_FAILURE;
}
}
else
{
DEBUGMSG(1, (TEXT("ERROR: RegQueryValueEx failed.\r\n")));
RegCloseKey(hKey);
return NDIS_STATUS_FAILURE;
}
DEBUGMSG(ZONE_INIT, (TEXT("SMSC LAN91C111 WindowsCE.NET 5.0 (NDIS%d.%d) Driver V2.0 Build#%d\r\n"), DRIVER_NDIS_MAJOR_VERSION, DRIVER_NDIS_MINOR_VERSION, DRIVER_BUILD_NUM));
//Initialize the Wrapper.
NdisMInitializeWrapper( &LAN91C111_WrapperHandle,
DriverObject,
RegistryPath,
NULL
);
//Set up our Characteristics, but clear it first
NdisZeroMemory((PVOID) &Characteristics, sizeof(Characteristics));
Characteristics.MajorNdisVersion = DRIVER_NDIS_MAJOR_VERSION;
Characteristics.MinorNdisVersion = DRIVER_NDIS_MINOR_VERSION;
Characteristics.CheckForHangHandler = LAN91C111_MiniportCheckforHang; //Optional
Characteristics.DisableInterruptHandler = LAN91C111_MiniportDisableInterrupt;
Characteristics.EnableInterruptHandler = LAN91C111_MiniportEnableInterrupt;
Characteristics.HaltHandler = LAN91C111_MiniportHalt; //Required
Characteristics.HandleInterruptHandler = LAN91C111_MiniPortHandleInterrupt; //Required
Characteristics.InitializeHandler = LAN91C111_MiniportInitialize; //Required
Characteristics.ISRHandler = LAN91C111_MiniportISR; //Required
Characteristics.QueryInformationHandler = LAN91C111_MiniportQueryInformation; //Required
Characteristics.ReconfigureHandler = NULL;
Characteristics.ResetHandler = LAN91C111_MiniportReset; //Required
Characteristics.SendHandler = LAN91C111_MiniportSend; //Required
Characteristics.SetInformationHandler = LAN91C111_MiniportSetInformation;
Characteristics.TransferDataHandler = NULL;
//Register as an NDIS MiniPort Driver.
Status = NdisMRegisterMiniport(LAN91C111_WrapperHandle,
(NDIS_MINIPORT_CHARACTERISTICS *) &Characteristics,
sizeof(NDIS51_MINIPORT_CHARACTERISTICS));
if(Status != NDIS_STATUS_SUCCESS)
{
NdisTerminateWrapper (LAN91C111_WrapperHandle, NULL);
DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111 : NdisMRegisterMiniport Failed (%04x) !!\r\n"), Status));
}
if(Status == NDIS_STATUS_SUCCESS)
{
RETAILMSG(1, (TEXT("+%s_Init\r\n"),&RegistryPath->Buffer[5]));
}
DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111 <= DriverEntry\r\n")));
return(Status);
}
BOOL __stdcall DllEntry (
HANDLE hDLL,
DWORD dwReason,
LPVOID lpReserved
)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER(hDLL);
DEBUGMSG(ZONE_INIT, (TEXT("LAN : DLL Process Attach\r\n")));
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(ZONE_INIT, (TEXT("LAN : DLL Process Detach\r\n")));
break;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -