📄 driver.cpp
字号:
NDIS_STATUS NIC_DRIVER_OBJECT::DriverSetInformation(
IN NDIS_OID Oid,
IN PVOID InfoBuffer,
IN ULONG InfoBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
// pass to lower object, to see if it can handle this request,
// if it can, return TRUE and set status.
if(m_pLower->DeviceSetInformation(
&status,
Oid,
InfoBuffer,
InfoBufferLength,
BytesRead,
BytesNeeded)) return status;
switch (Oid)
{
HANDLE_SET( OID_GEN_CURRENT_PACKET_FILTER,sizeof(U32));
case OID_802_3_MULTICAST_LIST:
NdisMoveMemory(
&m_pLower->m_szMulticastList[0][0],
InfoBuffer,
InfoBufferLength);
m_pLower->m_nMulticasts =
InfoBufferLength / ETH_ADDRESS_LENGTH;
m_pLower->DeviceOnSetupFilter(
m_pLower->m_szCurrentSettings[SID_GEN_CURRENT_PACKET_FILTER]
| NDIS_PACKET_TYPE_MULTICAST);
break;
// don't care oids
case OID_GEN_CURRENT_LOOKAHEAD:
break;
case OID_GEN_NETWORK_LAYER_ADDRESSES:
default:
status = NDIS_STATUS_INVALID_OID;
} // of switch Oid
return status;
}
void NIC_DRIVER_OBJECT::DriverEnableInterrupt(void)
{
m_pLower->DeviceEnableInterrupt();
}
void NIC_DRIVER_OBJECT::DriverDisableInterrupt(void)
{
m_pLower->DeviceDisableInterrupt();
}
BOOL NIC_DRIVER_OBJECT::DriverCheckForHang(void)
{
if(m_bSystemHang) return TRUE;
return m_pLower->DeviceCheckForHang();
}
VOID NIC_DRIVER_OBJECT::DriverHalt(void)
{
m_pLower->DeviceHalt();
}
NDIS_STATUS NIC_DRIVER_OBJECT::DriverReset(
OUT PBOOLEAN pbAddressingReset)
{
// Reset activities
// 1. Abort all current tx and rx.
// 2. Cleanup waiting and standby queues.
// 3. Re-init tx and rx descriptors.
// 4. Softreset MAC, PHY and set registers angain.
*pbAddressingReset = TRUE;
#ifndef IMPL_RESET
return NDIS_STATUS_SUCCESS;
#endif
m_pLower->DeviceReset();
DriverStart();
m_bSystemHang = 0;
m_bOutofResources = 0;
return NDIS_STATUS_SUCCESS;
}
NDIS_STATUS NIC_DRIVER_OBJECT::DriverSend(
IN PNDIS_PACKET pPacket,
IN UINT uFlags)
{
#if !defined(IMPL_TX_QUEUE)
if(!m_pLower->DeviceQueryTxResources())
return NDIS_STATUS_RESOURCES;
#endif
PCQUEUE_GEN_HEADER pobj;
if(!(pobj = m_TQueue.Dequeue()))
{
m_bOutofResources = 1;
DEBUG_PRINT((TEXT("<DM9:m_bOutofResources\n")));
return NDIS_STATUS_RESOURCES;
}
PNDIS_BUFFER pndisFirstBuffer;
UINT uPhysicalBufferCount;
UINT uBufferCount;
UINT uTotalPacketLength;
PNDIS_BUFFER pndisCurrBuffer;
PU8 pcurr = (PU8)CQueueGetUserPointer(pobj);
PVOID ptrBuffer;
UINT nBuffer;
U32 idx,check;
NdisQueryPacket(
pPacket,
&uPhysicalBufferCount,
&uBufferCount,
&pndisFirstBuffer,
&uTotalPacketLength);
if (uTotalPacketLength > ETH_MAX_FRAME_SIZE) {
return NDIS_STATUS_FAILURE;
}
uPhysicalBufferCount &= 0xFFFF;
for(idx=0,check=0,pndisCurrBuffer=pndisFirstBuffer;
idx < uBufferCount;
idx++, pndisCurrBuffer = pndisCurrBuffer->Next)
{
NdisQueryBuffer(
pndisCurrBuffer,
&ptrBuffer,
&nBuffer);
if(!nBuffer) continue;
NdisMoveMemory(pcurr, ptrBuffer, nBuffer);
pcurr += nBuffer;
check += nBuffer;
} // of for gathering buffer
if(uTotalPacketLength != check) return NDIS_STATUS_FAILURE;
pobj->pPacket = (PVOID)pPacket;
pobj->uFlags = uFlags;
pobj->nLength = uTotalPacketLength;
m_pLower->DeviceSend(pobj);
#ifdef IMPL_SEND_INDICATION
return NDIS_STATUS_PENDING;
#else
return NDIS_STATUS_SUCCESS;
#endif
}
void NIC_DRIVER_OBJECT::DriverReceiveIndication(
int nCurr,
PVOID pVoid,
int nLength)
{
NdisMEthIndicateReceive(
m_NdisHandle,
(PNDIS_HANDLE)nCurr,
(char*)pVoid,
ETH_HEADER_SIZE,
((char*)pVoid + ETH_HEADER_SIZE),
nLength - ETH_HEADER_SIZE,
nLength - ETH_HEADER_SIZE);
NdisMEthIndicateReceiveComplete(m_NdisHandle);
return;
}
void NIC_DRIVER_OBJECT::DriverSendCompleted(
PCQUEUE_GEN_HEADER pObject)
{
m_TQueue.Enqueue(pObject);
#ifdef IMPL_SEND_INDICATION
NdisMSendResourcesAvailable(m_NdisHandle);
NdisMSendComplete(
m_NdisHandle,
(PNDIS_PACKET)(pObject->pPacket),
NDIS_STATUS_SUCCESS);
#endif
}
/********************************************************************************************
*
* Trunk Functions
*
********************************************************************************************/
#ifdef __cplusplus
extern "C" { // miniport driver trunk functions
#endif
NDIS_STATUS MiniportInitialize(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediaIndex,
IN PNDIS_MEDIUM MediaArray,
IN UINT MediaArraySize,
IN NDIS_HANDLE MiniportHandle,
IN NDIS_HANDLE WrapperConfigHandle)
{
PUTS(("<DM9:++MiniportIntialize>\n"));
NIC_DRIVER_OBJECT *pnic;
if(!(pnic = new NIC_DRIVER_OBJECT(
MiniportHandle,WrapperConfigHandle)))
return NDIS_STATUS_FAILURE;
C_Exception *pexp;
TRY
{
pnic->EDriverInitialize(
OpenErrorStatus,
SelectedMediaIndex,
MediaArray,
MediaArraySize);
pnic->DriverStart();
FI;
}
CATCH(pexp)
{
pexp->PrintErrorMessage();
CLEAN(pexp);
delete pnic;
return NDIS_STATUS_FAILURE;
}
PUTS(("<DM9:--MiniportInitialize>\n"));
return NDIS_STATUS_SUCCESS;
}
void MiniportISRHandler(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueInterrupt,
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverIsr(
InterruptRecognized,
QueueInterrupt);
}
VOID MiniportInterruptHandler(
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverInterruptHandler();
}
NDIS_STATUS MiniportQueryInformation(
IN NDIS_HANDLE MiniportContext,
IN NDIS_OID Oid,
IN PVOID InfoBuffer,
IN ULONG InfoBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded)
{
return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverQueryInformation(
Oid,
InfoBuffer,
InfoBufferLength,
BytesWritten,
BytesNeeded);
}
NDIS_STATUS MiniportSetInformation(
IN NDIS_HANDLE MiniportContext,
IN NDIS_OID Oid,
IN PVOID InfoBuffer,
IN ULONG InfoBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded)
{
return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverSetInformation(
Oid,
InfoBuffer,
InfoBufferLength,
BytesRead,
BytesNeeded);
}
VOID MiniportEnableInterrupt(
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverEnableInterrupt();
}
VOID MiniportDisableInterrupt(
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverDisableInterrupt();
}
BOOLEAN MiniportCheckForHang(
IN NDIS_HANDLE MiniportContext)
{
return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverCheckForHang();
}
VOID MiniportHalt(
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverHalt();
}
NDIS_STATUS MiniportReset(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportContext)
{
return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverReset(AddressingReset);
}
NDIS_STATUS MiniportSend(
IN NDIS_HANDLE MiniportContext,
IN PNDIS_PACKET Packet,
IN UINT Flags)
{
return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverSend(Packet,Flags);
}
#ifdef __cplusplus
} // of miniport trunk functions
#endif
/********************************************************************************************
*
* DriverEntry
*
********************************************************************************************/
extern "C" NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NDIS_STATUS status;
NDIS_HANDLE hwrapper;
NDIS40_MINIPORT_CHARACTERISTICS ndischar;
PUTS(("<Davicom DM9000/9000A/9010 driver v3.04 for WinCE 4.2/5.0/6.0>\r\n"));
NdisMInitializeWrapper(
&hwrapper,
pDriverObject,
pRegistryPath,
NULL);
memset((void*)&ndischar,0,sizeof(ndischar));
ndischar.Ndis30Chars.MajorNdisVersion = PRJ_NDIS_MAJOR_VERSION;
ndischar.Ndis30Chars.MinorNdisVersion = PRJ_NDIS_MINOR_VERSION;
ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;
ndischar.Ndis30Chars.ResetHandler = MiniportReset;
ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
ndischar.Ndis30Chars.HaltHandler = MiniportHalt;
ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler;
ndischar.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
ndischar.Ndis30Chars.SendHandler = MiniportSend;
if((status = NdisMRegisterMiniport(
hwrapper,
(PNDIS_MINIPORT_CHARACTERISTICS)&ndischar,
sizeof(ndischar)) != NDIS_STATUS_SUCCESS))
{
NdisTerminateWrapper(hwrapper,NULL);
return status;
}
#ifndef IMPL_DLL_ENTRY
INIT_EXCEPTION();
#endif
return NDIS_STATUS_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -