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