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

📄 lan91c111_ndis.c

📁 老外的一个开源项目
💻 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 + -