我现在学习驱动, 一直都用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直播授课