WDK中提示的Warning

本文探讨了WDK编译过程中出现的警告信息,包括内存泄漏警告、DriverUnload成员访问警告及变量检查警告等,并提供了相应的解决建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前从来没有注意WDK在编译之后,虽然没有在build的时候直接提示警告信息,但是会在ORCA的一个界面中提示程序中存在的一些Warnning,比如:

 警告实例1:

warning 28197: Possibly leaking memory 'pMacInfo':

如果你上网查找这个错误:http://msdn.microsoft.com/en-us/library/aa468922.aspx

那你就会发现,在程序中忘记了释放已经分配的内存:

        pMacInfo =  (PDOT11_MAC_INFO)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle, sizeof(DOT11_MAC_INFO), FILTER_ALLOC_TAG, LowPoolPriority);
		NdisZeroMemory(pMacInfo,sizeof(DOT11_MAC_INFO));
	    DEBUGP(DL_TEST,("sizeof DOT11_MAC_INFO is%u!\n",sizeof(DOT11_MAC_INFO)));
		Status = filterDoInternalRequest(pFilter,
	                                  NdisRequestMethod,
									  Oid,
									  pMacInfo,
									  sizeof(DOT11_MAC_INFO),
									  sizeof(DOT11_MAC_INFO),
									  MethodId,
									  &BytesProcessed); 
....(略)
		 } 
       NdisFreeMemory(pMacInfo,0,0);

 

如果你没有NdisFreeMemory()这条语句,他就会提示说可能存在内存泄露。

 

 警告实例2:

 

133            DriverObject->DriverUnload = FilterUnload;
 
       

filter.c(133) : warning 28175: The 'DriverUnload' member of _DRIVER_OBJECT should not be accessed by a driver: Access to this member may be permitted for certain classes of drivers. See the documentation for this warning for more information.
Found in function 'DriverEntry'

这里说成员DriverUnload不应该被驱动访问~ 没有找到原因,暂且记录!

 

 警告实例3:

28193 - <Variable> holds a value that must be examined

 NdisQueryMdl(
            pMdl,
            (PVOID *)&pCopyData,
            &BufferLength,
            NormalPagePriority);
FILTER_ASSERT(pCopyData != NULL);// Exception will rise if no this statment

 

The driver should test the value of the specified variable, which was supplied by a function, but the driver is either not using the value or is overwriting the value without examining it.

,从环境搭建到编写并测试HelloWDK驱动程序。首先介绍如何安装WDK,然后讲解如何在VS2019中创建和配置驱动项目,解决编译错误。最后,指导如何在虚拟机上测试驱动,包括启用驱动签名测试模式,安装并查看驱动运行效果和日志输出。摘要由优快云通过智能技术生成驱动的开发对于初学者来说是不友好的,我们不知道怎么入手,从哪里入门。对于初学者来说束手无策,特别是碰到一个很简单的问题,都不知道怎么解决,这一系列的教程,就是用来排除这些障碍。大部分的驱动开发教程都会先给我们把文档和demo给我们贴出来:Windows驱动程序入门: Windows 驱动程序入门 - Windows drivers | Microsoft DocsGithub: https://github.com/Microsoft/Windows-driver-samples但这对于初学者来说,一开始并没有什么用,因为看不懂。我们还是按照之前有一定的编程基础,来进入驱动的开发。假设大家已经安装了vs2019或者更高版本的vistual studio。先开发一个Hello World的驱动程序,把驱动程序安装到测试机上,看发生了什么。我们先不管里面的逻辑原理是什么,先依葫芦画瓢,整出第一个Hello World的demo。WDK(Windows Driver Kit) 安装安装WDK也是比较简单的事情,在Vistual studio Install上找到Windows Driver Kit ,进行安装安装完成了以后会出现Windows Driver Kit已经打钩了。编写HelloWDK新建一个工程,选择Empty WDM Driver项目,新建driver.cpp文件,编写如下代码:// driver.cpp#include <ntddk.h>extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject);extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath){ DbgPrint("[GO2CODING_Driver] DriverEntry\n"); NTSTATUS status = STATUS_SUCCESS; pDriverObject->DriverUnload = DriverUnload; return status;}extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject){ DbgPrint("[GO2CODING_Driver] DriverUnload\n"); return;}123456789101112131415161718192021这时候编译会出错,error C2220: 以下警告被视为错误warning C4100: “pRegPath”: 未引用的形参warning C4100: “pDriverObject”: 未引用的形参123我们还需要如下的设置:1.配置属性 - C/C++ -常规 中 将警告视为错误 设置为 否2.配置属性 - Driver Signing - General 中 Sign Mode 设置为 Off。3 .配置属性 -Inf2cat - run Inf2cat 设置为 否。这样编译成功后,生成HelloWDM.inf和HelloWDM.sys文件。第一个demo也就完成了。测试虚拟机在做驱动的时候,并不像以前开发的应用程序那样,最好不要直接在本机上测试,我们需要一台windows 10 的虚拟机,虚拟机的安装方式可以参考相关的教程。我们还需要驱动开发的相关工具,包含DebugView,DriverMonitor,IRPTrace,WinObj,DeviceTree,DiskView,DriverManager,EzDriverInstaller,可以在这里进行下载。放到测试机上。测试机在正常的模式下,是无法安装windows没有签名的驱动,我们需要把测试机变为不需要签名验证。按shift重启测试机。进入这个界面,选择 疑难解答->启动设置->重启。重新进入系统,在如下的页面中按 7 启动windows。重启完后,把编译好的HelloWDK放到测试机上,进入设备管理(电脑右键->管理),添加过时硬件。一路下一步到底,直到出现 从磁盘安装,选择安装的路径到刚才拷贝的路径下。在安装驱动之前,我们先以管理员的身份打开debugview,在Capture选择如下,等待着log的输出。安装驱动,会 出现如下的提示,选择始终安装提示安装完成。在设备管理上出现了,如下的新设备。同时在debugview下,我们可以看到如下的log。这个log对于我们来说,意义太重大了,说明我们不仅仅把驱动安装成功了,还打印出了日志,简直相当于调试了,我们的心安了不少。HelloWDK.inf的内容如下:;; The Win2K DDK documentation contains an excellent INF reference.;--------- Version Section ---------------------------------------------------[Version]Signature="$CHICAGO$"Provider=Go2Coding_DeviceDriverVer=11/1/2007,3.0.0.3; If device fits one of the standard classes, use the name and GUID here,; otherwise create your own device class and GUID as this example shows.Class=Go2CodingDeviceClassGUID={EF2962F0-0D55-4bff-B8AA-2221EE8A79B1}CatalogFile=HelloWDK.cat;--------- SourceDiskNames and SourceDiskFiles Section -----------------------; These sections identify source disks and files for installation. They are; shown here as an example, but commented out.[SourceDisksNames]1 = "HelloWDK",Disk1,,[SourceDisksFiles]HelloWDK.sys = 1,,;--------- ClassInstall/ClassInstall32 Section -------------------------------; Not necessary if using a standard class; 9X Style[ClassInstall]Addreg=Class_AddReg; NT Style[ClassInstall32]Addreg=Class_AddReg[Class_AddReg]HKR,,,,%DeviceClassName%HKR,,Icon,,"-5";--------- DestinationDirs Section -------------------------------------------[DestinationDirs]YouMark_Files_Driver = 10,System32\Drivers;--------- Manufacturer and Models Sections ----------------------------------[Manufacturer]%MfgName%=Mfg0,ntamd64[Mfg0]; PCI hardware Ids use the form; PCI\VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd;改成你自己的ID%DeviceDesc%=YouMark_DDI, PCI\VEN_9899&DEV_9899;---------- DDInstall Sections -----------------------------------------------; --------- Windows 9X -----------------; Experimentation has shown that DDInstall root names greater than 19 characters; cause problems in Windows 98[Mfg0.ntamd64]%DeviceDesc%=YouMark_DDI, PCI\VEN_9899&DEV_9899[YouMark_DDI]CopyFiles=YouMark_Files_DriverAddReg=YouMark_9X_AddReg[YouMark_9X_AddReg]HKR,,DevLoader,,*ntkernHKR,,NTMPDriver,,DeviceIoControl.sysHKR, "Parameters", "BreakOnEntry", 0x00010001, 0; --------- Windows NT -----------------[YouMark_DDI.NT]CopyFiles=YouMark_Files_DriverAddReg=YouMark_NT_AddReg[YouMark_DDI.NT.Services]Addservice = HelloWDK, 0x00000002, YouMark_AddService[YouMark_AddService]DisplayName = %SvcDesc%ServiceType = 1 ; SERVICE_KERNEL_DRIVERStartType = 3 ; SERVICE_DEMAND_STARTErrorControl = 1 ; SERVICE_ERROR_NORMALServiceBinary = %10%\System32\Drivers\HelloWDK.sys[YouMark_NT_AddReg]HKLM, "System\CurrentControlSet\Services\HelloWDK\Parameters",\"BreakOnEntry", 0x00010001, 0; --------- Files (common) -------------[YouMark_Files_Driver]HelloWDK.sys;--------- Strings Section ---------------------------------------------------[Strings]ProviderName="Go2Coding."MfgName="Go2Coding Soft"DeviceDesc="Hello World HelloWDK!"DeviceClassName="Go2Coding_Device"SvcDesc="Go2Coding"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113如果需要 demo的源代码,可以私信我。
03-20
#include <ntddk.h> #include <wdm.h> #include <ntddndis.h> // 调试级别定义(必须放在所有include之后) #define DPFLTR_IHVDRIVER_ID 0x63 // 自定义驱动标识(0-63) #define MYDRIVER_TRACE_LEVEL_INFO DPFLTR_INFO_LEVEL // 0x0 #define MYDRIVER_TRACE_LEVEL_WARNING DPFLTR_WARNING_LEVEL // 0x1 #define MYDRIVER_TRACE_LEVEL_ERROR DPFLTR_ERROR_LEVEL // 0x2 #define MYDRIVER_TRACE_LEVEL_VERBOSE 0x3 // 自定义详细级别 #define IOCTL_PROTOCOL_CONTROL CTL_CODE(FILE_DEVICE_NETWORK, 0x800, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) typedef struct _PROTOCOL_DRIVER { PDEVICE_OBJECT DeviceObject; PFILE_OBJECT FileObject; KEVENT CompletionEvent; IO_STATUS_BLOCK IoStatus; } PROTOCOL_DRIVER; // 协议特征结构 typedef struct _PROTOCOL_CHARACTERISTICS { ULONG Magic; USHORT HeaderSize; UCHAR Checksum; } PROTOCOL_CHARACTERISTICS; // 全局变量 PROTOCOL_DRIVER g_ProtocolDriver; PROTOCOL_CHARACTERISTICS g_ProtocolChars = { 0x4E455449, sizeof(PROTOCOL_CHARACTERISTICS), 0xAA }; // IRP完成回调 NTSTATUS ProtocolIoCompletion( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context) { UNREFERENCED_PARAMETER(DeviceObject); PKEVENT event = (PKEVENT)Context; KeSetEvent(event, IO_NO_INCREMENT, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } // 绑定到协议驱动 NTSTATUS AttachToProtocolDriver() { UNICODE_STRING protoName; RtlInitUnicodeString(&protoName, L"\\Device\\Tcp"); NTSTATUS status = IoGetDeviceObjectPointer( &protoName, FILE_ALL_ACCESS, &g_ProtocolDriver.FileObject, &g_ProtocolDriver.DeviceObject); if (!NT_SUCCESS(status)) { DbgPrintEx(DPFLTR_IHVDRIVER_ID, DBG_LEVEL_ERROR, "[%s] Failed to attach to protocol driver: 0x%X\n", __FUNCTION__, status); return status; } DbgPrintEx(DPFLTR_IHVDRIVER_ID, DBG_LEVEL_INFO, "[%s] Successfully attached to protocol driver at 0x%p\n", __FUNCTION__, g_ProtocolDriver.DeviceObject); return STATUS_SUCCESS; }
最新发布
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值