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

📄 ndisprot.h

📁 基于NDIS标准的驱动开发源码
💻 H
字号:
/////////////////////////////////////////////
// ndisprot.h文件
// 定义此驱动程序数据结构,定义和函数原型




#ifndef __NDISPROT_H__
#define __NDISPROT_H__

// 驱动内部名称和符号连接名称
#define DEVICE_NAME L"\\Device\\devNdisProt"
#define LINK_NAME L"\\DosDevices\\slNdisProt"


typedef struct _GLOBAL
{
	PDRIVER_OBJECT pDriverObj;		// 驱动对象指针
	NDIS_HANDLE hNdisProtocol;		// 协议驱动句柄,是NdisRegisterProtocol函数返回的

	LIST_ENTRY AdapterList; 		// 为我们绑定的每个适配器创建的设备对象列表
	KSPIN_LOCK GlobalLock;			// 为了同步对这个表的访问
	PDEVICE_OBJECT pControlDevice;	// 此驱动程序的控制设备对象指针
} GLOBAL;



typedef struct _INTERNAL_REQUEST
{
	PIRP pIrp;				 
	NDIS_REQUEST Request;
} INTERNAL_REQUEST, *PINTERNAL_REQUEST;

// 每个适配器也要有自己的私有变量。下面的OPEN_INSTANCE结构描述了打开的适配器
typedef struct _OPEN_INSTANCE
{
	// 静态数据
	LIST_ENTRY AdapterListEntry;	// 用于连接到其它NIC设备对象,即连接到全局AdapterList列表
	PDEVICE_OBJECT pDeviceObj;		// 关联到的设备对象的指针
	UNICODE_STRING ustrAdapterName;	// 此适配器的名称
	UNICODE_STRING ustrLinkName;	// 此适配器对应适配器对象的符号连接名称
	NDIS_HANDLE hAdapter;			// 适配器句柄
	
	// 状态信息
	BOOLEAN bBound;			// 是否绑定
	NDIS_STATUS Status;		// 状态代码		
	ULONG nIrpCount;		// 当前用户在此适配器上的IRP请求数量
	
	// 封包池句柄
	NDIS_HANDLE	hPacketPool;

	// 接收列表
	LIST_ENTRY RcvList;
	KSPIN_LOCK	RcvSpinLock;
	// 重启列表
	LIST_ENTRY	ResetIrpList;
	KSPIN_LOCK ResetQueueLock;
	
	// 同步事件
	NDIS_EVENT BindEvent;
	NDIS_EVENT CleanupEvent;

	NDIS_MEDIUM Medium;		// 此适配器的类型
} OPEN_INSTANCE, *POPEN_INSTANCE;

typedef struct _PACKET_RESERVED
{
	LIST_ENTRY ListElement;		// 将各个封包描述表连在一起
	PIRP	pIrp;				// 记录此封包对应的未决的IRP请求
	PMDL	pMdl;				// 记录为此封包申请的MDL
}	PACKET_RESERVED, *PPACKET_RESERVED;


#define ETHERNET_HEADER_LENGTH	14
#define RESERVED(_p) ((PACKET_RESERVED*)((_p)->ProtocolReserved))



extern GLOBAL g_data;



VOID 
  ProtocolBindAdapter(
    OUT PNDIS_STATUS Status,
    IN NDIS_HANDLE  BindContext,
    IN PNDIS_STRING  DeviceName,
    IN PVOID  SystemSpecific1,
    IN PVOID  SystemSpecific2
    );
VOID
  ProtocolUnbindAdapter(
      OUT PNDIS_STATUS  Status,
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_HANDLE  UnbindContext
      );


// 自定义函数的声明
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);

NTSTATUS DispatchRead(PDEVICE_OBJECT pDevObj, PIRP pIrp);
NTSTATUS DispatchWrite(PDEVICE_OBJECT pDevObj, PIRP pIrp);

void IoIncrement(OPEN_INSTANCE *pOpen);


void IoDecrement(OPEN_INSTANCE *pOpen);

VOID
ProtocolTransferDataComplete (
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN PNDIS_PACKET  pPacket,
    IN NDIS_STATUS   Status,
    IN UINT          BytesTransfered
    );


NDIS_STATUS
ProtocolReceive(
    IN NDIS_HANDLE ProtocolBindingContext,
    IN NDIS_HANDLE MacReceiveContext,
    IN PVOID       HeaderBuffer,
    IN UINT        HeaderBufferSize,
    IN PVOID       LookAheadBuffer,
    IN UINT        LookaheadBufferSize,
    IN UINT        PacketSize
    );

int ProtocolReceivePacket(NDIS_HANDLE ProtocolBindingContext, PNDIS_PACKET Packet);

void CancelReadIrp(PDEVICE_OBJECT pDeviceObj);

NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);

NTSTATUS
GetAdapterList(
    IN  PVOID              Buffer,
    IN  ULONG              Length,
    IN  OUT PULONG         DataLength
    );

VOID
PacketResetComplete(
    IN NDIS_HANDLE  ProtocolBindingContext,
    IN NDIS_STATUS  Status
    );

VOID
  ProtocolUnbindAdapter(
      OUT PNDIS_STATUS  Status,
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_HANDLE  UnbindContext
      );

VOID
  ProtocolOpenAdapterComplete(
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_STATUS  Status,
      IN NDIS_STATUS  OpenErrorStatus
      );
VOID 
  ProtocolCloseAdapterComplete(
      IN NDIS_HANDLE  ProtocolBindingContext,
      IN NDIS_STATUS  Status
      );

VOID
ReadCancelRoutine (
    IN PDEVICE_OBJECT   pDeviceObject,
    IN PIRP             pIrp
    );

VOID
ProtocolSendComplete(
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN PNDIS_PACKET  pPacket,
    IN NDIS_STATUS   Status
    );

VOID
ProtocolResetComplete(
    IN NDIS_HANDLE  ProtocolBindingContext,
    IN NDIS_STATUS  Status
    );

VOID
ProtocolRequestComplete(
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN PNDIS_REQUEST NdisRequest,
    IN NDIS_STATUS   Status
    );

VOID
PacketRequestComplete(
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN PNDIS_REQUEST NdisRequest,
    IN NDIS_STATUS   Status
    );

NTSTATUS
DispatchCleanup(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

VOID
ProtocolReceiveComplete(
    IN NDIS_HANDLE  ProtocolBindingContext
    );

VOID
ProtocolStatus(
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN NDIS_STATUS   Status,
    IN PVOID         StatusBuffer,
    IN UINT          StatusBufferSize
    );

VOID
ProtocolStatusComplete(
    IN NDIS_HANDLE  ProtocolBindingContext
    );

NDIS_STATUS
ProtocolPNPHandler(
    IN    NDIS_HANDLE        ProtocolBindingContext,
    IN    PNET_PNP_EVENT     NetPnPEvent
    );

#endif // __NDISPROT_H__

⌨️ 快捷键说明

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