3760|8

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请高手解惑 能解决者散分100 [复制链接]

关于windows 2003 sp1 DDK(Windows DDK 3790.1830)版本中DDK编译驱动程序的问题,使用编译环境是windows xp,各个文件如下:

1、sources文件:

TARGETNAME=Test
TARGETPATH=obj
TARGETTYPE=DRIVER   
SOURCES=11DriverDemo.c

2、源文件11DriverDemo.c:

#include


// 自定义函数的声明
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);

// 驱动内部名称和符号连接名称
#define DEVICE_NAME L"\\Device\\devDriverDemo"
#define LINK_NAME L"\\??\\slDriverDemo"

// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{

        NTSTATUS status = STATUS_SUCCESS;

        // 初始化各个派遣例程
        pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
        pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
        pDriverObj->DriverUnload = DriverUnload;

                // 创建、初始化设备对象
        // 设备名称
        UNICODE_STRING ustrDevName;
        RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
        // 创建设备对象
        PDEVICE_OBJECT pDevObj;
        status = IoCreateDevice(pDriverObj,
                                0,
                                &ustrDevName,
                                FILE_DEVICE_UNKNOWN,
                                0,
                                FALSE,
                                &pDevObj);
        if(!NT_SUCCESS(status))
        {
                return status;
        }

                // 创建符号连接名称
        // 符号连接名称
        UNICODE_STRING ustrLinkName;
        RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
        // 创建关联
        status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  
        if(!NT_SUCCESS(status))
        {
                IoDeleteDevice(pDevObj);  
                return status;
        }
       
        return STATUS_SUCCESS;
}

void DriverUnload(PDRIVER_OBJECT pDriverObj)
{       
        // 删除符号连接名称
        UNICODE_STRING strLink;
        RtlInitUnicodeString(&strLink, LINK_NAME);
        IoDeleteSymbolicLink(&strLink);

        // 删除设备对象
        IoDeleteDevice(pDriverObj->DeviceObject);
}

// 处理IRP_MJ_CREATE、IRP_MJ_CLOSE功能代码
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        // 完成此请求
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);

        return STATUS_SUCCESS;
}

在Windows XP Checked Build Environment环境中编译命令为build -cZg,编译结果是


F:\PROGRA~1\WINDDK>e:

E:\>cd aboutprogram\coding\driver

E:\aboutprogram\coding\driver>build -cZg
BUILD: Adding /Y to COPYCMD so xcopy ops won't hang.
BUILD: Object root set to: ==> objchk_wxp_x86
BUILD: Compile and Link for i386
BUILD: Examining e:\aboutprogram\coding\driver directory for files to compile.
BUILD: Compiling (NoSync) e:\aboutprogram\coding\driver directory
Compiling - 11driverdemo.c for i386
errors in directory e:\aboutprogram\coding\driver
11driverdemo.c(31) : error C2275: 'UNICODE_STRING' : illegal use of this type as an expression
11driverdemo.c(31) : error C2146: syntax error : missing ';' before identifier 'ustrDevName'
11driverdemo.c(31) : error C2144: syntax error : '' should be preceded by ''
11driverdemo.c(31) : error C2144: syntax error : '' should be preceded by ''
11driverdemo.c(31) : error C2143: syntax error : missing ';' before 'identifier'
11driverdemo.c(31) : error C2065: 'ustrDevName' : undeclared identifier
11driverdemo.c(32) : error C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
11driverdemo.c(34) : error C2275: 'PDEVICE_OBJECT' : illegal use of this type as an expression
11driverdemo.c(34) : error C2146: syntax error : missing ';' before identifier 'pDevObj'
11driverdemo.c(34) : error C2144: syntax error : '' should be preceded by ''
11driverdemo.c(34) : error C2144: syntax error : '' should be preceded by ''
11driverdemo.c(34) : error C2143: syntax error : missing ';' before 'identifier'
11driverdemo.c(34) : error C2065: 'pDevObj' : undeclared identifier
11driverdemo.c(37) : error C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
11driverdemo.c(41) : error C4047: 'function' : 'PDEVICE_OBJECT * ' differs in levels of indirection from 'int *'
11driverdemo.c(49) : error C2275: 'UNICODE_STRING' : illegal use of this type as an expression
11driverdemo.c(49) : error C2146: syntax error : missing ';' before identifier 'ustrLinkName'
11driverdemo.c(49) : error C2144: syntax error : '' should be preceded by ''
11driverdemo.c(49) : error C2144: syntax error : '' should be preceded by ''
11driverdemo.c(49) : error C2143: syntax error : missing ';' before 'identifier'
11driverdemo.c(49) : error C2065: 'ustrLinkName' : undeclared identifier
11driverdemo.c(50) : error C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
11driverdemo.c(52) : error C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
11driverdemo.c(52) : error C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
11driverdemo.c(55) : error C4047: 'function' : 'PDEVICE_OBJECT' differs in levels of indirection from 'int'
BUILD: Compile errors: not linking e:\aboutprogram\coding\driver directory
BUILD: Done

    2 files compiled - 25 Errors

E:\aboutprogram\coding\driver>

请高手帮忙解决问题

最新回复

汗,已经习惯C++的方式了,如果很多变量,那申明起来多麻烦... 而且要想到一个变量,再在函数顶端加一个. 有什么好的办法啊? 555~  详情 回复 发表于 2007-10-6 19:49
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
UNICODE_STRING ustrDevName;
把这个定义放到前面去,你的是.c文件,而不是.cpp文件。
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶~
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
好象不成啊,继续等待中
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
自己顶起,继续等待eeworld中有热心的人
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
DriverEntry改成如下,我编译已通过

// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
UNICODE_STRING ustrDevName;
UNICODE_STRING ustrLinkName;
PDEVICE_OBJECT pDevObj;
NTSTATUS status = STATUS_SUCCESS;

// 初始化各个派遣例程
pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
pDriverObj->DriverUnload = DriverUnload;

// 创建、初始化设备对象
// 设备名称
RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
// 创建设备对象
status = IoCreateDevice(pDriverObj,
         0,
         &ustrDevName,
         FILE_DEVICE_UNKNOWN,
         0,
         FALSE,
         &pDevObj);
if(!NT_SUCCESS(status))
{
  return status;
}

// 创建符号连接名称
// 符号连接名称
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
// 创建关联
status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  
if(!NT_SUCCESS(status))
{
     IoDeleteDevice(pDevObj);  
      return status;
}

return STATUS_SUCCESS;
}
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢hua1998(hua)大侠,能否帮忙解释一下原因吗?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
这是C语言,变量的申明必须放在函数的最顶部.
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
汗,已经习惯C++的方式了,如果很多变量,那申明起来多麻烦...

而且要想到一个变量,再在函数顶端加一个. 有什么好的办法啊?


555~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表