windows驱动编译报错

前言:在搭建完驱动开发环境之后,最想做的事情莫过于马上编译驱动,但是在这过程中往往会遇到好多问题,一起盘一盘,驱动编译报错那些事儿。

在虚拟机安装好VS2017+SDK10.0.16299.0之后,找出了之前在VS2015自己写的驱动demo,一编译,各种报错,解决一波。

先贴贴自己之前写的驱动demo,也是网上听着铁锤老师的课,动手码了码,还望各位大佬多多指教

#include <ntddk.h>
#include <usbioctl.h>

#define DEVICE_NAME L"\\Driver\\MyFirstDevice"
#define SYM_NAME L"\\??\\MyFirstDevice"

VOID Unload(PDRIVER_OBJECT DriverObject) {
    
    

	UNREFERENCED_PARAMETER(DriverObject);
	KdPrint(("卸载驱动程序\n"));

	if (DriverObject->DeviceObject)
	{
    
    
		IoDeleteDevice(DriverObject->DeviceObject);

		UNICODE_STRING symname = {
    
     0 };

		RtlInitUnicodeString(&symname, SYM_NAME);

		IoDeleteSymbolicLink(&symname);

		KdPrint(("驱动和设备移除成功"));
		
	}
}

//
//Dispatch
//

NTSTATUS MyCreate(PDEVICE_OBJECT pdevice, PIRP pirp)

{
    
    
	NTSTATUS status = STATUS_SUCCESS;

	DbgPrint("My device has bee opened\n");

	pirp->IoStatus.Status = status;
	pirp->IoStatus.Information = 0;
	IoCompleteRequest(pirp, IO_NO_INCREMENT);

	return STATUS_SUCCESS;
}

NTSTATUS MyClose(PDEVICE_OBJECT pdevice, PIRP pirp)

{
    
    
	NTSTATUS status = STATUS_SUCCESS;

	DbgPrint("My device has been closed\n");

	pirp->IoStatus.Status = status;
	pirp->IoStatus.Information = 0;
	IoCompleteRequest(pirp, IO_NO_INCREMENT);

	return STATUS_SUCCESS;
}

NTSTATUS MyCleanUp(PDEVICE_OBJECT pdevice, PIRP pirp)

{
    
    
	NTSTATUS status = STATUS_SUCCESS;

	DbgPrint("My device has been clanup\n");

	pirp->IoStatus.Status = status;
	pirp->IoStatus.Information = 0;
	IoCompleteRequest(pirp, IO_NO_INCREMENT);

	return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
    
    
	UNREFERENCED_PARAMETER(DriverObject);
	UNREFERENCED_PARAMETER(RegistryPath);

	NTSTATUS status = STATUS_SUCCESS;

	KdPrint(("DriverEntry\n"));

	UNICODE_STRING devicename = {
    
     0 };

	PDEVICE_OBJECT pdevice = NULL;

	DriverObject->DriverUnload = Unload;

	RtlInitUnicodeString(&devicename, DEVICE_NAME);

	status = IoCreateDevice(DriverObject, 0, &devicename, FILE_DEVICE_UNKNOWN, 0, TRUE, &pdevice);

	if (!NT_SUCCESS(status))
	{
    
    
		DbgPrint("Create device failed: %x\n", status);
		return status;
	}

	//
	//创建设备成功
	//
	//打印注册表所在目录
	KdPrint(("-----%wZ-------\n", RegistryPath));

	UNICODE_STRING symname = {
    
    0};

//	UNICODE_STRING symname;

	RtlInitUnicodeString(&symname, SYM_NAME);

	status = IoCreateSymbolicLink(&symname, &devicename);

	if (!NT_SUCCESS(status))
	{
    
    
		DbgPrint("Create SymbolicLink failed: %x\n", status);

		IoDeleteDevice(pdevice);

		return status;
	}

	DbgPrint("设备创建成功,设备已成功加载!");

	DriverObject->MajorFunction[IRP_MJ_CREATE] = MyCreate;
	DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyClose;
	DriverObject->MajorFunction[IRP_MJ_CLEANUP] = MyCleanUp;

	return STATUS_SUCCESS;
}

状况一:把代码拿进去,红了一大片(要么SDK没装,要么SDK版本没选对)
在这里插入图片描述
原因分析:因为VS207默认SDK版本为LatestTargetPlatformVersion,这里就需要我们手动修改成我们环境搭建时安装的SDK的版本。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
状况二:解决上述问题,接下来肯定就是急着编译辣(心机吃不了热豆腐),记得要勾选正确的平台,我这里选x64,这个一编译马上报错,“error C2220: 警告被视为错误 - 没有生成“object”文件”,网上找了帖子说是因为编码的问题,照着做还是没有解决问题,自己找找看。
在这里插入图片描述
原因分析:我这之前写的驱动加载进VS2017之后,属性都变了,乍一看都在修改Win32平台的属性,这就是咱经常犯的错误,不够仔细,这里咱因该把平台改成x64,然后再更改属性。
在这里插入图片描述
在这里插入图片描述
改完之后,编译妥妥的编译成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42931917/article/details/108399656