ULONG没有定义的 问题
用WDK7600编译一个驱动
不知道是和是缺少什么头文件。反复报错。。
//=========================================
//= = 文件名称:HelloDRIVER.c
//= = 文件描述:关于HelloDRIVER文件
//= = 作 者:Wen
//= = 编写时间:2013-9-10 19:00:52
//=========================================
#include "HelloDRIVER.h"
#include "SSDTHook.h"
//=========================================
//= = 预处理定义
//=========================================
#pragma alloc_text(INIT, DriverEntry)//如果某些代码在驱动程序完成初始化后不再需要,可以直接把它插入到INIT段
#pragma alloc_text(PAGE, DefaultDispatch) //表示函数运行在分页内存中
#pragma alloc_text(PAGE, DriverUnload)
//=========================================
//= = 函数名称:DriverEntry
//= = 功能描述:驱动程序入口函数
//= = 入口参数:PDRIVER_OBJECT, PUNICODE_STRING
//= = 出口参数:NTSTATUS
//=========================================
NTSTATUS DriverEntry(
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
PDEVICE_OBJECT deviceObject;
PDEVICE_EXTENSION deviceExtension;
UNICODE_STRING symbolicLink;
UNICODE_STRING deviceName;
ULONG i;
KdPrint(("Enter HelloDRIVER DriverEntry!\n"));
UNREFERENCED_PARAMETER(RegistryPath);
RtlInitUnicodeString(&deviceName, L"\\Device\\HelloDRIVER");
// 处理派遣例程
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = DefaultDispatch;
}
// 设置分发例程
DriverObject->DriverUnload = DriverUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE] = DefaultDispatch;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DefaultDispatch;
DriverObject->MajorFunction[IRP_MJ_READ] = DefaultDispatch;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DefaultDispatch;
// 创建设备
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&deviceName,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&deviceObject);
if(!NT_SUCCESS(status))
{
return status;
}
deviceObject->Flags = DO_BUFFERED_IO;
deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
deviceExtension->DeviceObject = deviceObject;
deviceExtension->DeviceName = deviceName;
RtlInitUnicodeString(&symbolicLink, L"\\??\\HelloDRIVER");
deviceExtension->SymbolicLink = symbolicLink;
// 创建符号链接
status = IoCreateSymbolicLink(&symbolicLink, &deviceName);
if(!NT_SUCCESS(status))
{
IoDeleteDevice(deviceObject);
return status;
}
KdPrint(("End of HelloDRIVER DriverEntry!\n"));
ULONG uAddr = GetSSDTAddr(0x25);
if(uAddr)
{
DbgPrint("NtCreateFile: 0x%08x\n", uAddr);
}
return status;
}
//=========================================
//= = 函数名称:DriverUnload
//= = 功能描述:驱动程序卸载函数
//= = 入口参数:PDRIVER_OBJECT
//= = 出口参数:VOID
//=========================================
VOID DriverUnload(
__in PDRIVER_OBJECT DriverObject
)
{
PDEVICE_OBJECT deviceObject;
UNICODE_STRING linkName;
KdPrint(("Enter HelloDRIVER DriverUnload!\n"));
deviceObject = DriverObject->DeviceObject;
while(NULL != deviceObject)
{
PDEVICE_EXTENSION deviceExtesion = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
// 删除符号链接与设备
linkName = deviceExtesion->SymbolicLink;
IoDeleteSymbolicLink(&linkName);
deviceObject = deviceObject->NextDevice;
IoDeleteDevice(deviceExtesion->DeviceObject);
}
KdPrint(("End of HelloDRIVER DriverUnload!\n"));
}
//=========================================
//= = 函数名称:DefaultDispatch
//= = 功能描述:驱动程序默认派遣例程
//= = 入口参数:PDRIVER_OBJECT, PIRP
//= = 出口参数:NTSTATUS
//=========================================
NTSTATUS DefaultDispatch(
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
)
{
NTSTATUS status;
KdPrint(("Enter HelloDRIVER DefaultDispatch!\n"));
UNREFERENCED_PARAMETER(DeviceObject);
status = STATUS_SUCCESS;
// 完成IRP请求
Irp->IoStatus.Status =status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
KdPrint(("End of HelloDRIVER DefaultDispatch!\n"));
return status;
}
这个是头文件
//=========================================
//= = 文件名称:HelloDRIVER.h
//= = 文件描述:关于HelloDRIVER头文件
//= = 作 者:Wen
//= = 编写时间:2013-9-10 19:00:52
//=========================================
#ifndef __HELLODRIVER_H__
#define __HELLODRIVER_H__
//=========================================
//= = 头文件声明
//=========================================
#include <NTDDK.h>
//=========================================
//= = 宏与结构体
//=========================================
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;//指向设备对象的指针
UNICODE_STRING DeviceName;//设备名称
UNICODE_STRING SymbolicLink;// 符号链接名
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;
//=========================================
//= = 函数声明
//=========================================
NTSTATUS
DriverEntry (
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
);
VOID
DriverUnload(
__in PDRIVER_OBJECT DriverObject
);
NTSTATUS DefaultDispatch(
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
);
#endif // End of __HELLODRIVER_H
//=========================================
//= = 文件结束
//=========================================
[解决办法]
问题在于你的文件名,HelloDRIVER.c,VC 对于 .c 扩展名的,自动认定为 C 程序。
不幸的是 VC 执行的又是一个旧版本的 C 标准,改版只允许在函数开始部分定义局部变量。
所以 ULONG uAddr = GetSSDTAddr(0x25); 出现在函数中间的就是错误了。
解决方法是:
(1) 把扩展名改为 .cpp,这样按 c++ 编译就可以了;or
(2) 把 uAddr 的定义向上提到该函数 block 开始处。