driverObject->MajorFunction[i] = DrvDispatch在vs15中报错

dangninghui9577 2017-03-09 11:09:40
0day书里的一个简单的程序实例,VS2015 sdk wdk10 在编译时,出现C4028错误,形参1与声明不同。如果不对driverObject->MajorFunction[i]进行修改,则可以顺利编译


#include "ntddk.h"

#define DEVICE_NAME L"\\Device\\HelloWorld"
#define DEVICE_LINK L"\\DosDevices\\HelloWorld"

PDEVICE_OBJECT g_DeviceObject;

void DriverUnload(IN PDRIVER_OBJECT driverObject) {
KdPrint(("DriverUnload: 88!\n"));
}

NTSTATUS DrvDispatch(IN PDRIVER_OBJECT driverObject, IN PIRP pIrp) {
KdPrint(("Enter DrvDispatch\n"));

pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject, IN PUNICODE_STRING registryPath)
{
NTSTATUS ntStatus;
UNICODE_STRING devName;
UNICODE_STRING symLinkName;
int i = 0;
KdPrint(("DriverEntry: Hello world driver demo!\n"));

driverObject->DriverUnload = DriverUnload;

RtlInitUnicodeString(&devName, DEVICE_NAME);
ntStatus = IoCreateDevice(driverObject,
0,
&devName,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&g_DeviceObject);
if (!NT_SUCCESS(ntStatus)) {
return ntStatus;
}

RtlInitUnicodeString(&symLinkName, DEVICE_LINK);
ntStatus = IoCreateSymbolicLink(&symLinkName, &devName);

if (!NT_SUCCESS(ntStatus)) {
IoDeleteDevice(g_DeviceObject);
return ntStatus;
}

for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
driverObject->MajorFunction[i] = DrvDispatch;
}

return STATUS_SUCCESS;
}
...全文
288 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuchouzhe 2017-03-09
  • 打赏
  • 举报
回复
wdm驱动已经很久不搞了,一点意见仅供参考,似乎是 用c++编译器编译c代码了,造成有可能分派函数类型错误,改变编译器参数或使用extern C

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧