如何在Windows NT驱动程序中获取符号链接名称?

问题描述 投票:0回答:1

我正在写一个Windows NT驱动程序。我定义了一个DEVICE_EXTENSION

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

我创建了一个设备,

status = IoCreateDevice(pDriverObject,
    sizeof(DEVICE_EXTENSION),
    &devName,
    FILE_DEVICE_UNKNOWN,
    0, TRUE,
    &pDevObj);
if (!NT_SUCCESS(status))
{ 
    DbgPrint("CreateDevice Error...\n");
    return status;
}
pDevObj->Flags |= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = devName;

UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName, DOS_DEVICE_NAME);
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink(&symLinkName, &devName);

你可以看到,我将symLinkName存储在DEVICE_EXTENSION pDevExt中。当它从设备卸载时,我读了这个symLinkName

NTSTATUS status;
PDEVICE_OBJECT  pNextObj;
DbgPrint(("Enter DriverUnload\n"));
pNextObj = pDriverObject->DeviceObject;
UNICODE_STRING pLinkName;

while (pNextObj != NULL)
{
    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;
    RtlCopyUnicodeString(&pLinkName, &(pDevExt->ustrSymLinkName));
    DbgPrint("Start delete symlinkname %wZ ...\n", &pLinkName);n // meet a error
    status = IoDeleteSymbolicLink(&pLinkName);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("Delete SymbolLink Error\n");
        goto finish;
    }
    pNextObj = pNextObj->NextDevice;
    IoDeleteDevice(pDevExt->pDevice);
}

在执行IoDeleteSymbolicLink之前,我想打印这个pLinkName,但我遇到了错误。

enter image description here为了解决这个问题,我尝试了很多方法。

while (pNextObj != NULL)
{
    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;
    // RtlCopyUnicodeString(&pLinkName, &(pDevExt->ustrSymLinkName));
    RtlInitUnicodeString(&pLinkName, DOS_DEVICE_NAME);     
    DbgPrint("Start delete symlinkname %wZ ...\n", &pLinkName);
    status = IoDeleteSymbolicLink(&pLinkName);
    if (!NT_SUCCESS(status))
    {
        DbgPrint("Delete SymbolLink Error\n");
        goto finish;
    }
    pNextObj = pNextObj->NextDevice;
    IoDeleteDevice(pDevExt->pDevice);
}

这将成功执行,但我不知道为什么会这样。

c++ windows driver
1个回答
1
投票

我想你在你的代码中使用这个#pragma alloc_text(INIT, DriverEntry)。如果是这样,这就是解释:

/* 
 * These compiler directives tell the Operating System how to load the
 * driver into memory. The "INIT" section is discardable as you only
 * need the driver entry upon initialization, then it can be discarded.
 *
 */

加载后,qazxsw poi会话将被丢弃,如果在那个会话中,你的qazxsw poi数据已被释放。您可以删除所有INIT以避免此问题。

© www.soinside.com 2019 - 2024. All rights reserved.