阅读:14284回复:43
给刚刚开始作NDIS开发的一点经验
首先强烈推荐用VMware workstation来作测试机器,能给你节省很多时间与经历。理由有2点,一是VMware workstation自带的网卡可以直接用passthru这个例子,省了很多人问为什么parket一直是空啊。
二是调试的时候一次次的重启,用虚拟机器感觉好点。 然后开始开发前把论坛上这几年的帖子好好看看,特别是靠前的帖子,很多你遇到的问题前人早就遇到了,也提出解决的方法了,很多还有代码给你,别一上来就问这问那的,让人觉得你很懒。 最后正像前辈们说的DDK的文档很重要,虽然是英文的,好好看看吧,论坛里也有中文翻译的,作个参考还是行的。 我实在不会写东西,大家能凑合看明白我的意思就好啦 |
|
|
沙发#
发布于:2004-05-12 22:57
再给大家贴点代码吧,其实都是前辈们贴过的。
如有冒犯那我说声对不起。 这是一个NDIS中间层与应用层通信的例子,中间层用的是passthru,不过他重新写了Ptreceive等几个函数。如果你用VMware开发可以不用修改这些函数 |
|
|
板凳#
发布于:2004-05-12 23:00
这个还是关于驱动与应用层通信的,不多说了,自己看吧
// Copyright And Configuration Management ---------------------------------- // // User I/O Common Header - iocommon.h // // Companion Sample Code for the Article // // \"Extending the Microsoft PassThru NDIS Intermediate Driver\" // // Copyright (c) 2003 Printing Communications Associates, Inc. (PCAUSA) // http://www.pcausa.com // // The right to use this code in your own derivative works is granted so long // as 1.) your own derivative works include significant modifications of your // own, 2.) you retain the above copyright notices and this paragraph in its // entirety within sources derived from this code. // This product includes software developed by PCAUSA. The name of PCAUSA // may not be used to endorse or promote products derived from this software // without specific prior written permission. // THIS SOFTWARE IS PROVIDED ``AS IS\'\' AND WITHOUT ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // End --------------------------------------------------------------------- |
|
|
地板#
发布于:2004-05-12 23:05
NDIS 函 数 简 明 手 册 easyxu(原作)
无连接微端口的上层函数 DriverEntry 由操作系统调用来激活和初始化微端口驱动程序 MiniportAllocateComple 调用它来指示以前调用的NdisMAllocateMemoryAsync已经完成 MiniportCheckForHang 检查NIC的内部状态 MiniportDisableInterrupt 禁止NIC产生中断 MiniportEnableInterrupt 允许NIC产生中断 MiniportHalt 重新分配和重新注册NIC占用的资源并且终止NIC以使它不再有用 MiniportHandleInterrupt 延期用来完成I/O中断函数的执行 MiniportInitialize 出始化NIC MiniportISR 作为NIC中断服务例程以高权值运行 MiniportQueryInformation 查询微端口驱动程序的性能和当前状态 MiniportReconfigure 未使用 MiniportReset 对NIC发出一个硬件重置 MiniportReturnPacket 从上层接收一个包,这个包是在这之前通过调用NdisMIndicateReceivePacket函数传上去的包 MiniportSend 如果驱动程序没有MiniportSendPadcets或MiniportWanSend函数,它用来将一个包通过NIC传递到网络上 MiniportSendPackets 通过NIC传递一组包到网络上 MiniportSetInformation 变换(设置)关于微端口驱动程序或它的NIC的信息 MiniportShutdown 当系统暂时关闭时,将NIC恢复到初始状态 MiniportSynchronizeISR 同步访问与MiniportISR或MiniportDisableInterrupt共享的资源。如果有运行在DIRQL下的NIC驱动程序函数与驱动程序的MiniportISR或MiniportDisableInterrupt函数共享资源,需要此函数 MiniportTimer 如果微端口的NIC不产生中断,用于轮询NIC的状态 MiniportTransferData 将由NIC接收到的包的内容拷贝到一个给定的包缓存中 MiniportWanSend 如果驱动程序控制着WAN NIC,通过NIC发送一个包到网络上 面向连接微端口的上层函数 DriverEntry 由操作系统调用来激活和初始化微端口驱动程序 MiniportAllocateComplete 调用它来指示以前调用的NdisMAllocateMemoryAsync已经完成 MiniportChecKForHang 检查NIC的内部状态 MiniportCoActivateVc 激活一个虚连接(VC) MiniportCoCreateVc 为一个VC建立VC状态 MiniportCoDeactivateVc 为一个VC释放VC的状态 MiniportCoDeleteVc 删除一个VC MiniportCoRequest 查询微端口驱动程序的能力和当前状态或改变(设置)有关微端口驱动程序或它的NIC的信息 MiniportCoSendPackets 通过一个NIC发送一组包到网络上 MiniportDisableInterrupt 禁止一个NIC产生中断 MiniportEnableInterrupt 允许一个NIC产生中断 MiniporeHalt 收回和注销NIC占用的资源并且终止NIC以使它不再使用 MiniportHandIeInterrupt 延期用来完成I/O中断函数的执行 MiniportInitialize 初始化NIC MiniportISR 作为NIC中断服务例程以高权值运行 MiniportReconfigure 未使用 MiniporeReset 对NIC发出一个硬件重置 MiniportReturnPacket 从上层接收一个包,这个包是在这以前通过调用NdisMCoIndicateReceivePacket传上去的 MiniportShutdown 一个可选择函数,当系统关闭时,将NIC恢复到它的初始状态 MiniportSynchronizpISR 同步访问与MiniportISR或MiniportDisableInterrupt共享的资源,如果有运行在DIRQL下的NIC驱动程序函数与驱动程序的MiniportISR或MiniportDisableInterrupt函数共享资源 MiniportTimer 如果微端口NIC不产生中断, 轮询一个NIC状态 MiniportWanSend 如果驱动程序控制着WAN NIC ,通过网络接口卡发送一个包到网络上 初始化和注册函数 NdisMInitializeWrapper 为微端口驱动程序初始化NDIS库数据结构 NdisMRegisterMiniport 向NDIS提供有关微端口驱动程序的信息 NdisMSetAttributes 向NDIS库报告微端口驱动程序所支持的NIC的类型并且传递指向微端口的环境区域的句柄。NDIS将在接下来的调用中把这个句柄传递给MiniportXxx函数 NdisMSetAtteributesEx 除了如同NdisMSetAttributes一样传递同样的信息,这个函数改变了缺省的NIC超时动作,并且允许一个微端口指定一些附加的标志。一个驱动程序,例如一个NDIS中间层驱动程序或一个非 串行化微端口驱动程序,如果必须指定一个或多个这种标志的话,则必须调用这个函数而不是NdisMSetAttributes NdisMGetDeviceProperty 检索出设备对象,这个对象被用来通过一个总线驱动程序来建立一个与NIC的通信。例如,USB和IEEE 1394总线驱动程序 NdisMQueryAdapterResources 返回一个NIC硬件资源列表 NdisMQueryInformationComplete 指示NDIS先前的MiniporeQueryInformation操作完成。仅被无连接微端口调用 NdisMSetInformationComplete 报告NDIS库,以前的MiniportSetInofrmation操作已经完成,仅被无连接微端口调用 NdisOpenConfiguration 提供一个调用者可以用来调用NdisReadConfiguration,NdisWriteConfiguration,NdisOpenConfigurationByIndex或NdisOpenConfigurationByName的句柄 NdisOpenCanfigurationByIndex 打开一个给定的已打开的注册表中的主键值的一个子键,而这个主键是由一个调用者所提供的句柄指定 NdisOpenConfigarationByName 打开一个给定的已打开的注册表中的主键值的一个指定的子键,这个主键是由一个调用者所提供的句柄指定 NdisReadConfiguration 使用由调用NdisOpenConfiguration所获得的参数句柄来读取存储在注册表中的指定键名的键值,键值将传给NdisReadConfigration NdisWriteConfiguration 使用由调用NdisOpenConfiguration所获得的参数句柄将键值写入注册表,键值传给NdisWriteConfiguration NdisCloseConfiguration 关闭一个通过调用NdisOpenConfiguration而打开的注册表句柄 NdisMRegisterAdapterShutdownHandler 注册一个NIC驱动程序提供的Miniportshutdown函数,它在系统将要关闭时被调用 NDIS_INIT_FUNCTION 注明一个驱动程序函数仅在初始化时开始运行 NDIS_PAGEABLE_FUNCTION 注明一个驱动程序函数是可分页代码 硬件设置函数 NdisReadEisaSlotInformation 读取EISA NIC插槽信息并且将它拷贝到NIC驱动程序所提供的一个缓存中 NdisReadEisaSlotInformationEx 为一个支持可选择设置的EISA NIC读取插槽信息和有关的一系列函数的信息,并且将这些设置拷贝到NIC驱动程序所提供的缓存中 NdisImmediateReadPciSlotInformation 从一个指定PCI设备的设置区间读取一个指定长度的字节 NdisImmediateWritePciSlotInformation 向一个指定PCI设备的设置区间写入一个指定长度的字节 NdisMPciAssignResources 返回一个指定PCI设备所声明的资源列表 NdisReadPciSlotInformation 从一个指定PCI设备的设置区间读取一个指定长度的字节 NdisWritePciSlotInformation 向一个指定PCI设备的设置区间写入一个指定长度的字节 NdisReadPcmciaAttributeMemory 为一个PC卡的NIC从属性内存中读取与总线相关的设置参数 NdisWritePcmciaAttributeMemory 为一个PC卡NIC向属性内存写入与总线相关的设置参数 NdisReadNetworkAddress 返回软件可设置的网络地址,它是在NIC安装在机器中时为NIC存储在注册表中的 I/O端口函数 NdisMRegisterIoPortRange 为使用NdisRawReadPortXxx和NdisRawWriteportXxx函数建立I/O访问端口 NdisMDeregisterIoProtRange 删除早期由NdisMRegisterIoPortRange注册的I/O访问端口 NdisMMapIospace 为随后的内存映射I/O操作映射一定范围的设备内存 NdisZeroMappedMemory 将早期调用NdisMMapIoSpace映射的内存块以0填充 NdisMoveFromMappedMemory 将在初始化时由NdisMMapIoSpace所映射的设备内存中的数据拷贝到一个系统空间的缓存中 NdisMoveToMappedMemory 将数据从一个系统空间缓存中拷贝到在初始化时由NdisMMapIoSpace所映射的设备内存中 NdisMUnmapIoSpace 释放调用NdisMMapIoSpace所映射的区域 NdisImmediateReadSharedMemory 在驱动程序调用NdisMMapIoSpace之前从共享内存地址中读取一块数据到缓存 NdisImmediateWriteSharedMemory 在驱动程序调用NdisMMapIoSpace之前向一个共享内存地址中写入缓存中的数据 NdisRawReadPortXxx 从一个I/O端口读取唯一的一条数据,具体的函数包括:NdisRawReadPortUchor,NdisRawReadportUlong,NdisRawReadportUshort NdisRawReadPortBufferXxx 从一个I/O端口一次读取数据到缓存,具体函数包括:NdisRawReadPortBufferUchar,NdisRawReadPortBufferUlong,NdisRawReadPortBufferUshort NdisRawWritePortXxx 向一个I/O端口写入一条数据,具体函数包括:NdisRawWritePortUchar,NdisRawWritePortUlong,NdisRawWritePortUshourt NdisRawWritePortBufferXxx 将缓存中的数据写入I/O端口,具体函数包括:NdisRawWritePortBufferUch,NdisRawWritePortBufferUlong,NdisRawWritePortBufferUshort NdisImmediateReadPortXxx 在驱动程序调用NdisMRegisterIoPortRange映射端口之前从一个I/O端口读取一条数据。具体函数包括:NdisImmediateReadPortUcha,NdisImmediateReadPortUshort,NdisImmeduateReadPortUlong NdisImmediateWritePortXxx 在驱动程序调用NdisMRegisterIoPortRange映射端口之前向一个I/O端口写一条数据。具体函数包括:NdisImmediateWritePortUch,NdisImmediateWritePortUshort,NdisImmediateWritePortUlong DMA相关的函数 NdisMAllocateMapRegisters 为使用总线管理器的DMA设备分配映射注册表 NdisMAllocateShareMemory 分配系统与一个总线管理器DMA 和NIC共享的内存。它在驱动程序初始化时以IRQL PASSIVE_LEVEL调用 NdisMAllocateShareMemoryAsync 调用它提升IRQL,例如一个微端口的MiniportHandleInterrupt函数为总线管理器DMA NIC分配共享内存 NdisMCompleteBufferPhysicalMapping 释放早期为一个总线管理器DMA操作而调用NdisMStartBufferPhysicalMapping所使用的映射注册表。仅在DMA初始化时由调用NdisMAllocateMapRegisters的驱动程序调用 NdisMCompleteDmaTransfer 指示NDIS库一个从属的DMA操作已完成 NdisMDeregisterDmaChannel 在微端口驱动程序的DMA通道上释放它的声明 NdisFlushBuffer 在发送数据到NIC或从NIC转移数据之前,调用它来确保在总线管理器DMA运行的cache和主机物理内存之间一致 NdisGetCacheFillSize 返回微处理器的以字节为单位的cache边界。DMA NIC的驱动程序可以使用由这个函数返回的信息以避免在DMA传输时与cache断开 NdisMFreeMapRegisters 释放总线管理器DMA的映射注册表,它是早期由NdisMAllocateMapRegisters分配的 NdisMFreeSharedMemory 释放早期由NdisMAllocateSharedMemory或NdisMAllocateSharedMemoryAsync分配的内存 NdisMInitializeScatterGatherDma 为使用DMA驱动程序保留系统资源,仅被非串行化或面向连接微端口调用 NdisMReadDmaCounter 读取系统DMA管理器的计数器的当前值 NdisMRegistgerDmaChannel 为将来从属的DMA操作建立一个DMA通道控制 NdisMSetupDmaTransfer 为从属的DMA传递设置一个主机系统的DMA控制器 NdisMStarBufferPhysicalMapping 为一个总线管理器DMA操作产生一个物理地址映射,仅在DMA初始化时调用NdisMAllocateMapRegisters的驱动程序调用 NdisMUpdateSharedMemory 确保在总线管理器DMA操作时从共享内存区读取的数据是最新的 NdisQueryMapRegisterCount 返回所有可能的映射注册表数量。在调用NdisMAllocateMapRegisters之前驱动程序调用NdisQueryMapRegisterCount来选择实际分配多少注册表 中断处理函数 NdisMDeregisterInterrupt 是一个中断处理程序停止接收中断。操作系统断开NIC中断相连的中断服务函数的联系 NdisMRegisterInterrupt 连接微端口中断服务函数(MiniportISR)和由它的NIC所产生的中断 NdisMSynchronizeWithInterrupt 任何与MiniportISR或MiniportDisableInterrupt函数共享资源的NIC驱动程序函数必须同步访问这些资源以防止争用发生。通过调用NdisMSynchronizeWithInterrupt和传递一个MiniportSynchronizeISR函数的地址,来使函数与MiniportISR和MiniportDisableInterrupt同步。MiniportSynchronzeISR运行在DIRQL上,所以它可以安全地访问共享资源 同步函数 NdisMCanceltimer 取消早期由NdisMSetTimer设置的一个时钟 NdisMInitializeTimer 初始化一个时钟对象并且将对象与一个MiniportTimer函数相连 NdisMSetTimer 设置一个时钟在一个指定间隔之后停止 NdisMSetPeriodicTimer 设置时钟每隔一个指定时间后停止,或直到调用NdisMCancelTimer后才停止 NdisMsleep 引起调用者的线程阻塞指定的间隔。驱动程序在初始化或当停止适配器时,调用NdisMsleep。例如,当等待NIC完成初始化时。NdisMsleep仅在IRQL PASSIVEL_LEVEL下被调用 NdisStallExecution 引起调用者的线程停止一个指定间隔,不超过50微秒。此时不能使用NdisMSleep,NdisStallExecution仅在升高的IRQL下被调用 NdisInitializeEvent 产生和初始化一个用来同步驱动程序操作的事件 NdisSetEvent 为指定事件设置信号量 NdisResetEvent 重新设置指定事件为无信号状态 NdisWaitEvent 引起调用者等待到指定事件被指示或指定时间间隔结束时为止 NdisAllocateSpinLock 初始化一个的NDIS_SPIN_LOCK类型变量,它被用来同步访问非ISR驱动程序函数之间共享的资源 NdisFreeSpinLock 释放一个在调用NdisAllocateSpinLock过程中初始化的自旋锁 NdisAcquireSpinLock 获得一个自旋锁来保护在一个SMP安全方式下运行的非ISR驱动程序函数之间的共享资源的访问。运行在IRQL<DISPATCH_LEVEL下的微端口调用这个函数来获得一个自旋锁 NdisReleaseSpinLock 释放一个早期调用NdisAcquireSpinLock获得的自旋锁 NdisDprAcquireSpinLock 获得一个在IRQL DISPATCH_LEVEL下的自旋锁。它保护在一个SMP安全模式下运行的非ISR驱动程序函数间的共享资源访问。它比为运行在IRQL DISPATCH_LEVEL上的驱动程序函数调用NdisAcquireSpinLock要快 NdisDprReleaseSpinLock 释放一个早期调用NdisDprAcquireSpinLock获得的自旋锁 NdisInitializeReadWriteLock 初始化一个NDIS_RW_LOCK类型变量。NDIS_RW_LOCK变量用来限制对一个非ISR驱动程序线程的共享资源一次进行一个写访问。这个NDIS_RW_LOCK允许多个非ISR驱动程序线程同时读这些资源。这个读访问在写访问时是不允许的 NdisAcquireReadWriteLock 获得一个调用者用来在多个驱动程序线程的共享资源间进行写或读访问的锁。运行在IRQL<DISPAICH_LEVEL下的微端口调用这个函数来获得一个读-写锁。读-写锁适用经常进行读访问但很少进行写访问的资源 NdisReleaseReadWriteLock 释放一个在调用NdisAcquireReadWriteLock过程中获得的读-写锁 NdisMSynchronizeWithInterrupt 任何与MiniportISR或MiniportDisableInterrupt函数共享资源的NIC驱动程序函数必须与这两个函数同步访问资源,以防止争用发生。必须与MiniportISR和MiniportDisableInterrupt同步的函数通过调用NdisMSynchronizeWithInterrupt,与一个也运行在DLRQL的MiniportSynchronizeISR函数同步访问共享资源 状态函数 NdisMCoIndicateStatus 向绑定协议指示一个面向连接NIC的状态变化或一个在网络接口卡(NIC)上的指定虚连接(VC)的状态变化 NdisMIndicateStatus 向NDIS库指示NIC状态已变化,仅被无连接微端口调用 NdisMIndicateStatusComplete 向NDIS库指示状态变化已完成,仅被无连接微端口调用 NdisMQueryInformationComplete 指示早期的MiniportQueryInformation调用已完成 NdisMSetInformationComplete 指示早期的MiniportSetInformation调用已完成 无连接微端口的发送和接收函数 NdisMIndicateReceivePacket 向相关上层指示一个或多个包 NdisMArcIndicateReceiveNdisMEthIndicateReceiveNdisMFddiIndicateReceiveNdisMTrIndicateReceive 指示一个指定介质类型的包正在接收 NdisMArcIndicateReceiveCompleteNdisMEthIndicateReceiveCompleteNdisMFddiIndicateReceiveCompleteNdisMTrIndicateReceiveComplete 指示一个包接收操作已完成 NdisMsendComplete 指示早期包发送操作已完成,当早期MiniportSend函数异步操作时使用它 NdisMSendResourcesAvailable 指示NDIS库,微端口驱动程序有可用于发送操作的资源。如果微端口完成了一个同步发送,在它的MiniportSend函数中调用这个函数,或者当它检测出一个异步发送操作已完成时,在它的MiniportHandleInterrupt函数中调用。如果驱动程序没有为一个未完的发送操作调用NdisMSendComplete时,NdisMsendResourcesAvailable才可被调用 NdisMTransferDataComplete 指示NDIS库早期的MiniportTransferDate请求已完成,当先前调用的MiniportTransferData函数返回NDIS_STATUS_PENDING时使用这个函数 面向连接微端口的发送和接收函数 NdisMCoIndicateReceivePacket 向上层相关层指示一个或多个包,根据每一个VC指示包 NdisMCoSendComplete 指示早期通过调用MiniportCoSendPackets所发起的包发送操作已完成 带外(OOB)数据宏 NDIS_OOB_DATA_FROM_PACKET 返回一个指向与一个给定包描述符相连的OOB数据块的指针 NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO 从与一个给定包描述符相连的OOB数据块中返回MediaSpecificInformation指针和SizeMediaSpecificInfo值 NDIS_GET_PACKET_STATUS 从一个与给定包描述符相连的OOB数据块中返回状态值 NDIS_GET_PACKET_TIME_TO_SEND 从一个与给定包描述符相连的OOB数据块中返回TimeToSend值 NDIS_SET_PACKET_HEADER_SIZE 为随后的接收指示设置一个与给定包描述符相连的OOB数据块中的HeaderSize值 NDIS_SET_PACKET_MEDIA_SPECIFIC_LNFO 设置与一个给定包描述符相连的OOB数据块中的MediaSpecificInformation指针和SizeMediaSpecificInfo值 NDIS_SET_PACKET_STATUS 在一个驱动程序调用NdisM(Co)IndicateReceivePacket或在一个驱动程序的Miniport(Co)SendPackets函数返回控制之前,设置与一个给定包描述符相连的OOB数据块中的状态值。 NDIS_SET_PACKET_TIME_RECEIVED 设置与一给定包描述符相连的OOB数据块中的TimeReceived值 NDIS_SET_PACKET_TIME_SENT 设置与一给定包描述符相连的OOB数据块中的TimeSent值 包和缓存处理函数 NdisAllocatePacketPool 分配和初始化一个不分页包池块。调用者提供请求可存放包描述符数和以字节为单位的每个固定包的大小 NdisAllocatePacketPoolEx 分配和初始化一个不分页包池的块。并且提供请求包描述符的数量和以字节为单位的每个固定包的大小,调用者提供用来保存溢出状态下的包描述符的数量 NdisAllocatePacket 从由NdisAllocatePacketPool返回的包池中分配一固定大小的包描述符 NdisDprAllocatePacket 当调用者运行在IRQL DISPATCH_LEVEL下,分配和初始化一个包描述符 NdisAllocateBufferPool 返回一个调用者可用NdisAllocateBuffer来分配缓存描述符的句柄 NdisAllocateBuffer 在指定的已分配的不分页的内存块中创建一个映射虚存范围的缓存描述符。需给出由NdisAllocateBufferPool返回的句柄 NdisAdjustBufferLength 修改一个给定缓存描述符指定范围的长度 NdisBufferLength 返回一个给定映射缓存以字节为单位的长度 NdisBufferVirtualAddress 如果给定缓存描述符所给出的物理页并没有映射到系统空间的话,返回由一个给定缓存描述符映射的缓存的基本虚地址,并且将这物理页映射到系统空间, NdisCopyBuffer 为指定的内存块创建缓存描述符 NdisCopyFromPacketToPacket 从一个包向另一个包拷贝指定数量的字节,给定一个指定的源包和一个目的包及每个包的起始位置 NdisCreateLookaheadBufferFromSharedMemory 返回一个与总线管理器DMA NIC共享内存块的缓存的虚地址。允许驱动程序以只读预分缓存方式将向上指示的接收数据的一部分映射到相关协议 NdisDestroyLookaheadBufferFromSharedMemory 释放由调用NdisCreateLookaheadBufferFromSharedMemory而获得的缓存 NdisQueryPacket 返回一组描述了包和链的大指针的信息 NdisQueryBuffer 返回由一个给定缓存描述符映射的一个缓存的虚地址的基址和长度 NdisQueryBufferOffset 返回在一个给定缓存描述符中映射的一个缓存的虚地址的基址和长度 NdisGetFirstBufferFromPacket 返回链在包上的第一个缓存的描述符及虚地址,以及第一个缓存的长度和所有缓存的总长(以防缓存使分段的) NdisGetNextBuffer 返回给定缓存描述符链当前的缓存描述符 NdisGetBufferPhysicalArraySize 对一给定缓存描述符,返回不邻接的物理块的缓存数量。总线管理DMA NIC在调用NdisMStarBufferPhysicalMapping之前调用它来决定分配和填充多少NDIS_PHYSICAL_ADDRESS结构 NdisGetPacketFlags 如果有的话,返回在一个给定包中,由协议驱动程序设置的标志 NdisFreePacketPool 释放由调用NdisAllocatePacketPool所分配的一个不分页池的块 NdisPacketPoolUsage 返回一个包池中当前已分配的包描述符的数量 NdisFreePacket 释放调用NdisAllocatePacket所分配的包 NdisDprFreePacket 当调用者为访问包池提供内部同步,并且调用者运行在IRQL DISPATCH_LEVEL时,释放驱动程序分配的包描述符并且将它返回给空闲列表 NdisFreeBufferPool 释放调用NdisAllocateBufferPool所获得的句柄 NdisFreeBuffer 释放调用NdisAllocateBuffer所获得的缓存描述符 NdisChainBufferAtBack 将一给定缓存描述符链到一个给定包的缓存描述符链表的未尾 NdisUnchainBufferAtFront 从一给定包的缓存描述符链表中删除链表的表头并且返回指向这个缓存描述符的指针 NdisUnchainBufferAtBack 从一给定包的缓存描述符链表中删除表尾,并且返回指向这缓存描述符的指针 NdisReinitializePacket 从一给定包中删除所有相链的缓存并且重新初始化它以备重新使用 NdisRecalculatePacketCounts 重新设置多个给定包的有效个数以使下一个调用NdisQueryPacket重新计算个数 NDIS_BUFFER_LINKAGE 由一指向缓存描述符的指针,返回一个被链接的缓存的指针。这个宏允许一个驱动程序不必提供自己的缓存描述符链接情况而对已分配缓存描述符排队 NDIS_BUFFER_TO_SPAN_PAGES 确定给定的缓存取要使用多少物理页 内存函数 NdisAllocateMemory 在指定地址范围地将驻留(不分页)的系统空间内存以物理连续分配方式分配和/或以非cache方式分配 NdisAllocateMemorywithTag 如同调用NdisAllocateMemory,不同在于它允许调用者提供一个标记可用来跟踪驱动程序的内存分配 NdisEqualmemory 将一个内存块中的指定数量的字符与另一个内存块中相同数量的字符相比较 NdisFillMemory 用给定字符填充一个调用者所提供的缓存 NdisFreeMemory 释放早期由NdisAllocateMemory分配的内存块 NdisMoveMemory 从一调用者提供的位置将一指定数量的字节拷贝到另一地方 NdisZeroMeomory 用0填充内存块 NdisInitializeNPagedLookasideList 初始化一个预先分配的列表,在初始化成功以后,可以从预先分配列表中分配或向列表释放不分页的固定大小的块 NdisAllocateFromNPagedLookasideList 从一给定的预先分配的列表头中删除第一个项目。如果预先分配列表是空的,那么从不分页池中分配一个项目 NdisDeleteNPagedLookasideList 将一不分页预分配列表从系统中删除 NdisFreeToNPagedLookasideList 返回预分配列表的入口 NdisInitializeListHead 初始化一个顺序的,互锁的,单链表的表头 NdisInterlockedInsertTailList 插入一个项目,通常是一个包,到一个双链表的表尾,这使得可以在一个多处理器安全方式下同步访问列表 NdisInterlockedRemoveHeadList 从表头删除一个项目,这使得可以在一个多处理器安全方式下同步访问列表 NdisInitializeslistHead 初始化一个顺序的,互锁的,单链表的表头 NdisInterlockedPopEntrysList 从一个顺序的,单链表中删除第一个项目 NdisInterlockedPushEntrysList 在一个顺序的,单链表表头插入一个项目 NdisQueryDepthsList 返回一个给定的顺序的,单链表中当前项目数目 系统信息函数 NdisSystemProcessorCount 确定它的调用者运行在一个单处理器上还是多处理机上。一个NDIS驱动程序在分配资源之前的初始化中,调用这个函数 NdisGetCurrentProcessorCounts 返回驱动程序当前可使用的处理器的个数,驱动程序用它来确定CPU的利用情况 NdisGetCurrentProcessorCpuUsage 以百分比方式返回当前处理器使用率 NdisGetCurrentSystemTime 返回当前系统时间,用来设置时间戳 NdisGetSystemUptime 返回自从系统开始以来所经过的时间值,以微秒为单位 日志函数 NdisMCreateLog 分配和打开一个NIC微端口可写入数据的日志文件,这个文件由一个驱动程序提供的Win32应用程序显示 NdisMWriteLogData 为供驱动程序提供的Win32应用程序使用和显示日志,而将驱动程序提供的信息写入日志文件 NdisMFlushLog 清除日志文件 NdisMCloseLog 释放日志所使用的资源 NdisWriteErroLogEntry 向系统I/O出错日志文件写一条目 字符串函数 NdisAnsiStringToUnicodeString 将一给定数量ANSI字符串转化为一定数量的Unicode字符串 NdisEqualAnsiString 将两个ANSI字符串比较并且返回一个表明它们是否相等的值 NdisEqualString 在操作系统缺省的字符集下,比较两个字符串是否相等 NdisEqualUnicodeString 比较两个Unicode字符串并且返回一个表明它们是否相等的值 NdisFreeString 释放为缓存字符串分配的存储区 NdisInitAnsiString 初始化一ANSI字符串 NdisInitializeString 为一长度字符串分配存储区,并且以系统缺省的字符集初始化它 NdisInitUnicodeString 初始化一Unicode字符串 NdisPrintString 在调试窗口显示指定的字符串 NdisUnicodeStringToAnsiString 将一给定的Unicode字符串转换成ANSI字符串 NdisUpcaseUnicodeString 将一给定Unicode字符串副本转换为大写形式,并且返回转换后的字符串 文件函数 NdisOpenFile 返回一个已打开文件的句柄 NdisMapFile 如果文件未被映射,将一个已打开文件映射到一个调用者可访问的缓存中 NdisUnmapFile 释放一个由NdisMapFile建立的文件的虚地址映射 NdisCloseFile 释放由NdisOpenFile返回的句柄,并且释放文件打开时所分配给文件contex的内存 地址函数 NdisGetPhysicalAddressHigh 返回一个给定物理地址的高位部分 NdisGetPhysicalAddressLow 返回一个给定物理地址的低位部分 NdisSetPhysicalAddressHigh 将一个给定物理地址的高位部分设置为一个给定的值 NdisSetPhysicalAddressLow 将一个给定物理地址的低位部分设置为一个给定的值 NDIS_PHYSICAL_ADDRESS_CONST 初始化一个物理地址的静态常量类型 变量函数 NdisRetriveUlong 从源地址中取回一个ULONG值,避免对齐错误 NdisStoreUlong 存储一ULONG值到一指定地址,避免对齐错误 NdisInterlockedAddUlong 用一个原子操作将一个Unsigned long值与一个给定Unsigned integer相加,使用一个调用者提供的自旋锁来同步访问integer变量 NdisInterlockedDecrement 用一个原子操作减一 NdisInterlockedIncrement 用一个原子操作加一 注册函数 NdisReadRegisterUchar 从一个内存映射设备注册表中读取一个UCHAR NdisReadRegisterUlong 从一个内存映射设备注册表中读取一个ULONG NdisReadRegiseerUshort 从一个内存映射设备注册表中读取一个USHORT NdisWriteRegisterUchar 向一个内存映射设备写入一个UCHAR NdisWriteRegisterUlong 向一个内存映射设备写入一个ULONG NdisWriteRegisterUshort 向一个内存映射设备写入一个USHORT 工作项目函数 NdisInitializeWorkItem 当一个系统工作线程获得控制时,用一个调用者提供的环境和回调例程,初始化一个工作队列来作为执行排队 NdisScheduleWorkItem 将一个给定工作项目插入到一个队列。一个系统工作线程删除项目,并且将控制给予驱动程序先前提供给NdisInitializeWorkItem的回调函数 NDIS提供的媒体相关宏 ETH_COPY_NETWORK_ADDRESS 将一个给定Ethernet地址拷贝到一个给定位置 FDDI_IS_BROADCAST 将一个调用者提供的变量设置为一个布尔值,它表示一个给定的FDDI地址是否是一个广播地址 FDDI_IS_MULTICAST 将一个调用者提供的变量设置为一个布尔值,它表示一个给定的FDDI地址是否是多点传输地址 FDDI_IS_SMT 设置一个调用者提供的变量为一布尔值,它表示是否给定的FDDI帧是SMT TR_COMPARE_NETWORK_ADDRESS 将一个调用者提供的变量设置为一个布尔值,表明一个给定的Token Ring地址是大于、小于或等于另一个给定Token Ring地址的值 TR_COPY_NETWORK_ADDRESSES 将一个给定Token Ring地址拷贝到一给定位置 IR_IS_BROADCAST 将一个调用者提供的变量设置为一个布尔值,它表示一个给定的Token Ring地址是否是广播地址 TR_IS_FUNCTIONAL 将一个调用者提供的变量设置为一个布尔值,它表示一个给定Token Ring地址是否是函数地址 TR_IS_GROUP 将一个调用者提供的变量设置为一个布尔值,它表示一个给定Token Ring地址是否是一组地址 TR_IS_NOT_DIRECTED 将一个调用者提供的变量设置为一个布尔值,它表示一给定Token Ring地址是否既不是一个函数地址也不是一组地址 TR_IS_SOURCE_ROUTING 将一个调用者提供的变量设置为一个布尔值,它表示一给定Token Ring地址是否是一源路由地 |
|
|
地下室#
发布于:2004-05-15 18:21
thank you
|
|
|
5楼#
发布于:2004-05-15 21:07
非常感谢你, 我用你给的firewall的例子怎么什么都监视不到呢
|
|
6楼#
发布于:2004-05-18 10:22
那是你规则设置的问题啦
|
|
7楼#
发布于:2004-05-18 17:47
你先看看程序,firewall这个例子完全可以在win2000下很好的运行(你不会没先装驱动吧),比对着passthru做开始学习的例子很不错的
|
|
|
8楼#
发布于:2004-05-26 15:54
这个例子好像只可以截获ICMP包~~
所以开始什麽都看不见的~ |
|
9楼#
发布于:2004-05-29 10:44
好东西
|
|
10楼#
发布于:2004-06-06 01:32
“正像前辈们说的DDK的文档很重要,虽然是英文的,好好看看吧,论坛里也有中文翻译的,作个参考还是行的。”
实在不好意思,我想问一下,在论坛哪有呀,我怎么找不到。 |
|
11楼#
发布于:2004-06-06 18:52
在论坛下载的地方
文件名是DDKReferenceCN.chm或win2000驱动程序设计指南.zip 1M多一点的东西 有的帖子也有,不过我是找不到了 |
|
|
12楼#
发布于:2005-02-27 17:26
虚拟机上能用softice吗?
在虚拟机上sofice能启动,但是按ctrl+D也出现那个调试窗口,还有就是Symbol Loader一加载sys文件就出错,请问有解决的办法吗? |
|
13楼#
发布于:2005-03-20 18:53
再给大家贴点代码吧,其实都是前辈们贴过的。 请问,我怎么下载不了!谁有这代码!能否发到我的邮箱! E-Mail:harryccf@163.com |
|
|
14楼#
发布于:2005-03-21 09:54
有人研究过这个FireWall的程序吗?
那里主要是靠一个Monitor_flag来决定到底是拦还是不拦这个ICMP包的,一开始初始化是它的值为0也就是拦ICMP包,我现在想不用他的那个应用程序界面直接就用那相SYS文件来拦ICMP包,并且把那个Monitor_falg值初始化时设成1也就是拦ICMP包,但是结果发现编译安装完后,只要一有人PING我机器我机器马上就蓝屏并且重启,不知道是怎么回事有人能告诉我为什么吗? |
|
15楼#
发布于:2005-04-10 15:15
非常感谢!让我少走很多弯路
|
|
16楼#
发布于:2007-10-28 16:37
好例子 研究中
|
|
17楼#
发布于:2008-04-26 09:42
正如雪中送炭,非常感谢!
|
|
18楼#
发布于:2008-04-26 13:46
编译SYS文件出错啊
mydef.c(4) : error C2220: warning treated as error - no object file genera mydef.c(4) : error C4273: 'KeReadStateEvent' : inconsistent dll linkage extern LONG KeReadStateEvent(IN PRKEVENT Event); //这个有问题呢 如何解决呢~ |
|
19楼#
发布于:2008-04-28 16:24
顶。。。。。
|
|
上一页
下一页