windows驱动编译报错

tech2025-07-06  0

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

在虚拟机安装好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,然后再更改属性。 改完之后,编译妥妥的编译成功

最新回复(0)