[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 hanyeguxing 于 2011-4-28 13:47 编辑

8# zm900612


  父进程 explorer.exe 在新建 cmd.exe 进程的用户空间为其建立了 PEB 之后,还通过 KlInitPeb (在父进程的用户空间执行)对此 PEB 加以进一步的初始化,在此之前已经准备好了 PPB 作为调用参数之一传下来。进程参数块是一个 RTL_USER_PROCESS_PARAMETERS 数据结构,里面带下来的参数中有一个指针 Environment ,指向一个“宽字符 Unicode” 串,这就是各环境变量的定义。

  参数 PPB 实际涉及两块数据。一块是进程参数块本身,这是有固定大小的;另一块的内容是一些环境变量字符串,这些字符串游离在进程参数块外面,并且也没有固定的长度。这里的目的就是要把这两块数据都复制到新建 cmd.exe 进程的用户空间去,并相应地设置好相关数据结构中的指针。为此,程序中首先要确定这些环境变量字符串所占的长度 EnvSize 。

  知道了这些环境变量字符串所占的长度 EnvSize 以后,如果非 0,就要在新建 cmd.exe 进程的用户空间分配相应的区间。这里在调用 NtAllocateVirtualMemory 时的第 2 个参数、即指针 EnvPtr 的值已预先设置为 NULL ,表示对起始地址没有特定的要求;并且第 3 个参数、即要求在所分配起始地址中前导 0 的个数也是 0 ,因此可以分配在任意的部位 (前导 0 的个数实际上大致上给定了一个部位)。对于这样的分配要求,内存管理会在目标空间从低到高扫描,以找到第一个符合大小要求的区间。由于用户空间的起点是 0x10000 ,这又是第一次要求由内存管理自由分配,所以实际分配的位置一定在 0x10000 处。另一方面,由于区间分配的粒度是 64KB ,所以实际分配的一般总是 64KB ,因为很难设想 EnvSize 会大于 64KB 。实际分配的位置和大小则通过参数 EnvPtr 和 EnvSize1 返回。然后通过 NtWriteVirtualMemory 将来自参数 Ppb、或当前进程的环境变量字符串复制到新建 cmd.exe 进程用户空间的这个区间中。

  接着把 PPB 复制过去并对新建进程用户空间 PPB 和 PEB 中的几个成分作出修正,然后 NtReadVirtualMemory 从 PEB 读取其 ImageBaseAddress 字段,并通过参数 ImageBaseAddress 返回目标映像装入用户空间后的起始地址。

  再接着就是创建新进程的第一个线程、堆栈、TEB 等等。。。。。。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

限于时间仓促
有些特殊存储的环境变量未及表述
比如date、time、random、cmdcmdline、cd等动态变化的状态变量
比如::、=c:、=d:、=e:等无法正常读取和写入的当前路径变量
有空再说吧
天的白色影子

TOP

还是linux方便,setenv()、getenv() 自由使用

TOP

很好奇这些结论是怎么证明出来的...

TOP

感觉有点热哦

本帖最后由 neorobin 于 2011-4-27 23:01 编辑

楼主所述如果可以列出网上资料 (希望有微软的) 来源 (当然是部分难以查找的资料, 我该先自己搜搜学学), 我想看看, 谢谢!

TOP

本帖最后由 powerbat 于 2011-4-27 22:55 编辑

http://technet.microsoft.com/en-us/library/bb490954.aspx
The maximum individual environment variable size is 8192bytes.

http://www.bathome.net/viewthrea ... muid=29086#pid21569
已经讨论过,微软的说法中“字节(byte)”是不准确的,实际可以为字符。

“所以Windows的环境变量也是以Unicode形式存储”,难怪如此,虽然字面上单个变量最大长度为8192字节/字符,但存储时占用空间可能为(8192*2)个字节。

TOP

4# qzwqzw
是我搞错了,确实是字符数,8192这个数字也记错了,2的13次方这下不会错了。。。
***共同提高***

TOP

请确认你的信息来源
这条信息应该是错误的
环境变量的最大长度为8192个字符数(而非字节数)
具体可以用代码测试
限于顶楼规定我就不粘贴了
天的白色影子

TOP

本帖最后由 batman 于 2011-4-27 22:20 编辑

“所以Windows的环境变量也是以Unicode形式存储”

这点我有疑问,因为cmd中变量+=号+值的最大字节数是8196,也就是说我当我设置名为str的变量时,str=后面可以跟上8192个单字节字符,如果说无论什么字符都占两个字节,那么为什么后面还能跟8192个单字节字符?
***共同提高***

TOP

真正的高人,看得我云里雾里,这个可能要慢慢消化了。。。
***共同提高***

TOP

返回列表