• 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;
    }
  • 相关阅读:
    java执行cmd程序
    修改linux 默认ssh的22端口
    docker入门(一)
    关键字:心跳网络、oracle rac 网络异常宕机、packet reassembles failed 、UDP error 转载大佬的一篇文章
    记录数据库心跳网络异常,导致数据库宕机--推荐使用OSWBB监控主机
    python项目一键导入所有安装包
    weblogic 中间件利用bsu 漏洞补丁升级
    weblogic 控制台密码输入5次错误被锁 / 密码忘记 修改密码的方法
    oracle数据泵工作学习记录
    简单粗暴的给Linux系统配置本地yum 源
  • 原文地址:https://www.cnblogs.com/endenvor/p/11541068.html
Copyright © 2020-2023  润新知