📄 main.c
字号:
Adapter->IOPortRangeRegistered = TRUE;
/* Initialize NIC */
#ifndef NOCARD
Status = NICInitialize(Adapter);
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE,("No NE2000 or compatible network adapter found at address 0x%X.\n",
Adapter->IOBase));
NDIS_DbgPrint(MID_TRACE, ("Status (0x%X).\n", Status));
MiniportHalt((NDIS_HANDLE)Adapter);
return Status;
}
NDIS_DbgPrint(MID_TRACE, ("BOARDDATA:\n"));
for (i = 0; i < 4; i++) {
NDIS_DbgPrint(MID_TRACE, ("%02X %02X %02X %02X\n",
Adapter->SAPROM[i*4+0],
Adapter->SAPROM[i*4+1],
Adapter->SAPROM[i*4+2],
Adapter->SAPROM[i*4+3]));
}
/* Setup adapter structure */
Adapter->TXStart = ((ULONG_PTR)Adapter->RamBase >> 8);
Adapter->TXCount = DRIVER_DEFAULT_TX_BUFFER_COUNT;
Adapter->TXFree = DRIVER_DEFAULT_TX_BUFFER_COUNT;
Adapter->TXCurrent = -1;
Adapter->PageStart = Adapter->TXStart + Adapter->TXCount;
Adapter->PageStop = Adapter->TXStart + (Adapter->RamSize >> 8);
/* Initialize multicast address mask to accept all */
for (i = 0; i < 8; i++)
Adapter->MulticastAddressMask[i] = 0xFF;
/* Setup the NIC */
NICSetup(Adapter);
NDIS_DbgPrint(MID_TRACE, ("TXStart (0x%X) TXCount (0x%X) PageStart (0x%X)\n",
Adapter->TXStart,
Adapter->TXCount,
Adapter->PageStart));
NDIS_DbgPrint(MID_TRACE, ("PageStop (0x%X) CurrentPage (0x%X) NextPacket (0x%X).\n",
Adapter->PageStop,
Adapter->CurrentPage,
Adapter->NextPacket));
#endif
/* Register the interrupt */
Status = NdisMRegisterInterrupt(
&Adapter->Interrupt,
MiniportAdapterHandle,
Adapter->InterruptVector,
Adapter->InterruptLevel,
FALSE,
FALSE,
NdisInterruptLatched);
if (Status != NDIS_STATUS_SUCCESS) {
NDIS_DbgPrint(MIN_TRACE, ("Cannot register interrupt. Status (0x%X).\n", Status));
MiniportHalt((NDIS_HANDLE)Adapter);
return Status;
}
Adapter->InterruptRegistered = TRUE;
#ifndef NOCARD
/* Start the NIC */
NICStart(Adapter);
#endif
/* Add adapter to the global adapter list */
InsertTailList(&DriverInfo.AdapterListHead, &Adapter->ListEntry);
NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n"));
return NDIS_STATUS_SUCCESS;
}
static VOID STDCALL MiniportISR(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueMiniportHandleInterrupt,
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Interrupt Service Routine for controlled adapters
* ARGUMENTS:
* InterruptRecognized = Address of buffer to place wether
* the adapter generated the interrupt
* QueueMiniportHandleInterrupt = Address of buffer to place wether
* MiniportHandleInterrupt should be called
* MiniportAdapterContext = Pointer to adapter context area
* NOTES:
* All pending interrupts are handled
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
NICDisableInterrupts((PNIC_ADAPTER)MiniportAdapterContext);
*InterruptRecognized = TRUE;
*QueueMiniportHandleInterrupt = TRUE;
}
static NDIS_STATUS STDCALL MiniportQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded)
/*
* FUNCTION: Handler to process queries
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
* Oid = OID code designating query operation
* InformationBuffer = Address of return buffer
* InformationBufferLength = Length of return buffer
* BytesWritten = Address of buffer to place number of bytes returned
* BytesNeeded = Address of buffer to place number of bytes needed
* in InformationBuffer for specified OID
* RETURNS:
* Status of operation
*/
{
NDIS_STATUS Status;
PVOID CopyFrom;
UINT CopySize;
ULONG GenericULONG;
USHORT GenericUSHORT;
NDIS_MEDIUM Medium = NdisMedium802_3;
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid));
Status = NDIS_STATUS_SUCCESS;
CopyFrom = (PVOID)&GenericULONG;
CopySize = sizeof(ULONG);
switch (Oid) {
case OID_GEN_SUPPORTED_LIST:
CopyFrom = (PVOID)&MiniportOIDList;
CopySize = sizeof(MiniportOIDList);
break;
case OID_GEN_HARDWARE_STATUS:
GenericULONG = (ULONG)NdisHardwareStatusReady;
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
CopyFrom = (PVOID)&Medium;
CopySize = sizeof(NDIS_MEDIUM);
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
GenericULONG = DRIVER_MAXIMUM_LOOKAHEAD;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
GenericULONG = DRIVER_FRAME_SIZE - DRIVER_HEADER_SIZE;
break;
case OID_GEN_LINK_SPEED:
GenericULONG = 100000; /* 10Mbps */
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
GenericULONG = Adapter->TXCount * DRIVER_BLOCK_SIZE;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
GenericULONG = Adapter->RamSize -
(ULONG_PTR)Adapter->RamBase -
(Adapter->TXCount * DRIVER_BLOCK_SIZE);
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
GenericULONG = DRIVER_BLOCK_SIZE;
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
GenericULONG = DRIVER_BLOCK_SIZE;
break;
case OID_GEN_VENDOR_ID:
NdisMoveMemory(&GenericULONG, &Adapter->PermanentAddress, 3);
GenericULONG &= 0xFFFFFF00;
GenericULONG |= 0x01;
break;
case OID_GEN_VENDOR_DESCRIPTION:
CopyFrom = (PVOID)&DRIVER_VENDOR_DESCRIPTION;
CopySize = sizeof(DRIVER_VENDOR_DESCRIPTION);
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
GenericUSHORT = (USHORT)DRIVER_VENDOR_DRIVER_VERSION;
CopyFrom = (PVOID)&GenericUSHORT;
CopySize = sizeof(USHORT);
break;
case OID_GEN_CURRENT_PACKET_FILTER:
GenericULONG = Adapter->PacketFilter;
break;
case OID_GEN_CURRENT_LOOKAHEAD:
GenericULONG = Adapter->LookaheadSize;
break;
case OID_GEN_DRIVER_VERSION:
GenericUSHORT = ((USHORT)DRIVER_NDIS_MAJOR_VERSION << 8) | DRIVER_NDIS_MINOR_VERSION;
CopyFrom = (PVOID)&GenericUSHORT;
CopySize = sizeof(USHORT);
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
GenericULONG = DRIVER_FRAME_SIZE;
break;
case OID_GEN_PROTOCOL_OPTIONS:
NDIS_DbgPrint(MID_TRACE, ("OID_GEN_PROTOCOL_OPTIONS.\n"));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_MAC_OPTIONS:
GenericULONG = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_NO_LOOPBACK;
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
GenericULONG = (ULONG)NdisMediaStateConnected;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
GenericULONG = 1;
break;
case OID_802_3_PERMANENT_ADDRESS:
CopyFrom = (PVOID)&Adapter->PermanentAddress;
CopySize = DRIVER_LENGTH_OF_ADDRESS;
break;
case OID_802_3_CURRENT_ADDRESS:
CopyFrom = (PVOID)&Adapter->StationAddress;
CopySize = DRIVER_LENGTH_OF_ADDRESS;
break;
case OID_802_3_MULTICAST_LIST:
NDIS_DbgPrint(MID_TRACE, ("OID_802_3_MULTICAST_LIST.\n"));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
GenericULONG = Adapter->MaxMulticastListSize;
break;
case OID_802_3_MAC_OPTIONS:
NDIS_DbgPrint(MID_TRACE, ("OID_802_3_MAC_OPTIONS.\n"));
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
default:
NDIS_DbgPrint(MIN_TRACE, ("Unknown OID (0x%X).\n", Oid));
Status = NDIS_STATUS_INVALID_OID;
break;
}
if (Status == NDIS_STATUS_SUCCESS) {
if (CopySize > InformationBufferLength) {
*BytesNeeded = (CopySize - InformationBufferLength);
*BytesWritten = 0;
Status = NDIS_STATUS_INVALID_LENGTH;
} else {
NdisMoveMemory(InformationBuffer, CopyFrom, CopySize);
*BytesWritten = CopySize;
*BytesNeeded = 0;
}
}
NDIS_DbgPrint(MAX_TRACE, ("Leaving. Status is (0x%X).\n", Status));
return Status;
}
static NDIS_STATUS STDCALL MiniportReconfigure(
OUT PNDIS_STATUS OpenErrorStatus,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE WrapperConfigurationContext)
/*
* FUNCTION: Reconfigures an adapter
* ARGUMENTS:
* OpenErrorStatus = Address of buffer to place additional status information
* MiniportAdapterContext = Pointer to adapter context area
* WrapperConfigurationContext = Handle used to identify configuration context
* RETURNS:
* Status of operation
* NOTES:
* Never called by NDIS library
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
return NDIS_STATUS_FAILURE;
}
static NDIS_STATUS STDCALL MiniportReset(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportAdapterContext)
/*
* FUNCTION: Resets an adapter
* ARGUMENTS:
* AddressingReset = Address of a buffer to place value indicating
* wether NDIS library should call MiniportSetInformation
* to restore addressing information
* MiniportAdapterContext = Pointer to adapter context area
* RETURNS:
* Status of operation
*/
{
NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
return NDIS_STATUS_FAILURE;
}
static NDIS_STATUS STDCALL MiniportSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags)
/*
* FUNCTION: Transmits a packet
* ARGUMENTS:
* MiniportAdapterContext = Pointer to adapter context area
* Packet = Pointer to a packet descriptor specifying
* the data to be transmitted
* Flags = Specifies optional packet flags
* RETURNS:
* Status of operation
*/
{
PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
NDIS_DbgPrint(MID_TRACE, ("Queueing packet.\n"));
#ifdef NOCARD
NdisMSendComplete(Adapter->MiniportAdapterHandle,
Packet,
NDIS_STATUS_SUCCESS);
#else
/* Queue the packet on the transmit queue */
RESERVED(Packet)->Next = NULL;
if (Adapter->TXQueueHead == NULL) {
Adapter->TXQueueHead = Packet;
} else {
RESERVED(Adapter->TXQueueTail)->Next = Packet;
}
Adapter->TXQueueTail = Packet;
/* Transmit the packet */
NICTransmit(Adapter);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -