前言:在搭建完驱动开发环境之后,最想做的事情莫过于马上编译驱动,但是在这过程中往往会遇到好多问题,一起盘一盘,驱动编译报错那些事儿。
在虚拟机安装好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,然后再更改属性。
改完之后,编译妥妥的编译成功