首页
社区
课程
招聘
[求助]KdPrint无法打印中文
发表于: 2009-7-23 09:52 9269

[求助]KdPrint无法打印中文

2009-7-23 09:52
9269
我现在学习驱动, 一直都用KdPrint打印信息, 然后用DebugView查看
可是今天打印一串中文字符, 发现竟然无法打印, 内核中不是一直使用
Unicode的吗, 为何不支持打印中文呢?

下面是代码:

// FileFunc.h
#pragma once

#ifdef __cplusplus
extern "C" {
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif

#define PAGEDCODE        code_seg("PAGE")
#define LOCKEDCODE        code_seg()
#define INITCODE        code_seg("INIT")

#define PAGEDDATA        data_seg("PAGE")
#define LOCKEDDATA        data_seg()
#define INITDATA        data_seg("INIT")

#define arraysize(p) (sizeof(p) / sizeof((p)[0]) )

typedef struct _DEVICE_EXTENSION
{
        PDEVICE_OBJECT        pDevice;
        UNICODE_STRING        ustrDeviceName;
        UNICODE_STRING        ustrSymLinkName;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;

NTSTATUS        CreateDevice(IN PDRIVER_OBJECT        pDriverObject);
VOID                HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS        HelloDDKDispatchRoutine(PDEVICE_OBJECT pDevObj, PIRP pIrp);

// FileFunc.cpp
#include "FileFunc.h"

#pragma INITCODE
VOID StringTest()
{
        UNICODE_STRING us;
        RtlInitUnicodeString(&us, L"print 中文 in kernel");
        KdPrint(("%wZ\n", &us)); // 这里无法打印出中文
}

#pragma INITCODE
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistry)
{
        NTSTATUS status;

        KdPrint(("Enter DriverEntry\n"));

        pDriverObject->DriverUnload                                        = HelloDDKUnload;
        pDriverObject->MajorFunction[IRP_MJ_CREATE]        =
        pDriverObject->MajorFunction[IRP_MJ_READ]        =
        pDriverObject->MajorFunction[IRP_MJ_WRITE]        =
        pDriverObject->MajorFunction[IRP_MJ_CLOSE]        = HelloDDKDispatchRoutine;

        status = CreateDevice(pDriverObject);

        StringTest();

        KdPrint(("Leave DriverEntry\n"));

        return status;
}

#pragma INITCODE
NTSTATUS        CreateDevice(IN PDRIVER_OBJECT        pDriverObject)
{
        NTSTATUS                status;
        PDEVICE_OBJECT        pDevObj;
        PDEVICE_EXTENSION        pdx;

        UNICODE_STRING        devName;
        RtlInitUnicodeString(&devName, L"\\Device\\HelloDDKDev");
        status = IoCreateDevice(pDriverObject,
                                                        sizeof(DEVICE_EXTENSION),
                                                        &devName,
                                                        FILE_DEVICE_UNKNOWN,
                                                        0,
                                                        TRUE,
                                                        &pDevObj);

        if ( !NT_SUCCESS(status) )
                return status;

        pDevObj->Flags |= DO_BUFFERED_IO;
        pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pdx->pDevice = pDevObj;
        pdx->ustrDeviceName = devName;

        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName, L"\\??\\HelloDDK");
        pdx->ustrSymLinkName = symLinkName;

        status = IoCreateSymbolicLink(&symLinkName, &devName);
        if ( !NT_SUCCESS(status))
        {
                IoDeleteDevice(pDevObj);
                return status;
        }

        return STATUS_SUCCESS;
}

#pragma PAGEDCODE
VOID                HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
{
        KdPrint(("Entry DDKUnload\n"));
        PDEVICE_OBJECT        pDevObj = pDriverObject->DeviceObject;

        while ( pDevObj )
        {
                PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
                IoDeleteSymbolicLink(&pdx->ustrSymLinkName);
                pDevObj = pDevObj->NextDevice;
                IoDeleteDevice(pdx->pDevice);
        }

        KdPrint(("Leave DDKUnload"));
}

#pragma PAGEDCODE
NTSTATUS        HelloDDKDispatchRoutine(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
        NTSTATUS status = STATUS_SUCCESS;
        KdPrint(("Enter DispatchRoutine\n"));

        pIrp->IoStatus.Status = status;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);

        KdPrint(("Leave DispatchRoutine\n"));

        return status;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 61
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
我是可以打印出来的,可能楼主的机器有点问题!
2009-7-23 10:05
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
我是在虚拟机中测试的
"print 中文 in kernel" 这段我只能看到print
从后面的“中文”开始都看不到了
2009-7-23 10:16
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
刚才去了一个群上问了问, 需要把UNICODE_STRING转换成ANSI_STRING才能打印出来:

#pragma INITCODE
VOID StringTest()
{
        UNICODE_STRING us;
        RtlInitUnicodeString(&us, L"print 中文 in kernel");
        KdPrint(("%wZ\n", &us));

        ANSI_STRING as;
        RtlUnicodeStringToAnsiString(&as, &us, TRUE);
        KdPrint(("%Z\n", &as));
        RtlFreeAnsiString(&as);
}

这样就能显示出来了

感觉很奇怪, 内核都是支持UNICODE,而且我们平时使用ansi类型的api, 内核会把参数先转换成unicode, 再调用unicode版本的api, 可是为什么却无法直接打印中文, 真是有点想不通?
2009-7-23 10:35
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
ring3下用OutputDebugStringW(L"pp 中文\n")测试就知道支不支持了~
估计是dbgview的问题~
2009-7-23 16:01
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
DbgPrint函数遇到中文字符的UNICODE_STRING就会截断
2009-7-23 16:42
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
具体原理 请分析DbgView函数流程
2009-7-23 16:44
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
被截断了
2009-7-23 16:45
0
雪    币: 116
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用最新版本的debugview看看!
2009-7-23 17:00
0
游客
登录 | 注册 方可回帖
返回
//