一个汇编版的NDIS驱动程序模板

Windows内核原理与实现之 NDIS(网络驱动程序接口规范) 文章摘录自《Windows内核原理与实现》一书。 在Windows的网络栈中,网络协议与网络适配器是分离的,协议驱动程序并不针对特定的网络适配器而设计,然而,当协议驱动程序正真运行时,它必须通过一个网络适配器才能发送和接收数据。协议驱动程序通过统一的接口与网络适配器驱动程序进行通信,此接口即为 Microsoft 和 3COM 于 1989 年联手开发的NDIS(Network Driver I... 阅读详情
;一个汇编版的NDIS驱动程序模板(by mgf @2007.02.23)
;   写驱动程序已经很久了,但我一直用汇编来写驱动程序,原因是我不喜欢DDK,因为DDK和汇编一样,不是象VC,C#那样的“可视化”的开发工具,
;DDK和汇编一样看不见结构或对象的成员,也看不到各种函数的原型,这些东西和各种常量定义还必须去查看相关的包含文件,不仅如此,DDK还会
;“自作聪明”地把很多垃圾代码加到我的驱动里,虽然没有影响驱动程序的功能,但是还是不爽,不如直接用汇编,生成的驱动程序是什么样的自己
;心里有数。其实这也怪不得MS,它不想大家了解它的操作系统核心技术,但是又不得不开放一些技术细节给大家写驱动,所以只有提高门槛,搞出这
;么一个变态的DDK来吓走很多人,它的目的也就达到了,就是让尽可能少的人了解它的核心技术。能够跨过DDK这道槛的,必定不是一般的高手。呵呵!

;   很多书都建议写驱动最好不用汇编,因为写出来的程序不可移植,但是我不这么认为,因为现在90%的人写出的驱动都是在PC上运行的,没有必要
;为了这10%而放弃这么好的汇编语言。而且计算机都是相通的,如果你会写PC下的驱动了,再写MAC下的驱动不就容易多了吗?

;   这是一个标准的legacy驱动程序,虽然编译时用WDM的方法编译,它有Unload,Read,Write例程,而且还用NDIS HOOK来部分实现了防火墙的功能。
;NDIS HOOK技术被广泛应用于瑞星、江民、天网等众多流行的防火墙里,它的原理是使用NdisRegisterProtocol()注册假协议来获取系统的协议链地址,
;再搜索这个单向协议链,找到TCPIP协议的NDIS_OPEN_BLOCK(NDIS_BINDING_HANDLE)结构,里面就有TCPIP协议的各种派发函数地址,比如SEND在结构
;偏移30H的地方,RECV在结构偏移40H的地方,还有其他很多重要的函数地址都在这个表里。把表里的地址替换成我们的函数地址,就可以拦截操作系统
;收发的所有数据包了。本驱动只是实现了嗅探数据包的功能,还没有实现拦截恶意数据包的功能,如果想实现这个功能,在_Write函数、_mySend函数、
;_myRecv函数里加些代码,使它们配合完成拦截数据包的功能。本驱动如果IoAttachDevice其他驱动,可以改成过滤器;做些修改,还可以实现更多功能,
;可以用来过滤缓冲区溢出攻击包,也可以用来定制自己的SQL INJECTION防护网。

;   本驱动嗅探数据包的流程是这样的:当系统收发数据包时,被_mySend或_myRecv拦截,这两个函数就用NdisSetEvent()置位一个RING3事件(这个事
;件在DriverEntry里建立,在RING3里打开),这样在RING3应用层的WaitForSingleObject()因为事件被置位而返回,于是RING3代码用ReadFile()读取数
;据包的内容,判断是放行还是拦截,再用WriteFile来通知驱动做相应的操作。当然为了提高效率,不是每个数据包都提示RING3应用程序该不该放行,
;有些可以直接在RING0驱动里判断的就不必传到RING3去判断了。处于RING3的代码大概是这样的:


;#include "stdafx.h"
;#include "windows.h"
;#include "stdlib.h"


;int _tmain(int argc, _TCHAR* argv[])
;{
;   HANDLE hdrv=CreateFile("////.//NDISDRV",0xc0000000,0,0,3,0,0);
;   HANDLE hEvent=OpenEvent(0x100000,0,"Send3Event"); //注意Send3Event必须和驱动里的名字对应
;   //HANDLE hEvent=OpenEvent(0x100000,0,"Recv3Event"); //注意Recv3Event必须和驱动里的名字对应
;
;   int dwTempVar=1;char szTempBuffer[0x800];
;   while(dwTempVar)
;   {
;     WaitForSingleObject(hEvent,-1);  
;     ReadFile(hdrv,szTempBuffer,0x800,(LPDWORD)&dwTempVar,0);
;   }
;
;   return 0;
;}

;把下面的代码保存到ndisdrv.asm里,在MASM32 6.14及以上的编译器里编译:
;ml /c /coff /Cp ndisdrv.asm
;link /subsystem:native /driver:wdm /release /align:16 /base:0x10000 /out:ndisdrv.sys ndisdrv.obj
;由于驱动程序涉及的知识太广而深奥了,本文难免有错漏的地方,希望大家指出,以免一错再错,误导别人。
;下面是驱动的代码:



.586p
.model flat,stdcall
option casemap:none
assume fs:nothing,gs:nothing

includelib ntoskrnl.lib
includelib hal.lib
includelib ndis.lib
includelib tdi.lib
includelib wdm.lib
;以上LIB文件要从DDK里复制到MASM32的LIB目录里


NdisQueryBufferSafe proto :dword,:dword,:dword,:dword
NdisInitializeEvent proto :dword
NdisSetEvent proto :dword
NdisResetEvent proto :dword
NdisWaitEvent proto :dword,:dword
NdisRegisterProtocol proto :dword,:dword,:dword,:dword
NdisDeregisterProtocol proto :dword,:dword
IoCreateDevice proto :dword,:dword,:dword,:dword,:dword,:dword,:dword
IoDeleteDevice proto :dword
IoCreateSymbolicLink proto :dword,:dword
IoDeleteSymbolicLink proto :dword
IoCompleteRequest proto :dword,:dword
IoCreateNotificationEvent proto :dword,:dword
PsGetVersion proto :dword,:dword,:dword,:dword
RtlCompareUnicodeString proto :dword,:dword,:dword
ZwClose proto :dword
;由于MASM32没有相关的INC文件,所以要使用的API要自己定义原型


.data
lpProtocolHandle dd 0 ;协议句柄的指针
lpDeviceObject dd 0 ;设备对象的指针
lpOldSend dd 0 ;保存TCPIP协议驱动的OPEN_BLOCK(BINDING HANDLE)里的SEND派发函数地址
lpOldRecv dd 0 ;保存TCPIP协议驱动的OPEN_BLOCK(BINDING HANDLE)里的RECV派发函数地址

lpSend3Event dd 0 ;RING3发送事件在本驱动的指针
hSend3Event dd 0 ;RING3发送事件在本驱动的句柄
lpRecv3Event dd 0 ;RING3接收事件在本驱动的指针
hRecv3Event dd 0 ;RING3接收事件在本驱动的句柄
dwStatus dd 0
dwTempVar dd 0

obSendEvent db 16 dup(0) ;RING0 SEND对象
obRecvEvent db 16 dup(0) ;RING0 RECV对象

stProtocolChar db 70h dup(0) ;NdisRegisterProtocol()要使用的NDIS_PROTOCOL_CHARACTERISTIC结构

szSendBuffer db 800h dup(0) ;系统将要发送的数据包的副本
szRecvBuffer db 800h dup(0) ;系统将要接收的数据包的副本
dwSendSize dd 0 ;发送副本大小
dwRecvSize dd 0 ;接收副本大小



.const
stTcpip dw 5*2,6*2
dd offset szTcpip
szTcpip dw 'T','c','p','i','p',0
stProtName dw 7*2,8*2
dd offset szProtName
szProtName dw 'N','d','i','s','D','r','v',0
stDeviceName dw 15*2,16*2
dd offset szDeviceName
szDeviceName dw '/','D','e','v','i','c','e','/','N','d','i','s','D','r','v',0
stSymbolicLinkName dw 19*2,20*2
dd offset szSymbolicLinkName
szSymbolicLinkName dw '/','D','o','s','D','e','v','i','c','e','s','/','N','D','I','S','D','R','V',0
stSend3Event dw 28*2,29*2
dd offset szSend3Event
szSend3Event dw '/','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','/','S','e','n','d','3','E','v','e','n','t',0
stRecv3Event dw 28*2,29*2
dd offset szRecv3Event
szRecv3Event dw '/','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','/','R','e','c','v','3','E','v','e','n','t',0


.code
start proc DriverObject,RegisterPath
pushad

invoke PsGetVersion,offset dwTempVar,0,0,0 ;获取操作系统版本,如果不是5.0(2000,XP,2003)就退出,因为不能使用NDIS5.0
.if dwTempVar!=5
jmp _exit
.endif


mov byte ptr stProtocolChar,5
mov byte ptr stProtocolChar+1,0

mov eax,dword ptr stProtName
mov dword ptr stProtocolChar+30h,eax
mov eax,dword ptr stProtName+4
mov dword ptr stProtocolChar+34h,eax

mov dword ptr stProtocolChar+08h,offset PtOpenAdapterComplete
mov dword ptr stProtocolChar+0ch,offset PtCloseAdapterComplete
mov dword ptr stProtocolChar+10h,offset PtSendComplete
mov dword ptr stProtocolChar+14h,offset PtTransferDataComplete
mov dword ptr stProtocolChar+18h,offset PtResetComplete
mov dword ptr stProtocolChar+1ch,offset PtRequestComplete
mov dword ptr stProtocolChar+20h,offset PtReceive
mov dword ptr stProtocolChar+24h,offset PtReceiveComplete
mov dword ptr stProtocolChar+28h,offset PtStatus
mov dword ptr stProtocolChar+2ch,offset PtStatusComplete
mov dword ptr stProtocolChar+3ch,offset PtBindAdapter
mov dword ptr stProtocolChar+40h,offset PtUnbindAdapter
mov dword ptr stProtocolChar+38h,offset PtReceivePacket
mov dword ptr stProtocolChar+44h,offset PtPNPHandler
;以上是填充NDIS_PROTOCOL_CHARACTERISTIC结构

invoke NdisRegisterProtocol,offset dwStatus,offset lpProtocolHandle,offset stProtocolChar,6ch ;获取系统协议链表的地址,前面做了这么多工作都是为了这个地址
.if dwStatus
jmp _exit
.endif
mov ebx,lpProtocolHandle
mov ebx,[ebx+10h] ;跳过我的假协议,保存协议链里下一项的地址
invoke NdisDeregisterProtocol,offset dwStatus,lpProtocolHandle ;我注册的假协议已经没有用了,注销
mov lpProtocolHandle,ebx ;真正的系统协议链的地址

mov esi,offset stTcpip
.repeat
lea edi,[ebx+44h]
invoke RtlCompareUnicodeString,edi,esi,1
.break .if eax==0
mov ebx,[ebx+10h]
.until ebx==0 ;这个循环是搜索TCPIP协议的PROTOCOL_HANDLE
.if eax
jmp _exit
.endif
mov ebx,[ebx] ;取出PROTOCOL_HANDLE里的OPEN_BLOCK指针,每个版本的NDIS的PROTOCOL_HANDLE结构都可能不同,要注意
mov lpProtocolHandle,ebx ;保存TCPIP协议的OPEN_BLOCK(BINDING_HANDLE)

mov eax,[ebx+30h]
mov lpOldSend,eax ;保存TCPIP协议的OPEN_BLOCK(BINDING_HANDLE)里的SEND派发函数地址
mov eax,[ebx+40h]
mov lpOldRecv,eax ;保存TCPIP协议的OPEN_BLOCK(BINDING_HANDLE)里的RECV派发函数地址


invoke IoCreateDevice,DriverObject,18h,offset stDeviceName,21h,0,0,offset lpDeviceObject ;建立设备,DeviceExtension size=18h, type= device_transfer
invoke IoCreateSymbolicLink,offset stSymbolicLinkName,offset stDeviceName
mov eax,lpDeviceObject
or dword ptr [eax+1ch],10h ;把device.flag设置为DO_DIRECT_IO,使驱动程序的READ、WRITE例程直接映射用户缓冲区到本驱动

mov edi,DriverObject
add edi,38h
mov ecx,1ch
mov eax,offset _CommonIoControl
rep stosd ;填充共用例程,必须,否则CreateFile()不能打开本驱动

mov eax,DriverObject
mov dword ptr [eax+34h],offset _Unload
mov dword ptr [eax+44h],offset _Read
mov dword ptr [eax+48h],offset _Write ;注册驱动例程
mov byte ptr [eax+8],2 ;强行修改Driver.flag为legacy driver,否则DriverEntry返回时系统就会卸载本驱动(因为本驱动默认编译为WDM drvier)


invoke NdisInitializeEvent,offset obSendEvent
invoke NdisInitializeEvent,offset obRecvEvent
invoke NdisResetEvent,offset obSendEvent
invoke NdisResetEvent,offset obRecvEvent
;建立RING0事件

invoke IoCreateNotificationEvent,offset stSend3Event,offset hSend3Event
mov lpSend3Event,eax
invoke NdisResetEvent,eax
invoke IoCreateNotificationEvent,offset stRecv3Event,offset hRecv3Event
mov lpRecv3Event,eax
invoke NdisResetEvent,eax
;建立RING3事件,在RING3用OpenEvent()打开

mov ebx,lpProtocolHandle
mov dword ptr [ebx+30h],offset _mySend ;HOOK TCPIP协议的SEND
mov dword ptr [ebx+40h],offset _myRecv ;HOOK TCPIP协议的RECV


_exit:
popad
xor eax,eax
ret
start endp


_Unload proc DriverObject
mov edx,lpProtocolHandle
mov eax,lpOldSend
mov [edx+30h],eax
mov eax,lpOldRecv
mov [edx+40h],eax
;恢复TCPIP协议的OPEN_BLOCK里原来的SEND/RECV派发例程

invoke ZwClose,hSend3Event
invoke ZwClose,hRecv3Event
invoke NdisSetEvent,offset obSendEvent
invoke NdisSetEvent,offset obRecvEvent

invoke IoDeleteSymbolicLink,offset stSymbolicLinkName
invoke IoDeleteDevice,lpDeviceObject

xor eax,eax
ret
_Unload endp


_CommonIoControl proc DeviceObject,pIrp
mov eax,pIrp
mov dword ptr [eax+18h],0
mov dword ptr [eax+1ch],0
invoke IoCompleteRequest,pIrp,0
xor eax,eax
ret
_CommonIoControl endp


_Read proc DeviceObject,pIrp
pushad
mov ebx,pIrp
mov edi,[ebx+4]
mov ecx,[edi+18h]
mov edi,[edi+10h]
add edi,ecx ;EDI=用户缓冲区

mov ecx,lpSend3Event
mov edx,lpRecv3Event
.if dword ptr [ecx+4]
invoke NdisResetEvent,lpSend3Event ;RING3事件复位,防止再次放行
mov esi,offset szSendBuffer
mov ecx,dwSendSize
mov eax,[ebx+60h]
.if ecx>[eax+4]
mov ecx,[eax+4]
.endif
.else
invoke NdisResetEvent,lpRecv3Event
mov esi,offset szRecvBuffer
mov ecx,dwRecvSize
mov eax,[ebx+60h]
.if ecx>[eax+4]
mov ecx,[eax+4]
.endif
.endif

mov dword ptr [ebx+18h],0
mov dword ptr [ebx+1ch],ecx ;设置ReadFile()的读取字节数
rep movsb ;把数据包复制到ReadFile()提供的缓冲区

invoke IoCompleteRequest,pIrp,0
popad
xor eax,eax
ret
_Read endp


_Write proc DeviceObject,pIrp
mov eax,pIrp
mov dword ptr [eax+18h],0
mov dword ptr [eax+1ch],0

mov edx,[eax+4]
mov ecx,[eax+60h]
mov ecx,[ecx+4]
mov eax,[edx+18h]
mov edx,[edx+10h]
add edx,eax
;EDX=用户缓冲区

invoke IoCompleteRequest,pIrp,0
xor eax,eax
ret
_Write endp


_mySend proc _lpAdapt,_lpPacket
local @va
local @size
pushad
mov ebx,_lpPacket
mov ebx,[ebx+8]

mov edi,offset szSendBuffer
.repeat
invoke NdisQueryBufferSafe,ebx,addr @va,addr @size,20h
mov esi,@va
mov ecx,@size
rep movsb
mov ebx,[ebx]
.until ebx==0
sub edi,offset szSendBuffer
mov dwSendSize,edi
;以上循环复制将要发送的数据包到本驱动

invoke NdisSetEvent,lpSend3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile来读数据包内容(重要)

popad
leave
jmp lpOldSend ;转到系统原来的Send例程执行
ret
_mySend endp


_myRecv proc _lpAdapt,_lpPacket
local @va
local @size
pushad
mov ebx,_lpPacket
mov ebx,[ebx+8]

mov edi,offset szRecvBuffer
.repeat
invoke NdisQueryBufferSafe,ebx,addr @va,addr @size,20h
mov esi,@va
mov ecx,@size
rep movsb
mov ebx,[ebx]
.until ebx==0
sub edi,offset szRecvBuffer
mov dwRecvSize,edi
;以上循环复制将要接收的数据包到本驱动

invoke NdisSetEvent,lpRecv3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile来读数据包内容(重要)

popad
leave
jmp lpOldRecv ;转到系统原来的Recv例程执行
ret
_myRecv endp


;以下空函数是为了填充NDIS_PROTOCOL_CHARACTERISTIC结构而设置的,实际下基本不会被系统调用,没有又不行。
PtOpenAdapterComplete proc pAdapt,Status,OpenErrorStatus
xor eax,eax
ret
PtOpenAdapterComplete endp


PtCloseAdapterComplete proc pAdapt,Status
xor eax,eax
ret
PtCloseAdapterComplete endp


PtSendComplete proc pAdapt,Packet,Status
xor eax,eax
ret
PtSendComplete endp


PtTransferDataComplete proc pAdapt,Packet,Status,BytesTransferred
xor eax,eax
ret
PtTransferDataComplete endp


PtResetComplete proc pAdapt,Status
xor eax,eax
ret
PtResetComplete endp


PtRequestComplete proc pAdapt,_NdisRequest,Status
xor eax,eax
ret
PtRequestComplete endp


PtReceive proc pAdapt,MacReceiveContext,HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSize
xor eax,eax
ret
PtReceive endp


PtReceiveComplete proc pAdapt
xor eax,eax
ret
PtReceiveComplete endp


PtStatus proc pAdapt,GeneralStatus,StatusBuffer,StatusBufferSize
xor eax,eax
ret
PtStatus endp


PtStatusComplete proc pAdapt
xor eax,eax
ret
PtStatusComplete endp


PtBindAdapter proc Status,BindContext,DeviceName,SystemSpecific1,SystemSpecific2
xor eax,eax
ret
PtBindAdapter endp


PtUnbindAdapter proc Status,pAdapt,UnbindContext
xor eax,eax
ret
PtUnbindAdapter endp


PtReceivePacket proc pAdapt,Packet
xor eax,eax
ret
PtReceivePacket endp


PtPNPHandler proc pAdapt,pNetPnPEvent
xor eax,eax
ret
PtPNPHandler endp


end start 
汇编写驱动(一)——光速入门 用汇编写windows驱动非常简单,只要有汇编基础和用C写驱动的能力即可。有了这两样基础,我们距离用汇编写驱动,只剩下一层窗户纸,一戳就破。一、准备软件:Radasm        为了快速入门,好的IDE是降低入门难道的有效手段。Radasm是我最为钟爱的一款软件,第一次使用过它,我就果断地将masm32删除了。   RadASM是一款著名的WIN32汇编编辑器,精通win32汇编的人对它应该不会陌生。支持MASM、TASM等多种汇编编译器,提供优秀的IDE,自带一个资源编辑器和一个调试器(OD)。拥有较 阅读详情

相关推荐

windows ndis 详解

windows ndis 网络驱动

zhangyihu321的专栏 2312

(一)arm裸机开发---汇编led驱动程序

学习新的系列,arm裸机开发。主芯片使用的是imx.6ull芯片,平台使用的是正点原子的imx.6ull alpha开发板。本节介绍汇编led驱动的开发过程。 为什么我们要用汇编来写led程序呢?因为cortex-a芯片上电之后sp指针(堆栈指针)没有初始化,没有c语言运行的环境。所以必须先用汇编语言初始化sp指针,ddr等,把c语言运行环境搭好。 目录一.硬件原理图二.初始化流程1.使能GPIO1_3的时钟2.设置GPIO的复用功能为IO3.设置GPIO的电器属性4.设置GPIO的输入输出三.编写驱动程

Engineering Lion的博客 756

NDIS驱动开发实战指南:从基础到中间层驱动程序

网络驱动程序接口规范(NDIS)是微软和3Com公司共同开发的一种标准API集合。它的目的是为网络适配器的驱动程序提供一个统一的接口,以便在不同的网络硬件和上层协议之间提供一致的通信方式。NDIS简化了网络驱动程序的开发,并支持即插即用设备,使得网络适配器可以轻松地被操作系统所识别和配置。微型端口驱动程序(Miniport Driver)是在网络适配器驱动程序层次中最低层的组件。它主要负责与硬件通信,执行数据的接收和发送操作。

weixin_30633869的博客 922

嵌入式I.MX6ULL裸机开发学习(一)汇编LED驱动程序

汇编LED驱动程序编写,编译与烧录。

qq_36098455的博客 959

纯汇编写的操作系统源码(包含编译后的文件和网络驱动)

纯汇编写的操作系统源码(包含编译后的文件和网络驱动)

雷达信号处理——恒虚警检测(CFAR)

上图展示的是同时在距离维和多普勒维进行恒虚警检测的原理,如果只是在距离维或多普勒维做CFAR,检测单元的左右两侧均有设定好数量的保护单元和参考单元。不同的CFAR检测器适用于不同的场景,CA-CFAR算法适用于均匀环境中的单目标或彼此相距较远的多目标环境,在邻近多目标环境会发生目标的遮蔽效应,在杂波边缘会发生杂波边缘效应。从图中也可以看到,根据阈值的选择不同,有不同的检测器,其中CA-CFAR是取的参考单元的均值,SO-CFAR取的是参考单元的最小值,而GO-CFAR是取的参考单元的最大值。

诚朴勇毅 3万+

NDIS驱动程序堆栈

NDIS驱动程序堆栈

王马的博客 1756

MT4量化交易入门:手把手教你用MQL4编写第一个外汇EA(含完整代码)

本文详细介绍了如何使用MQL4在MT4平台上编写第一个外汇EA,涵盖从开发环境配置到均线交叉策略实现的完整流程。通过手把手教学和完整代码示例,帮助量化交易新手快速掌握外汇自动化交易的核心技术,实现高效的MT4量化交易系统。

mmm90的博客 527

ecm、ppp、ndis 拨号

Modem拨号,PPP属于数据链路层协议,它使用HDLC协议格式来封装数据帧,而在数据流中如果遇到 0x7D,则表示后面的数据是控制信息,当它出现的时候,设备需从数据模式切换成控制模式,病处理 这些信息,设备需要对每一个字节的数据进行解析,并作出相应的处理,占用较多的资源。 NDIS拨号,Ethernet协议是通过使用不同的以太网帧的包头来区分控制信息和数据信息,一个以太网帧 的包头大小是固定的...

xingyuan1hao的专栏 2万+

从零搭建ROS1导航小车(一):松灵SCOUT Mini底盘通讯配置与ROS包编译避坑指南

本文详细介绍了从零开始搭建ROS1导航小车的初始步骤,重点讲解松灵SCOUT Mini底盘的通讯配置与ROS包编译避坑指南。内容包括硬件连接、CAN通讯配置、ROS工作空间构建及编译优化等实用技巧,帮助开发者快速实现自主导航小车的通讯功能。

weixin_27014595的博客 189

QT插件学习系列(一) 初识QtPlugin

QT插件学习系列(一) 初识QtPlugin 1、 概述 为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢? 导出的动态库如果缺失,程序不能运行。但插件可以。 同一套代码,即可分别在 windows 下和 linux 下生成插件。 QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。 高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的插件基类,例如现有的 QTSqlDriver,因此你可也以编写自己的 QTStyle 扩展 QT。 低级

L_Andy的专栏 3116

PPP拨号和NDIS拨号的区别:

PPP拨号 和 NDIS拨号 的区别: 参考网址: https://blog.youkuaiyun.com/xingyuan1hao/article/details/89279730 https://blog.youkuaiyun.com/opencpu/article/details/8050139 https://bbs.youkuaiyun.com/topics/390677893?depth_1-utm_source...

a746742897的博客 5634

Versal ACAP NoC实战:像理解计算机网络一样配置AXI NoC,打通PS与PL数据通路

本文深入探讨了Versal ACAP NoC的配置与优化,通过计算机网络类比解析NoC架构,详细介绍了在VD100开发板上配置AXI NoC实现PS与PL数据交互的实战步骤。文章涵盖NoC组件功能、Vivado配置技巧、性能优化方法及常见问题解决方案,帮助开发者高效打通Versal芯片的数据通路。

weixin_42665255的博客 294

Remote NDIS (RNDIS)

远程 NDIS (RNDIS) 概述 - Windows drivers | Microsoft DocsRNDIS 使硬件供应商无需为连接到 USB 总线的网络设备编写 NDIS 微型端口驱动程序。https://docs.microsoft.com/zh-cn/windows-hardware/drivers/network/overview-of-remote-ndis--rndis- 远程 NDIS (RNDIS) 是一种独立于总线的类规范,适用于动态即插即用上的网络设备) (802.3 (PnP

maimang1001的专栏 4739

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2311

Meta-World环境实战解析:pick-place-v2中的状态观测与动作控制

本文深入解析了Meta-World中pick-place-v2环境的强化学习实战要点。文章详细拆解了39维状态观测向量的构成与意义,包括机械臂末端、物体位置及目标坐标,并揭示了默认部分可观测设置的潜在影响。同时,阐述了4维动作空间的控制逻辑与奖励函数的分阶段设计,为训练高效稳定的抓放策略提供了核心指导与实用调优技巧。

weixin_29184371的博客 78

NDIS 6.85的轮询模式

NDIS轮询模式

王马的博客 1708

华为昇腾云平台适配Baichuan2大模型记录

文件发现报错:ValueError: The pipeline stage 2 in auto_parallel_context is not equal to the pipeline_stage 1 in the config.run_baichuan2_7b.yaml`,发现默认设备数是16卡,对应的pipeline_stage为2,但实际是8卡,那就改成下面的试试看。,将Baichuan2_7B_Chat.ckpt文件复制进去,将。点击镜像管理,突然发现有个2_2_0,赶紧新建了一个,成功。

羊城迷鹿的博客 2393

NDIS(Network Driver Interface Specification)驱动程序

该代码实现了一个NDIS驱动程序的入口函数,负责初始化微型端口、注册协议、分配内存和初始化同步机制(如自旋锁)。驱动程序使用NDIS API与网络设备进行交互,负责处理底层的网络数据传输和适配器管理。

lydstory123的专栏 1073

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NDIS Filter开发-OID 请求

Filter驱动的OID请求

王马的博客 947

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NDIS小端口驱动开发(八)

NDIS小端口驱动的PNP总结

王马的博客 1236

NDIS 中间层驱动开发

1 NDIS中间层驱动程序1.1 NDIS中间层驱动程序(NDIS Intermediate Drivers)概述微软Windows网络驱动程序接口标准(NDIS 4.0)和Windows NT 4.0(SP3)引入了一种新的NDIS驱动程序,它可以嵌在NDIS 传输驱动程序TDI(如,TCP/IP)和底层的NDIS网络接口驱动程序的中间。这种新类型的驱动程序被称为NDIS中间层驱动,如图表

Kyline`s Blog 2855

NDIS Filter开发-Filter启动、暂停和绕过

NDIS Filter驱动的绕过模式

王马的博客 1493

NDIS协议驱动(四)

NDIS协议驱动

王马的博客 1229

NDIS协议驱动(一)

NDIS 协议层驱动

王马的博客 1610
上一篇: 逆向分析并重组源码的过程
下一篇: 汇编实现木马生成技术
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值