首页
社区
课程
招聘
[求助][求助]关于键盘过滤驱动中写入文件的问题
发表于: 2011-4-14 13:51 5193

[求助][求助]关于键盘过滤驱动中写入文件的问题

2011-4-14 13:51
5193
感谢昨天那位朋友的帮助,现在能顺利获取到扫描码并转化成字符,
可是在工作线程中将字符写入文件时,打开却都是乱码,不知为何?
求教各位大侠!

//----------------------
首先:获取扫描码
buf = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
ch1=(CHAR)buf[2];   //这里扫描码要转换为CHAR型
再通过一个表将扫描码转化成字符:
CHAR chn=ascii;

调用工作线程:
VOID ThreadFunc(..)
{
......
DbgPrint(("Get a char:%c\n",chn)); //在这里还能输出正常,获取转化后的字符成功
ZwWriteFile(                   //写入文件
hfile,
NULL,
NULL,
NULL,
&ioStatus,
&chn,
1,
NULL,
NULL);  //执行写入,打开都是乱码
.....
}

问题:
1.就算把CHAR改成UCHAR也一样,能获取转化后的字符,但在写入文件时都是乱码

实在无奈,只能上网来求教各位大侠,还请不吝赐教!谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
。。为什么。。都没有大侠愿意帮助一下吗?。谢谢了
2011-4-14 18:01
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
后来我又把char转存到Ansi_String中:
CHAR *p=&chn;
RtlInitAnsiString(&keys,p); //以P指针指向的chn字符(串)来初始化ansi string
DbgPrint(("buffer is %Z\n",&keys));
DbgPrint(("buffer2 is %s\n",keys.Buffer));  //到这里。所有的输出都正常,都获取到了按键字符,
可是接下来,,恶梦又来了:

ZwWriteFile(                   //写入文件
hfile,
NULL,
NULL,
NULL,
&ioStatus,
keys.Buffer,
keys.Length,
NULL,
NULL);  //执行写入,打开都是乱码
.....
2011-4-14 18:38
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没有人帮助一下吗?
2011-4-15 08:53
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
NTSTATUS       
WriteLogFile(PMYFILEDATA                        PFilesData)
{
        int                        i,j;
        WCHAR                        TempName[500] = {0};
        CHAR                                AnsiName[1024] = {0},WriteName[1024] = {0};
        ANSI_STRING        asFileName,asWrite;
        UNICODE_STRING                BackFile;
        NTSTATUS                                        status;
        HANDLE                                                        LogHandle = NULL;
        OBJECT_ATTRIBUTES                ObjAttrib;
        IO_STATUS_BLOCK                        IoStatusBlock={0};
        FILE_STANDARD_INFORMATION fsi; //文件标准信息结构
        FILE_POSITION_INFORMATION fpi;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//初始化写入内容
        sprintf(WriteName, "Operation is %s,FileName is %Z \n",PFilesData->Oper,&asFileName );
        //RtlInitAnsiString(&asWrite,WriteName);
        //WriteName[asWrite.Length] = 0;
        DbgPrint("%s ",WriteName);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        status = ZwWriteFile(LogHandle,
                                                                                NULL,
                                                                                NULL,
                                                                                NULL,
                                                                                &IoStatusBlock,
                                                                                WriteName,
                                                                                strlen(WriteName),
                                                                                NULL,
                                                                                NULL);
        if (!NT_SUCCESS(status))
        {
                DbgPrint(" ZwWriteFile Failed %08x\n",status);
                if(LogHandle != NULL)
                        ZwClose(LogHandle);
                return status;
        }
       
       
        if(LogHandle != NULL)
                        ZwClose(LogHandle);
        return status ;
       
}
2011-4-16 15:54
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
我解释一下:
注意你写入文件时是一个一个字符写入的,但是你用了字符串指针。举个例子,char a='a';
&a是指向以'a'开始的一个字符串,直至遇到NULL,如果字符'a'后不为NULL,而是一些不可打印字符,那么这些字符都会被写入文件,结果就出现了乱码,LZ复习一下关于c语言字符指针的部分吧。
2011-4-16 16:20
0
游客
登录 | 注册 方可回帖
返回
//