zoukankan      html  css  js  c++  java
  • KdPrint/DbgPrint and UNICODE_STRING/ANSI_STRING

    typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR  Buffer;
    } UNICODE_STRING;
    typedef UNICODE_STRING *PUNICODE_STRING;
    
    
    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
    typedef STRING *PSTRING;
    
    typedef STRING ANSI_STRING;
    typedef PSTRING PANSI_STRING;

    To make life easier MS have extended kernel CRTL output() function with Z format specifier. This works for all kernel functions those understand formatted strings (e.g. sprintf_vsnprintfKdPrint/DbgPrint). For example:

    PUNICODE_STRING pUStr;
    PANSI_STRING    pAStr;
    ...
    KdPrint(("Unicode string: %wZ
    ", pUStr));
    KdPrint(("ANSI    string: %Z
    ",  pAStr));
    

    Though, you can use a little more complicated documented way. Btw, this form is suitable for printing byte array of strictly defined length.

    KdPrint(("Unicode string: %*.*ws
    ",pUStr->Length/sizeof(WCHAR),
        pUStr->Length/sizeof(WCHAR), pUStr));
    KdPrint(("Unicode string: %*.*S
    ",pUStr->Length/sizeof(WCHAR),
        pUStr->Length/sizeof(WCHAR), pUStr));
    KdPrint(("ANSI    string: %*.*s
    ", pAStr->Length/sizeof(CHAR),
        pAStr->Length/sizeof(CHAR),  pAStr));
    

    Or, if you want to take into account NULL-terminator, but limit output length to specified number of characters:

    KdPrint(("Unicode string: %.*ws
    ",
        pUStr->Length/sizeof(WCHAR), pUStr));
    KdPrint(("Unicode string: %.*S
    ",
        pUStr->Length/sizeof(WCHAR), pUStr));
    KdPrint(("ANSI    string: %.*s
    ",
        pAStr->Length/sizeof(CHAR),  pAStr));

  • 相关阅读:
    计数排序
    epel
    Web开发:我希望得到的编程学习路线图
    第五章:if语句与运算符
    java web学习建议
    第四章:c++数据类型
    第二章:做一个最简单的c++程序
    linux的商业应用
    第三章:初步了解函数
    解析Linux商业应用现状
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289061.html
Copyright © 2011-2022 走看看