64bit환경에서의 윈도우는 cmd가 두개 존재 한다. system32와 sysWow64의 각 폴더 안에 존재 하며 각각은 64bit, 32bit로 동작을 하게 된다.
그럼 윈도우에서 cmd를 실행하면 어느 위치에 있는 cmd가 동작을 할까?
답은 어떠한 환경에서는 system32안에 있는 cmd.exe가 동작을 한다. 이는 일반적으로 윈도우에서 실행 했을때는 아무런 문제가 없다.
그럼 일반적으로 프로그램을 개발하는 시점에서 ShellExecute를 통해 cmd.exe를 호출하면 어떻게 될까?
프로그램을 개발하는 시점에서 윈도우의 시스템 디렉토리의 정보를 가져오는 GetSystemDirectory를 하게 되면 32bit, 64bit 환경에 상관없이 %windir%system32\를 가져오게 된다. 그럼 당연히 system32안에 있는 cmd.exe를 호출할 것 같지만 프로그램을 개발함에 있어서 딱히 Target을 정하지 않으면 32bit 프로그램을 만들게 될것이고, 그럼 system32가 아닌 sysWow64폴더 안에 있는 cmd.exe가 실행 될것이다.
이게 먼차이가 있는지... 어차피 sysWow64는 system32를 리다이렉트한것일 텐데...
실제 프로젝트를 진행하다 드라이버 재설치 관련하여 shell command를 실행해 보니, 두 cmd가 서로 차이가 있는걸 발견하였다.
각각의 cmd.exe를 실행후 bcdedit 명령을 실행 하였을때 system32의 cmd에서는 권한없음 또는 해당 정보가 출력되는 반면 sysWow64에서의 cmd에서는 해당 명령을 수행할 수 없다고 나왔다.
그렇다 위와 같은 상황에서는 반드시 system32안에 있는 cmd를 실행해야지만 원하는 결과를 얻을수 있다.
그렇다면 어떻게 64bit환경에서 32bit프로그램을 실행시 system32안에 있는 cmd를 실행할 수 있을까?
shellexecute 실행시 프로그램의 경로를 c:\windows\system32\cmd.exe로 고정을 해보자....
그리고 결과를 보면.. 원하는 cmd가 아니다..
경로를 고정한다 하더라도 호출의 수행은c:\windows\sysWow64\cmd.exe로 리다이렉트 될것이다.
32bit 응용프로그램은 system디렉토리에 접근을 할때 무조건 %windir%\sysWow64로 리다이렉트 되도록 되어 있다.
이를 해결하려면?
system32 or sysWow64로의 접근을 하지 않고 sysnative로 접근을 하면 이러한 문제는 해결이 된다.
즉, %windir%\sysNative\cmd.exe를 호출하면 원하는 결과를 얻을수 있다.
자 이제 windows explorer에서 sysNative를 검색해 보자
...
안나온다..보이지도 않고 접근도 안된다. 왜.....
sysNative
이 폴더는 64bit환경에서 보이지도 않고 접근을 할 수도 없다. 64bit환경에서 Windows Explorer는 64bit로 구동하기 때문에 아무것도 할 수 없다.
그래도 확인하고 싶다... 면 %windir%\sysWow64\cmd.exe를 통해 접근을 하면 된다.
sysNative에 대해서는 추후에 좀더 자세히 알아보도록 하겠다.