栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

通过读源码win10驱动下实现3环的GetEnvironmentVariable

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过读源码win10驱动下实现3环的GetEnvironmentVariable


效果图:

通过读源码win10驱动下实现3环的GetEnvironmentVariable

NTSTATUS NTAPI

RtlQueryEnvironmentVariable_U(PWSTR Environment,

    PCUNICODE_STRING Name,

    PUNICODE_STRING Value)

{

    NTSTATUS Status;

    PWSTR wcs;

    UNICODE_STRING var;

    PWSTR val;

    BOOLEAN SysEnvUsed = FALSE;

    DbgPrint("RtlQueryEnvironmentVariable_U Environment %p Variable %wZ Value %pn",

        Environment, Name, Value);

    if (Environment == NULL)

    {

        MPPEB Peb = RtlGetCurrentPeb();

        if (Peb) {

            //RtlAcquirePebLock();

            Environment = Peb->ProcessParameters->Environment;

            SysEnvUsed = TRUE;

        }

    }

    if (Environment == NULL)

    {

        //if (SysEnvUsed)

            //RtlReleasePebLock();

        return(STATUS_VARIABLE_NOT_FOUND);

    }

    Value->Length = 0;

    wcs = Environment;

    DbgPrint("Starting search at :%pn", wcs);

    while (*wcs)

    {

        var.Buffer = wcs++;

        wcs = wcschr(wcs, L'=');

        if (wcs == NULL)

        {

            wcs = var.Buffer + wcslen(var.Buffer);

            DbgPrint("Search at :%Sn", wcs);

        }

        if (*wcs)

        {

            var.Length = var.MaximumLength = (USHORT)(wcs - var.Buffer) * sizeof(WCHAR);

            val = ++wcs;

            wcs += wcslen(wcs);

            DbgPrint("Search at :%Sn", wcs);

            if (RtlEqualUnicodeString(&var, Name, TRUE))

            {

                Value->Length = (USHORT)(wcs - val) * sizeof(WCHAR);

                if (Value->Length <= Value->MaximumLength)

                {

                    memcpy(Value->Buffer, val,

                        min(Value->Length + sizeof(WCHAR), Value->MaximumLength));

                    DbgPrint("Value %Sn", val);

                    DbgPrint("Return STATUS_SUCCESSn");

                    Status = STATUS_SUCCESS;

                }

                else

                {

                    DbgPrint("Return STATUS_BUFFER_TOO_SMALLn");

                    Status = STATUS_BUFFER_TOO_SMALL;

                }

                //if (SysEnvUsed)

                    //RtlReleasePebLock();

                return(Status);

            }

        }

        wcs++;

    }

   

    DbgPrint("Return STATUS_VARIABLE_NOT_FOUND: %wZn", Name);

    return(STATUS_VARIABLE_NOT_FOUND);

}

//获取环境变量 

DWORD My_Get_Environment_Variable(IN LPCWSTR lpName,

    IN LPWSTR lpBuffer,

    IN DWORD nSize) {

    UNICODE_STRING VarName, VarValue;

    NTSTATUS Status;

    USHORT UniSize;

    if (nSize <= (UNICODE_STRING_MAX_CHARS - 1))

    {

        if (nSize)

        {

            UniSize = (USHORT)nSize * sizeof(WCHAR) - sizeof(UNICODE_NULL);

        }

        else

        {

            UniSize = 0;

        }

    }

    else

    {

        UniSize = UNICODE_STRING_MAX_BYTES - sizeof(UNICODE_NULL);

    }

    Status = RtlInitUnicodeStringEx(&VarName, lpName);

    if (!NT_SUCCESS(Status))

    {

        baseSetLastNTError(Status);

        return 0;

    }

    RtlInitEmptyUnicodeString(&VarValue, lpBuffer, UniSize);

    Status = RtlQueryEnvironmentVariable_U(NULL, &VarName, &VarValue);

    if (!NT_SUCCESS(Status))

    {

    DbgPrint("RtlQueryEnvironmentVariable_U----------- %Sn", VarValue);

        if (Status == STATUS_BUFFER_TOO_SMALL)

        {

            return (VarValue.Length / sizeof(WCHAR)) + sizeof(ANSI_NULL);

        }

        baseSetLastNTError(Status);

        return 0;

    }

    lpBuffer[VarValue.Length / sizeof(WCHAR)] = UNICODE_NULL;

    return (VarValue.Length / sizeof(WCHAR));

}

用法:

wchar_t buffer[256];

    wchar_t pwcDevNameBuf = NULL;

    DWORD code = My_Get_Environment_Variable(L"TEMP", buffer, 256);

    DbgPrint("buffer----------- %Sn", buffer);

©著作权归作者所有:来自51CTO博客作者土匪猿的原创作品,如需转载,请注明出处,否则将追究法律责任


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/232434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号