itek_init.c
来自「win9x下的一个网卡驱动程序。」· C语言 代码 · 共 1,398 行 · 第 1/3 页
C
1,398 行
}
pTempOpen->NextOpen = pITekOpen->NextOpen;
}
//pITekOpen->NextOpen = NULL;
NdisStatus = EthDeleteFilterOpenAdapter(
pITekAdapter->FilterDB,
pITekOpen->NdisFilterHandle,
NULL);
if(NdisStatus != NDIS_STATUS_SUCCESS) {
pITekOpen->Closing = TRUE;
#ifdef DEBUG
Debug_Printf("ITEK:EthDeleteFilterOpenAdapter() pending...\n");
#endif
return (NDIS_STATUS_PENDING);
}
pITekOpen->ReferenceCount--;
pITekAdapter->ReferenceCount--;
if(pITekOpen->ReferenceCount == 0) {
#ifdef DEBUG
Debug_Printf("Free Open Instance(0x%x)\n", MacBindingHandle);
#endif
ITekFreeMemory((PVOID)pITekOpen);
}
#ifdef DEBUG
Debug_Printf("ITEK:ITekCloseAdapter() Return\n");
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekReset
//
NDIS_STATUS NDIS_API
ITekReset(
IN NDIS_HANDLE MacBindingHandle
)
{
NDIS_STATUS NdisStatus;
PITEK_OPEN pITekOpen = (PITEK_OPEN)MacBindingHandle;
PITEK_ADAPTER pITekAdapter;
#ifdef DEBUG
Debug_Printf("ITEK:ITekReset(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif
NdisStatus = NDIS_STATUS_FAILURE;
pITekAdapter = pITekOpen->pITekAdapter;
if(pITekAdapter->NicStatus == NIC_RESETTING) {
#ifdef DEBUG
Debug_Printf("Resetting already progressing\n");
#endif
NdisStatus = NDIS_STATUS_RESET_IN_PROGRESS;
} else {
//???
}
#ifdef DEBUG
Debug_Printf("ITEK:ITekReset() Return\n");
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekRequest
//
NDIS_STATUS NDIS_API
ITekRequest(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest
)
{
NDIS_STATUS NdisStatus;
PITEK_OPEN pITekOpen = (PITEK_OPEN)MacBindingHandle;
PITEK_ADAPTER pITekAdapter;
ULONG BytesWritten, BytesRead, BytesNeeded;
#ifdef DEBUG
Debug_Printf("ITEK:ITekRequest(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif
pITekAdapter = pITekOpen->pITekAdapter;
BytesWritten = 0;
BytesRead = 0;
BytesNeeded = 0;
if(NdisRequest->RequestType == NdisRequestQueryInformation) {
NdisStatus = ITekQueryInformation(
pITekAdapter,
pITekOpen,
NdisRequest->DATA.QUERY_INFORMATION.Oid,
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
&BytesWritten,
&BytesNeeded);
NdisRequest->DATA.QUERY_INFORMATION.BytesWritten = (UINT)BytesWritten;
NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = (UINT)BytesNeeded;
} else if (NdisRequest->RequestType == NdisRequestSetInformation) {
NdisStatus = ITekSetInformation(
pITekAdapter,
pITekOpen,
NdisRequest,
NdisRequest->DATA.SET_INFORMATION.Oid,
NdisRequest->DATA.SET_INFORMATION.InformationBuffer,
NdisRequest->DATA.SET_INFORMATION.InformationBufferLength,
&BytesRead,
&BytesNeeded);
NdisRequest->DATA.SET_INFORMATION.BytesRead = (UINT)BytesRead;
NdisRequest->DATA.SET_INFORMATION.BytesNeeded = (UINT)BytesNeeded;
} else {
NdisStatus = NDIS_STATUS_NOT_RECOGNIZED;
}
//NdisCompleteRequest(
// pITekOpen->NdisBindingContext,
// NdisRequest,
// NDIS_STATUS_SUCCESS
// );
#ifdef DEBUG
Debug_Printf("ITEK:ITekRequest() Return\n");
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekQueryGlobalStatistics
//
NDIS_STATUS NDIS_API
ITekQueryGlobalStatistics(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest
)
{
NDIS_STATUS NdisStatus;
PITEK_OPEN pITekOpen = (PITEK_OPEN)MacBindingHandle;
PITEK_ADAPTER pITekAdapter;
ULONG BytesWritten, BytesNeeded;
#ifdef DEBUG
Debug_Printf("ITEK:ITekQueryGlobalStatistics() Entry\n");
#endif
pITekAdapter = pITekOpen->pITekAdapter;
BytesWritten = 0;
BytesNeeded = 0;
NdisStatus = NDIS_STATUS_FAILURE;
NdisStatus = ITekQueryInformation(
pITekAdapter,
pITekOpen,
NdisRequest->DATA.QUERY_INFORMATION.Oid,
NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer,
NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength,
&BytesWritten,
&BytesNeeded);
NdisRequest->DATA.QUERY_INFORMATION.BytesWritten = (UINT)BytesWritten;
NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded = (UINT)BytesNeeded;
#ifdef DEBUG
Debug_Printf("ITEK:ITekQueryGlobalStatistics() Return(0x%x)\n",
NdisStatus);
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekUnload
//
VOID NDIS_API
ITekUnload(
IN NDIS_HANDLE MacMacContext
)
{
NDIS_STATUS NdisStatus;
PDRIVER_BLOCK pMacContext = (PDRIVER_BLOCK)MacMacContext;
#ifdef DEBUG
Debug_Printf("ITEK:ITekUnload(MacMacContext=0x%x) Entry\n",
MacMacContext);
#endif
NdisDeregisterMac(
&NdisStatus,
pMacContext->NdisMacHandle
);
NdisTerminateWrapper(
pMacContext->NdisWrapperHandle,
NULL
);
#ifdef DEBUG
Debug_Printf("ITEK:ITekUnload() Return\n");
#endif
return;
}
///////////////////////////////////////////////////////////////////////////
// ITekTransferData
//
NDIS_STATUS NDIS_API
ITekTransferData(
IN NDIS_HANDLE MacBindingHandle,
IN NDIS_HANDLE MacReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer,
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred
)
{
NDIS_STATUS NdisStatus;
#ifdef DEBUG
Debug_Printf("ITEK:ITekTransferData() Entry\n");
#endif
NdisStatus = NDIS_STATUS_FAILURE;
#ifdef DEBUG
Debug_Printf("ITEK:ITekTransferData() Return\n");
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekSend
//
NDIS_STATUS NDIS_API
ITekSend(
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_PACKET Packet
)
{
NDIS_STATUS NdisStatus;
PITEK_OPEN pITekOpen = (PITEK_OPEN)MacBindingHandle;
PITEK_ADAPTER pITekAdapter;
PNDIS_BUFFER pNdisBuffer;
UINT PhysicalBufferCount;
UINT BufferCount, BufferLength;
UINT TotalPacketLength;
PCHAR pHdrData;
#ifdef DEBUG
Debug_Printf("ITEK:ITekSend(MacBindingHandle=0x%x) Entry\n", MacBindingHandle);
#endif
NdisStatus = NDIS_STATUS_SUCCESS;
pITekAdapter = pITekOpen->pITekAdapter;
if(pITekOpen->Closing == TRUE) {
#ifdef DEBUG
Debug_Printf("ITEK:Closing...\n");
#endif
return (NDIS_STATUS_CLOSING);
}
NdisQueryPacket(
Packet,
&PhysicalBufferCount,
&BufferCount,
&pNdisBuffer,
&TotalPacketLength);
NdisQueryBuffer(
pNdisBuffer,
(PVOID *)&pHdrData,
&BufferLength);
if(BufferLength < ITEK_PDU_HDRSIZE) {
NdisStatus = NDIS_STATUS_FAILURE;
return (NdisStatus);
}
ITEK_RESERVED(Packet)->pITekOpen = pITekOpen;
if(pITekAdapter->pHeadPacket == NULL) {
pITekAdapter->pHeadPacket = Packet;
} else {
ITEK_RESERVED(pITekAdapter->pTailPacket)->pNextPacket = Packet;
}
ITEK_RESERVED(Packet)->pNextPacket = NULL;
pITekAdapter->pTailPacket = Packet;
//ITekNextSend(pITekAdapter);
//NdisStatus = NDIS_STATUS_PENDING;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("ITEK:ITekSend() return\n");
#endif
return (NdisStatus);
}
///////////////////////////////////////////////////////////////////////////
// ITekQueryInformation
//
NDIS_STATUS NDIS_API
ITekQueryInformation(
IN NDIS_HANDLE ITekAdapterContext,
IN NDIS_HANDLE ITekOpenContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
)
{
PITEK_ADAPTER pITekAdapter = (PITEK_ADAPTER)ITekAdapterContext;
PITEK_OPEN pITekOpen = (PITEK_OPEN)ITekOpenContext;
NDIS_STATUS NdisStatus;
ULONG InfoSize;
ULONG InfoULONG;
USHORT InfoUSHORT;
PVOID InfoSource;
NDIS_HARDWARE_STATUS NicStatus;
NDIS_MEDIUM NicMedium;
InfoSource = (PVOID)&InfoULONG;
InfoSize = 4;
#ifdef DEBUG
Debug_Printf("ITEK:ITekQueryInformation() Entry\n");
#endif
NdisStatus = NDIS_STATUS_NOT_SUPPORTED;
switch(Oid) {
//General Operational Charateristics
case OID_GEN_SUPPORTED_LIST:
InfoSource = (PVOID)ITEKSupportedOids;
InfoSize = sizeof(ITEKSupportedOids);
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_SUPPORTED_LIST=size(%u bytes)\n", InfoSize);
#endif
break;
case OID_GEN_HARDWARE_STATUS:
if(pITekAdapter->NicStatus == NIC_DISABLED) {
//NicStatus = NdisHardwareStatusNotReady;
NicStatus = NdisHardwareStatusInitializing;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_HARDWARE_STATUS=Initializing\n");
#endif
} else {
NicStatus = NdisHardwareStatusReady;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_HARDWARE_STATUS=Ready\n");
#endif
}
InfoSource = (PVOID)&NicStatus;
InfoSize = sizeof(NDIS_HARDWARE_STATUS);
NdisStatus = NDIS_STATUS_SUCCESS;
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MEDIA_SUPPORTED or OID_GEN_MEDIA_IN_USE=802.3(Ethernet)\n");
#endif
NicMedium = NdisMedium802_3;
InfoSource = (PVOID)&NicMedium;
InfoSize = sizeof(NDIS_MEDIUM);
NdisStatus = NDIS_STATUS_SUCCESS;
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
InfoULONG = ITEK_MAX_LOOKAHEAD;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MAXIMUM_LOOKAHEAD=%u\n",InfoULONG);
#endif
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
InfoULONG = ITEK_SDU_MAXSIZE; // not equal to Ethernet MTU size (1514-14)
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_MAXIMUM_FRAME_SIZE=%u\n", InfoULONG);
#endif
break;
case OID_GEN_LINK_SPEED:
InfoULONG = 100000; // 25Mbps
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_LINK_SPEED=%u bps\n", InfoULONG*100);
#endif
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
InfoULONG = ITEK_TX_MAXSIZE;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_TRANSMIT_BUFFER_SPACE=%u bytes\n", InfoULONG);
#endif
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
InfoULONG = 1520;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_RECEIVE_BUFFER_SPACE=%u\n", InfoULONG);
#endif
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
InfoULONG = ITEK_TX_MINSIZE;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_TRANSMIT_BLOCK_SIZE=%u bytes(Min.),%u bytes(Max.)\n",InfoULONG, ITEK_TX_MAXSIZE);
#endif
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
InfoULONG = 1520;
NdisStatus = NDIS_STATUS_SUCCESS;
//InfoULONG = ITEK_SDU_MAXSIZE;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_RECEIVE_BLOCK_SIZE=%u\n", InfoULONG);
#endif
break;
case OID_GEN_VENDOR_ID:
InfoULONG = ITEK_VENDOR_ID;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_VENDOR_ID=0x%x\n", InfoULONG);
#endif
break;
case OID_GEN_VENDOR_DESCRIPTION:
InfoSource = (PVOID)ITEK_DESCRIPTION;
InfoSize = strlen(ITEK_DESCRIPTION);
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_VENDOR_DESCRIPTION=%s(%u)\n", ITEK_DESCRIPTION, InfoSize);
#endif
break;
// case OID_GEN_VENDOR_DRIVER_VERSION:
//#ifdef DEBUG
// Debug_Printf("Query OID_GEN_VENDOR_DRIVER_VERSION\n");
//#endif
// break;
case OID_GEN_CURRENT_PACKET_FILTER:
InfoULONG = pITekOpen->PacketFilter;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_CURRENT_PACKET_FILTER=0x%x\n",InfoULONG);
#endif
break;
case OID_GEN_CURRENT_LOOKAHEAD:
InfoULONG = ITEK_MAX_LOOKAHEAD;
NdisStatus = NDIS_STATUS_SUCCESS;
#ifdef DEBUG
Debug_Printf("Query OID_GEN_CURRENT_LOOKAHEAD=%u bytes\n", InfoULONG);
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?