CreateProcess는 lpEnvironment 매개 변수의 환경 블록에서 중복된 변수를 제거하지 않습니다.

  • 아티클
  • 2023. 07. 17.
  •  

이 문서의 내용

  1. 원인
  2. CreateProcess 함수
  3. 환경 변수

애플리케이션은 환경 블록을 해당 매개 변수로 lpEnvironment 호출 CreateProcess 하고 전달합니다.

동일한 변수에 대해 두 개의 정의가 있지만 해당 블록에 다른 값이 있는 경우 자식 프로세스는 변수를 쿼리할 때 블록에서 설정한 마지막 값을 가져올 것으로 예상할 수 있습니다. 대신 Windows는 첫 번째 값을 반환합니다.

원래 제품 버전: Windows Server 2008
원래 KB 번호: 2505238

원인

이 동작은 Windows에서 의도적으로 수행됩니다.

CreateProcess 함수

현재 디자인에서는 CreateProcess 매개 변수로 lpEnvironment 전달하는 버퍼에서 중복된 변수를 제거하지 않습니다. 해당 버퍼를 새 프로세스의 환경 블록으로 설정하기만 하면 됩니다.

매개 변수에 대한 lpEnvironment 자세한 내용은 CreateProcess 함수를 참조하세요.

환경 변수

자식 프로세스가 만들어지고 해당 환경 변수에 액세스하려는 경우 API를 GetEnvironmentVariable 사용할 GetEnvironmentStrings 수 있습니다.

  • GetEnvironmentStrings 는 전달한 버퍼와 동일한 프로세스의 환경 블록 버퍼에 대한 포인터를 반환합니다 CreateProcess.
  • GetEnvironmentVariable 는 간단한 알고리즘을 사용하여 전달한 CreateProcess 버퍼 내에서 원하는 변수를 찾습니다. 이 변수는 왼쪽에서 오른쪽으로 버퍼를 이동하고 원하는 변수 이름을 찾으면 해당 값을 반환합니다. GetEnvironmentVariable 는 버퍼에 이름이 같은 다른 변수가 있으면 상관없습니다.

요약하자면, 현재 디자인에서는 환경 블록 버퍼에서 중복된 변수를 제거하기 위해 호출 CreateProcess 하는 것은 애플리케이션의 책임입니다.

Posted by gurupia
,