c - 使用 win32 和 C 从 WDK 驱动程序中的 UNICODE_STRING 中提取路径名组件

标签 c windows wdk

我正在尝试分隔 UNICODE_STRING 路径名的组成部分,以便创建从设备根到文件叶的目录树。这需要在 WDK 驱动程序中完成。

我需要使用 ZwCreateFile() 一次构建一个目录结构,因为它只能在一次调用中创建最终目录或叶,而不是整个路径。

很抱歉向你们 C 工程师提出这样一个简单的问题,但我无法理解它并在驱动程序中使用它。

我目前的方法是将 UNICODE_STRING 转换为 char 并使用 strtok_s() 函数将路径名分解为其组件目录和文件。

我想用

char string1[] =
    "\\Device\\HarddiskVolume";

char seps[] = "\\";
char *token1 = NULL;

char *next_token1 = NULL;

token1 = strtok_s(string1, seps, &next_token1);

但我需要将 UNICODE_STRING 转换为 char 字符串。

最佳答案

这是您可以开始的示例。函数 PathBuf() 遍历一个字符串,将路径名的各个部分复制到目标缓冲区中。该函数通过多次调用直到到达字符串末尾来执行此操作。

您需要检查这是否满足您的需求,并进行任何您可能需要的额外调整以获得您想要的。

为了进行测试,我还使用了 wchar_t。您可能需要更改为 UNICODE_STRING 或类似内容。

请注意,存在一些边缘情况,例如没有任何中间文本的两个路径分隔符。空格应该只是路径名部分中的另一个字符。

在 Windows 路径名中有网络设备类型的语法,例如“\device\file”,因此您可能需要添加一些内容以了解第一部分是否是使用两个斜杠引入的设备。

我还做了这个,以便它可以处理 Windows 路径名分隔符(反斜杠)或 Linux 路径名分隔符(正斜杠),这似乎是相当标准的方法。

#include <stdlib.h>
#include <stdio.h>

wchar_t *PathBuf(wchar_t *pDest, const wchar_t *pSrc)
{
    // if not NULL source string and not the end of the source string, process it.
    if (pSrc && *pSrc) {
        short iState = 0;  // start state off as no characters found.
        do {
            // determine whether this is a path separator or a file path
            // path component text character. set the current state based
            // on the current character in the source text string.
            switch (*pSrc) {
                case L'\\':    // backslash path separator found
                case L'/':     // forward slash path separator found
                    iState = (iState == 0) ? 1 : 2;  // first instance or not?
                    break;
                default:
                    *pDest++ = *pSrc;  // copy the character from source to destination buffer
                    iState = 1;  // indicate at least one character found
                    break;
            }
            // continue the loop until either ending path separator found
            // or we have reached end of the source string.
            // we will continue on the next call after the path separator.
        } while (*pSrc && *pSrc++ && iState < 2);
    }
    *pDest = 0;   // end of string terminator for destination buffer

    return pSrc;  // return our current place in the source string
}

int testfunc(void)
{
    wchar_t *list[] = {
        L"\\state",
        L"state2",
        L"\\\\state3\\",
        L"\\statex\\state4",
        L"xx"
    };
    int i;

    for (i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
        wchar_t *p1;         // pointer to source string which is updated
        wchar_t buff[128];   // destination buffer for each component
        p1 = list[i];        // start the source string with the next test item
        printf("Doing %S\n", p1);   // print out the entire test string
        while (*p1) {
            p1 = PathBuf(buff, p1);    // copy first path component into buff, update source string pointer
            printf ("  \"%S\"", buff);  // print out the path component found within double quotes
            // at this point you could use ZwCreateFile() to create the path component.
            // a sanity check on the text such as empty string may be in order.
        }
        printf("\n");
    }
}

此源将输出以下内容:

Doing \state
  "state"
Doing state2
  "state2"
Doing \\state3\
  ""  "state3"
Doing \statex\state4
  "statex"  "state4"
Doing xx
  "xx"

另见

Directory relative ZwCreateFile

The Definitive Guide on Win32 to NT Path Conversion

Nt vs. Zw - Clearing Confusion On The Native API

关于c - 使用 win32 和 C 从 WDK 驱动程序中的 UNICODE_STRING 中提取路径名组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49755023/

相关文章:

c++ - librsvg 和开罗; rsvg_handle_render_cairo() 失败;我究竟做错了什么?

c# - C# 中的共享点编程

digital-signature - Win7 64 位遗留 nt4 驱动程序签名问题

windows - OS线程调度与cpu使用关系

Windows 内核调试 : Debug over virtual serial port with WDK 8. 1

windows - v4 打印驱动器的虚拟打印机驱动程序 INF 配置

c - 在 GTK 中使用多线程?

c - c语言客户端向http服务器发送文件

c - 是否有真正安全的 C 格式库?

windows - deltree 发生了什么,它的替代品是什么?