在C中为内核驱动程序创建一个目录

时间:2018-04-10 06:55:39

标签: c windows wdk

我最近一直在研究使用WDK(Windows驱动程序工具包)创建miniFilter。我正在努力为C找到良好的Api参考。例如,我想以下列格式创建一个目录,但找不到任何引用以及如何执行任何引用。

UNICODE_STRING的格式 - > ' \设备\ HarddiskVolume4 \用户\ WDKRemoteUser \桌面'

对于那些用C语言发展的人,我会把你的帽子给你们。

B.n我正在Visual Studio 2017中进行所有开发

好的,我创建了一个功能:

NTSTATUS create_directory(UNICODE_STRING dirName) {
IO_STATUS_BLOCK iosb;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE FileHandle = NULL;
FILE_OBJECT *FileObj;

DbgPrint("Directory :- '%wZ'", &dirName);

InitializeObjectAttributes(
    &ObjectAttributes,
    &dirName,
    (OBJ_CASE_INSENSITIVE |
        OBJ_KERNEL_HANDLE),
    NULL,
    NULL
);


Status = ZwCreateFile(
    &FileHandle,
    GENERIC_READ | SYNCHRONIZE,
    &ObjectAttributes,
    &iosb,
    0,
    FILE_ATTRIBUTE_NORMAL,
    FILE_SHARE_WRITE | FILE_SHARE_READ,
    FILE_OPEN,
    FILE_DIRECTORY_FILE,
    NULL,
    0
);

return Status;
}

我想我已经从https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-zwcreatefile

正确地遵循了语法

但它似乎没有创建一个目录,猜测我的其中一个参数略有不正确。

我从MS示例中获取了一个用于创建文件的副本,并根据我认为创建目录的方式对其进行了修改。

由于

1 个答案:

答案 0 :(得分:0)

要回答问题并确认下面的工作代码,还在句柄上添加了ZwClose。感谢每个人的评论

NTSTATUS create_directory(UNICODE_STRING dirName) {
IO_STATUS_BLOCK iosb;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE FileHandle = NULL;
FILE_OBJECT *FileObj;

DbgPrint("Directory :- '%wZ'", &dirName);

InitializeObjectAttributes(
    &ObjectAttributes,
    &dirName,
    (OBJ_CASE_INSENSITIVE |
        OBJ_KERNEL_HANDLE),
    NULL,
    NULL
);


Status = ZwCreateFile(
    &FileHandle,
    GENERIC_READ,
    &ObjectAttributes,
    &iosb,
    0,
    FILE_ATTRIBUTE_NORMAL| SYNCHRONIZE,
    FILE_SHARE_WRITE | FILE_SHARE_READ,
    FILE_CREATE,
    FILE_DIRECTORY_FILE,
    NULL,
    0
);

if (FileHandle) {
    ZwClose(FileHandle);
}

return Status;
}