zoukankan      html  css  js  c++  java
  • win10 1903 vs2019 调用RtlInitUnicodeString时导致的蓝屏

    问题描述(蓝屏条件):
    在CreateDevice前添加#pragma code_seg("INIT"),
    以RtlInitUnicodeString(&devName, L"\Device\MyDDKDevice")形式初始化devName,
    将其保存在设备扩展里,给Unload调用,一旦访问devName就会导致蓝屏,
    蓝屏代码Bug Check 0x50: PAGE_FAULT_IN_NONPAGED_AREA
    以RtlInitUnicodeString(&devName, g_wsDevName)形式初始化devName,则不会蓝屏
    
    在CreateDevice前添加#pragma code_seg("PAGE")或#pragma code_seg()或不添加该行代码
    RtlInitUnicodeString第二个参数形式无要求,都正常
    
    注:这是在win10 1903 vs2019下测试的,该测试代码来自《Windows驱动开发技术详解》,
    以前win10 1803 vs2017的时候也测试过,但不会导致蓝屏。
    
    PCWSTR g_wsDevName = L"\Device\MyDDKDevice";
    PCWSTR g_wsDevSymbolicName = L"\??\HelloDDK";
    //#pragma code_seg("INIT")        //1. WRONG
    //#pragma code_seg("PAGE")         //2. OK
    #pragma code_seg()               //3. OK
    NTSTATUS CreateDevice(
        IN PDRIVER_OBJECT    pDriverObject)
    {
        DbgPrint("Enter %s
    ", __FUNCTION__);
        NTSTATUS status = 0;
        PDEVICE_OBJECT pDevObj = NULL;
        PDEVICE_EXTENSION pDevExt = NULL;
        UNICODE_STRING devName;
        //RtlInitUnicodeString(&devName, g_wsDevName);            //这种形式在什么代码段都可以
        RtlInitUnicodeString(&devName, L"\Device\MyDDKDevice"); //这种形式不能用在code_seg("INIT")
        __try {
            status = IoCreateDevice(pDriverObject,
                sizeof(DEVICE_EXTENSION),
                &devName,
                FILE_DEVICE_UNKNOWN,
                0, TRUE,
                &pDevObj);
            if (status != STATUS_SUCCESS) __leave;
            pDevObj->Flags |= DO_BUFFERED_IO;
            pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
            pDevExt->pDevice = pDevObj;
            pDevExt->ustrDeviceName = devName;
            //创建符号链接
            UNICODE_STRING symLinkName;
            //RtlInitUnicodeString(&symLinkName, g_wsDevSymbolicName);
            RtlInitUnicodeString(&symLinkName, L"\??\HelloDDK");
            pDevExt->ustrSymLinkName = symLinkName;
            status = IoCreateSymbolicLink(&symLinkName, &devName);
            if (!NT_SUCCESS(status))
            {
                DbgPrint("Failed to call IoCreateSymbolicLink
    ");
                IoDeleteDevice(pDevObj);
                __leave;
            }
        }
        __finally {
        }
        DbgPrint("Leave %s
    ", __FUNCTION__);
        return status;
    }
  • 相关阅读:
    20210603
    20210602
    20210601
    20210531-已编辑
    2021053101
    操作系统笔记(一)
    尘埃落定,扬帆起航
    RTL级低功耗设计
    关于毛刺
    电路级拾珍
  • 原文地址:https://www.cnblogs.com/endenvor/p/11541068.html
Copyright © 2011-2022 走看看