分类: WINDOWS
2005-10-17 15:27:49
第四章 各命令参数块详解
第一节:初始化及控制
1.LLC_DIR_INITIALIZE
该命令需要用到LLC_DIR_INITIALIZE_PARMS参数结构
该结构成员有:
USHORT usBringUps; IBM令牌环网使用,PC NETWORK或以太网无用
UCHAR Reserved[30]; 保留,用于DOS
; 初始化 DLC例子(MASM32)
.386
.mode flat,stdcall ;平板式内存,标准调用(C方式)
option casemap:none ;区别大小写
include windows.inc ;包含常量文件
include dlcapi.inc ;DLC调用
include masm32.inc ;一些共用函数
includelib dlcapi.lib
includelib masm32.lib
.data?
CCB LLC_CCB > ;定义数据结构
BadCCB LLC_CCB >
InitParms LLC_DIR_INITIALIZE_PARMS >
.code
start:
mov eax,addr CCB
invoke ZeroMemory,eax,sizeof CCB
mov eax,LLC_DIR_INITIALIZE ;命令=初始化
mov CCB.uchDlcCommand,eax
mov eax,addr InitParms
invoke ZeroMemory,eax,sizeof InitParms
mov eax,addr InitParms ;把参数表的地址放入CCB块的U结构的pParameterTable中
mov CCB.u.pParameterTable,eax
invoke AcsLan,addr CCB,addr BadCCB ;调用AcsLan函数
assume edi:LLC_CCB ;强制EDI寄存器指向LLC_CCB数据结构
invoke StdOut,[edi].uchDlcStatus ;
assume edi:nothing
end start
2.LLC_DIR_OPEN_ADAPTER
该命令需要用到LLC_DIR_OPEN_ADAPTER_PARMS参数结构
在此结构中又要用到PLLC_ADAPTER_OPEN_PARMS, PLLC_EXTENDED_ADAPTER_PARMS ,PLLC_DLC_PARMS等三个结构
结构成员:
PLLC_ADAPTER_OPEN_PARMS pAdapterParms
PLLC_EXTENDED_ADAPTER_PARMS pExtendedParms
PLLC_DLC_PARMS pDlcParms
PVOID pReserved1 保留
以下是各成员的详解
A. PLLC_ADAPTER_OPEN_PARMS
该结构的成员描述:
USHORT usOpenErrorCode ; 指示打开适配器测试的结果
USHORT usOpenOptions ; 一个十六位值下面按位进行描述
第15位:不配置自身到网上,相反,把用户发送的数据作为接收数据接收
第14位:屏蔽硬件错误
第13位:屏蔽软件错误
第12位:已过时不用
第11位: 已过时不用
第10位:保留为0
第9位:保留为0
第8位:加入监控
第7位:已过时不用
第6位:保留为0
第5位:在一个打开的进程运行期间,防止适配器作为监控
第4位:主要针对早期令牌环网
第3,2,1,0位:都必须保留为0
UCHAR auchNodeAddress[6]
指定适配器的LAN地址
UCHAR auchGroupAddress[4]
指定组地址,如为0,则无组地址
UCHAR auchFunctionAddress[4]
指定将接收消息的适配器的函数地址
USHORT 保留
USHORT 保留
USHORT usMaxFrameSize;
在NDIS中定义的最大尺寸(帧)
USHORT 保留3[4]
USHORT usBringUps;用于令牌环网测试
USHORT InitWarnings;0为无错误,1为无参数发现,2为有错
USHORT 保留[3]
B.PLLC_EXTENDED_ADAPTER_PARMS 该结构的成员描述:
PVOID hBufferPool;
缓冲池句柄,此句柄用于LLC_BUFFER_CREATE命令
PVOID pSecurityDescriptor
95/98不用,NT,W2K是一个安全描述符
LLC_ETHERNET_TYPE LlcEthernetType
以太网类型值,有以下几种:
LLC_ETHERNET_TYPE_DEFAULT;使用注册表中的参数
LLC_ETHERNET_TYPE_AUTO;自动配置类型
LLC_ETHERNET_TYPE_802_3;使用802.3LAN头
LLC_ETHERNET_TYPE_DIX;使用DIX SNA类型
C.PLLC_DLC_PARMS 该结构的成员描述:
UCHAR uchDlcMaxSaps;在同一时间内打开的最大SAP数,默认为2
UCHAR uchDlcMaxStations;在同一时间内可打开的最大链接站点数,默认为6
UCHAR uchDlcMaxGroupSaps;在同一时间内打开的最大SAP组数,如果值为0,则无组数
UCHAR uchDlcMaxGroupMembers;分配给一组的最大SAP数
...
例子:
.data?
hEvent DWORD ?
.code
invoke CreateEvent,NULL,FALSE,FALSE,NULL ;建立通知事件
mov hEvent,eax;保存事件句柄
invoke ZeroMemory,addr CCB,sizeof CCB
mov eax,LLC_DIR_OPEN_ADAPTER
mov CCB.uchDlcCommand,eax ;命令为打开适配器,
invoke ZeroMemory,addr OpenParms,sizeof OpenParms
mov eax,addr OpenParms
mov CCB.u.pParameterTable,eax ;指定参数表为打开适配器参数表
invoke ZeroMemory,addr AdapterOpenParms,sizeof AdapterOpenParms
mov eax,addr AdapterOpenParms
mov OpenParms.pAdapterParms,eax ;参数表的适配器参数字段指向适配器参数结构
invoke ZeroMemory,addr ExtendedAdapterParms,sizeof ExtendedAdapterParms
mov eax,LLC_ETHERNET_TYPE_DEFAULT
mov ExtendedAdapterParms.LlcEthernetType,eax
mov eax,addr ExtendedAdapterParms
mov OpenParms.pExtendedParms,eax
invoke ZeroMemory,addr DlcParms,sizeof DlcParms
mov eax,addr DlcParms
mov OpenParms.pDlcParms,eax
mov eax,hEvent
mov CCB.hCompletionEvent,eax
invoke ResetEvent,eax
invoke AcsLan,addr CCB,addr BadCCB
invoke WaitForSingleObject,hEvent,5000
...
3.LLC_DIR_OPEN_DIRECT
该命令需要用到LLC_DIR_OPEN_DIRECT_PARMS数据结构
数据结构成员详解
USHORT Reserved[4];保留
USHORT usOpenOptions ;目前无说明
USHORT usEthernetType; 指定一个LLC_ETHERNET_TYPE类型 (前一节有描述)
ULONG ulProtocolTypeMask;
ULONG ulProtocolTypeMatch;
ULONG ulProtocolTypeOffset;
前面三项是可选的,如果指定了此三项,则使之只能接收某一固定类型的帧
例子:
.code
mov eax,LLC_DIR_OPEN_DIRECT
mov CCB.uchDlcCommand,eax
.data?
opend LLC_DIR_OPEN_DIRECT_PARMS >
.code
invoke ZeorMemory,addr opend,sizeof opend
mov eax,0806h ;ARP协议
mov opend.usEthernetType,eax
.data
STATION_ID DWORD 0
.code
mov eax,STATION_ID
mov CCB.u.dlc.usStationId,eax
mov eax,0
mov opend.ulProtocolTypeMask,eax
mov opend.ulProtocolTypeMatch,eax
mov eax,2
mov opend.ulProtocolTypeOffset,eax
mov eax,addr opend
mov CCB.u.pParameterTable,eax
mov eax,hEvent
mov CCB.hCompletionEvent ,eax
invoke ResetEvent,eax
invoke AcsLan,addr CCB,addr BadCCB
invoke WaitForSingleObject,hEvent,5000
...
4 LLC_DIR_SET_EXCEPTION_FLAGS
该命令定义一例外标志,所带u参数为LLC_DIR_SET_EFLAG_PARMS
这些标志的每个成员被用于请求由应用程序发出的相关例外事件信息,你必须在调用LLC_DIR_OPEN_ADAPTER命令后立即发出此命令,然后发出LLC_READ命令,设置LLC_CCB结构的成员hComplerionEvent,无论何时,当一个例外出现时,命令将被执行,错误码由设备驱动程序返回
以下是该结构的描述:
typedef struct { ULONG ulAdapterCheckFlag;//用户定义的检查适配器标志,如为0,则不通知错误 ULONG ulNetworkStatusFalg;//网络 ULONG ulPcErrorFag; //本工作站 ULONG ulSystemActionFalg; } LLC_DIR_SET_EFLAG_PARMS, *PLLC_DIR_SET_EFLAG_PARMS;