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

📄 itek_init.c

📁 win9x下的一个网卡驱动程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
///////////////////////////////////////////////////////////////////////////
//

//to use the following functions from standard c-library directly
#include  <string.h>
#pragma intrinsic(memcpy, memcmp, memset, strcat, strcmp, strcpy, strlen)

#pragma warning(disable:4201 4514 4100)

//to include Windows95 DDK header files
//
#include  <basedef.h>
#include  <vmm.h>
#include  <debug.h>
#include  <ndis.h>
#include  <vwin32.h>
#include  <efilter.h>

#include "ITek_type.h"
#include "ITek_init.h"
#include "ITek_util.h"

#pragma VxD_LOCKED_CODE_SEG
#pragma VxD_LOCKED_DATA_SEG

NDIS_PHYSICAL_ADDRESS HighestPhysicalAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1,-1);

//candidates for the global vars.
DRIVER_BLOCK        gDriverBlock = {0};

// ITEK MAC supports the following OIDs(Object IDentifiers)
STATIC UINT ITEKSupportedOids[] = 
{
	//General Operational Characteristics
	OID_GEN_SUPPORTED_LIST,
	OID_GEN_HARDWARE_STATUS,
	OID_GEN_MEDIA_SUPPORTED,
	OID_GEN_MEDIA_IN_USE,
	OID_GEN_MAXIMUM_LOOKAHEAD,
	OID_GEN_MAXIMUM_FRAME_SIZE,
	OID_GEN_LINK_SPEED,
	OID_GEN_TRANSMIT_BUFFER_SPACE,
	OID_GEN_RECEIVE_BUFFER_SPACE,
	OID_GEN_TRANSMIT_BLOCK_SIZE,
	OID_GEN_RECEIVE_BLOCK_SIZE,
	OID_GEN_VENDOR_ID,
	OID_GEN_VENDOR_DESCRIPTION,
	OID_GEN_CURRENT_PACKET_FILTER,
	OID_GEN_CURRENT_LOOKAHEAD,
	OID_GEN_DRIVER_VERSION,
	OID_GEN_MAXIMUM_TOTAL_SIZE,
	OID_GEN_PROTOCOL_OPTIONS,
	OID_GEN_MAC_OPTIONS,
	//OID_GEN_MEDIA_CONNECT_STATUS,
	//OID_GEN_MAXIMUM_SEND_PACKETS,
	//General Statistics
	OID_GEN_XMIT_OK,
	OID_GEN_RCV_OK,
	OID_GEN_XMIT_ERROR,
	OID_GEN_RCV_ERROR,
	OID_GEN_RCV_NO_BUFFER,
	OID_GEN_DIRECTED_BYTES_XMIT,
	OID_GEN_DIRECTED_FRAMES_XMIT,
	OID_GEN_DIRECTED_BYTES_RCV,
	OID_GEN_DIRECTED_FRAMES_RCV,
	OID_GEN_RCV_CRC_ERROR,
	OID_GEN_TRANSMIT_QUEUE_LENGTH,
	//Ethernet Operational Charateraritics
	OID_802_3_PERMANENT_ADDRESS,
	OID_802_3_CURRENT_ADDRESS,
	OID_802_3_MULTICAST_LIST,
	OID_802_3_MAXIMUM_LIST_SIZE,
	//Ethernet Statistics	
	OID_802_3_RCV_ERROR_ALIGNMENT,
	OID_802_3_XMIT_ONE_COLLISION,
	OID_802_3_XMIT_MORE_COLLISIONS,
	OID_802_3_XMIT_DEFERRED
};


///////////////////////////////////////////////////////////////////////////
//
//  DriverEntry
//
///////////////////////////////////////////////////////////////////////////
NDIS_STATUS NDIS_API
DriverEntry(
	IN  PDRIVER_OBJECT  DriverObject,   // NULL in Windows95 CHICAGO
	IN  PUNICODE_STRING RegistryPath    // NULL in Windows95 CHICAGO
	)
{
	NDIS_STATUS         NdisStatus;
	NDIS_HANDLE         NdisWrapperHandle = (NDIS_HANDLE)-1;
    PDRIVER_BLOCK		pNewMac = &gDriverBlock;
    NDIS_STRING			MacName = NDIS_STRING_CONST((PUCHAR)("ITEK"));
	
#ifdef	DEBUG
	Debug_Printf("ITEK:DriverEntry() Entry\n");
#endif

	//to tell NDIS that the ITek ATM  is initializing. 
	NdisInitializeWrapper(&NdisWrapperHandle,
				          DriverObject,
						  RegistryPath,
			              NULL);

#ifdef	DEBUG
	Debug_Printf("ITEK:Wrapper Initialized(0x%x)\n", NdisWrapperHandle);
#endif
	//here set NdisWrapperHandler to the corresponding global var.
	//
	pNewMac->DriverObject = DriverObject;
	pNewMac->NdisWrapperHandle = NdisWrapperHandle;
	pNewMac->NextITek = (PITEK_ADAPTER)NULL;

	//to register our NIC callbacks
	pNewMac->MacCharacteristics.MajorNdisVersion = ITEK_DRIVER_MAJOR;
	pNewMac->MacCharacteristics.MinorNdisVersion = ITEK_DRIVER_MINOR;
	pNewMac->MacCharacteristics.Reserved = 0;
	pNewMac->MacCharacteristics.OpenAdapterHandler  = ITekOpenAdapter;
	pNewMac->MacCharacteristics.CloseAdapterHandler = ITekCloseAdapter;
	pNewMac->MacCharacteristics.SendHandler        =  ITekSend;
	pNewMac->MacCharacteristics.TransferDataHandler = ITekTransferData;
	pNewMac->MacCharacteristics.ResetHandler        = ITekReset;
	pNewMac->MacCharacteristics.RequestHandler        = ITekRequest;
	pNewMac->MacCharacteristics.QueryGlobalStatisticsHandler = ITekQueryGlobalStatistics;
	pNewMac->MacCharacteristics.UnloadMacHandler       = ITekUnload;
	pNewMac->MacCharacteristics.AddAdapterHandler      = ITekAddAdapter;
	pNewMac->MacCharacteristics.RemoveAdapterHandler   = ITekRemoveAdapter;
	pNewMac->MacCharacteristics.Name = MacName;

	//to register our NIC driver's entry points and 
	//name with the NDIS library when the driver initializes.
	NdisRegisterMac(&NdisStatus,
					&pNewMac->NdisMacHandle,
					NdisWrapperHandle,
					(NDIS_HANDLE)&gDriverBlock,
					&pNewMac->MacCharacteristics,
					sizeof(pNewMac->MacCharacteristics));

	//let the device init procedure to handle the result.
	if(NdisStatus != NDIS_STATUS_SUCCESS) {
		NdisTerminateWrapper(NdisWrapperHandle, NULL);
#ifdef	DEBUG
		Debug_Printf("ITEK:Registered as Mac Failed(Error#%x), Return\n", NdisStatus);
#endif
	} else {
#ifdef	DEBUG
		Debug_Printf("ITEK:Registered as Mac Succeeded(MacMacContext=0x%x, MacHandle=0x%x) Return\n",
						(NDIS_HANDLE)&gDriverBlock, pNewMac->NdisMacHandle);
#endif
	}

	return	(NdisStatus);
}



///////////////////////////////////////////////////////////////////////////
//  ITekAddAdapter
//
NDIS_STATUS	NDIS_API
ITekAddAdapter(
		IN	NDIS_HANDLE		MacMacContext,
		IN	NDIS_HANDLE		ConfigurationHandle,
		IN	PNDIS_STRING	AdapterName
		)
{
	NDIS_STATUS         NdisStatus;
    PDRIVER_BLOCK		pMacContext = (PDRIVER_BLOCK)MacMacContext;
	PITEK_ADAPTER      pITekAdapter;
    NDIS_STRING			BusTypeStr = NDIS_STRING_CONST((PUCHAR)("BusType"));
	NDIS_ADAPTER_INFORMATION	AdapterInformation;

#ifdef  DEBUG
	Debug_Printf("ITEK:ITekAddAdapter(MacMacContext, ConfigurationHandle, %s) Entry\n",
					AdapterName->Buffer);
#endif

	NdisStatus = NDIS_STATUS_FAILURE;

	//alloc the new brabo atm driver
	ITekAllocateMemory((PVOID *)&pITekAdapter,	sizeof(ITEK_ADAPTER));

	if(pITekAdapter == NULL) 
		return  (NDIS_STATUS_FAILURE);

	NdisZeroMemory(pITekAdapter, sizeof(ITEK_ADAPTER));   
#ifdef  DEBUG
	Debug_Printf("ITEK:Allocate One ITek Adapter Object Context\n");
#endif

	// Initializing this ITEK adapter object
	pITekAdapter->ConfigurationHandle = ConfigurationHandle;	//WrapperHandle
	pITekAdapter->WrapperHandle = 	pMacContext->NdisWrapperHandle;
#ifdef	DEBUG
	Debug_Printf("ITEK:ConfigurationHandle=0x%x, WrapperHandle=0x%x\n",
					pITekAdapter->ConfigurationHandle,
					pITekAdapter->WrapperHandle);
#endif


	pITekAdapter->AdapterType = NdisInterfaceInternal;
	pITekAdapter->NicStatus = NIC_DISABLED;
	pITekAdapter->MulticastListMax = ITEK_MULTICASTLIST_MAX;

	pITekAdapter->PermanentAddress[0] = 0x00;
	pITekAdapter->PermanentAddress[1] = 0x00;
	pITekAdapter->PermanentAddress[2] = 0x00;
	pITekAdapter->PermanentAddress[3] = 0x00;
	pITekAdapter->PermanentAddress[4] = 0x00;
	pITekAdapter->PermanentAddress[5] = 0x00;

	pITekAdapter->CurrentAddress[0] = pITekAdapter->PermanentAddress[0];
	pITekAdapter->CurrentAddress[1] = pITekAdapter->PermanentAddress[1];
	pITekAdapter->CurrentAddress[2] = pITekAdapter->PermanentAddress[2];
	pITekAdapter->CurrentAddress[3] = pITekAdapter->PermanentAddress[3];
	pITekAdapter->CurrentAddress[4] = pITekAdapter->PermanentAddress[4];
	pITekAdapter->CurrentAddress[5] = pITekAdapter->PermanentAddress[5];

	pITekAdapter->DestinationAddress[0] = 0xff;
	pITekAdapter->DestinationAddress[1] = 0xff;
	pITekAdapter->DestinationAddress[2] = 0xff;
	pITekAdapter->DestinationAddress[3] = 0xff;
	pITekAdapter->DestinationAddress[4] = 0xff;
	pITekAdapter->DestinationAddress[5] = 0xff;

	pITekAdapter->pHeadPacket = NULL;
	pITekAdapter->pTailPacket = NULL;

	pITekAdapter->NicStatus = NIC_CONFIGURING;

	// Now we can safely use the ITek ATM NIC's operational registers via its mapped host 
	// pointer, pOpRegs.

	//add to the global ITek adapter lists
	pITekAdapter->NextITek = pMacContext->NextITek;
	pMacContext->NextITek = pITekAdapter;

	NdisZeroMemory (&AdapterInformation, sizeof(NDIS_ADAPTER_INFORMATION));

	AdapterInformation.Master = 0;
	AdapterInformation.Dma32BitAddresses = 0;
    AdapterInformation.AdapterType = pITekAdapter->AdapterType;
	AdapterInformation.PhysicalMapRegistersNeeded = 0;
	AdapterInformation.MaximumPhysicalMapping =  0;
    AdapterInformation.NumberOfPortDescriptors = 0;
    AdapterInformation.PortDescriptors[0].InitialPort = 0;
    AdapterInformation.PortDescriptors[0].NumberOfPorts = 0;

	NdisStatus = NdisRegisterAdapter(
		&pITekAdapter->ITekAdapterHandle,
		pMacContext->NdisMacHandle,
		(NDIS_HANDLE)pITekAdapter,
		ConfigurationHandle,
		AdapterName,
		(PVOID)&AdapterInformation); 

	if(NdisStatus != NDIS_STATUS_SUCCESS) {
#ifdef  DEBUG
	Debug_Printf("ITEK:NdisRegisterAdapter failed(Error#%x)\n", NdisStatus);
#endif
		return  (NdisStatus);
	}

	NdisAllocateSpinLock(&pITekAdapter->Lock);

	if(EthCreateFilter(
				pITekAdapter->MulticastListMax,
				ITekAddressChangeAction,
				ITekFilterChangeAction,
				ITekCloseAction,
				pITekAdapter->CurrentAddress,
				&pITekAdapter->Lock,
				&pITekAdapter->FilterDB) == FALSE)
	{
#ifdef  DEBUG
	Debug_Printf("ITEK:EthCreateFilter() failed\n");
#endif
		NdisFreeSpinLock(&pITekAdapter->Lock);
		NdisStatus = NDIS_STATUS_FAILURE;
		return  (NdisStatus);
	} 

#ifdef	ITEK_TIMER
			NdisInitializeTimer(
				&pITekAdapter->NdisTimer,
				ITekTimerFunction,
				(PVOID)pITekAdapter);

			NdisSetTimer(
				&pITekAdapter->NdisTimer,
				ITEK_TIMEOUT_MSEC);			//see datastru.h
#ifdef	DEBUG
			Debug_Printf("Timer initialized and set\n");
#endif
#endif //ITEK_TIMER


	pITekAdapter->NicStatus = NIC_ENABLED;

#ifdef  DEBUG
	Debug_Printf("ITEK:ITekAddAdapter() Return with 0x%x\n", NdisStatus);
#endif

	return  (NdisStatus);
}

///////////////////////////////////////////////////////////////////////////
//  ITekRemoveAdapter
//
VOID	NDIS_API
ITekRemoveAdapter(
    IN PVOID MacAdapterContext
    )
{
	PITEK_ADAPTER      pITekAdapter = (PITEK_ADAPTER)MacAdapterContext;
#ifdef	DEBUG
	Debug_Printf("ITEK:ITekRemoveAdapter(MacAdapterContext=0x%x) Entry\n", 
					MacAdapterContext);
#endif

	// free this adapter context
#ifdef	DEBUG
	Debug_Printf("free this adapter context\n");
#endif
	gDriverBlock.NextITek = pITekAdapter->NextITek;
	ITekFreeMemory((PVOID)pITekAdapter);

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekRemoveAdapter() Return\n");
#endif

	return;
}

///////////////////////////////////////////////////////////////////////////
//  ITekOpenAdapter
//
NDIS_STATUS	NDIS_API
ITekOpenAdapter(
    OUT PNDIS_STATUS OpenErrorStatus,
    OUT NDIS_HANDLE *MacBindingHandle,
    OUT PUINT SelectedMediumIndex,
    IN PNDIS_MEDIUM MediumArray,
    IN UINT MediumArraySize,
    IN NDIS_HANDLE NdisBindingContext,
    IN NDIS_HANDLE MacAdapterContext,
    IN UINT OpenOptions,
    IN PSTRING AddressingInformation OPTIONAL
    )
{
	NDIS_STATUS         NdisStatus;
	PITEK_ADAPTER      pITekAdapter = (PITEK_ADAPTER)MacAdapterContext;
	PITEK_OPEN			pITekOpen = (PITEK_OPEN)NULL;
	UINT                uIndex;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekOpenAdapter(NdisBindingContext=0x%x) Entry\n", NdisBindingContext);
#endif

	NdisStatus = NDIS_STATUS_FAILURE;
	*OpenErrorStatus = NDIS_STATUS_FAILURE;

	//select the supported medium type
	for(uIndex = 0; uIndex < MediumArraySize; uIndex) {
		if(*(MediumArray+uIndex) == NdisMedium802_3) {
			break;
		}
	}

	if(uIndex == MediumArraySize)
		return  (NDIS_STATUS_UNSUPPORTED_MEDIA);

	*SelectedMediumIndex = uIndex;

	ITekAllocateMemory((PVOID *)&pITekOpen, sizeof(ITEK_OPEN));
	if(pITekOpen == NULL) {
#ifdef	DEBUG
		Debug_Printf("Allocating ITEK_OPEN instance failed\n");
#endif
		return	(NDIS_STATUS_RESOURCES);
	}


	NdisZeroMemory(pITekOpen, sizeof(ITEK_OPEN));   

	pITekAdapter->ReferenceCount++;

	NdisAcquireSpinLock(&pITekAdapter->Lock);
	if(EthNoteFilterOpenAdapter(
				pITekAdapter->FilterDB,
				pITekOpen,
				NdisBindingContext,
				&pITekOpen->NdisFilterHandle) == FALSE) {
#ifdef	DEBUG
		Debug_Printf("EthNoteFilterOpenAdapter() Failed\n");
#endif
		NdisReleaseSpinLock(&pITekAdapter->Lock);
		ITekFreeMemory((PVOID)pITekOpen);
		return	(NDIS_STATUS_FAILURE);
	}

	pITekOpen->NextOpen = pITekAdapter->NextOpen;
	pITekAdapter->NextOpen = pITekOpen;

	pITekOpen->pITekAdapter = pITekAdapter;
	pITekOpen->pDriverBlock = &gDriverBlock;
	pITekOpen->NdisBindingContext = NdisBindingContext;
	pITekOpen->AddressingInformation = AddressingInformation;
	pITekOpen->OpenOptions = OpenOptions;
	pITekOpen->ProtOptionFlags = 0;
	pITekOpen->ReferenceCount = 1;
	pITekOpen->Closing = FALSE;

	pITekOpen->PacketFilter = 0;
	pITekOpen->MaxLookAhead = ITEK_MAX_LOOKAHEAD;

	*MacBindingHandle = (NDIS_HANDLE)pITekOpen;

	NdisStatus = NDIS_STATUS_SUCCESS;
	*OpenErrorStatus = NDIS_STATUS_SUCCESS;

	NdisReleaseSpinLock(&pITekAdapter->Lock);

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekOpenAdapter() Return with MacBindingHandle=0x%x\n",
					(NDIS_HANDLE)pITekOpen);
#endif

	return	(NdisStatus);
}

///////////////////////////////////////////////////////////////////////////
//  ITekCloseAdapter
//
NDIS_STATUS	NDIS_API
ITekCloseAdapter(
    IN NDIS_HANDLE MacBindingHandle
    )
{
	NDIS_STATUS		NdisStatus;
	PITEK_OPEN		pITekOpen = (PITEK_OPEN)MacBindingHandle;	
	PITEK_OPEN		pTempOpen;
	PITEK_ADAPTER	pITekAdapter;

#ifdef	DEBUG
	Debug_Printf("ITEK:ITekCloseAdapter(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif

	NdisStatus = NDIS_STATUS_SUCCESS;
	pITekAdapter = pITekOpen->pITekAdapter;

	if(pITekOpen->Closing == TRUE) {
#ifdef	DEBUG
		Debug_Printf("ITEK:Closing...Return\n");
#endif
		return	(NDIS_STATUS_CLOSING);
	}
	
	if(pITekOpen == pITekAdapter->NextOpen) {
		pITekAdapter->NextOpen =  pITekOpen->NextOpen;
	} else {
		pTempOpen = pITekAdapter->NextOpen;
		while(pTempOpen->NextOpen != pITekOpen) {
			pTempOpen = pTempOpen->NextOpen;

⌨️ 快捷键说明

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