Как я могу получить имя ссылки на символ в драйвере Windows NT? - PullRequest
0 голосов
/ 18 сентября 2018

Я пишу драйвер 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);
}

это выполнится успешно, но я не знаю, почему это произошло.

1 Ответ

0 голосов
/ 18 сентября 2018

Полагаю, вы используете это #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.
 *
 */

После загрузки INIT sesison будет отброшено, и ваши данные pDevExt->ustrSymLinkName будут освобождены, если они находятся в этом сеансе.Вы можете удалить все #pragma alloc_text, чтобы избежать этой проблемы.

...