首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

ULONG没有定义的 有关问题

2013-09-16 
ULONG没有定义的 问题用WDK7600编译一个驱动不知道是和是缺少什么头文件。反复报错。。//

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 开始处。

热点排行