3507|8

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请大侠帮我解决这个问题!急急急! [复制链接]

使用DriverStudio自带的例子Daytime进行目录枚举功能扩展。
编写MyNT.h文件如下:
#ifndef _MyNT_H
#define _MyNT_H
#include

#pragma pack(8)
typedef struct _FILE_BOTH_DIR_INFORMATION
{
        ULONG NextEntryOffset;
        ULONG FileIndex;
        LARGE_INTEGER CreationTime;
        LARGE_INTEGER LastAccessTime;
        LARGE_INTEGER LastWriteTime;
        LARGE_INTEGER ChangeTime;
        LARGE_INTEGER EndOfFile;
        LARGE_INTEGER AllocationSize;
        ULONG FileAttributes;
        ULONG FileNameLength;
        ULONG EaSize;
        char shortNameLength;
        WCHAR ShortName[12];
        WCHAR Filename[1];
}FILE_BOTH_DIR_INFORMATION,*PFILE_BOTH_DIR_INFORMATION;
#pragma pack()
#define FileBothDirectoryInformation 3
extern "C"
{
        NTSYSAPI NTSTATUS NTAPI
                NtQueryDirectoryFile(IN HANDLE FileHandle,
                IN HANDLE Event OPTIONAL,
                IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
                IN PVOID ApcContext OPTIONAL,
                OUT PIO_STATUS_BLOCK ioStatusBlock,
                OUT PVOID FileInformation,
                IN ULONG Length,
                IN ULONG FileInformationClass,
                IN BOOLEAN ReturnSignleEntry,
                IN PUNICODE_STRING FileName OPTIONAL,
                IN BOOLEAN RestartScan);
}

NTSTATUS MyFindNextFile(HANDLE hHandle,unsigned char *bBuffer,int len);

#endif

编写MyNT.cpp文件如下:
#include "MyNT.h"
#pragma comment(lib,"ntdll.lib")

NTSTATUS MyFindNextFile(HANDLE hHandle,unsigned char *bBuffer,int len)
{
        NTSTATUS status;
        IO_STATUS_BLOCK io_block;
        status = NtQueryDirectoryFile(hHandle,NULL,NULL,NULL,
                                                 &io_block,(PVOID)bBuffer,len,
                                                 FileBothDirectoryInformation,
                                                 FALSE,NULL,FALSE);
        return status;
}

之后,在Daytime.cpp文件中添加如下代码:
#include "MyNT.h"

在工程中添加MyNT.cpp文件。

在Daytime类中加入Public函数:
VOID Test(VOID);

该函数定义如下:
VOID Daytime::Test(VOID)
{
        HANDLE hFileHandle;
        NTSTATUS status;
        IO_STATUS_BLOCK ioStatusBlock;
        OBJECT_ATTRIBUTES objectAttributes;

        UNICODE_STRING uParentName;
        WCHAR wParentName[256];
        char ansiParentName[256];
        UNICODE_STRING uChildName;
        WCHAR wChildName[256];
        char ansiChildName[256];

        memset(wParentName,0,sizeof(wParentName));
        wcscpy(wParentName,L"\\??\\C:\\WINDOWS\\");
        RtlInitUnicodeString(&uParentName,wParentName);

        InitializeObjectAttributes(&objectAttributes,&uParentName,
                OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
        hFileHandle = NULL;
        status = ZwOpenFile(&hFileHandle,GENERIC_READ|GENERIC_WRITE,
                &objectAttributes,&ioStatusBlock,FILE_SHARE_READ,
                FILE_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT);
        if(status == STATUS_SUCCESS)
                DbgPrint("ZwOpen Successed.\n");
        else
        {
                DbgPrint("ZwOpen Failed.\n");
                return;
        }
        if(hFileHandle == NULL)return;

        unsigned char ansiUse[4096];
        memset(ansiUse,0,sizeof(ansiUse));
        status = MyFindNextFile(hFileHandle,ansiUse,sizeof(ansiUse));
        if(hFileHandle != NULL)ZwClose(hFileHandle);

        FILE_BOTH_DIR_INFORMATION fdInfo;
        unsigned long fdOffset = 0;
        int i,j,k;
        if(status == STATUS_SUCCESS)
        {
                while(1)
                {
                        memset(&fdInfo,0,sizeof(fdInfo));
                        memcpy(&fdInfo,ansiUse+fdOffset,sizeof(fdInfo));
                        k = fdInfo.FileNameLength;
                        memset(wChildName,0,sizeof(wChildName));
                        memcpy(wChildName,ansiUse+fdOffset+0x5e,k);
                        i = wcslen(wChildName);
                        memset(ansiChildName,0,sizeof(ansiChildName));
                        for(j = 0;j < i;j ++)ansiChildName[j] = (char)wChildName[j];
                        DbgPrint("Daytime: %s\n",ansiChildName);
                        if(fdInfo.NextEntryOffset == 0)break;
                        fdOffset = fdOffset+fdInfo.NextEntryOffset;
                }
        }
        else
                DbgPrint("Failed to query.\n");
}

编译后出现一个错误:Daytime.obj : error LNK2019: unresolved external symbol __chkstk referenced in function "public: void __thiscall Daytime::Test(void)" (?Test@Daytime@@QAEXXZ).\objchk\i386\Daytime.sys : fatal error LNK1120: 1 unresolved externals

为什么呢?谢谢各位!急急急!!!

最新回复

VOID Daytime::Test(VOID) 是不是给屏蔽了,没有编译  详情 回复 发表于 2009-2-20 17:31
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
未见过。
帮顶了。
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
求给点有建设性的意见吧!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
没有做过windows的驱动,只弄过wince的。

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
你用的是哪个版本的VC?这个__chkstk是调试版编译时自动加入的函数,用于函数调用后检查栈指针是否正确。可以导入run-time库或者chkstk.obj试试。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

6
 
导入run-time库或者chkstk.obj试试。

这两种方法具体怎么做?
我用的是VC 6.0 中文版。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

7
 
加一行:
#pragma comment(lib, "chkstk.obj")
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
知道怎么回事了。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
VOID Daytime::Test(VOID)

是不是给屏蔽了,没有编译
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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